From a09bd1d65aff39df426559cf7d9ea02e364b29ba Mon Sep 17 00:00:00 2001 From: sebastianherreramonterrosa Date: Mon, 23 Sep 2024 22:58:13 -0500 Subject: [PATCH] v0.0.8: add unit tests, add continuous integration with github actions, change notatio Phitter variable to phi --- .github/workflows/unittest.yml | 34 + README.md | 110 +- benckmarks/fit/continuous.ipynb | 4 +- benckmarks/fit/discrete.ipynb | 4 +- examples/fit_accelerate.ipynb | 22 +- examples/fit_continuous_college.ipynb | 22 +- examples/fit_continuous_iris.ipynb | 22 +- examples/fit_continuous_ncdb.ipynb | 30 +- examples/fit_continuous_winequality.ipynb | 30 +- examples/fit_discrete_galton_board.ipynb | 33 +- examples/fit_discrete_warpbraks.ipynb | 22 +- examples/fit_specific_distribution.ipynb | 10 +- examples/working_distribution.ipynb | 7 +- multimedia/working_distributions.png | Bin 0 -> 111179 bytes phitter/__init__.py | 2 +- .../continuous_distributions/erlang.py | 2 +- .../continuous_distributions/erlang_3p.py | 5 +- .../generalized_gamma.py | 26 +- .../generalized_gamma_4p.py | 46 +- .../continuous_distributions/non_central_f.py | 3 +- .../continuous_distributions/pert.py | 7 +- .../continuous_distributions/uniform.py | 6 +- .../continuous_distributions/weibull.py | 2 +- .../continuous_distributions/weibull_3p.py | 2 + .../sample_generalized_gamma_4p.txt | 12158 +++++++++++++--- .../build_phitter_web_continuous.ipynb | 27 +- .../continuous/phitter_web_continuous.py | 1977 ++- .../discrete/build_phitter_web_discrete.ipynb | 15 +- phitter_web/discrete/phitter_web_discrete.py | 202 +- pyproject.toml | 2 +- pytest.ini | 2 + requirements.txt | 5 + .../test_distributions_continuous.ipynb | 1208 +- .../fit/test_fit_continuous.ipynb | 2391 +-- .../phitter_local/fit/test_fit_discrete.ipynb | 10 +- .../test_matplotlib_continuous.ipynb | 20 +- .../matplotlib/test_matplotlib_discrete.ipynb | 18 +- .../plot/plotly/test_plotly_continuous.ipynb | 20 +- .../plot/plotly/test_plotly_discrete.ipynb | 18 +- .../test_statistical_tests_continuous.ipynb} | 48 +- .../test_statistical_tests_discrete.ipynb} | 0 .../test_statistical_tests_continuous.ipynb} | 64 +- .../test_statistical_tests_discrete.ipynb} | 0 .../test_phitter_web_continuous.py | 17 +- .../test_phitter_web_discrete.py | 13 +- .../pytest/test_distribution_measurements.py | 51 + tests/pytest/test_phitter_continuous.py | 31 + tests/pytest/test_phitter_discrete.py | 31 + tests/pytest/test_phitter_web_continuous.py | 31 + tests/pytest/test_statistical_tests.py | 26 + tests/pytest/tets_phitter_web_discrete.py | 31 + 51 files changed, 13627 insertions(+), 5240 deletions(-) create mode 100644 .github/workflows/unittest.yml create mode 100644 multimedia/working_distributions.png create mode 100644 pytest.ini create mode 100644 requirements.txt rename tests/phitter_local/{statistics_test/all/tets_statistics_test_continuous.ipynb => statistical_tests/all/test_statistical_tests_continuous.ipynb} (99%) rename tests/phitter_local/{statistics_test/all/tets_statistics_test_discrete.ipynb => statistical_tests/all/test_statistical_tests_discrete.ipynb} (100%) rename tests/phitter_local/{statistics_test/singular/tets_statistics_test_continuous.ipynb => statistical_tests/singular/test_statistical_tests_continuous.ipynb} (69%) rename tests/phitter_local/{statistics_test/singular/tests_statistics_test_discrete.ipynb => statistical_tests/singular/test_statistical_tests_discrete.ipynb} (100%) create mode 100644 tests/pytest/test_distribution_measurements.py create mode 100644 tests/pytest/test_phitter_continuous.py create mode 100644 tests/pytest/test_phitter_discrete.py create mode 100644 tests/pytest/test_phitter_web_continuous.py create mode 100644 tests/pytest/test_statistical_tests.py create mode 100644 tests/pytest/tets_phitter_web_discrete.py diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml new file mode 100644 index 0000000..fefe843 --- /dev/null +++ b/.github/workflows/unittest.yml @@ -0,0 +1,34 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + # Step 1: Check out the code from the repository + - name: Check out code + uses: actions/checkout@v2 + + # Step 2: Set up Python environment + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: "3.11" + + # Step 3: Install dependencies + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + # Step 4: Run tests + - name: Run tests + run: pytest tests/pytest diff --git a/README.md b/README.md index 9324e50..5006bbd 100644 --- a/README.md +++ b/README.md @@ -56,10 +56,12 @@ pip install phitter ```python import phitter +## Define your dataset data: list[int | float] = [...] -phitter_cont = phitter.PHITTER(data) -phitter_cont.fit() +## Make a continuous fit using Phitter +phi = phitter.PHITTER(data) +phi.fit() ``` ### Full continuous implementation @@ -67,9 +69,11 @@ phitter_cont.fit() ```python import phitter +## Define your dataset data: list[int | float] = [...] -phitter_cont = phitter.PHITTER( +## Make a continuous fit using Phitter +phi = phitter.PHITTER( data=data, fit_type="continuous", num_bins=15, @@ -77,7 +81,7 @@ phitter_cont = phitter.PHITTER( minimum_sse=1e-2, distributions_to_fit=["beta", "normal", "fatigue_life", "triangular"], ) -phitter_cont.fit(n_workers=6) +phi.fit(n_workers=6) ``` ### Full discrete implementation @@ -85,43 +89,49 @@ phitter_cont.fit(n_workers=6) ```python import phitter +## Define your dataset data: list[int | float] = [...] -phitter_disc = phitter.PHITTER( +## Make a discrete fit using Phitter +phi = phitter.PHITTER( data=data, fit_type="discrete", confidence_level=0.95, minimum_sse=1e-2, distributions_to_fit=["binomial", "geometric"], ) -phitter_disc.fit(n_workers=2) +phi.fit(n_workers=2) ``` ### Phitter: properties and methods ```python import phitter + +## Define your dataset data: list[int | float] = [...] -phitter_cont = phitter.PHITTER(data) -phitter_cont.fit() + +## Make a fit using Phitter +phi = phitter.PHITTER(data) +phi.fit(n_workers=2) ## Global methods and properties -phitter_cont.summarize(k: int) -> pandas.DataFrame -phitter_cont.summarize_info(k: int) -> pandas.DataFrame -phitter_cont.best_distribution -> dict -phitter_cont.sorted_distributions_sse -> dict -phitter_cont.not_rejected_distributions -> dict -phitter_cont.df_sorted_distributions_sse -> pandas.DataFrame -phitter_cont.df_not_rejected_distributions -> pandas.DataFrame +phi.summarize(k: int) -> pandas.DataFrame +phi.summarize_info(k: int) -> pandas.DataFrame +phi.best_distribution -> dict +phi.sorted_distributions_sse -> dict +phi.not_rejected_distributions -> dict +phi.df_sorted_distributions_sse -> pandas.DataFrame +phi.df_not_rejected_distributions -> pandas.DataFrame ## Specific distribution methods and properties -phitter_cont.get_parameters(id_distribution: str) -> dict -phitter_cont.get_test_chi_square(id_distribution: str) -> dict -phitter_cont.get_test_kolmmogorov_smirnov(id_distribution: str) -> dict -phitter_cont.get_test_anderson_darling(id_distribution: str) -> dict -phitter_cont.get_sse(id_distribution: str) -> float -phitter_cont.get_n_test_passed(id_distribution: str) -> int -phitter_cont.get_n_test_null(id_distribution: str) -> int +phi.get_parameters(id_distribution: str) -> dict +phi.get_test_chi_square(id_distribution: str) -> dict +phi.get_test_kolmmogorov_smirnov(id_distribution: str) -> dict +phi.get_test_anderson_darling(id_distribution: str) -> dict +phi.get_sse(id_distribution: str) -> float +phi.get_n_test_passed(id_distribution: str) -> int +phi.get_n_test_null(id_distribution: str) -> int ``` ### Histogram Plot @@ -129,10 +139,10 @@ phitter_cont.get_n_test_null(id_distribution: str) -> int ```python import phitter data: list[int | float] = [...] -phitter_cont = phitter.PHITTER(data) -phitter_cont.fit() +phi = phitter.PHITTER(data) +phi.fit() -phitter_cont.plot_histogram() +phi.plot_histogram() ``` phitter_histogram @@ -142,10 +152,10 @@ phitter_cont.plot_histogram() ```python import phitter data: list[int | float] = [...] -phitter_cont = phitter.PHITTER(data) -phitter_cont.fit() +phi = phitter.PHITTER(data) +phi.fit() -phitter_cont.plot_histogram_distributions() +phi.plot_histogram_distributions() ``` phitter_histogram @@ -155,10 +165,10 @@ phitter_cont.plot_histogram_distributions() ```python import phitter data: list[int | float] = [...] -phitter_cont = phitter.PHITTER(data) -phitter_cont.fit() +phi = phitter.PHITTER(data) +phi.fit() -phitter_cont.plot_distribution("beta") +phi.plot_distribution("beta") ``` phitter_histogram @@ -168,10 +178,10 @@ phitter_cont.plot_distribution("beta") ```python import phitter data: list[int | float] = [...] -phitter_cont = phitter.PHITTER(data) -phitter_cont.fit() +phi = phitter.PHITTER(data) +phi.fit() -phitter_cont.plot_ecdf() +phi.plot_ecdf() ``` phitter_histogram @@ -181,10 +191,10 @@ phitter_cont.plot_ecdf() ```python import phitter data: list[int | float] = [...] -phitter_cont = phitter.PHITTER(data) -phitter_cont.fit() +phi = phitter.PHITTER(data) +phi.fit() -phitter_cont.plot_ecdf_distribution("beta") +phi.plot_ecdf_distribution("beta") ``` phitter_histogram @@ -194,10 +204,10 @@ phitter_cont.plot_ecdf_distribution("beta") ```python import phitter data: list[int | float] = [...] -phitter_cont = phitter.PHITTER(data) -phitter_cont.fit() +phi = phitter.PHITTER(data) +phi.fit() -phitter_cont.qq_plot("beta") +phi.qq_plot("beta") ``` phitter_histogram @@ -207,15 +217,15 @@ phitter_cont.qq_plot("beta") ```python import phitter data: list[int | float] = [...] -phitter_cont = phitter.PHITTER(data) -phitter_cont.fit() +phi = phitter.PHITTER(data) +phi.fit() -phitter_cont.qq_plot_regression("beta") +phi.qq_plot_regression("beta") ``` phitter_histogram -### Distributions: Methods and properties +### Working with distributions: Methods and properties ```python import phitter @@ -272,12 +282,12 @@ distribution.mode # -> 733.3333333333333 | frechet | ▢️[phitter:frechet](https://phitter.io/distributions/continuous/frechet) | πŸ“Š[frechet.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/frechet.xlsx) | 🌐[gs:frechet](https://docs.google.com/spreadsheets/d/1PNGvHImwOFIragM_hHrQJcTN7OcqCKFoHKXlPq76fnI) | | gamma | ▢️[phitter:gamma](https://phitter.io/distributions/continuous/gamma) | πŸ“Š[gamma.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/gamma.xlsx) | 🌐[gs:gamma](https://docs.google.com/spreadsheets/d/1HgD3a1zOml7Hy9PMVvFwQwrbmbs8iPbH-zQMowH0LVE) | | gamma_3p | ▢️[phitter:gamma_3p](https://phitter.io/distributions/continuous/gamma_3p) | πŸ“Š[gamma_3p.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/gamma_3p.xlsx) | 🌐[gs:gamma_3p](https://docs.google.com/spreadsheets/d/1NkyFZFOMzk2V9qkFEI_zhGUGWiGV-K9vU-RLaFB7ip8) | -| generalized_extreme_value | ▢️[phitter:generalized_extreme_value](https://phitter.io/distributions/continuous/generalized_extreme_value) | πŸ“Š[generalized_extreme_value.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_extreme_value.xlsx) | 🌐[gs:generalized_extreme_value](https://docs.google.com/spreadsheets/d/19qHvnTJGVVZ7zhi-yhauCOGhu0iAdkYJ5FFgwv1q5OI) | -| generalized_gamma | ▢️[phitter:generalized_gamma](https://phitter.io/distributions/continuous/generalized_gamma) | πŸ“Š[generalized_gamma.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_gamma.xlsx) | 🌐[gs:generalized_gamma](https://docs.google.com/spreadsheets/d/1xx8b_VSG4jznZzaKq2yKumw5VcNX5Wj86YqLO7n4S5A) | -| generalized_gamma_4p | ▢️[phitter:generalized_gamma_4p](https://phitter.io/distributions/continuous/generalized_gamma_4p) | πŸ“Š[generalized_gamma_4p.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_gamma_4p.xlsx) | 🌐[gs:generalized_gamma_4p](https://docs.google.com/spreadsheets/d/1TN72MSkZ2bRyoNy29h4VIxFudXAroSi1PnmFijPvO0M) | -| generalized_logistic | ▢️[phitter:generalized_logistic](https://phitter.io/distributions/continuous/generalized_logistic) | πŸ“Š[generalized_logistic.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_logistic.xlsx) | 🌐[gs:generalized_logistic](https://docs.google.com/spreadsheets/d/1vwppGjHbwEA3xd3OtV51sPZhpOWyzmPIOV_Tued-I1Y) | -| generalized_normal | ▢️[phitter:generalized_normal](https://phitter.io/distributions/continuous/generalized_normal) | πŸ“Š[generalized_normal.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_normal.xlsx) | 🌐[gs:generalized_normal](https://docs.google.com/spreadsheets/d/1_77JSp0mhHxqvQugVRRWIoQOTa91WdyNqNmOfDNuSfA) | -| generalized_pareto | ▢️[phitter:generalized_pareto](https://phitter.io/distributions/continuous/generalized_pareto) | πŸ“Š[generalized_pareto.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_pareto.xlsx) | 🌐[gs:generalized_pareto](https://docs.google.com/spreadsheets/d/1E28WYhX4Ba9Nj-JNxqAm-Gh7o1EOOIOwXIdCFl1PXI0) | +| generalized_extreme_value | ▢️[phitter:gen_extreme_value](https://phitter.io/distributions/continuous/generalized_extreme_value) | πŸ“Š[gen_extreme_value.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_extreme_value.xlsx) | 🌐[gs:gen_extreme_value](https://docs.google.com/spreadsheets/d/19qHvnTJGVVZ7zhi-yhauCOGhu0iAdkYJ5FFgwv1q5OI) | +| generalized_gamma | ▢️[phitter:gen_gamma](https://phitter.io/distributions/continuous/generalized_gamma) | πŸ“Š[gen_gamma.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_gamma.xlsx) | 🌐[gs:gen_gamma](https://docs.google.com/spreadsheets/d/1xx8b_VSG4jznZzaKq2yKumw5VcNX5Wj86YqLO7n4S5A) | +| generalized_gamma_4p | ▢️[phitter:gen_gamma_4p](https://phitter.io/distributions/continuous/generalized_gamma_4p) | πŸ“Š[gen_gamma_4p.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_gamma_4p.xlsx) | 🌐[gs:gen_gamma_4p](https://docs.google.com/spreadsheets/d/1TN72MSkZ2bRyoNy29h4VIxFudXAroSi1PnmFijPvO0M) | +| generalized_logistic | ▢️[phitter:gen_logistic](https://phitter.io/distributions/continuous/generalized_logistic) | πŸ“Š[gen_logistic.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_logistic.xlsx) | 🌐[gs:gen_logistic](https://docs.google.com/spreadsheets/d/1vwppGjHbwEA3xd3OtV51sPZhpOWyzmPIOV_Tued-I1Y) | +| generalized_normal | ▢️[phitter:gen_normal](https://phitter.io/distributions/continuous/generalized_normal) | πŸ“Š[gen_normal.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_normal.xlsx) | 🌐[gs:gen_normal](https://docs.google.com/spreadsheets/d/1_77JSp0mhHxqvQugVRRWIoQOTa91WdyNqNmOfDNuSfA) | +| generalized_pareto | ▢️[phitter:gen_pareto](https://phitter.io/distributions/continuous/generalized_pareto) | πŸ“Š[gen_pareto.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/generalized_pareto.xlsx) | 🌐[gs:gen_pareto](https://docs.google.com/spreadsheets/d/1E28WYhX4Ba9Nj-JNxqAm-Gh7o1EOOIOwXIdCFl1PXI0) | | gibrat | ▢️[phitter:gibrat](https://phitter.io/distributions/continuous/gibrat) | πŸ“Š[gibrat.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/gibrat.xlsx) | 🌐[gs:gibrat](https://docs.google.com/spreadsheets/d/1pM7skBPnH8V3GCJo0iSst46Oc2OzqWdX2qATYBqc_GQ) | | gumbel_left | ▢️[phitter:gumbel_left](https://phitter.io/distributions/continuous/gumbel_left) | πŸ“Š[gumbel_left.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/gumbel_left.xlsx) | 🌐[gs:gumbel_left](https://docs.google.com/spreadsheets/d/1WoW97haebsHk1sB8smC4Zq8KqW8leJY0bPK757B2IdI) | | gumbel_right | ▢️[phitter:gumbel_right](https://phitter.io/distributions/continuous/gumbel_right) | πŸ“Š[gumbel_right.xlsx](https://github.com/phitterio/phitter-files/blob/main/continuous/gumbel_right.xlsx) | 🌐[gs:gumbel_right](https://docs.google.com/spreadsheets/d/1CpzfSwAdptFrI8DhV3tWRsEFd9cr6h3Jaj7t3gigims) | diff --git a/benckmarks/fit/continuous.ipynb b/benckmarks/fit/continuous.ipynb index fd24016..cb1ed84 100644 --- a/benckmarks/fit/continuous.ipynb +++ b/benckmarks/fit/continuous.ipynb @@ -65,8 +65,8 @@ " distribution_class = phitter.continuous.CONTINUOUS_DISTRIBUTIONS[id_distribution]\n", " data = distribution_class(init_parameters_examples=True).sample(sample_size)\n", " ti = time.time()\n", - " phitter_cont = phitter.PHITTER(data=data)\n", - " phitter_cont.fit(n_workers=n_workers)\n", + " phi = phitter.PHITTER(data=data)\n", + " phi.fit(n_workers=n_workers)\n", " tf = time.time() - ti\n", " df_fit_time = df_fit_time.fillna(0)\n", " if n_workers in df_fit_time.columns and sample_size in df_fit_time.index:\n", diff --git a/benckmarks/fit/discrete.ipynb b/benckmarks/fit/discrete.ipynb index cc221ba..45ecadf 100644 --- a/benckmarks/fit/discrete.ipynb +++ b/benckmarks/fit/discrete.ipynb @@ -72,8 +72,8 @@ " for id_distribution, distribution_class in phitter.discrete.DISCRETE_DISTRIBUTIONS.items():\n", " data = distribution_class(init_parameters_examples=True).sample(sample_size)\n", " ti = time.time()\n", - " phitter_cont = phitter.PHITTER(data=data, fit_type=\"discrete\")\n", - " phitter_cont.fit(n_workers=n_workers)\n", + " phi = phitter.PHITTER(data=data, fit_type=\"discrete\")\n", + " phi.fit(n_workers=n_workers)\n", " tf = time.time() - ti\n", " df_fit_time = df_fit_time.fillna(0)\n", " if n_workers in df_fit_time.columns and sample_size in df_fit_time.index:\n", diff --git a/examples/fit_accelerate.ipynb b/examples/fit_accelerate.ipynb index 70bb4a6..69d5658 100644 --- a/examples/fit_accelerate.ipynb +++ b/examples/fit_accelerate.ipynb @@ -81,12 +81,12 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont = phitter.PHITTER(\n", + "phi = phitter.PHITTER(\n", " data=data,\n", " subsample_size=10000,\n", " subsample_estimation_size=10000,\n", ")\n", - "phitter_cont.fit(n_workers=4)" + "phi.fit(n_workers=4)" ] }, { @@ -389,7 +389,7 @@ } ], "source": [ - "phitter_cont.summarize()" + "phi.summarize()" ] }, { @@ -593,7 +593,7 @@ } ], "source": [ - "phitter_cont.df_sorted_distributions_sse.head()" + "phi.df_sorted_distributions_sse.head()" ] }, { @@ -617,7 +617,7 @@ } ], "source": [ - "phitter_cont.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -641,7 +641,7 @@ } ], "source": [ - "phitter_cont.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] }, { @@ -665,7 +665,7 @@ } ], "source": [ - "phitter_cont.plot_distribution(\"nakagami\")" + "phi.plot_distribution(\"nakagami\")" ] }, { @@ -692,7 +692,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf()" + "phi.plot_ecdf()" ] }, { @@ -719,7 +719,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf_distribution(\"nakagami\")" + "phi.plot_ecdf_distribution(\"nakagami\")" ] }, { @@ -746,7 +746,7 @@ } ], "source": [ - "phitter_cont.qq_plot(\"nakagami\")" + "phi.qq_plot(\"nakagami\")" ] }, { @@ -773,7 +773,7 @@ } ], "source": [ - "phitter_cont.qq_plot_regression(\"nakagami\")" + "phi.qq_plot_regression(\"nakagami\")" ] } ], diff --git a/examples/fit_continuous_college.ipynb b/examples/fit_continuous_college.ipynb index dbbdf1d..c5f4d92 100644 --- a/examples/fit_continuous_college.ipynb +++ b/examples/fit_continuous_college.ipynb @@ -239,8 +239,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont = phitter.PHITTER(data=data)\n", - "phitter_cont.fit(n_workers=2)" + "phi = phitter.PHITTER(data=data)\n", + "phi.fit(n_workers=2)" ] }, { @@ -264,7 +264,7 @@ } ], "source": [ - "phitter_cont.best_distribution" + "phi.best_distribution" ] }, { @@ -576,7 +576,7 @@ } ], "source": [ - "phitter_cont.df_sorted_distributions_sse.head(10)" + "phi.df_sorted_distributions_sse.head(10)" ] }, { @@ -1231,7 +1231,7 @@ } ], "source": [ - "phitter_cont.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -22043,7 +22043,7 @@ } ], "source": [ - "phitter_cont.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] }, { @@ -24727,7 +24727,7 @@ } ], "source": [ - "phitter_cont.plot_distribution(\"johnson_sb\")" + "phi.plot_distribution(\"johnson_sb\")" ] }, { @@ -30369,7 +30369,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf()" + "phi.plot_ecdf()" ] }, { @@ -38025,7 +38025,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf_distribution(\"johnson_sb\")" + "phi.plot_ecdf_distribution(\"johnson_sb\")" ] }, { @@ -41255,7 +41255,7 @@ } ], "source": [ - "phitter_cont.qq_plot(\"johnson_sb\")" + "phi.qq_plot(\"johnson_sb\")" ] }, { @@ -47085,7 +47085,7 @@ } ], "source": [ - "phitter_cont.qq_plot_regression(\"johnson_sb\")" + "phi.qq_plot_regression(\"johnson_sb\")" ] } ], diff --git a/examples/fit_continuous_iris.ipynb b/examples/fit_continuous_iris.ipynb index e680f10..ee791fb 100644 --- a/examples/fit_continuous_iris.ipynb +++ b/examples/fit_continuous_iris.ipynb @@ -158,8 +158,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont = phitter.PHITTER(data=data)\n", - "phitter_cont.fit(n_workers=2)" + "phi = phitter.PHITTER(data=data)\n", + "phi.fit(n_workers=2)" ] }, { @@ -182,7 +182,7 @@ } ], "source": [ - "phitter_cont.best_distribution" + "phi.best_distribution" ] }, { @@ -520,7 +520,7 @@ } ], "source": [ - "phitter_cont.df_sorted_distributions_sse" + "phi.df_sorted_distributions_sse" ] }, { @@ -1167,7 +1167,7 @@ } ], "source": [ - "phitter_cont.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -21971,7 +21971,7 @@ } ], "source": [ - "phitter_cont.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] }, { @@ -24647,7 +24647,7 @@ } ], "source": [ - "phitter_cont.plot_distribution(\"burr_4p\", )" + "phi.plot_distribution(\"burr_4p\", )" ] }, { @@ -25381,7 +25381,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf()" + "phi.plot_ecdf()" ] }, { @@ -28129,7 +28129,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf_distribution(\"logistic\")" + "phi.plot_ecdf_distribution(\"logistic\")" ] }, { @@ -29071,7 +29071,7 @@ } ], "source": [ - "phitter_cont.qq_plot(\"logistic\")" + "phi.qq_plot(\"logistic\")" ] }, { @@ -30325,7 +30325,7 @@ } ], "source": [ - "phitter_cont.qq_plot_regression(\"logistic\")" + "phi.qq_plot_regression(\"logistic\")" ] } ], diff --git a/examples/fit_continuous_ncdb.ipynb b/examples/fit_continuous_ncdb.ipynb index 75a2dc4..3470fb7 100644 --- a/examples/fit_continuous_ncdb.ipynb +++ b/examples/fit_continuous_ncdb.ipynb @@ -257,8 +257,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont = phitter.PHITTER(data=data)\n", - "phitter_cont.fit(n_workers=4)" + "phi = phitter.PHITTER(data=data)\n", + "phi.fit(n_workers=4)" ] }, { @@ -286,7 +286,7 @@ } ], "source": [ - "phitter_cont.best_distribution" + "phi.best_distribution" ] }, { @@ -589,7 +589,7 @@ } ], "source": [ - "phitter_cont.summarize()" + "phi.summarize()" ] }, { @@ -908,7 +908,7 @@ } ], "source": [ - "phitter_cont.df_sorted_distributions_sse.head(10)" + "phi.df_sorted_distributions_sse.head(10)" ] }, { @@ -935,7 +935,7 @@ } ], "source": [ - "phitter_cont.get_parameters(\"weibull\")" + "phi.get_parameters(\"weibull\")" ] }, { @@ -962,7 +962,7 @@ } ], "source": [ - "phitter_cont.get_sse(\"weibull\")" + "phi.get_sse(\"weibull\")" ] }, { @@ -992,7 +992,7 @@ } ], "source": [ - "phitter_cont.get_test_kolmogorov_smirnov(\"weibull\")" + "phi.get_test_kolmogorov_smirnov(\"weibull\")" ] }, { @@ -1016,7 +1016,7 @@ } ], "source": [ - "phitter_cont.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -1040,7 +1040,7 @@ } ], "source": [ - "phitter_cont.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] }, { @@ -1064,7 +1064,7 @@ } ], "source": [ - "phitter_cont.plot_distribution(\"weibull\")" + "phi.plot_distribution(\"weibull\")" ] }, { @@ -1088,7 +1088,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf()" + "phi.plot_ecdf()" ] }, { @@ -1112,7 +1112,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf_distribution(\"weibull\")" + "phi.plot_ecdf_distribution(\"weibull\")" ] }, { @@ -1136,7 +1136,7 @@ } ], "source": [ - "phitter_cont.qq_plot(\"weibull\")" + "phi.qq_plot(\"weibull\")" ] }, { @@ -1160,7 +1160,7 @@ } ], "source": [ - "phitter_cont.qq_plot_regression(\"weibull\")" + "phi.qq_plot_regression(\"weibull\")" ] } ], diff --git a/examples/fit_continuous_winequality.ipynb b/examples/fit_continuous_winequality.ipynb index 6dce91a..3bef665 100644 --- a/examples/fit_continuous_winequality.ipynb +++ b/examples/fit_continuous_winequality.ipynb @@ -86,8 +86,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont = phitter.PHITTER(data=data)\n", - "phitter_cont.fit(n_workers=2)" + "phi = phitter.PHITTER(data=data)\n", + "phi.fit(n_workers=2)" ] }, { @@ -103,7 +103,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.best_distribution" + "phi.best_distribution" ] }, { @@ -119,7 +119,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.df_sorted_distributions_sse.head(10)" + "phi.df_sorted_distributions_sse.head(10)" ] }, { @@ -135,7 +135,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.df_not_rejected_distributions" + "phi.df_not_rejected_distributions" ] }, { @@ -151,7 +151,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.get_parameters(\"weibull\")" + "phi.get_parameters(\"weibull\")" ] }, { @@ -167,7 +167,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.get_sse(\"weibull\")" + "phi.get_sse(\"weibull\")" ] }, { @@ -183,7 +183,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.get_test_chi_square(\"weibull\")" + "phi.get_test_chi_square(\"weibull\")" ] }, { @@ -199,7 +199,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -215,7 +215,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] }, { @@ -231,7 +231,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.plot_distribution(\"normal\")" + "phi.plot_distribution(\"normal\")" ] }, { @@ -247,7 +247,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.plot_ecdf()" + "phi.plot_ecdf()" ] }, { @@ -263,7 +263,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.plot_ecdf_distribution(\"normal\")" + "phi.plot_ecdf_distribution(\"normal\")" ] }, { @@ -279,7 +279,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.qq_plot(\"normal\")" + "phi.qq_plot(\"normal\")" ] }, { @@ -295,7 +295,7 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont.qq_plot_regression(\"normal\")" + "phi.qq_plot_regression(\"normal\")" ] } ], diff --git a/examples/fit_discrete_galton_board.ipynb b/examples/fit_discrete_galton_board.ipynb index baee5b2..0477ab9 100644 --- a/examples/fit_discrete_galton_board.ipynb +++ b/examples/fit_discrete_galton_board.ipynb @@ -20,8 +20,9 @@ "metadata": {}, "outputs": [], "source": [ - "import sys\n", "import os\n", + "import sys\n", + "\n", "import numpy" ] }, @@ -83,11 +84,11 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_disc = phitter.PHITTER(\n", + "phi = phitter.PHITTER(\n", " data=data,\n", " fit_type=\"discrete\",\n", ")\n", - "phitter_disc.fit()" + "phi.fit()" ] }, { @@ -114,7 +115,7 @@ } ], "source": [ - "phitter_disc.best_distribution" + "phi.best_distribution" ] }, { @@ -226,7 +227,7 @@ } ], "source": [ - "phitter_disc.summarize()" + "phi.summarize()" ] }, { @@ -415,7 +416,7 @@ } ], "source": [ - "phitter_disc.df_sorted_distributions_sse" + "phi.df_sorted_distributions_sse" ] }, { @@ -442,7 +443,7 @@ } ], "source": [ - "phitter_disc.get_parameters(\"binomial\")" + "phi.get_parameters(\"binomial\")" ] }, { @@ -469,7 +470,7 @@ } ], "source": [ - "phitter_disc.get_sse(\"binomial\")" + "phi.get_sse(\"binomial\")" ] }, { @@ -499,7 +500,7 @@ } ], "source": [ - "phitter_disc.get_test_kolmogorov_smirnov(\"binomial\")" + "phi.get_test_kolmogorov_smirnov(\"binomial\")" ] }, { @@ -523,7 +524,7 @@ } ], "source": [ - "phitter_disc.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -547,7 +548,7 @@ } ], "source": [ - "phitter_disc.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] }, { @@ -571,7 +572,7 @@ } ], "source": [ - "phitter_disc.plot_distribution(\"hypergeometric\")" + "phi.plot_distribution(\"hypergeometric\")" ] }, { @@ -595,7 +596,7 @@ } ], "source": [ - "phitter_disc.plot_ecdf()" + "phi.plot_ecdf()" ] }, { @@ -619,7 +620,7 @@ } ], "source": [ - "phitter_disc.plot_ecdf_distribution(\"hypergeometric\")" + "phi.plot_ecdf_distribution(\"hypergeometric\")" ] }, { @@ -646,7 +647,7 @@ } ], "source": [ - "phitter_disc.qq_plot(\"binomial\")" + "phi.qq_plot(\"binomial\")" ] }, { @@ -673,7 +674,7 @@ } ], "source": [ - "phitter_disc.qq_plot_regression(\"binomial\")" + "phi.qq_plot_regression(\"binomial\")" ] } ], diff --git a/examples/fit_discrete_warpbraks.ipynb b/examples/fit_discrete_warpbraks.ipynb index 69b17d0..a7ab570 100644 --- a/examples/fit_discrete_warpbraks.ipynb +++ b/examples/fit_discrete_warpbraks.ipynb @@ -145,11 +145,11 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_disc = phitter.PHITTER(\n", + "phi = phitter.PHITTER(\n", " data=data,\n", " fit_type=\"discrete\",\n", ")\n", - "phitter_disc.fit()" + "phi.fit()" ] }, { @@ -169,7 +169,7 @@ } ], "source": [ - "phitter_disc.best_distribution" + "phi.best_distribution" ] }, { @@ -351,7 +351,7 @@ } ], "source": [ - "phitter_disc.df_sorted_distributions_sse" + "phi.df_sorted_distributions_sse" ] }, { @@ -1098,7 +1098,7 @@ } ], "source": [ - "phitter_disc.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -2675,7 +2675,7 @@ } ], "source": [ - "phitter_disc.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] }, { @@ -3569,7 +3569,7 @@ } ], "source": [ - "phitter_disc.plot_distribution(\"poisson\")" + "phi.plot_distribution(\"poisson\")" ] }, { @@ -4328,7 +4328,7 @@ } ], "source": [ - "phitter_disc.plot_ecdf()" + "phi.plot_ecdf()" ] }, { @@ -5222,7 +5222,7 @@ } ], "source": [ - "phitter_disc.plot_ecdf_distribution(\"poisson\")" + "phi.plot_ecdf_distribution(\"poisson\")" ] }, { @@ -5968,7 +5968,7 @@ } ], "source": [ - "phitter_disc.qq_plot(\"poisson\")" + "phi.qq_plot(\"poisson\")" ] }, { @@ -6834,7 +6834,7 @@ } ], "source": [ - "phitter_disc.qq_plot_regression(\"poisson\")" + "phi.qq_plot_regression(\"poisson\")" ] } ], diff --git a/examples/fit_specific_distribution.ipynb b/examples/fit_specific_distribution.ipynb index e94be5f..bd904fe 100644 --- a/examples/fit_specific_distribution.ipynb +++ b/examples/fit_specific_distribution.ipynb @@ -75,8 +75,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont = phitter.PHITTER(data=data, distributions_to_fit=[\"beta\"])\n", - "phitter_cont.fit()" + "phi = phitter.PHITTER(data=data, distributions_to_fit=[\"beta\"])\n", + "phi.fit()" ] }, { @@ -151,7 +151,7 @@ } ], "source": [ - "phitter_cont.summarize()" + "phi.summarize()" ] }, { @@ -263,7 +263,7 @@ } ], "source": [ - "phitter_cont.df_sorted_distributions_sse" + "phi.df_sorted_distributions_sse" ] }, { @@ -287,7 +287,7 @@ } ], "source": [ - "phitter_cont.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] } ], diff --git a/examples/working_distribution.ipynb b/examples/working_distribution.ipynb index a1332b1..8f0d0dc 100644 --- a/examples/working_distribution.ipynb +++ b/examples/working_distribution.ipynb @@ -67,15 +67,10 @@ ] }, { - "attachments": { - "image.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4sAAAD6CAYAAAAIhdKaAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAHzTSURBVHhe7d0HmBXV3T/w3/beK70jvYpgI6LYEDtRUYOxvcH++lejUeyiidEYiQUTX401YizErtFoxIIFpXdYWNoWtrK9/ud7ds4yO7fNvXsX2N3v53nm2b1zp545M/f85pw5E9K/f/9mISIiIiIiIrIINf8SERERERERtWKwSERERERERC4YLBIREREREZELBotERERERETkIuT++/5f8+rX3pSlleYYL4793Yvyv4eL/LRgjsz/rznScMkjL0rvd1vGXfLIm3KGvCPn3vyC+e1B8Is75MXrDxMpj5OC/54rN//dHK+Z32/Q+/HrR+TN00XeOfdm8bzVl8gjb54hA8p/kj9fOl+WmGNbljVB4nIC2eeWZcq7brYxKI6VO57/Xzls459lzkOtW9xhnn32WbniiivMTw7Zj0U7qPw5dEPb42OljnOmS/5VgrgdTjk7Vw7sMXRutFxyxyWS8uPN8uePjY9jL5E7LhotKS1fOlay+gWZ/+Iq85MnLWkwITHHdo56OCcdcZ+uh8T1i4iIiLoEn2XTdpbzXJdvlpnEj7KRuzjILBdfMusSCfn2P680f3j37fJCrkh8fLykpKRIdHS0hISEmFMTERERERFRV9Lc3Cw10cky94IjZeMdC9wHi/369VOvzkCgmJ2dLfn5+VJZWalmJiIiIiIioq4HlYNxcXHSu3dvufjii2XYsKiWGkZLsBg6Oq5lYtQoIlCsqKhgoEhERERERNSFIeZD7Ldz5055beFCObfN4z4tQWLoPQvukBOM/9H0FDWKRERERERE1D0gBqwxYkF3QiV5glxy06mqGpI1ikRERERERN0HYkDX/mpaKhHVqzPiRhyrPhARERERERFBy3sWIyLVHyIiIiIiIiLgS/mJiIiIiIjIhQoW6zf+pD4QuRMWFiZXX321PPjgg5KWlmaOJSIiIiKiruLNNx+RS8z/tZAfv/1n8zt33SzfylDZtGmTOTo4kgZOkCG/nCehES2969RXlsrav98ktSV71Gc69CFQvP7662XChAny+uuvy7vvvmt+Q0REREREXcGQIUNk48aN5qcW6PQm5LoT+zW/Y4wf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" - } - }, "cell_type": "markdown", "metadata": {}, "source": [ - "![image.png](attachment:image.png)\n" + "\"phitter_histogram\"\n" ] }, { diff --git a/multimedia/working_distributions.png b/multimedia/working_distributions.png new file mode 100644 index 0000000000000000000000000000000000000000..bad17fe105b01b774c63903fe3269508645d3062 GIT binary patch literal 111179 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 literal 0 HcmV?d00001 diff --git a/phitter/__init__.py b/phitter/__init__.py index 696ada6..e942af0 100644 --- a/phitter/__init__.py +++ b/phitter/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.07" +__version__ = "0.0.8" from .main import PHITTER from phitter import continuous diff --git a/phitter/continuous/continuous_distributions/erlang.py b/phitter/continuous/continuous_distributions/erlang.py index 3cba4a3..f03f73f 100644 --- a/phitter/continuous/continuous_distributions/erlang.py +++ b/phitter/continuous/continuous_distributions/erlang.py @@ -78,7 +78,7 @@ def non_central_moments(self, k: int) -> float | None: """ Parametric no central moments. Β΅[k] = E[Xᡏ] = ∫xα΅βˆ™f(x) dx """ - return self.beta**self.k * (scipy.special.gamma(self.k + k) / scipy.special.factorial(k - 1)) + return self.beta**k * (scipy.special.gamma(self.k + k) / scipy.special.gamma(self.k)) def central_moments(self, k: int) -> float | None: """ diff --git a/phitter/continuous/continuous_distributions/erlang_3p.py b/phitter/continuous/continuous_distributions/erlang_3p.py index d96f1ec..7b8eec3 100644 --- a/phitter/continuous/continuous_distributions/erlang_3p.py +++ b/phitter/continuous/continuous_distributions/erlang_3p.py @@ -48,7 +48,8 @@ def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: """ Cumulative distribution function """ - result = scipy.special.gammainc(self.k, (x - self.loc) / self.beta) + # result = scipy.special.gammainc(self.k, (x - self.loc) / self.beta) + result = scipy.stats.erlang.cdf(x, self.k, scale=self.beta, loc=self.loc) return result def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: @@ -78,7 +79,7 @@ def non_central_moments(self, k: int) -> float | None: """ Parametric no central moments. Β΅[k] = E[Xᡏ] = ∫xα΅βˆ™f(x) dx """ - return self.beta**self.k * (scipy.special.gamma(k + self.k) / scipy.special.factorial(k - 1)) + return self.beta**k * (scipy.special.gamma(k + self.k) / scipy.special.gamma(self.k)) def central_moments(self, k: int) -> float | None: """ diff --git a/phitter/continuous/continuous_distributions/generalized_gamma.py b/phitter/continuous/continuous_distributions/generalized_gamma.py index eb36d4a..6540f4d 100644 --- a/phitter/continuous/continuous_distributions/generalized_gamma.py +++ b/phitter/continuous/continuous_distributions/generalized_gamma.py @@ -53,21 +53,24 @@ def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: Cumulative distribution function """ # result = scipy.stats.gamma.cdf((x / self.a) ** self.p, a=self.d / self.p, scale=1) - result = scipy.special.gammainc(self.d / self.p, (x / self.a) ** self.p) - + # result = scipy.special.gammainc(self.d / self.p, (x / self.a) ** self.p) + result = scipy.stats.gengamma.cdf(x, self.d / self.p, self.p, scale=self.a) return result def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: """ Probability density function """ - return (self.p / (self.a**self.d)) * (x ** (self.d - 1)) * numpy.exp(-((x / self.a) ** self.p)) / scipy.special.gamma(self.d / self.p) + # result = (self.p / (self.a**self.d)) * (x ** (self.d - 1)) * numpy.exp(-((x / self.a) ** self.p)) / scipy.special.gamma(self.d / self.p) + result = scipy.stats.gengamma.cdf(x, self.d / self.p, self.p, scale=self.a) + return result def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: """ Percent point function. Inverse of Cumulative distribution function. If CDF[x] = u => PPF[u] = x """ - result = self.a * scipy.special.gammaincinv(self.d / self.p, u) ** (1 / self.p) + # result = self.a * scipy.special.gammaincinv(self.d / self.p, u) ** (1 / self.p) + result = scipy.stats.gengamma.ppf(u, self.d / self.p, self.p, scale=self.a) return result def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: @@ -208,16 +211,11 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa return (eq1, eq2, eq3) try: - ## scipy.optimize.fsolve is 100x faster than least square but sometimes return solutions < 0 - solution = scipy.optimize.fsolve(equations, (1, 1, 1), continuous_measures) - - ## If return a perameter < 0 then use least_square with restriction - if all(x > 0 for x in solution) is False or all(x == 1 for x in solution) is True: - bounds = ((0, 0, 0), (numpy.inf, numpy.inf, numpy.inf)) - x0 = (1, 1, 1) - args = [continuous_measures] - response = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) - solution = response.x + bounds = ((1e-5, 1e-5, 1e-5), (numpy.inf, numpy.inf, numpy.inf)) + x0 = (continuous_measures.mean, 1, 1) + args = [continuous_measures] + response = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) + solution = response.x parameters = {"a": solution[0], "d": solution[1], "p": solution[2]} except: scipy_parameters = scipy.stats.gengamma.fit(continuous_measures.data_to_fit) diff --git a/phitter/continuous/continuous_distributions/generalized_gamma_4p.py b/phitter/continuous/continuous_distributions/generalized_gamma_4p.py index c740bb1..abc357f 100644 --- a/phitter/continuous/continuous_distributions/generalized_gamma_4p.py +++ b/phitter/continuous/continuous_distributions/generalized_gamma_4p.py @@ -50,20 +50,24 @@ def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: Cumulative distribution function """ # result = scipy.stats.gamma.cdf(((x - self.loc) / self.a) ** self.p, a=self.d / self.p, scale=1) - result = scipy.special.gammainc(self.d / self.p, ((x - self.loc) / self.a) ** self.p) + # result = scipy.special.gammainc(self.d / self.p, ((x - self.loc) / self.a) ** self.p) + result = scipy.stats.gengamma.cdf(x, self.d / self.p, self.p, loc=self.loc, scale=self.a) return result def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: """ Probability density function """ - return (self.p / (self.a**self.d)) * ((x - self.loc) ** (self.d - 1)) * numpy.exp(-(((x - self.loc) / self.a) ** self.p)) / scipy.special.gamma(self.d / self.p) + result = (self.p / (self.a**self.d)) * ((x - self.loc) ** (self.d - 1)) * numpy.exp(-(((x - self.loc) / self.a) ** self.p)) / scipy.special.gamma(self.d / self.p) + result = scipy.stats.gengamma.pdf(x, self.d / self.p, self.p, loc=self.loc, scale=self.a) + return result def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: """ Percent point function. Inverse of Cumulative distribution function. If CDF[x] = u => PPF[u] = x """ - result = self.a * scipy.special.gammaincinv(self.d / self.p, u) ** (1 / self.p) + # result = self.a * scipy.special.gammaincinv(self.d / self.p, u) ** (1 / self.p) + result = scipy.stats.gengamma.ppf(u, self.d / self.p, self.p, loc=self.loc, scale=self.a) return result def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: @@ -192,38 +196,30 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parametric_mean = E(1) + loc parametric_variance = E(2) - E(1) ** 2 - # parametric_skewness = (E(3) - 3 * E(2) * E(1) + 2 * E(1) ** 3) / ((E(2) - E(1) ** 2)) ** 1.5 + parametric_skewness = (E(3) - 3 * E(2) * E(1) + 2 * E(1) ** 3) / ((E(2) - E(1) ** 2)) ** 1.5 parametric_kurtosis = (E(4) - 4 * E(1) * E(3) + 6 * E(1) ** 2 * E(2) - 3 * E(1) ** 4) / ((E(2) - E(1) ** 2)) ** 2 - parametric_median = a * scipy.stats.gamma.ppf(0.5, a=d / p, scale=1) ** (1 / p) + loc + # parametric_median = a * scipy.stats.gamma.ppf(0.5, a=d / p, scale=1) ** (1 / p) + loc # parametric_mode = loc + a * ((d - 1) / p) ** (1 / p) ## System Equations eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance - # eq3 = parametric_skewness - continuous_measures.skewness - eq3 = parametric_median - continuous_measures.median + eq3 = parametric_skewness - continuous_measures.skewness + # eq3 = parametric_median - continuous_measures.median eq4 = parametric_kurtosis - continuous_measures.kurtosis return (eq1, eq2, eq3, eq4) - ## scipy.optimize.fsolve is 100x faster than least square but sometimes return solutions < 0 - solution = scipy.optimize.fsolve(equations, (1, 1, 1, 1), continuous_measures) - - ## If return a perameter < 0 then use least_square with restriction - if all(x > 0 for x in solution) is False or all(x == 1 for x in solution) is True: - try: - bounds = ((0, 0, 0, 0), (numpy.inf, numpy.inf, numpy.inf, numpy.inf)) - if continuous_measures.mean < 0: - bounds = ((0, 0, 0, -numpy.inf), (numpy.inf, numpy.inf, numpy.inf, 0)) - x0 = (1, 1, 1, continuous_measures.mean) - args = [continuous_measures] - response = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) - solution = response.x - except: - scipy_parameters = scipy.stats.gengamma.fit(continuous_measures.data_to_fit) - solution = [scipy_parameters[3], scipy_parameters[0], scipy_parameters[1], scipy_parameters[2]] - - parameters = {"a": solution[0], "d": solution[1], "p": solution[2], "loc": solution[3]} + try: + bounds = ((1e-5, 1e-5, 1e-5, -numpy.inf), (numpy.inf, numpy.inf, numpy.inf, numpy.inf)) + x0 = (1, 1, continuous_measures.mean, continuous_measures.mean) + args = [continuous_measures] + response = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) + solution = response.x + parameters = {"a": solution[0], "d": solution[1], "p": solution[2], "loc": solution[3]} + except: + scipy_parameters = scipy.stats.gengamma.fit(continuous_measures.data_to_fit) + parameters = {"a": scipy_parameters[3], "d": scipy_parameters[0], "p": scipy_parameters[1], "loc": scipy_parameters[2]} return parameters diff --git a/phitter/continuous/continuous_distributions/non_central_f.py b/phitter/continuous/continuous_distributions/non_central_f.py index 8309ed2..d0119b0 100644 --- a/phitter/continuous/continuous_distributions/non_central_f.py +++ b/phitter/continuous/continuous_distributions/non_central_f.py @@ -1,5 +1,6 @@ import numpy import scipy.integrate +import scipy.optimize import scipy.special import scipy.stats @@ -265,7 +266,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa return (eq1, eq2, eq3) bounds = ((0, 0, 0), (numpy.inf, numpy.inf, numpy.inf)) - x0 = (continuous_measures.mean, 1, 10) + x0 = (continuous_measures.mean, continuous_measures.mean, continuous_measures.mean) args = [continuous_measures] solution = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) parameters = {"lambda": solution.x[0], "n1": solution.x[1], "n2": solution.x[2]} diff --git a/phitter/continuous/continuous_distributions/pert.py b/phitter/continuous/continuous_distributions/pert.py index dd69237..bc7790c 100644 --- a/phitter/continuous/continuous_distributions/pert.py +++ b/phitter/continuous/continuous_distributions/pert.py @@ -184,7 +184,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa # parametric_kurtosis = 3 + 6 * ((self.alpha2 - self.alpha1) ** 2 * (self.alpha2 + self.alpha1 + 1) - (self.alpha2 * self.alpha1) * (self.alpha2 + self.alpha1 + 2)) / ((self.alpha2 * self.alpha1) * (self.alpha2 + self.alpha1 + 2) * (self.alpha2 + self.alpha1 + 3)) # parametric_median = (a + 6 * b + c) / 8 parametric_median = scipy.special.betaincinv(self.alpha1, self.alpha2, 0.5) * (c - a) + a - parametric_mode = b + # parametric_mode = b ## System Equations eq1 = parametric_mean - continuous_measures.mean @@ -206,10 +206,9 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"a": solution.x[0], "b": solution.x[1], "c": solution.x[2]} ## Correction of parameters - parameters["a"] = min(continuous_measures.min - 1e-3, parameters["a"]) - parameters["c"] = max(continuous_measures.max + 1e-3, parameters["c"]) + parameters["a"] = min(continuous_measures.min - 1e-2, parameters["a"]) + parameters["c"] = max(continuous_measures.max + 1e-2, parameters["c"]) - # parameters = {"a": continuous_measures.min - 1e-3, "b": continuous_measures.mode, "c": continuous_measures.max + 1e-3} return parameters diff --git a/phitter/continuous/continuous_distributions/uniform.py b/phitter/continuous/continuous_distributions/uniform.py index 7042621..9ffe9d9 100644 --- a/phitter/continuous/continuous_distributions/uniform.py +++ b/phitter/continuous/continuous_distributions/uniform.py @@ -51,7 +51,11 @@ def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: """ Probability density function """ - return 1 / (self.b - self.a) + pdf_value = 1 / (self.b - self.a) + if isinstance(x, numpy.ndarray): + return numpy.full_like(x, pdf_value) + else: + return pdf_value def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: """ diff --git a/phitter/continuous/continuous_distributions/weibull.py b/phitter/continuous/continuous_distributions/weibull.py index f4f13a6..bea24de 100644 --- a/phitter/continuous/continuous_distributions/weibull.py +++ b/phitter/continuous/continuous_distributions/weibull.py @@ -209,7 +209,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa # parameters = {"alpha": solution[0], "beta": solution[1]} bounds = ((1e-5, 1e-5), (numpy.inf, numpy.inf)) - x0 = (1, 1) + x0 = (continuous_measures.mean, continuous_measures.mean) args = [continuous_measures] solution = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) parameters = {"alpha": solution.x[0], "beta": solution.x[1]} diff --git a/phitter/continuous/continuous_distributions/weibull_3p.py b/phitter/continuous/continuous_distributions/weibull_3p.py index a66d579..2b27702 100644 --- a/phitter/continuous/continuous_distributions/weibull_3p.py +++ b/phitter/continuous/continuous_distributions/weibull_3p.py @@ -199,12 +199,14 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parametric_variance = E(2) - E(1) ** 2 parametric_skewness = (E(3) - 3 * E(2) * E(1) + 2 * E(1) ** 3) / ((E(2) - E(1) ** 2)) ** 1.5 # parametric_kurtosis = (E(4)-4 * E(1) * E(3) + 6 * E(1) ** 2 * E(2) - 3 * E(1) ** 4) / ((E(2) - E(1) ** 2)) ** 2 + # parametric_median = loc + beta * (numpy.log(2)) ** (1 / alpha) ## System Equations eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_skewness - continuous_measures.skewness # eq4 = parametric_kurtosis - continuous_measures.kurtosis + # eq3 = parametric_median - continuous_measures.median return (eq1, eq2, eq3) diff --git a/phitter/continuous/continuous_distributions_sample/sample_generalized_gamma_4p.txt b/phitter/continuous/continuous_distributions_sample/sample_generalized_gamma_4p.txt index e84e7a2..7785b9b 100644 --- a/phitter/continuous/continuous_distributions_sample/sample_generalized_gamma_4p.txt +++ b/phitter/continuous/continuous_distributions_sample/sample_generalized_gamma_4p.txt @@ -1,2158 +1,10000 @@ -40,84608469 -39,19046692 -35,22087149 -42,45751728 -39,20544907 -44,80332598 -44,83267681 -34,60544372 -44,84936574 -42,25057112 -35,7314844 -40,54139987 -43,20195305 -43,10377415 -45,00870064 -53,27921912 -38,19936473 -44,93517669 -40,49491276 -46,10909625 -36,38563932 -53,49431752 -41,97947374 -49,71708563 -41,56099038 -44,67651009 -41,90310067 -39,51617267 -41,81061322 -40,81376508 -36,94798821 -40,84523546 -37,73112831 -40,19301002 -38,06737309 -37,18564177 -46,97126044 -49,46908067 -39,21808493 -55,61492388 -44,03751293 -40,0527167 -45,89720052 -51,20139717 -38,94339512 -35,3789548 -54,69990405 -43,9059534 -41,40665104 -39,78290229 -48,74582626 -38,33262158 -38,16148113 -43,5232852 -35,65863382 -44,43499311 -40,63683014 -38,96268655 -42,15600219 -40,83857704 -37,207106 -43,62545405 -52,53905991 -35,17984909 -35,81976158 -36,00081628 -45,07041752 -41,08051391 -36,07700332 -35,82773521 -37,23413722 -38,08404371 -47,19224354 -47,19716475 -39,37747405 -39,16128001 -37,95303986 -38,2640082 -41,95649679 -46,16669489 -39,87270072 -43,25855259 -37,79765973 -41,1845061 -39,49626887 -35,3855461 -45,20144485 -43,67105745 -36,82247287 -37,77119281 -47,96262509 -49,77226238 -45,16510147 -44,53907732 -44,33074714 -42,43597248 -50,37016554 -38,9265131 -37,35929218 -35,39481492 -47,42508773 -39,4792602 -40,58401132 -39,0282585 -38,38697845 -41,71000671 -47,58686885 -43,63621819 -38,64040043 -42,97029007 -41,9725807 -43,17692021 -42,70687763 -31,87664217 -43,26953785 -41,92350687 -50,47720461 -45,5599024 -42,35966152 -34,57306084 -45,29363976 -46,04808847 -50,37695194 -37,23847456 -46,55815758 -43,39978952 -41,21945176 -49,81284924 -42,03091695 -37,39625729 -36,8059662 -47,36357768 -45,83953258 -37,99323304 -39,35168631 -40,87807648 -42,07526546 -39,79561226 -34,97551406 -57,69760539 -49,8114354 -39,79606565 -34,96310824 -39,17759006 -45,16793373 -50,64550295 -42,19825865 -37,31393377 -39,36637062 -47,53189789 -42,64387545 -44,40429105 -34,64818883 -44,46743962 -34,00276649 -48,62701431 -36,95779631 -56,21961353 -45,01946529 -37,15651756 -46,45226508 -46,69510904 -43,60158615 -38,51255032 -39,61940221 -49,71354329 -37,41654743 -41,44281894 -41,4838334 -40,80219755 -40,17625411 -41,29453061 -39,2532268 -41,74243751 -36,05801556 -40,66449246 -32,65252234 -36,75247919 -38,28154354 -38,34061291 -46,38322461 -43,27455964 -41,88725991 -50,8063478 -39,92517281 -36,72631396 -37,62907192 -47,66751541 -47,600083 -43,7639434 -43,00687257 -36,62905671 -39,87685801 -39,11665712 -37,85029117 -43,86932327 -38,23072071 -42,34384221 -37,73277657 -42,02284233 -37,39275046 -36,84574605 -40,61009261 -44,34971422 -49,75562761 -38,23582135 -39,62413618 -45,77645416 -35,46166872 -32,69801531 -37,73423402 -50,70055018 -36,44812449 -43,53177481 -44,6574404 -36,50897275 -41,09173449 -39,45326476 -38,41139097 -36,62463489 -37,76900481 -43,01497773 -44,86096208 -38,09926491 -37,9135625 -43,11759346 -40,6386631 -40,91167108 -35,49488382 -38,36517312 -47,91959962 -39,93884039 -40,92267534 -41,170269 -39,04131375 -50,01171767 -48,09317658 -47,53677743 -49,5617893 -46,35650412 -39,88082039 -38,12854548 -38,97384262 -38,88087088 -37,11031641 -47,52820467 -39,1252333 -34,32014272 -43,83208367 -52,85341506 -48,98764426 -39,88665044 -41,82771824 -45,99164257 -44,41174556 -42,25060096 -38,7105947 -39,62829271 -37,56888463 -44,0740604 -39,30774719 -44,33870635 -33,84337821 -42,28686028 -38,58621785 -39,73923665 -39,93087679 -37,95380475 -41,25043652 -50,17492036 -36,59124958 -42,709023 -40,223934 -51,27889177 -53,16331052 -40,09554997 -42,10730079 -38,31207095 -53,30736161 -54,86820582 -52,24994382 -41,00427444 -43,44539913 -39,605522 -37,35987185 -43,12825574 -36,08720966 -39,27563664 -38,97239585 -46,36307115 -39,11461938 -40,68040668 -36,13141653 -38,4405757 -46,88030222 -45,40657365 -37,04105896 -41,59058534 -45,15832252 -41,33587055 -52,32281993 -48,79962218 -43,58727109 -41,7694937 -42,41457274 -44,96778834 -51,64764967 -45,91239891 -36,14544242 -39,00827697 -38,73782319 -40,06565914 -34,45788117 -37,18531486 -42,04599036 -37,27749818 -38,26382741 -39,58195628 -52,43200638 -47,78142635 -41,13090815 -40,57895779 -43,09714749 -48,26965707 -41,76338838 -38,29932219 -45,61482863 -43,17014803 -60,84676437 -42,42250502 -38,46733681 -43,26630526 -43,20303575 -38,8121155 -41,65687234 -44,01174616 -36,95131059 -38,25943124 -39,91243235 -36,52746013 -40,6969669 -48,81070904 -37,37618468 -34,90317169 -37,03766203 -36,16888179 -43,94746664 -37,57042842 -36,38513721 -37,24317054 -36,59873905 -39,14784679 -43,37739282 -36,48310037 -39,76645437 -34,47191288 -39,87495431 -35,1245729 -43,28507723 -40,98703045 -45,91148945 -38,37169302 -40,31977404 -34,00844838 -41,63484811 -42,42393336 -42,77036591 -46,43445052 -38,1780817 -39,03793819 -36,390669 -44,09759911 -42,3248319 -43,53546424 -35,31336613 -44,1778684 -59,46338736 -35,41981814 -39,03483865 -35,57001435 -39,93627822 -45,28546968 -42,07385389 -38,42187117 -43,07473491 -40,48157549 -42,07043572 -39,55529488 -43,67017267 -42,58724622 -44,33655295 -45,39692341 -39,53157174 -38,13834216 -36,25418828 -49,66953256 -35,13409031 -43,62269638 -39,88953676 -41,76834689 -42,15700301 -37,47445056 -38,71675779 -45,63134466 -41,77189988 -41,70757806 -40,41060852 -50,09032014 -38,57389325 -45,39382379 -37,53439218 -50,10081714 -47,73685231 -40,1636897 -40,47808986 -43,55900017 -42,43415331 -45,71792204 -43,31067784 -34,14603728 -38,5023765 -43,55357633 -39,26118802 -36,68062044 -49,50532793 -39,25422569 -40,12856592 -35,91061443 -42,09077384 -43,68677464 -40,67076435 -46,44988696 -41,8378762 -39,40952092 -35,84476278 -42,97460955 -39,28362404 -44,86433647 -61,45305124 -48,66973181 -36,16101072 -37,60323504 -37,93968435 -37,93396297 -45,62310324 -44,67608421 -42,29654396 -38,83642402 -36,8743144 -42,50351208 -44,3953733 -43,39106564 -39,24775404 -34,92087534 -45,12744271 -39,66213716 -42,40763107 -40,73916777 -39,72758869 -42,21845654 -41,57070847 -40,4169647 -41,17659394 -38,78806134 -42,54195625 -46,39996897 -37,32030475 -43,18812139 -40,495201 -36,74288473 -41,87171209 -41,50629413 -37,44789708 -36,33700525 -38,18853253 -46,50256447 -38,89578633 -34,22570439 -42,51925967 -46,35832569 -40,64971487 -39,29106651 -43,53802354 -36,88050783 -40,95870608 -36,2111855 -44,82999413 -39,83552939 -40,65208375 -54,4861154 -49,39879985 -45,30325589 -42,0598609 -42,94905155 -39,66585176 -41,55419296 -46,86326588 -44,45498671 -34,8427792 -34,75623434 -41,06913072 -45,57573058 -40,60281172 -35,6833728 -44,93804416 -40,72005989 -40,27031297 -48,209469 -36,80610562 -38,30382929 -41,65620235 -34,34962081 -46,9727103 -39,53027615 -41,48101059 -34,8427877 -44,32158721 -41,75815044 -37,25280291 -32,44711804 -38,91476491 -42,36675985 -44,76604104 -40,26759365 -47,68217411 -39,77448069 -41,50277135 -36,0887315 -42,99234641 -34,27807178 -42,32701937 -44,07345652 -37,62324657 -40,98047509 -39,61746136 -40,38627141 -57,14014891 -40,20186153 -38,96820962 -44,14479643 -43,22938483 -43,4231472 -41,75731842 -45,91522657 -41,94286266 -38,88124544 -39,9371763 -37,22790937 -34,84561336 -36,84656931 -59,12848538 -48,69019494 -42,52004581 -49,83338984 -41,58441023 -43,19004288 -53,2909225 -40,9865573 -43,99025287 -43,98842296 -45,31739469 -42,92922072 -43,95824159 -39,21953987 -43,67583273 -48,10825719 -34,16961581 -37,94922177 -44,08293855 -35,78716797 -36,88903697 -39,04509851 -44,22136196 -45,71852869 -38,73428033 -38,25840823 -39,7391596 -44,62238683 -45,95321203 -44,16463558 -45,12015713 -37,39319148 -47,80204089 -45,00680885 -45,59775709 -38,5164046 -44,17489604 -42,19136875 -37,00530496 -41,98432829 -42,77657477 -40,32303978 -42,06887281 -42,28458999 -43,34014397 -40,95759351 -37,81051709 -41,67739301 -40,22333344 -44,00291516 -39,3039252 -38,49697322 -38,64606777 -39,46843275 -33,15165897 -45,79182567 -55,68109624 -37,87808697 -39,15433215 -37,56258221 -40,1420149 -43,85901967 -41,32839787 -37,90631945 -40,90467684 -46,70753931 -50,61854301 -36,44351368 -42,51001411 -41,57553096 -40,37594304 -41,43079775 -35,56118483 -46,73081822 -35,22065159 -38,47328267 -37,9288076 -34,07516025 -38,54821455 -42,28936196 -38,73580499 -45,69829971 -42,20947307 -41,44627214 -43,36167949 -42,40732588 -39,11040964 -38,7467136 -42,16385426 -40,32545251 -39,85619357 -36,47584921 -46,14863244 -42,18843997 -46,88871593 -35,91760193 -38,47328003 -49,15115927 -47,03697536 -35,24754186 -42,09902844 -37,00550018 -42,73121875 -47,00819772 -42,82153839 -41,60026156 -37,67466997 -39,49502363 -35,30153591 -43,49443544 -44,4438917 -45,62444773 -40,42919165 -51,79506253 -45,22965834 -39,60781895 -37,46857889 -36,52584072 -50,87596026 -47,18320631 -39,18792688 -36,78516894 -42,11880093 -40,91770188 -36,2977476 -33,0411134 -45,12819457 -51,46380915 -34,28252051 -41,20343932 -42,73088261 -40,68354857 -42,03129072 -37,24006591 -37,62731093 -51,85307154 -39,69256224 -47,93567408 -48,25328482 -47,96720381 -50,58717576 -44,85888652 -44,13290086 -37,94465487 -47,45563757 -50,50674019 -40,31813333 -33,09616697 -44,35249932 -38,90824529 -42,01647031 -37,04096234 -36,82867999 -39,41911383 -41,8895169 -44,38451274 -38,0198044 -42,24257589 -43,14830096 -42,81335735 -40,52729389 -42,16900869 -41,70046264 -38,1926799 -38,3206922 -57,48470662 -44,62212229 -41,78020948 -43,91320405 -42,37703537 -49,14607137 -41,91690174 -48,82484242 -44,37313296 -39,95201525 -36,34207242 -34,19710581 -39,09259227 -34,12374819 -47,9387292 -39,36528717 -39,96423613 -35,19131789 -34,99750534 -40,78576319 -45,92888719 -45,44829026 -38,63371026 -47,53528807 -41,81133948 -39,42056727 -38,97021406 -41,83208068 -41,43891994 -50,5513516 -49,55231735 -41,58547068 -43,10302435 -46,29700506 -36,44209 -37,86478699 -49,07354631 -46,37434445 -37,15521742 -36,72897864 -44,84524015 -35,0365516 -38,12554172 -47,60645303 -41,13750929 -32,57366012 -50,98075832 -43,18255294 -38,51661575 -39,39436817 -38,21670123 -42,82183469 -45,52420377 -48,60233937 -47,90710701 -37,24965649 -36,95591887 -32,61562586 -33,46532167 -35,3351633 -47,89127919 -44,89224327 -40,67688851 -52,68575182 -53,60240127 -35,62791876 -57,48289494 -46,99499817 -43,11698399 -36,12445844 -42,7545414 -40,6928072 -41,13307668 -39,2357398 -47,768054 -51,77689379 -45,3091773 -49,09261305 -37,66792646 -39,38765464 -38,0761036 -52,47149821 -34,48462745 -36,97202469 -42,31937254 -47,60745362 -40,32006284 -39,87119586 -47,94165687 -41,11679153 -42,41854992 -37,65269963 -38,67060073 -46,53609821 -44,91330924 -42,8618253 -47,29500314 -41,22014237 -40,16469034 -48,44358527 -40,88619984 -36,45707327 -43,03663874 -46,59841047 -44,04033238 -44,29790765 -40,63562057 -40,23242433 -35,12377385 -40,74173263 -37,72609055 -38,78262751 -32,78302176 -43,31462902 -45,0900751 -45,58610739 -34,73579735 -43,8545217 -36,76021736 -43,01583042 -38,01267186 -43,58467992 -41,64586365 -40,01097244 -38,65565768 -50,16742777 -38,22989243 -40,42703972 -36,14969304 -46,27003876 -37,08089281 -52,59929967 -46,76439161 -42,66673474 -35,99659457 -45,55579882 -44,94611342 -44,48036968 -41,52999785 -40,50215893 -43,19351572 -38,04200129 -36,99731566 -54,75806943 -35,93011713 -36,44872766 -58,71421642 -44,27306052 -43,73519621 -38,95487661 -48,19739151 -48,67918186 -40,80609403 -34,45223832 -46,08445023 -40,72378445 -37,70864299 -38,32155774 -40,86425337 -44,90070225 -40,11409163 -45,46498665 -42,91962182 -45,43314473 -51,33564265 -42,19270402 -41,75789028 -37,09429404 -38,25705818 -55,36136935 -48,88906598 -47,7698519 -39,84344878 -38,58870709 -39,3294536 -40,49396602 -35,15632741 -47,46866768 -43,97428626 -47,01785623 -47,67095888 -36,97426221 -41,6408648 -36,20452707 -36,15999864 -42,67049659 -51,63699569 -43,98910022 -42,26363776 -36,6797694 -42,11869959 -35,16413932 -39,63892603 -44,19260618 -38,0578701 -33,2821052 -51,42626831 -46,89925149 -41,60099881 -44,35711124 -46,14246028 -40,03478559 -43,60027809 -47,61156701 -62,42434667 -35,56926887 -45,4220516 -48,92428313 -40,51241251 -36,42815088 -42,81534668 -47,34699626 -40,29680861 -36,45544012 -48,66643215 -34,52417361 -60,59473818 -41,63245075 -39,01596585 -38,56623852 -44,5231665 -37,98318394 -39,71266436 -41,87269687 -35,55112705 -40,02787724 -40,54064986 -44,73612291 -34,14857669 -48,55475517 -36,31086029 -38,99711425 -36,33259401 -37,04609776 -46,87248551 -40,09264203 -47,19041622 -40,59889128 -42,48482564 -42,96166163 -35,90849163 -42,90230847 -40,88376152 -48,72900659 -42,48847105 -45,7411944 -40,01205705 -37,46584396 -42,270352 -40,62835765 -37,81083256 -49,9367883 -39,58226945 -38,88405202 -41,56345398 -32,92999555 -38,04617563 -40,62181782 -47,67929372 -43,5430115 -34,91544728 -34,47974381 -38,47621141 -41,40954981 -57,61579151 -37,82466042 -42,47623897 -36,48784138 -39,87733529 -39,71157808 -33,35745681 -40,53288534 -43,27016971 -43,61389436 -34,65317205 -39,89471414 -35,92877163 -41,47938952 -38,61098428 -45,95348191 -41,57123182 -39,48888633 -45,16524512 -42,35990614 -40,71850325 -42,99308242 -38,99695201 -38,63261054 -38,20019865 -47,27073471 -42,73588045 -38,9635682 -40,13938633 -46,44016334 -36,80682828 -42,70171134 -45,42403722 -36,91335375 -45,04240636 -38,47055724 -36,83546801 -41,18212828 -38,75017326 -40,1020099 -38,13050514 -50,16307623 -38,10286305 -50,35595284 -45,08989933 -40,80761498 -40,96763158 -48,16242483 -37,62742964 -45,05980042 -38,89380845 -40,30158031 -35,22186723 -38,21893324 -38,95094042 -41,75076648 -37,02944763 -37,32537813 -33,37563433 -52,61319218 -33,93401399 -48,51051197 -38,85398341 -48,00030097 -47,32738801 -40,85917661 -37,98297965 -36,10822386 -48,47828089 -39,47869805 -46,36977263 -41,60320354 -41,13514387 -41,90072443 -37,69984546 -45,53782387 -35,73720153 -40,97125597 -36,90043482 -42,49189988 -36,53119331 -41,02316317 -42,42512011 -52,56197518 -36,20731221 -39,60527485 -43,3507933 -49,73708772 -38,60827666 -43,88838046 -42,49475856 -45,68745876 -43,1379274 -36,64278595 -47,37137622 -39,49614789 -34,67109874 -39,9697755 -43,13411281 -36,0346759 -52,04283273 -37,95192544 -42,86119789 -43,19047698 -36,92373648 -36,20105529 -43,22666338 -36,29834203 -41,65960526 -38,58576699 -37,42070957 -47,79982079 -36,19766754 -42,29345232 -37,94112073 -39,85285295 -39,65645515 -38,77763177 -43,2613673 -42,93805501 -38,52182739 -44,09180433 -37,89314063 -45,47978693 -42,69554408 -43,35043137 -40,16352068 -34,66078869 -34,09500895 -46,19566791 -35,74672933 -40,92635841 -33,00919669 -51,2778508 -42,52218813 -36,16068197 -33,51376065 -45,13791645 -40,2451923 -38,3882184 -40,34220734 -41,98942062 -49,0762742 -38,4918171 -44,10286409 -46,34938691 -42,93283721 -35,96640146 -37,108523 -42,10574994 -39,74447921 -44,41575319 -33,91985602 -43,2828956 -40,30385628 -46,71808227 -39,1780178 -38,691321 -42,35006376 -46,08896975 -46,3941032 -45,61260278 -39,06758924 -41,35728726 -43,8503859 -36,6000395 -39,58815143 -52,09044381 -38,59255015 -52,32316828 -39,06992906 -36,38685166 -45,28261934 -41,34434838 -41,10515957 -37,02491645 -34,654677 -41,80550746 -41,64990179 -37,02541684 -33,62051899 -40,68958133 -56,96993465 -39,94243175 -43,61637722 -45,63778948 -37,54934102 -39,60447821 -34,44141382 -39,25275635 -39,14211559 -41,52475713 -36,92426425 -36,09525179 -39,77070718 -38,06570699 -43,49477737 -44,55003773 -42,31496184 -40,88223451 -49,22999925 -38,9350632 -44,42825784 -43,7493341 -41,9474775 -38,06894636 -42,88132168 -44,90668838 -42,49633269 -46,05105303 -45,27178387 -45,06735492 -34,58303243 -38,74376277 -59,87793913 -34,67987219 -45,6485895 -45,45499905 -48,2916255 -37,44839664 -41,85727847 -37,25595161 -45,34108177 -39,52831118 -35,16395343 -41,91385386 -38,81292727 -43,2801038 -38,16248957 -44,97784256 -49,37085409 -43,83690055 -41,33699472 -48,40312188 -44,20432483 -40,20473174 -48,57447264 -43,9605616 -42,59563791 -39,0314463 -41,59179067 -47,0275266 -42,05030911 -44,07857023 -48,39332598 -35,10010048 -41,97782657 -39,81511199 -40,04783901 -40,33164625 -40,86329527 -39,6646536 -39,85672006 -45,2171824 -35,74804286 -39,96865147 -37,09791648 -42,96523363 -40,44746176 -51,2395978 -33,88614261 -43,08570943 -57,4429737 -45,68442847 -42,60551066 -41,63980977 -35,96712213 -37,41317222 -36,20451338 -49,53652032 -44,7486969 -38,66196473 -41,32556679 -36,0338673 -44,68149528 -50,51454617 -39,2600822 -37,47667273 -33,31191935 -43,02396244 -45,02164859 -39,77998025 -50,31737193 -40,64372149 -49,55948428 -41,80226252 -40,22764473 -35,24017422 -41,87107966 -43,40730283 -41,26963018 -34,55598838 -44,4693917 -34,38023443 -44,89590172 -40,3146876 -34,92329321 -36,8101142 -42,47992347 -42,98361663 -40,85873218 -46,76412708 -40,67565002 -39,78151411 -37,15908219 -47,85634752 -44,98044553 -53,32829223 -40,06703832 -45,50270131 -36,80433031 -47,54394648 -42,28503904 -40,46745888 -40,16314121 -38,9343794 -44,63688291 -39,08279037 -35,80370659 -48,51068563 -40,61559856 -42,22395651 -39,76180034 -40,08975184 -50,0049862 -39,23998297 -37,17451352 -38,0834035 -42,61027235 -41,53309643 -43,80652525 -39,40809416 -39,66785221 -39,20355267 -39,35308557 -39,73742752 -43,99342798 -35,41360924 -48,3744419 -42,08568634 -39,69428698 -46,47351837 -43,85919738 -39,71122095 -42,43838232 -45,78856555 -40,67522873 -40,16969135 -38,14126291 -36,87446066 -37,35145313 -43,22705562 -36,43626938 -34,53882735 -40,41975294 -41,97526072 -45,89448156 -35,96119347 -47,93580205 -39,81149724 -38,65450417 -37,68458616 -38,06182585 -40,3819878 -60,46182345 -46,31948131 -35,44275996 -34,26247751 -52,98777587 -32,30758059 -38,60325411 -44,69160785 -41,06648937 -37,96224399 -43,86581514 -38,59056332 -38,32920414 -45,94995938 -47,09311345 -43,36845406 -37,88519362 -38,19366703 -47,45376979 -38,46464704 -34,69185273 -47,40748114 -40,13185404 -40,83430384 -62,56287786 -36,21132546 -49,53619005 -43,50579575 -37,81478355 -43,65379624 -37,6453686 -42,26559236 -36,97383861 -38,25147507 -43,78700249 -43,19212681 -38,22919915 -37,93820824 -46,86177073 -41,16140617 -45,40996368 -50,64776363 -50,24317553 -54,56163172 -39,77279394 -43,59909797 -43,05439635 -39,41046358 -42,33557172 -42,62721047 -39,65501411 -47,45356612 -39,34405208 -39,82010654 -39,3756991 -46,13976302 -36,13662873 -41,18564764 -48,73679559 -47,66006194 -44,28409319 -50,19967822 -43,54325778 -52,23990688 -41,09297035 -39,82008976 -46,13981012 -41,065441 -52,19483083 -40,41728742 -40,35287492 -38,90708081 -36,56093366 -38,74869315 -43,03538058 -37,87785638 -49,58790276 -57,67375318 -41,23202327 -37,62436241 -35,38438426 -39,02725772 -38,95815738 -45,44567637 -35,63306049 -38,5298281 -40,58559529 -43,84472738 -34,31249799 -41,4765136 -40,87188471 -36,85448241 -36,27807145 -36,01112119 -48,83199691 -41,62284229 -44,96489918 -40,59771453 -49,03396436 -36,11836749 -44,24664669 -67,3960055 -43,51001029 -41,07251665 -46,17556528 -44,43185726 -43,62217884 -38,74863946 -37,48261608 -41,30769162 -41,49267654 -40,46681767 -36,42724967 -42,06345771 -43,23619001 -36,65065487 -44,25797502 -39,02569209 -39,11103341 -41,22678708 -37,65963924 -35,86091625 -44,03798508 -47,83964048 -40,8230885 -42,71862364 -41,15024791 -42,76699034 -37,18231785 -39,97300319 -44,14117099 -41,73054181 -41,66713727 -38,11646466 -36,24072408 -43,13932193 -43,11823395 -41,06559911 -39,31422911 -46,23649662 -35,81269628 -37,86186241 -42,61002286 -42,31408742 -43,4703112 -44,14125537 -51,10983413 -37,13497283 -54,10633739 -39,68372135 -34,20101239 -37,4335803 -44,70039464 -44,41634632 -35,7081889 -40,19260993 -40,20075861 -41,36247668 -45,20050229 -50,5589787 -46,62993622 -33,4254768 -47,86368228 -38,52742319 -49,53712138 -35,8660657 -45,22012824 -37,55137867 -34,68421048 -43,41180034 -38,5122931 -38,78221892 -45,33909493 -41,14511475 -34,13806908 -46,73709908 -53,85623712 -46,20686803 -37,7824473 -42,94720058 -45,51082646 -45,90760522 -45,37926722 -39,81801755 -39,8107753 -44,92324457 -38,25703397 -39,51695265 -35,4120406 -46,93506082 -37,18650383 -33,13675262 -47,38246323 -41,51501665 -37,61217461 -39,81078523 -43,84328574 -43,17188262 -37,64632776 -36,52141043 -44,87009729 -41,37326547 -46,82208572 -36,18578745 -51,14243975 -37,53739483 -39,85294981 -45,02257103 -41,26514849 -46,25041812 -43,49894393 -39,32773148 -40,64423966 -36,63966899 -34,65337574 -42,32276582 -58,34811231 -43,20254937 -42,41375327 -38,06596558 -34,3222541 -37,32902696 -41,38723016 -41,62870228 -48,92246993 -48,71542639 -46,85498707 -39,16716894 -46,47710002 -36,52608387 -37,44608825 -37,24019656 -45,41518391 -45,66550659 -37,76843224 -34,80779771 -47,92095834 -35,97593941 -48,09599111 -39,9027958 -38,57132844 -35,82745626 -41,8493284 -46,42492207 -48,02751526 -38,84356263 -40,14794451 -44,50735279 -34,62295245 -43,0972575 -48,02558361 -53,82958879 -43,527915 -40,16570494 -42,66033124 -52,97042076 -41,88458475 -45,00564264 -44,88452159 -47,49111249 -38,93315226 -42,02978657 -43,08630432 -41,90218532 -37,94918576 -45,18533234 -40,52362474 -39,62404829 -37,50193447 -41,72276043 -44,55635392 -36,2997656 -39,79047015 -39,56159627 -39,79578207 -36,27334409 -44,94374234 -42,0794381 -46,62802447 -43,52831206 -33,34149866 -47,01769084 -40,62093807 -40,57096448 -44,48796526 -48,13961414 -36,2265178 -39,28194477 -48,45272126 -40,12777019 -43,58214856 -39,34754187 -35,04585174 -37,63112052 -38,91811428 -43,4861157 -43,2168813 -47,76104026 -44,0443523 -36,11772702 -40,47934666 -36,29635376 -40,03357063 -48,98588994 -40,01872523 -38,46262161 -40,4782443 -44,37408184 -44,45388616 -42,74990255 -37,88200323 -52,90474358 -39,75778247 -44,70035015 -36,06020832 -46,7389349 -42,2383617 -39,7506812 -45,21545677 -47,03356748 -53,52933256 -43,10029179 -52,33366915 -53,69794123 -49,09921906 -43,0413265 -47,0648813 -37,91208813 -37,3335819 -40,09340462 -44,93206997 -43,33395874 -56,45554687 -42,98114193 -43,98058232 -47,96503679 -37,50339419 -42,01536178 -39,07350884 -38,17879802 -42,05829608 -33,79094373 -37,26908425 -49,1427379 -38,33347939 -47,37822355 -43,19502535 -40,43470699 -51,09848468 -39,13373911 -40,03672559 -48,58008633 -34,16432806 -35,49942112 -46,80311235 -43,30605539 -48,99643349 -47,85416525 -41,14756569 -39,32513863 -40,66333988 -41,81068784 -41,67222774 -38,05013109 -37,12259034 -43,50836692 -48,40310478 -48,44822264 -38,66287311 -40,975115 -52,56114182 -42,63578664 -46,72019406 -37,23412517 -36,2521058 -40,87625925 -46,38180954 -35,84339535 -38,18667222 -36,97243371 -42,5703692 -34,22623144 -62,49431373 -46,35820687 -47,0841639 -35,40129954 -34,90177602 -35,48988729 -41,86830126 -43,61267375 -40,16958276 -37,3480156 -45,7381079 -39,95024414 -44,47742429 -44,20358383 -48,06525979 -42,88567549 -47,98815331 -39,56454151 -39,03886489 -53,920258 -41,07852807 -37,55277223 -50,43724579 -45,84640215 -45,21330567 -38,07742369 -36,39262757 -35,79572866 -41,58661579 -40,19239256 -37,22426306 -51,17411672 -40,14953719 -37,76115616 -50,93041436 -42,82599513 -40,44413645 -41,62064023 -38,58616335 -37,3083309 -41,64174645 -36,28146295 -48,52584454 -40,00971258 -37,85851268 -54,39184515 -37,2910006 -44,1076826 -42,78842933 -35,36889528 -44,10633598 -38,63321135 -42,92116658 -42,19067804 -43,06789118 -45,43978734 -40,08931653 -41,15657466 -43,78513404 -40,04867006 -42,171239 -38,6757385 -39,04084637 -54,25282441 -40,52622577 -41,01726542 -41,92532275 -44,2839979 -42,97269978 -42,16288187 -41,77449967 -37,17246402 -41,16982717 -62,03563066 -45,30038765 -48,11007679 -40,19005335 -43,02953492 -38,28494431 -41,09340349 -41,50161702 -45,82651255 -33,96903104 -46,61030049 -45,0235521 -43,7225401 -39,95467057 -40,18021964 -41,11134827 -42,88558481 -43,64232613 -45,45935727 -43,71082832 -42,47106229 -54,90257235 -49,07670965 -41,67935733 -41,15446991 -41,43441207 -35,44272985 -42,73509454 -40,04095793 -42,75315198 -34,83257687 -48,60338174 -38,11345868 -33,58391789 -41,20331421 -53,79796904 -41,39691995 -50,33112683 -37,82849232 -41,36939607 -53,485755 -35,92780176 -43,01472407 -45,48231181 -40,45648814 -37,41534757 -37,52227224 -52,63395164 -36,44461557 -47,11411787 -47,99812542 -43,26829783 -38,5756152 -37,57434374 -46,70095426 -51,04650431 -33,92081912 -43,77887153 -40,67347374 -37,62448402 -37,37997573 -41,42145788 -43,1140669 -33,90869313 -37,07523836 -38,00570823 -38,40797511 -49,54120388 -46,16396934 -43,56964069 -39,03538531 -41,76453726 -37,81274264 -44,54872664 -40,70177866 -44,43597365 -39,5281979 -37,95255768 -45,45316562 -43,15634923 -48,7383187 -47,13145869 -39,59691785 -37,83746997 -44,61346289 -44,34879983 -37,89731268 -43,66085241 -43,23751505 -44,12943298 -40,28282315 -42,77649667 -43,87559739 -37,2968333 -39,75955827 -49,49235455 -45,5694821 -53,511387 -43,52593283 -42,27255335 -43,03765544 -41,53464526 -35,61487907 -46,11791637 -41,80532196 -39,35554834 -45,30067707 -44,80766182 -46,75638412 -38,54278985 -32,6399517 -35,82455105 -42,66944985 -49,64143874 -45,9470036 -36,3909546 -34,21264398 -43,61086214 -36,1499162 -39,2589544 -51,74293768 -34,12672131 -37,98955877 -34,31149988 -41,0715961 -51,22457853 -44,53867764 -33,941157 -37,7177204 -41,3092939 -48,1770948 -51,97543135 -46,48974843 -41,73835238 -45,96312501 -34,21539377 -35,27181503 -39,1668703 -39,99933681 -40,20015428 -37,86910311 -34,97524406 -42,96943337 -48,47093705 -52,36438336 -54,95955025 -38,93825673 -50,75116064 -34,15989818 -47,4944393 -47,19520785 -48,60939387 -40,75210433 -45,12808384 -35,89355332 -39,76387809 -37,51873699 -45,53218666 -39,3307839 -46,33745191 -39,69204489 -37,23444236 -42,13226017 -41,28716634 -39,23157248 -61,05104293 -41,13572341 -41,63095404 -44,92875132 -50,73053724 -47,82977082 -32,3574598 -44,51212494 -59,64932532 -46,51480126 -45,87768846 -39,71295691 -58,00252925 -51,3407986 -39,80482956 -38,62544771 -37,8560622 -47,12895296 -43,91408152 -47,70074963 -41,49436672 -40,27760718 -35,56108095 -39,24109004 -37,20150523 -48,90243847 -46,19953994 -40,15029579 -40,29007864 -43,85775179 -39,8944176 -38,96637193 -48,12742841 -42,28382849 -42,76653957 -44,31994268 -37,95046296 -52,45100139 -36,65224986 -34,31172362 -40,20972836 -35,96520906 -37,53619514 -33,81196131 -42,32333402 -40,76606103 -36,58931626 -43,02133018 -42,3810856 -40,80072482 -35,47610322 -39,55370557 -50,3387008 -38,53870229 -43,7518106 -41,64058238 -59,76304048 -38,20936645 -49,93245303 -42,51479488 -41,92796025 -40,59947876 -41,83649336 -38,97957246 -51,33549479 -39,62637972 -51,38993046 -42,46088387 -45,58012742 -38,69181481 -37,64706081 -41,73261979 -47,46465465 -42,67662448 -34,78783651 -37,02731899 -39,96525243 -49,56089957 -44,80167881 -36,16090059 -38,03336584 -41,69662434 -41,24780582 -38,51364381 -41,60635443 -47,77729328 -53,09298965 -48,41590387 -49,83088044 -46,80808002 -40,55922734 -37,99076185 -35,45990121 -38,37557833 -44,95253824 -43,52496249 -40,99471422 -48,84962214 -47,41978036 -40,47821306 -45,47865897 -36,78202986 -42,53535431 -43,66214972 -41,24539848 -35,54117947 -35,55230631 -48,7004384 -43,88681636 -41,44112497 -45,01051579 -45,48913927 -39,80911075 -38,16219601 -44,59748437 -35,66277287 -38,42440345 -44,03948088 -44,52144093 -41,38891261 -39,55974175 -41,44005863 -39,33444294 -37,9376337 -45,08944807 -47,69364918 -39,09933237 -34,31225703 -36,97371404 -52,13418858 -39,29678906 -41,51014733 -40,07024964 -46,01835615 -40,81523344 -40,27214894 -38,32325803 -40,33541323 -37,54155774 -37,06235667 -38,26264476 -50,33333138 -37,77466396 -41,29463763 -38,0845133 -46,29023442 -39,02069661 -38,04669608 -42,84955784 -52,83573741 -37,61827899 -44,24469549 -39,8611027 -37,26423692 -40,78826328 -36,10171034 -37,21178805 -45,47467612 -43,15383756 -35,10049212 -34,63272766 -49,4112327 -39,78986894 -41,50819687 -35,94442524 -44,85883973 -49,16977999 -41,22886898 -41,04424082 -41,81177464 -44,44454465 -43,18590327 -38,80152366 -39,6989138 -38,46571114 -45,34267057 -36,35798778 -42,45782292 -44,94347303 -44,82132512 -46,86006395 -42,24204033 -35,52501374 -45,6561741 -49,54040402 -38,40356041 -39,76496446 -40,48003434 -37,51755187 -42,85629101 -44,74043046 -35,4835614 -33,94657843 -34,51455218 -37,27994116 \ No newline at end of file +122,94048894 +125,74996987 +121,71554669 +122,71556265 +128,46734076 +127,22183680 +121,32501149 +126,73877044 +131,07518870 +125,59698788 +120,95583549 +128,86950459 +132,05625308 +122,11020993 +128,60124479 +116,29719798 +129,53708337 +130,28594511 +128,77110430 +120,32225783 +126,29772515 +126,79505632 +129,25734436 +126,26260192 +130,74192425 +126,67643041 +124,90754637 +128,65337288 +122,11211294 +123,93497080 +124,72481508 +128,77533367 +125,58621318 +128,32801106 +122,11920360 +125,54032206 +123,48753173 +121,74795103 +122,66506676 +126,11702049 +131,42241028 +129,97436747 +123,42474704 +120,98429858 +127,56970735 +130,35135131 +124,93603871 +129,27814971 +130,97848910 +130,47749863 +125,22310806 +123,33362159 +124,84035276 +129,27574327 +130,91231500 +130,20854645 +130,41476576 +126,38945193 +121,57051754 +122,34533135 +125,79433296 +131,53138060 +133,80085367 +122,22611703 +121,57781324 +124,76880591 +127,20529839 +129,70618951 +125,14257747 +124,64753462 +120,08485322 +130,64344956 +123,64297304 +128,43173015 +126,65578526 +129,85578244 +129,21138893 +130,34277602 +118,23076448 +126,76294191 +130,98893500 +130,35304413 +121,59986580 +126,38983482 +123,12269943 +124,69184156 +129,70850637 +129,49691119 +125,50298578 +114,49176307 +129,09923396 +129,27411980 +127,92831313 +127,76217937 +112,78044454 +126,71372229 +129,77730757 +125,62755489 +115,55143051 +132,87426236 +125,94453100 +122,95352843 +125,73302259 +123,81010836 +132,93442631 +131,57186792 +126,04390859 +128,97243224 +122,45059906 +128,68082855 +131,16450983 +127,55756593 +130,54676091 +125,73848299 +126,43411442 +130,89611251 +123,41605041 +123,40987146 +121,90485460 +129,19202547 +128,00575627 +124,86846848 +126,80632656 +124,88066691 +124,03099694 +123,90227055 +121,07730894 +124,02848429 +127,62567899 +127,85020427 +131,18994577 +126,27802204 +122,07399343 +127,71251176 +129,67656778 +125,85851761 +128,39781287 +128,79506720 +121,67572506 +123,05961137 +117,12294790 +130,75168464 +124,50774723 +129,25075604 +123,18459824 +131,03330037 +127,49802807 +123,73812869 +123,85718850 +125,08639376 +128,59998359 +127,50820841 +131,08548323 +123,57154841 +124,97176948 +127,85141823 +129,36061437 +129,41131910 +124,97024915 +128,88410416 +126,12944349 +118,68542153 +127,83260177 +127,40554399 +124,71933744 +126,14263340 +124,00312357 +126,02483585 +127,03534404 +128,01494582 +124,30988996 +120,97455025 +131,11989512 +125,81996688 +124,03362565 +125,76750795 +128,91928578 +130,55563902 +124,54692080 +128,49658901 +130,91705196 +127,16813369 +126,24418509 +126,53940201 +126,74468153 +126,67447893 +130,03327589 +121,06414854 +124,19620700 +127,24593048 +126,20634101 +122,71229909 +125,09725311 +122,90514108 +127,31946398 +128,02846459 +125,45995100 +121,81852504 +123,94902077 +130,34900830 +123,32238304 +124,22357485 +129,30302153 +128,45223010 +123,76702528 +130,45861895 +129,33672780 +125,85250879 +132,13361758 +131,20096256 +126,76766258 +126,52722447 +118,85614971 +130,73160058 +123,30020617 +127,64845810 +128,01984832 +127,29400525 +121,94485451 +118,37264994 +128,86702383 +122,62346059 +120,54492289 +124,97347244 +115,37545055 +119,50861449 +131,33396646 +129,84715476 +126,73359253 +126,99844954 +118,93450546 +125,73430862 +128,38113115 +131,48074850 +125,67354383 +124,52941001 +124,92917366 +126,76565679 +122,36470584 +126,84624319 +125,81036577 +117,73461992 +127,91132134 +130,98820748 +123,15794731 +123,87106916 +122,54921449 +129,54350123 +127,49552726 +127,01471688 +127,84910322 +127,89469414 +130,15744509 +122,15652202 +130,53211466 +129,01224303 +120,83225065 +130,09672234 +129,37592021 +130,39994021 +130,76573945 +122,55512049 +116,07340055 +129,96704706 +125,36289011 +128,36839141 +122,01776426 +129,46058167 +126,72076657 +127,96673518 +130,43392738 +125,81444686 +129,80394978 +125,40915165 +121,10374577 +128,66877576 +123,74032064 +125,90313627 +127,92048097 +134,64133998 +127,37784099 +125,35918808 +124,98924219 +125,53979257 +125,91375348 +121,11279951 +126,69234777 +126,59414358 +121,67943814 +131,58861505 +125,71505767 +129,77076803 +126,26720104 +120,74188175 +133,66398776 +128,22656470 +125,55210008 +126,60059758 +131,46264619 +131,26434687 +128,20063111 +130,41954223 +114,70068087 +123,28006582 +116,17160392 +121,50399457 +125,67654808 +131,63954925 +126,21850489 +127,45715606 +126,38456176 +129,52454303 +130,09794806 +127,38371102 +127,15614934 +127,08582381 +117,31724211 +128,20050312 +130,57896315 +124,42635822 +118,57669219 +130,24496360 +122,33440071 +126,49275573 +115,94742597 +130,78009037 +123,69298814 +120,76416853 +121,96568037 +126,09754925 +122,11647961 +132,13718868 +111,12747779 +128,52484699 +121,92453857 +124,90270402 +122,96052986 +130,01672315 +119,76063798 +125,95802493 +132,62238416 +118,00509584 +126,77938782 +123,16273098 +125,00366676 +132,51355888 +124,07364520 +115,76936765 +129,69252584 +124,44899634 +124,14173094 +115,91442293 +123,10694170 +117,56186686 +122,65608184 +126,37476138 +127,64705692 +118,15033937 +127,98239749 +121,89545980 +125,57196546 +128,52111177 +130,12067975 +128,26654789 +130,18639978 +129,35960017 +118,78495646 +130,43150430 +130,46064485 +130,00322286 +125,53226031 +128,52429394 +131,15343326 +129,57918930 +130,99351799 +130,75437651 +128,86818310 +127,67325509 +118,73286554 +126,18354970 +127,70039241 +118,87060472 +131,23629934 +129,76194330 +127,85481811 +121,24120852 +124,97173905 +130,36843965 +115,35055052 +127,19472332 +129,22439125 +117,27645339 +121,26876197 +123,73455611 +121,43379283 +125,35967272 +126,36186488 +129,51804164 +118,11730970 +130,71236730 +111,17891863 +128,94574211 +126,35912578 +111,91426098 +126,50153890 +130,79356953 +122,88937522 +129,86143139 +126,13195743 +131,85886592 +130,09807132 +127,27145821 +132,49846087 +117,00718898 +123,89115051 +131,28320919 +130,95087913 +123,76618198 +127,07161760 +127,33725869 +125,19004437 +127,78086226 +131,89143259 +126,65069962 +127,88275488 +125,07678883 +124,99306457 +121,84891100 +131,95068588 +119,76172496 +128,87458203 +121,66926071 +124,17481542 +131,62027985 +129,26811324 +120,97577216 +127,05292272 +121,82520458 +129,65924599 +126,48921341 +127,81035896 +129,27352728 +123,56780756 +125,96145360 +125,77717865 +123,55841591 +118,54562698 +124,26731432 +119,64784261 +121,59459906 +129,66066786 +124,47428689 +128,53294113 +128,61378593 +122,78701590 +118,31008383 +130,53910844 +125,76850586 +129,99139596 +127,00151249 +127,55392276 +125,84784823 +127,09935654 +124,09892473 +129,18426892 +122,26035452 +129,32789247 +123,40305949 +126,55071410 +131,51872742 +132,37767857 +126,88368864 +127,70974043 +121,23969847 +129,99248401 +123,94958367 +127,61061897 +125,03132971 +132,69378531 +127,96659683 +126,14843384 +125,56986938 +122,90114018 +127,44830724 +131,83476110 +123,79942853 +124,21939072 +123,68065613 +128,31287012 +121,87898533 +119,16127025 +124,35328652 +128,80137630 +120,49892040 +129,06542448 +132,13777354 +116,54455209 +122,15520858 +121,39308167 +123,16605085 +126,70966933 +127,54396360 +114,62371811 +114,64107435 +126,77508855 +121,05754739 +123,86301788 +109,20055844 +131,68561890 +126,59863180 +122,80782771 +126,54327843 +126,51455629 +127,33487676 +127,07619697 +130,88283131 +129,89467889 +129,36092752 +125,61055390 +129,67723857 +123,37216181 +125,96988605 +130,18946164 +131,51462792 +130,54094232 +125,59254442 +131,60202828 +129,48831085 +128,95087975 +128,86879067 +126,52458960 +131,73477346 +132,39981077 +128,16378826 +122,77515816 +127,56002662 +129,51616705 +126,73513871 +125,00659059 +128,81482173 +122,85807448 +129,06608098 +119,95094207 +132,34735012 +132,46573310 +122,44187515 +127,29457556 +124,46059833 +121,85659393 +130,31976682 +125,04446965 +126,55369420 +125,50043143 +122,75029503 +117,28105622 +131,79149266 +124,55206775 +115,71161639 +126,37356920 +124,75568113 +126,26362195 +124,27985241 +123,59026146 +118,92760519 +129,27572731 +121,67091910 +127,35098550 +124,56977086 +123,75374131 +129,10706651 +127,26300612 +130,56586066 +127,26927128 +125,13646738 +127,40484989 +127,62905802 +129,14033053 +128,47680908 +132,53974191 +118,69294013 +119,40586361 +114,64318993 +128,98162059 +128,80896363 +124,67416161 +131,42833898 +127,87864264 +127,15203107 +126,02018688 +126,36889128 +127,01311001 +129,84503241 +130,46385128 +122,89188379 +126,06262346 +116,24918182 +119,63045434 +127,57352523 +127,00501474 +126,08071130 +120,93067186 +127,30692777 +125,18661534 +128,11083950 +127,09494054 +126,18434101 +124,87191645 +120,49614238 +121,09618098 +127,12837565 +119,90952432 +129,98455374 +126,59067351 +124,32523124 +130,71414852 +128,27252273 +122,64417380 +126,93758878 +128,49022545 +123,85496657 +131,48206425 +125,77957032 +132,97473564 +124,28974044 +131,82837748 +127,03105846 +117,11104646 +126,78987668 +126,78149789 +118,61687152 +111,36186342 +129,04791158 +130,97402780 +114,99794790 +125,90861951 +120,47623425 +124,14317376 +128,56081655 +125,51405745 +123,76290150 +129,05879384 +127,49601388 +124,80464965 +126,78184813 +127,29720922 +125,51990634 +127,16643301 +128,18042665 +125,30479304 +119,81000266 +124,79394045 +130,04423175 +126,74293162 +130,30290589 +119,15753700 +126,98878878 +129,08990845 +127,55555315 +122,88517996 +130,50485425 +127,08466814 +125,95978486 +122,16031285 +126,08181582 +128,05994422 +124,83075260 +117,42956501 +124,24556562 +131,13247378 +126,40848498 +120,99322722 +121,94341488 +123,78256599 +126,64429730 +123,26280287 +123,54983247 +129,16688712 +124,84367844 +125,84620610 +125,93325196 +130,67995477 +121,59820977 +127,83703701 +128,84608885 +131,03988206 +123,08686667 +124,23706339 +112,59079481 +128,62514051 +125,63415597 +118,52287527 +131,10680626 +120,84577880 +128,50050613 +126,73235257 +118,53942149 +127,92040752 +129,76771809 +124,11059093 +128,19144245 +127,65034273 +122,97386905 +129,67337333 +123,43678602 +127,13749404 +119,76568627 +127,87852985 +128,27358181 +124,57268251 +129,06016902 +117,98787820 +128,91010896 +122,25273585 +130,71446879 +123,92338871 +131,06547978 +135,19904247 +131,25676350 +129,49047961 +129,81271501 +125,70657646 +127,93443180 +126,55334636 +130,77365993 +125,05297186 +127,77112221 +120,39776655 +131,68505390 +121,96767564 +119,44348322 +132,04687565 +127,14407274 +133,26045388 +131,95384625 +123,70622056 +127,32383010 +128,97817375 +129,85579052 +129,62420705 +121,14159456 +130,20354067 +130,40739299 +121,69378890 +124,39169905 +130,16373822 +132,93196394 +131,53600411 +132,31402967 +132,95539816 +131,51984760 +126,45129036 +118,56810936 +122,70759373 +126,09961440 +120,45677104 +121,50982124 +115,27657577 +126,03766426 +128,07836023 +126,62200476 +126,19774405 +123,61496313 +127,10461974 +124,25546550 +118,82055838 +114,86717853 +124,69596476 +117,76734659 +130,11995065 +132,06692453 +126,95981729 +111,84974241 +131,38951260 +126,92544719 +124,32162743 +122,86060245 +125,49808376 +127,38032931 +118,59875800 +123,66003487 +125,97708688 +128,96254939 +125,09605778 +120,02174645 +129,45824821 +133,94338430 +127,59637418 +125,72065596 +122,45963889 +130,40524707 +127,28488004 +123,06829089 +111,77061911 +127,60238849 +131,15331813 +132,04944102 +126,66129003 +119,72480037 +130,08603838 +129,51403380 +125,44764666 +128,49741697 +125,64479616 +130,28611600 +124,73983598 +130,57813883 +130,06122847 +129,15431185 +128,36023702 +125,53691752 +122,51002391 +129,21183773 +125,94089621 +125,23401455 +129,27475445 +125,23524468 +122,50438703 +128,20342997 +128,09526760 +122,61858708 +130,29532721 +123,82179278 +129,56654724 +128,05953114 +116,26190475 +129,72069819 +127,52558758 +121,76309105 +126,77708901 +126,84214442 +125,28839417 +123,89252903 +130,52636777 +123,59916992 +126,26811127 +129,64515358 +120,03026794 +129,87890626 +124,00613221 +119,46636380 +124,59385289 +122,98466335 +123,57326225 +127,17927522 +119,38017904 +129,37991074 +126,95351904 +127,96519503 +130,50666763 +130,00927665 +130,92560769 +126,18466722 +121,07321754 +127,94420585 +129,55392327 +130,94467908 +126,87659805 +124,85876803 +117,86626482 +126,66791075 +128,31721435 +131,93003316 +123,18643016 +128,72646478 +123,14210820 +125,45100223 +121,84458289 +123,12981372 +120,76455895 +125,43555463 +129,52730148 +125,47448048 +120,63242027 +122,51816260 +124,84805265 +126,07753057 +125,43142323 +118,85675945 +111,50940574 +124,88637384 +121,05349917 +127,62863816 +128,10029681 +128,62439350 +127,31342598 +128,49019063 +122,61300063 +123,56027683 +119,85188499 +122,78038826 +126,77131390 +116,60391310 +126,37469084 +125,67091085 +129,70672368 +128,36113638 +131,37986994 +124,57459141 +121,94558461 +116,17572164 +129,98923778 +126,63555480 +123,72476633 +127,44232550 +127,92578542 +127,81523151 +122,38405835 +128,10828578 +129,98492963 +120,76037091 +125,94389267 +122,36413935 +123,23982659 +128,63877936 +127,84036412 +127,76819749 +132,37029490 +129,03742110 +128,08739347 +123,88603466 +125,58101839 +125,21448146 +129,34140304 +127,06558193 +129,84544160 +126,06851545 +130,62111398 +131,13170925 +128,77309608 +129,21604956 +129,25869432 +125,00489482 +123,62229846 +129,71407729 +131,19548196 +125,52895870 +124,66821520 +129,75959349 +127,43014197 +125,27740320 +132,13281910 +130,89167005 +132,09561507 +126,55320638 +123,67077872 +123,32576991 +126,15511289 +126,50152854 +129,61583601 +125,06168059 +128,91080601 +123,07395289 +129,58821872 +127,81759861 +129,12812418 +127,59942937 +129,49119224 +122,97706681 +126,18735987 +124,71425773 +126,15100465 +126,24315736 +121,84825050 +127,28175101 +130,39299095 +118,66003194 +128,76557835 +123,15025522 +130,64419586 +125,55459776 +128,39099915 +124,13195951 +122,05428319 +130,25455082 +124,99874003 +118,67173796 +121,87920626 +126,63278849 +126,53072887 +129,22591414 +129,35313164 +129,28372243 +126,26092504 +117,70029265 +128,17799746 +123,41926870 +132,88962650 +122,24591795 +115,20681396 +120,20895186 +128,39414127 +121,17188290 +116,65358952 +121,79649994 +129,01093542 +125,16727770 +124,78551045 +130,08114711 +118,39773971 +119,81886087 +123,11668857 +131,68006491 +122,05759675 +128,67233941 +129,41068030 +124,69193436 +128,22630513 +126,66469148 +130,38220753 +112,27141737 +127,16994498 +126,12450655 +132,16899133 +131,44350440 +128,15462133 +117,83290363 +122,00957397 +130,10887386 +125,27245853 +128,25328769 +125,03516942 +123,23158809 +126,83997405 +128,71571985 +121,58054971 +120,93982386 +122,32761730 +122,24053398 +123,66900889 +134,67869008 +127,96117346 +126,98023717 +130,11096544 +129,90438253 +127,68347007 +126,66279345 +132,27336247 +127,57399979 +120,66855539 +126,97296079 +128,83201545 +130,04986017 +126,23292896 +129,51287394 +125,61851710 +131,38575123 +129,82777388 +129,44631860 +124,53607769 +128,76085628 +127,11382228 +123,06432731 +128,90824824 +127,14917696 +127,41202979 +130,30935868 +119,13046599 +131,96954094 +128,37910925 +129,72258045 +130,30044150 +128,00126849 +122,74716891 +119,19554951 +129,26380020 +130,02493854 +131,58634878 +130,65174099 +125,75876238 +127,47304021 +126,46097098 +133,13596843 +128,99141174 +128,57359122 +131,45610197 +131,62067605 +124,34147071 +122,63021586 +122,55262708 +126,13205199 +125,37224200 +126,73355559 +129,82945655 +132,31247816 +125,85268808 +122,85388445 +126,81294778 +116,99140495 +124,54804059 +129,79948907 +126,05470230 +128,84490442 +122,75940607 +116,58863169 +121,19122961 +128,73362562 +131,98415973 +127,20859135 +121,97004796 +128,90745046 +124,99813541 +123,14821433 +127,12391983 +130,60533659 +123,00912118 +123,67847000 +129,24982266 +119,80601080 +123,87390765 +130,42504905 +127,48625840 +112,98862013 +127,12386953 +123,57993396 +127,93930174 +126,36266575 +125,75177582 +122,93657921 +128,48822594 +121,89010208 +125,94438867 +128,39820773 +125,26650848 +124,34771207 +130,77620309 +128,05639819 +129,43934175 +128,06690730 +129,16477479 +129,59487872 +122,40429677 +123,63949481 +126,06109135 +123,46660548 +128,12176034 +119,01514726 +118,67408208 +127,10304369 +120,68106168 +128,44576558 +124,07997688 +128,41028706 +120,01584958 +118,21419924 +129,71395371 +124,59032964 +127,52661514 +127,19321409 +128,23722986 +129,19723509 +128,53129411 +120,16267264 +114,75013022 +128,90642305 +126,53193409 +129,61300715 +121,86237775 +127,55435479 +129,12497866 +130,10024563 +128,00588845 +114,61786769 +114,19405160 +118,74253732 +129,36194656 +133,97317955 +127,78120736 +126,73296410 +119,44605608 +127,58404978 +132,01652873 +130,66320461 +127,65353234 +123,71422701 +129,47687347 +131,06856872 +124,53821835 +121,61659227 +129,45069518 +126,74573105 +128,59636167 +127,65602535 +128,02460677 +128,28080440 +122,27984095 +124,46069697 +127,75735727 +129,33778116 +124,17621822 +123,41958633 +116,35464004 +122,58817389 +127,88690167 +124,59164685 +116,51228102 +123,75310526 +124,72543389 +116,58349649 +123,22111164 +124,24017519 +131,59650466 +125,71827999 +126,51867551 +118,23184451 +124,43489985 +123,97992208 +127,21979190 +131,09233479 +127,68875302 +130,42966819 +122,18675784 +127,28068515 +115,81364723 +116,41693703 +133,22685410 +128,42216327 +128,03779737 +130,26983711 +126,11618428 +125,84489309 +123,24860134 +125,64564170 +129,00506012 +116,53081969 +127,52641107 +125,78815450 +128,28909042 +131,19938792 +129,20879512 +126,07587098 +129,13690655 +123,18565569 +122,27892485 +127,13570602 +121,15236211 +125,66863654 +124,93276228 +124,95641151 +117,96777296 +124,34728331 +127,92082973 +127,41948275 +120,94599413 +129,77145342 +133,48393239 +125,97331551 +118,08123439 +131,47066437 +113,47330387 +126,15551165 +129,86235415 +114,68887474 +121,98564631 +120,06882404 +131,59802452 +131,54575879 +129,00439227 +123,40445585 +127,70452929 +131,49136407 +126,23936998 +126,45476921 +129,61789418 +125,67969358 +127,46044867 +128,84755494 +128,88048198 +129,33739895 +125,22319664 +128,71234943 +124,32660832 +125,64275427 +120,90252093 +130,71133009 +127,21742925 +125,22908573 +129,77532493 +126,45748607 +128,83337684 +128,64308598 +130,42991658 +125,64567408 +131,22500701 +128,82383295 +127,39390243 +130,46482643 +131,89405425 +129,98553508 +130,63286659 +121,46620923 +126,69347381 +127,18482728 +129,31312321 +119,00657465 +129,55522988 +123,97054759 +127,28111992 +122,03365939 +119,42149953 +128,47514792 +128,41639155 +131,52959188 +121,49933817 +123,23690214 +126,51104590 +130,60052005 +130,39916768 +114,98930431 +124,69483200 +127,15613550 +123,40898123 +130,49090953 +122,00495428 +129,40575805 +128,38170761 +129,06225363 +134,73686919 +112,89845993 +122,89060178 +129,08046256 +126,46522988 +129,83812408 +130,44147321 +120,21864086 +121,94613887 +131,87829907 +130,94292376 +124,00491957 +127,62343485 +129,47390975 +131,35603986 +132,19504551 +121,69463520 +127,00033270 +128,23506213 +132,60037217 +133,16060321 +124,87633072 +127,72457040 +128,67737917 +128,92511371 +132,67076860 +127,79418159 +114,51268860 +131,12816567 +126,07798639 +124,95625223 +126,25186279 +116,85270469 +130,26938141 +131,62264409 +113,59676389 +130,96612584 +128,60699663 +126,13110492 +129,09145476 +128,29637338 +126,17118268 +120,23850820 +125,30450827 +119,29827150 +126,43409399 +128,14238620 +126,76472157 +124,89001116 +132,19471491 +120,33284458 +120,41757575 +123,89764721 +124,12557695 +121,28533283 +130,60164983 +128,53348223 +124,70009806 +125,06237834 +123,56259357 +127,06273604 +129,73215742 +119,90159618 +127,43964504 +126,42285804 +117,15190752 +120,23897188 +124,14975132 +121,05261936 +129,36962022 +125,15395847 +130,90699890 +130,31202907 +123,25878712 +133,02980564 +125,62829783 +128,87637499 +129,46455914 +121,73795260 +122,65434296 +131,30551041 +126,86466569 +127,28928601 +123,70928133 +118,62881685 +126,14613753 +123,11157316 +121,10093722 +118,80029607 +132,96861685 +130,50715617 +127,22165052 +122,44435280 +128,54407861 +116,28439411 +130,75157041 +119,41117932 +129,62832800 +123,96963191 +130,92334463 +124,59551053 +119,97374669 +130,84203488 +128,24384531 +124,39110726 +130,72157641 +125,23584436 +124,64882615 +122,40243801 +126,96706935 +129,93234314 +129,40835199 +123,68473020 +131,08657658 +123,84210978 +122,99611719 +128,98762892 +113,66279613 +124,15957072 +131,81725670 +121,72515644 +127,93630289 +132,30170913 +131,88787467 +125,86631418 +127,51196952 +127,69463372 +125,16565412 +123,79467829 +129,01169890 +125,71957185 +130,71343096 +125,91815158 +116,50875266 +132,63843196 +123,51906306 +126,30908700 +130,15841878 +126,70680481 +129,32315332 +124,94024837 +125,14896235 +129,96038305 +125,02103152 +128,23032660 +117,48731364 +125,45967155 +125,81103274 +113,10746225 +122,17402074 +127,08121725 +118,28479649 +127,24471774 +124,36522745 +127,69021390 +125,91697582 +129,70155835 +121,67733949 +124,62034389 +128,66358147 +119,58299240 +127,52407043 +131,98192778 +124,86050288 +129,69728585 +127,03471115 +118,26149652 +129,86128323 +126,37788573 +130,03560297 +128,14757310 +126,07246346 +122,79664897 +118,00751656 +126,58910372 +119,98986633 +123,22706989 +126,89428396 +123,55732192 +124,89593190 +125,38163735 +126,44970678 +130,48548245 +129,58634867 +111,10460224 +116,04443481 +114,58780593 +124,33094196 +116,14282889 +126,77082382 +121,55742341 +122,87809702 +130,80868664 +128,98826094 +119,12434890 +127,40568885 +129,38917117 +127,43925615 +125,18179202 +129,73915159 +128,89010014 +121,68764114 +128,18610609 +129,32743823 +120,95648278 +124,23463820 +129,44237333 +128,15500275 +127,31885858 +129,41275406 +126,89191857 +121,10026744 +123,79740755 +128,90903806 +128,79131294 +128,64654578 +133,25096897 +120,74772755 +124,17123573 +129,75644514 +129,70461530 +127,01180346 +124,28975654 +123,43669382 +129,24054604 +122,40653424 +129,99806125 +129,72004845 +121,75127643 +122,13019227 +125,28846541 +129,44690945 +129,99036553 +129,09610775 +119,46138146 +118,63521644 +122,42480625 +116,71892332 +124,48107774 +130,98316020 +128,14583760 +127,26853639 +129,55739717 +124,42894754 +132,09587246 +126,80473516 +131,92869434 +127,62783746 +117,32232863 +125,17821966 +122,69384673 +126,88756412 +127,78855877 +126,14284281 +130,56705353 +121,16133512 +132,36294414 +125,90084451 +120,41171017 +117,92283331 +117,33479632 +127,12079933 +110,83357469 +123,88799145 +123,43964307 +130,87913677 +121,64848395 +130,37351325 +121,38969767 +129,03323260 +124,01299563 +125,03095253 +133,51809642 +127,00106340 +130,66609099 +127,95480075 +130,44238407 +128,57675177 +124,76011899 +127,34536692 +126,12107926 +128,35289673 +128,64866099 +119,71440348 +118,14340509 +125,54695088 +130,76365134 +130,30691184 +129,27051427 +128,66707283 +127,00191100 +127,17066301 +128,23205026 +126,61883855 +127,67586385 +124,02869701 +113,69921763 +126,78734399 +120,64147719 +117,55904287 +128,61209810 +128,42720174 +122,63810821 +132,40279398 +129,21544074 +122,68701122 +131,04846573 +117,15375273 +131,66001115 +131,70929138 +125,96831353 +130,19914541 +132,49521363 +123,97440424 +131,91589524 +128,98340942 +124,38765097 +118,67435541 +126,38130987 +120,22094543 +117,71358584 +121,62816162 +127,18712677 +114,02781858 +124,96336600 +130,57752738 +131,53796275 +133,10219820 +111,93161800 +123,74362487 +125,66970560 +126,36864900 +128,67454540 +126,15907238 +131,55288494 +115,73835818 +122,45370335 +123,47430231 +121,18618144 +129,21406930 +125,69304494 +125,20297998 +125,97512638 +127,24498816 +111,25745215 +129,32730726 +123,56156832 +129,56657879 +121,53962845 +130,66235836 +125,97479610 +124,76820494 +127,94224517 +128,18394863 +122,55065651 +123,16660887 +120,55824462 +125,19909761 +129,80508051 +134,37336307 +127,27955964 +129,59059708 +122,61340279 +131,07521395 +127,58158809 +123,52840799 +127,25427044 +130,43127661 +118,33530418 +133,16318596 +131,90636033 +121,56454397 +125,61515851 +129,43153303 +129,50786153 +129,91736402 +124,79706391 +128,76614874 +127,37795067 +132,40547262 +126,37681140 +125,15613162 +122,59238916 +132,73450543 +129,66630260 +125,06734099 +123,49453552 +133,23238220 +126,32727418 +127,99152187 +122,88213524 +129,41221804 +121,60140200 +121,12443057 +129,28017284 +126,82469340 +122,93731741 +122,53027718 +122,09519525 +131,14197224 +117,74523122 +124,28369229 +129,57142135 +119,04041827 +132,15523010 +124,29061915 +128,88359630 +129,13008334 +114,17263841 +116,79271222 +124,28992675 +128,53965230 +128,56041691 +127,06718655 +122,13176142 +129,47947056 +130,71808550 +127,89345366 +133,42671308 +131,96634486 +122,28330764 +113,67891674 +123,90705022 +119,14440655 +124,65014919 +125,72064941 +130,59166572 +124,02469504 +131,97069576 +119,03874404 +126,38397393 +126,31217014 +117,12069104 +128,19093153 +123,57763034 +126,71322951 +122,29983008 +124,03258487 +127,57248773 +131,09930315 +123,16465642 +128,83281529 +121,14279911 +125,65276984 +120,53078953 +130,83999463 +128,77058732 +131,30294222 +129,22878354 +127,31770347 +129,18324690 +126,30938865 +129,11165336 +127,40301777 +130,20850686 +127,13920161 +121,45575346 +120,41318784 +129,34146958 +128,78243981 +124,75897788 +128,78760642 +132,89775036 +125,01024175 +121,09588736 +123,02352545 +127,65604431 +126,17624701 +127,80096707 +121,84014132 +125,78289669 +129,39581285 +128,08328018 +125,11608318 +129,23056264 +132,44148157 +120,40676573 +131,52366373 +123,86050345 +126,24080659 +129,45577459 +121,15318331 +125,19954883 +130,06410363 +125,79203281 +128,55711057 +127,08412904 +121,78399241 +128,07337065 +125,27489567 +128,57258606 +129,73498129 +128,57883488 +126,79252542 +128,20926949 +129,81037346 +128,48822456 +131,95640904 +122,10885396 +130,43001913 +124,14835855 +126,01859497 +128,76421758 +109,26949416 +125,20005554 +129,93673709 +124,56168013 +126,60410207 +129,85367102 +130,69489324 +129,38584788 +126,12191591 +121,53690271 +126,22437987 +131,26518907 +126,98784296 +130,18393516 +127,16350681 +132,54013255 +121,76485125 +131,96063237 +120,63394524 +122,57802144 +124,61716262 +114,41752830 +119,67615910 +130,60377422 +132,02886055 +124,25914474 +129,33323187 +126,78626405 +119,37586285 +119,02302549 +126,96357057 +131,09622168 +127,05918581 +132,97385778 +132,16890724 +127,56536261 +128,22599508 +127,42146509 +130,25517832 +130,26889351 +130,41540631 +128,59294826 +125,79788894 +118,91599369 +121,25370718 +124,88943694 +124,81597749 +118,23764671 +125,21508160 +127,07977028 +128,83173883 +127,33816569 +124,71105299 +129,43278766 +131,03471100 +116,96426423 +127,25244704 +118,06741417 +131,40171316 +124,62398872 +124,25682646 +120,97423242 +129,33696777 +123,49955321 +128,94254267 +124,53499162 +127,41199291 +120,96297537 +129,49263446 +129,89984702 +130,47086795 +132,07287762 +125,61410455 +132,39574531 +118,77108798 +128,39546171 +123,37976372 +132,10180382 +127,49277483 +132,15699193 +122,26890158 +117,59994091 +120,36060859 +130,09519658 +128,15924975 +123,19690804 +128,42367718 +125,95357579 +121,89349727 +118,62380123 +128,32148794 +124,78391605 +128,03813566 +130,33782771 +129,33971610 +130,97860315 +124,26876173 +120,92480693 +119,00163249 +129,30165296 +126,97135991 +127,83122247 +118,14997786 +127,55553916 +125,74791541 +130,01650397 +118,57102464 +122,00711142 +131,45577560 +125,51323256 +118,33952351 +132,46390215 +121,65769970 +127,21779537 +130,91259228 +115,24887462 +131,44032133 +121,47848032 +130,50856646 +132,09712552 +126,98120652 +128,89968235 +126,20683659 +125,08954137 +129,49618195 +129,68745182 +124,00306217 +130,54833716 +129,66804250 +130,21048789 +117,98064489 +129,91885579 +126,46796368 +130,52232053 +121,88477535 +126,07363684 +127,59020493 +116,44220733 +120,25070635 +128,80181014 +129,14192668 +123,47973988 +118,23594462 +128,10343702 +125,01212231 +132,78242023 +117,57033526 +124,84185313 +125,13752580 +122,23438791 +125,90707520 +129,40006983 +129,28460302 +130,43146813 +126,23807409 +131,50170053 +128,52829162 +131,34519393 +127,73661528 +122,93624849 +124,66548415 +122,32457049 +126,28801587 +125,90226320 +129,18667476 +130,63256096 +126,93925764 +127,84735005 +119,40331576 +125,09920550 +117,49387679 +127,54154542 +128,09346484 +125,16537995 +122,50085868 +125,86357417 +131,49707559 +114,75145685 +130,21626325 +124,99083405 +129,98367173 +123,54850474 +118,96930845 +129,66145999 +121,22818705 +127,26061559 +122,89886766 +123,08658428 +130,07699918 +112,07173610 +115,49471547 +114,04791774 +121,93374015 +128,00230237 +130,87822793 +126,77474942 +129,30494166 +121,12793398 +125,15512480 +130,53266145 +127,74634804 +128,36888904 +125,90009220 +124,99229403 +130,24127025 +124,68382717 +126,95998978 +128,87411157 +132,56685818 +130,46027824 +125,51434158 +127,21907592 +130,43657146 +120,82332393 +126,76787324 +132,63093386 +126,62407352 +115,15007130 +128,37877907 +126,90873932 +126,28887042 +127,06162364 +127,01739315 +130,08486537 +127,78582985 +128,78455491 +126,81781996 +124,44586205 +125,32991778 +123,95056866 +125,50576677 +128,05483535 +128,04431779 +129,99847634 +128,67292615 +124,52725479 +130,33232941 +126,08653809 +124,85151299 +128,32148045 +127,83710641 +133,65588076 +122,50232685 +121,12225013 +120,62080761 +123,39997944 +129,56872318 +121,28342263 +129,34409847 +129,45205180 +122,46770857 +126,83602852 +130,98907310 +129,03345298 +128,22479189 +126,35090800 +132,02099176 +126,66271269 +126,69342624 +121,97821178 +125,92814066 +127,16164418 +125,46424010 +123,56027587 +115,45103004 +129,27968917 +128,75986852 +123,81208125 +127,20320542 +127,34540891 +122,55247238 +129,09047590 +130,92086521 +128,28188580 +128,70559065 +128,98347613 +109,87007893 +127,46922388 +123,50991327 +132,72696632 +125,35273913 +125,95371455 +112,89795021 +130,17607525 +131,63127493 +117,90614452 +130,41702030 +125,21912912 +127,45097476 +115,34000686 +130,78154233 +123,73211042 +130,86015747 +126,17595482 +120,55275232 +125,92566088 +124,86717438 +131,97593058 +131,94091479 +120,41381608 +127,80746272 +127,14375780 +122,78733535 +130,92873539 +130,13713978 +126,03207006 +124,39590928 +131,17423063 +125,32288452 +121,22844157 +124,39249888 +128,07545545 +129,05882593 +122,80866229 +125,49474316 +128,64153488 +129,13926519 +121,02705503 +126,33603792 +125,60752415 +118,40563314 +122,90801471 +123,99646176 +121,76331526 +124,37544968 +119,73199572 +131,22162830 +131,09944063 +124,96434283 +130,40253802 +125,25298694 +128,30363856 +123,98050276 +125,32007458 +130,99203467 +128,57893246 +125,75410272 +123,55236359 +119,00749585 +115,97994529 +125,54693030 +125,15495214 +126,49696359 +130,27047142 +123,24387486 +118,55512791 +127,31138057 +123,09906956 +129,83717737 +120,43858742 +129,96438709 +115,58423923 +130,61431422 +127,63158772 +124,14887504 +131,21093627 +128,86985579 +124,59625401 +124,51249916 +124,22666484 +118,48434241 +126,08931893 +130,51575979 +127,79501902 +122,98742386 +122,21107629 +123,32500326 +129,87826481 +123,91423742 +123,98975029 +127,50835612 +125,90644751 +127,66426039 +123,86233541 +127,50797470 +124,81185813 +126,06796122 +132,33048138 +121,28727820 +113,80828892 +129,08273846 +113,44850570 +128,14832139 +124,64066297 +124,14500168 +128,72193059 +120,92266696 +125,23866553 +126,91304797 +124,68948888 +126,25825537 +125,75895479 +126,82078344 +129,61990626 +128,76361118 +128,83302929 +128,03181948 +123,60894895 +124,57781023 +121,11245778 +127,00294165 +119,84270144 +129,76101840 +129,46584987 +126,11056788 +128,00648615 +128,29786157 +118,57158354 +133,31892062 +126,22497647 +127,87577887 +125,02297677 +125,90027564 +128,77191192 +117,90462991 +121,99192346 +129,95814413 +123,18120813 +126,27137324 +129,31258193 +126,22757084 +123,42261820 +113,60191119 +126,86147465 +125,39893517 +125,57788847 +126,81032488 +123,46730671 +126,85452600 +125,38888706 +129,23563937 +132,77378852 +128,31379029 +127,10676669 +123,69486316 +115,08976406 +120,62819819 +125,36022018 +131,98221619 +126,37530929 +128,02896520 +131,06307552 +118,09517132 +128,51219322 +126,08775345 +130,52366990 +127,35493820 +123,51515672 +123,41306001 +127,18392826 +128,50050830 +121,42346168 +124,65584638 +117,33469655 +122,81607418 +127,78698983 +119,76647676 +122,91424268 +126,47562853 +130,57596253 +121,98048925 +123,88124459 +123,76501659 +126,07638085 +130,45553147 +126,36783152 +132,26272570 +125,49370473 +125,58344362 +132,03973188 +126,87425094 +129,87491874 +128,32857107 +126,24587559 +127,84231801 +127,23518093 +119,61186029 +126,97177832 +122,79063520 +125,34586577 +126,43196992 +132,30977488 +130,79325473 +121,58544521 +125,80995950 +125,96589199 +117,30934936 +129,68485450 +121,94023878 +126,92851736 +124,61249176 +114,06730706 +128,34196953 +130,18023025 +123,94432111 +125,70798125 +121,55769900 +126,74503294 +125,57271143 +121,66766344 +123,06171832 +127,79845121 +112,08903203 +127,10536674 +126,94533606 +118,44961891 +127,35732488 +124,31405111 +128,06022492 +129,13490572 +126,35912811 +132,73471117 +131,43233236 +127,72599508 +128,52313052 +118,81216551 +126,55714099 +123,64978549 +124,23291401 +129,21697621 +126,27086086 +122,93955179 +126,85271197 +124,39064033 +123,13425424 +123,66161311 +133,45254230 +125,80407381 +120,33206427 +127,91046058 +128,24811153 +125,84473943 +116,80709374 +117,87000816 +125,78476698 +120,94682141 +123,45463044 +124,26595471 +119,30039617 +127,10060038 +128,11789991 +131,29987715 +126,21875128 +123,42133571 +124,59266848 +127,80783049 +123,42883976 +127,49662141 +124,63752071 +115,87969038 +124,26664371 +129,19431294 +125,90772232 +129,17207483 +128,32511159 +120,46479253 +118,02734910 +119,55127339 +129,55304667 +134,08747235 +120,25317127 +125,30412906 +124,24196860 +131,48370674 +127,72518253 +128,76123381 +127,07950260 +125,60230668 +120,23706383 +125,25720827 +125,90370075 +125,60787695 +132,00934765 +124,39432152 +123,02132420 +125,77837810 +130,79577345 +126,15661545 +121,57539291 +124,75441953 +121,18247301 +123,68561065 +130,56770904 +128,54242533 +129,80970027 +128,96648092 +116,27922945 +126,98349691 +128,10957794 +128,04732471 +121,25545961 +124,19504255 +128,95620126 +127,35550150 +131,40730505 +128,77969976 +125,54256188 +126,22168030 +129,83344865 +124,95268931 +126,25908391 +127,70287773 +126,07510000 +129,32330129 +126,20316252 +123,00208735 +117,96819901 +128,58633399 +126,94223845 +124,90125602 +126,81969916 +127,36359669 +126,63566398 +124,67563583 +129,20678797 +129,98313167 +127,68838999 +117,00332043 +127,18049844 +125,47693593 +125,05240335 +121,69112094 +127,76443333 +125,96420191 +128,10109007 +126,30744614 +128,00433524 +128,67156746 +128,17468194 +114,56247593 +123,69010286 +126,10174370 +130,79837807 +128,91373705 +119,62499143 +128,30653477 +127,28663338 +127,08756358 +118,54892677 +118,59121535 +116,65525206 +128,44685658 +129,62147838 +128,14553063 +127,97352444 +127,90540865 +121,56665725 +120,85958394 +130,53035784 +126,82351123 +127,37413818 +127,85562759 +122,77257155 +122,22824651 +128,70749489 +127,02785267 +128,54738805 +121,16052530 +130,12574629 +126,32328255 +129,64751906 +121,58508973 +120,36654159 +125,60633134 +127,79151591 +116,09175176 +113,50714971 +115,39224961 +127,08124169 +128,05672294 +124,58137359 +131,05475994 +124,45336607 +113,15861031 +126,09590686 +118,49721435 +125,93060419 +123,96660402 +126,72079324 +128,15910465 +125,70374878 +127,99320813 +116,34035328 +123,43844786 +127,26200797 +121,35557432 +119,90188193 +131,91984722 +125,89495344 +122,94572931 +127,09793537 +127,03240044 +127,34197905 +128,63573420 +123,48512492 +126,87688025 +125,09192358 +126,96479905 +118,49285549 +128,78393035 +122,54168421 +126,16820057 +122,16074209 +130,79218410 +117,73109595 +125,81995570 +131,57096633 +127,08899202 +128,90132724 +130,27079050 +129,02655090 +126,19927417 +127,16420577 +119,62034972 +124,90074078 +128,53468614 +126,56614381 +116,46088591 +118,06328239 +117,15362601 +124,53971017 +125,68965196 +125,28848999 +127,66301652 +125,37784974 +122,30882516 +125,27145089 +130,01715518 +129,32697741 +127,56540230 +120,74544959 +125,18857818 +121,04873881 +126,95537665 +124,03847729 +131,20750844 +123,87261808 +130,94041234 +117,93512082 +117,79271664 +122,45770027 +125,88727700 +131,15196333 +128,08112549 +128,35485777 +128,34136550 +121,67985706 +121,21282283 +122,35063616 +127,12382659 +122,83507313 +122,87016260 +128,95782177 +129,22251457 +121,81784986 +127,78243287 +123,56811743 +129,67728770 +127,18135215 +125,84960277 +127,20025363 +121,24801485 +125,66208237 +127,68890276 +121,66910045 +130,98354909 +124,85836412 +127,57827685 +130,24407974 +127,12175530 +131,75444542 +128,10255723 +127,73719766 +127,10671042 +123,23893898 +122,06100698 +125,75995585 +122,99775548 +120,95729598 +128,87080124 +126,59133764 +115,13421186 +129,14503135 +128,01858113 +125,08021546 +125,08890905 +122,52182007 +124,93004734 +131,16027547 +126,78870560 +130,83220104 +124,50050181 +132,92360901 +129,07241580 +130,16859748 +125,70827223 +123,72939019 +121,45680195 +127,20051183 +127,94985874 +128,63085469 +129,23040857 +129,99369751 +121,04018757 +125,89119721 +128,40166192 +131,70065597 +126,77540974 +128,32012132 +131,67387707 +125,01919446 +131,71250838 +128,76488941 +125,81629933 +127,54569540 +125,43278327 +131,42454274 +128,07118281 +129,45953513 +123,15878308 +123,51154744 +125,56750100 +118,66932410 +127,61816180 +122,45513970 +126,81659001 +120,10438838 +124,45222420 +116,00894668 +132,09290450 +122,84161446 +121,52880157 +127,69732261 +121,34195117 +125,19379871 +127,69095843 +124,65616256 +126,74285333 +128,98115854 +124,75078809 +128,32413419 +126,89553092 +127,55663190 +131,39360447 +118,79693090 +129,50860592 +128,39422084 +128,05531974 +128,43521572 +118,55698755 +124,47499230 +129,34004065 +119,81029180 +127,15180008 +131,84615460 +125,67403140 +122,04115583 +125,08264709 +115,60231718 +127,06154581 +121,02148812 +130,70795077 +131,21979485 +123,54713552 +132,09703716 +126,45509037 +131,73837330 +133,50252827 +130,52675720 +118,84393588 +120,20353245 +129,42313587 +128,75075000 +126,68271598 +129,25227519 +126,53623539 +122,86055031 +127,38612471 +125,05086247 +130,06793318 +128,94580084 +127,34954335 +112,53141754 +127,34071940 +124,86368562 +128,54601617 +125,32666226 +128,11273767 +125,26121066 +127,96570080 +126,79519488 +134,31336806 +125,86003247 +125,95386729 +126,14669044 +120,17118814 +130,71471611 +128,73646130 +123,37799746 +129,31192999 +126,76302925 +130,97157675 +122,77253643 +122,78244920 +129,19039827 +124,77601516 +123,52699516 +123,31493657 +130,54879093 +125,76898843 +130,24626074 +131,29926087 +128,32120647 +129,27861916 +119,49240713 +124,10553249 +124,49439443 +130,30572067 +126,20320947 +125,61128992 +126,50552104 +128,13717488 +121,76451382 +131,19664096 +130,02446781 +127,09153935 +126,76665079 +124,61170316 +123,30115683 +123,78586214 +124,24968082 +125,67877218 +124,48771356 +126,32369727 +127,36628523 +116,12055388 +122,43419170 +127,23611558 +129,77244600 +126,75840878 +129,55129922 +131,56745580 +121,22219302 +124,82775613 +124,17642892 +126,38081317 +120,97455855 +129,25280417 +124,73098253 +126,57900025 +126,51683981 +122,08331019 +120,67681506 +124,17749537 +125,40998542 +127,41601426 +123,88989535 +120,37834272 +127,68733342 +131,71547129 +127,05837394 +126,91190303 +124,11658575 +126,92515310 +123,24795107 +115,56689411 +129,26969642 +128,60983860 +127,86729415 +124,21143686 +128,57148342 +130,25117751 +128,36521572 +128,32088558 +117,07588218 +126,99891807 +122,74912476 +121,53954121 +125,66117626 +121,55330436 +119,40985329 +131,12542792 +129,29805480 +126,85385721 +118,33472181 +123,94099836 +128,51664899 +127,67791487 +130,71261681 +121,37756729 +132,16782184 +116,09444907 +124,33125012 +127,21692939 +125,44617912 +131,06381165 +128,20458885 +125,30410911 +127,01059620 +131,10734365 +123,49828949 +121,94784226 +130,68677295 +128,59735875 +122,04376638 +123,85065120 +126,26962338 +130,78667309 +127,54950145 +124,34538097 +118,87164503 +124,06053294 +129,80078390 +128,84194526 +125,32327244 +120,95838543 +123,05612974 +131,15161011 +129,06001540 +125,97997286 +129,92840208 +121,59605876 +123,37535206 +131,95817751 +125,24337158 +126,69173259 +117,36453136 +131,12135990 +121,25120968 +122,26408072 +129,75903440 +123,50359308 +131,69967892 +128,34736933 +128,18258419 +130,42795805 +131,09076449 +131,64183430 +126,33316170 +126,11719619 +124,23143123 +128,33890987 +122,89860308 +122,76378613 +126,74417864 +128,36556743 +122,98667404 +123,25021949 +124,14811254 +130,23976286 +131,82612351 +128,60640507 +126,00241940 +129,33986859 +127,06612576 +128,36291308 +125,95516948 +124,18327531 +126,44067178 +127,67135061 +123,87445773 +129,65102624 +126,13645116 +125,03166037 +129,37885905 +116,69464177 +119,31454815 +124,10615506 +124,88314833 +127,40841782 +132,21624602 +125,76370657 +130,89160400 +127,75244138 +128,75372458 +126,48808801 +122,46893567 +129,36035985 +127,91087681 +129,53672301 +124,07336912 +123,68296506 +122,29689226 +126,31998026 +122,07535574 +131,20913982 +123,12139687 +121,87001627 +130,95982433 +124,98699208 +120,50747486 +124,64343502 +126,91828985 +124,87159363 +113,82184477 +130,44160825 +122,02112322 +123,33746265 +123,18906192 +129,05826607 +129,52974526 +120,37411768 +123,11167967 +128,44817909 +123,56583830 +126,47770128 +121,21841276 +129,87814628 +121,99334475 +122,87870317 +123,33289082 +128,73701463 +120,66211212 +126,27655580 +130,99714660 +115,53960696 +130,37067233 +131,67485499 +129,75137125 +118,36963535 +128,14024026 +128,31610403 +120,22793400 +130,63453588 +125,49103958 +121,20817052 +129,12577185 +127,32607548 +118,04714875 +115,33954304 +127,23834112 +118,37679218 +127,22893357 +132,20875581 +123,47578212 +131,55341061 +128,34064637 +126,30381698 +121,46383467 +122,49349043 +127,93929699 +122,89532475 +129,54660298 +128,08806508 +124,61514363 +127,50553822 +122,74114622 +128,64212882 +126,69951143 +127,09661859 +132,67458073 +127,30076947 +131,04716170 +122,65729703 +126,89446017 +122,59657018 +120,84675343 +125,00435125 +118,51000766 +127,72675131 +120,27335522 +127,80470652 +127,66461265 +127,78577648 +130,28006485 +128,02503561 +126,29037716 +130,10725286 +130,65977936 +132,93758245 +129,50273431 +127,41229511 +127,90589463 +117,47178218 +132,41563269 +127,34785877 +124,73761445 +117,81659362 +129,31961438 +128,14165539 +122,34138660 +130,72527265 +119,34818533 +126,35174688 +121,11762914 +125,60663691 +125,72280499 +132,66559411 +125,27387026 +120,27164502 +117,79161506 +129,93761006 +125,61112182 +122,92425756 +125,50337333 +125,50088909 +126,88518102 +129,62348860 +127,86087840 +123,49134297 +121,90915765 +125,06148436 +130,37203830 +124,23272002 +122,71342800 +123,50339166 +128,81789557 +132,21887766 +129,40632875 +117,98546982 +124,49141017 +125,11585468 +128,18558843 +125,58193554 +119,37478532 +117,18192326 +131,44730537 +124,08837356 +124,49503392 +122,85318149 +130,79038480 +127,56438797 +120,73765458 +124,65425656 +124,57350861 +125,48963547 +125,48207149 +130,64130235 +121,20705966 +129,88868376 +130,22550376 +123,37959415 +125,68862386 +120,53428091 +121,67011710 +125,75443507 +129,83526620 +122,23651919 +128,41987751 +127,27038609 +122,98214969 +128,34620010 +127,19700133 +124,10202019 +122,31232436 +118,44616968 +128,51227873 +127,00858092 +119,91192012 +131,39297782 +128,81449799 +128,54625481 +121,84359295 +118,87333444 +124,22470228 +125,00903995 +127,49981714 +120,66471273 +121,57677780 +126,90056286 +124,35163381 +129,30466682 +112,25300156 +133,37331943 +127,60902502 +120,21896403 +126,86399574 +122,54567602 +127,30208767 +128,66461036 +121,47283699 +126,68628913 +126,46375249 +131,94795766 +127,63213310 +128,01065079 +134,95658224 +128,31795093 +128,44805358 +124,15346071 +130,23828498 +128,85536829 +127,87206478 +124,90040271 +120,05061010 +129,26683757 +124,15588325 +124,02517219 +127,20298334 +124,46864510 +122,20852106 +128,48318071 +124,22962176 +131,17441905 +128,97600399 +127,46004867 +123,96987340 +121,87725516 +128,40668729 +129,45357844 +122,89318003 +130,22462370 +125,37851351 +129,76740257 +123,33073568 +114,82804902 +122,82555550 +129,08348017 +131,09233415 +115,77222663 +128,24738933 +121,04888000 +127,26986034 +122,97970768 +128,74347557 +129,76803471 +129,36510175 +127,70012583 +123,10418591 +122,82301630 +129,79276829 +124,92465027 +124,31631593 +122,90712083 +129,58424724 +127,02868627 +129,88765110 +130,13322429 +127,10162119 +128,24701471 +126,36417697 +123,44584042 +127,61867458 +132,20567654 +133,59147584 +123,98457153 +117,32896104 +122,08748675 +123,52468974 +130,96665128 +130,11613631 +122,37995258 +121,73548143 +128,83792721 +131,67411760 +124,82162484 +128,97951459 +124,46357313 +126,16704805 +131,03266163 +128,76858806 +128,93744189 +132,63485377 +126,45759613 +133,87074172 +128,61096838 +129,49982105 +126,97064847 +125,32521158 +127,33116517 +127,75036540 +117,33642533 +126,85684269 +127,22035489 +132,88518163 +120,22105768 +125,56753347 +131,83879824 +117,64671926 +124,43128916 +127,10565729 +127,82677713 +117,35169794 +131,63844440 +119,15690793 +129,19614100 +128,70359864 +128,81525206 +124,36697325 +128,38708999 +124,60909492 +112,22491578 +124,26347187 +128,01996949 +125,24347395 +114,69041764 +123,87289724 +130,63603350 +128,41266194 +130,03274262 +124,23799641 +115,50812300 +129,83951289 +121,42501221 +128,59012397 +118,14429275 +123,19532866 +130,52995507 +127,73975778 +124,73709569 +128,24936801 +120,28703580 +125,00232047 +125,62976636 +129,54433458 +120,43284247 +123,32441130 +120,93951854 +127,41068149 +120,41674946 +129,18179799 +119,84091983 +125,31765425 +123,88959374 +130,75104802 +121,53190438 +127,77852013 +112,63588586 +130,73354936 +125,11051879 +129,59166659 +124,13475672 +119,04081752 +129,76135324 +118,69372690 +122,79022351 +131,53899968 +122,47491991 +122,97529497 +121,78829370 +121,95294618 +129,14878323 +124,28067799 +127,72025344 +127,25495533 +122,21814974 +131,57317911 +125,66720953 +126,51013315 +116,37277478 +115,73134142 +127,19545354 +124,03158758 +128,91902301 +130,28120525 +124,88880627 +127,70239151 +119,70298358 +126,24781617 +122,88398903 +126,62935526 +129,86168414 +128,47434006 +123,50115138 +119,81083823 +128,67874549 +127,53109770 +131,57791283 +120,98765938 +129,16319174 +125,47290489 +128,66068934 +123,02663421 +124,91830145 +127,83800687 +129,63405069 +121,97908798 +113,11827284 +128,16780106 +125,37886419 +125,17519645 +130,52932954 +111,24724829 +114,93709205 +126,78084036 +126,17420749 +130,82069569 +126,61420369 +126,90176555 +131,71400831 +130,97342362 +132,33297164 +127,89564979 +123,44923191 +128,29364794 +125,37724804 +125,79528146 +123,92083382 +130,66543809 +128,01519184 +129,94625006 +127,72358333 +134,28670023 +124,72249469 +130,45815032 +124,06412794 +126,68092428 +133,01493654 +124,07091337 +128,99701961 +126,87200563 +130,57049161 +121,42935232 +130,95988921 +131,03096449 +123,04964569 +122,80294969 +123,97028655 +119,96235371 +133,10452330 +132,29563578 +130,21919905 +124,80929530 +113,91420016 +129,65860173 +129,05694754 +123,81952037 +126,18740196 +124,09795241 +131,66155823 +125,72841555 +126,68371403 +117,72455034 +128,14634823 +124,37748867 +131,01907556 +124,99524202 +130,95200993 +129,55471778 +127,74618399 +125,28027838 +127,08423941 +129,62596278 +123,51544142 +133,75600130 +120,04098973 +128,07296036 +129,46606139 +126,30893371 +117,62023083 +125,39723402 +119,00504864 +126,52966914 +127,17352621 +128,18182404 +118,64314205 +123,79256716 +125,12958315 +121,82517962 +128,41837194 +124,09475629 +125,54166706 +129,39515653 +129,44002460 +130,23726009 +129,23010695 +125,71150655 +128,56609698 +122,48728787 +113,66314157 +123,62626949 +128,18136544 +123,84659330 +131,03826337 +130,69501798 +125,12376312 +127,74057474 +118,17033708 +120,58006125 +129,46878281 +126,79670304 +131,47952442 +129,45493124 +126,26610325 +129,71327039 +131,02076114 +130,60430333 +113,33326029 +127,80914339 +126,02022181 +123,74704197 +134,36954608 +122,86219059 +126,10359234 +126,09568376 +129,01319178 +127,98466316 +132,16411106 +123,30025635 +117,33385441 +120,77337821 +119,14913802 +132,16099512 +130,81014767 +123,82929284 +124,82255497 +123,97861768 +123,67776825 +126,01179123 +129,13048331 +126,86915323 +132,70386987 +115,21486338 +124,89829623 +127,94000668 +129,95870271 +130,90484700 +124,12775670 +128,14621929 +126,63006276 +127,72369608 +128,64537326 +126,26856814 +132,39513429 +124,92126657 +130,49388898 +116,89336221 +129,95857942 +125,64439212 +127,97131108 +130,30498019 +125,58503895 +121,62081166 +124,85989740 +134,69145917 +130,08918250 +121,44502646 +126,25776200 +126,82151850 +127,66811452 +129,08637441 +126,43043957 +123,33270944 +128,50909271 +125,26627127 +117,48195752 +127,83221048 +124,58871167 +127,47623912 +125,75111542 +126,83272442 +129,32480480 +131,34869787 +112,23481755 +127,81189058 +132,37898203 +127,59591467 +126,35565934 +126,91617426 +128,39793364 +129,37776286 +123,82915357 +121,73272006 +129,06374548 +125,96210214 +126,75766625 +122,44322058 +122,76276576 +119,30896739 +130,14059241 +121,27758702 +124,86780153 +123,81300890 +129,17863342 +125,81877523 +117,87915472 +120,98163475 +124,55667023 +122,80807168 +122,85884524 +129,85279686 +120,17996658 +124,95784347 +129,58154044 +121,17238074 +122,44461822 +129,17361652 +131,75224439 +130,59826143 +127,54213332 +129,26763685 +121,83153768 +123,65870697 +124,22390334 +125,29065534 +124,11378953 +127,62402692 +131,75905330 +128,36999567 +127,78896966 +132,22046728 +132,80897896 +124,29323756 +128,16145021 +120,54009736 +119,90708371 +128,90133148 +120,88831577 +126,19596547 +127,84730532 +121,94448251 +125,99243305 +125,51055758 +120,45716002 +117,97542170 +127,01365938 +125,27859086 +121,56866323 +124,15932905 +125,97171908 +127,56055176 +128,88322155 +121,65833629 +122,33224937 +127,09437706 +123,47359745 +128,34293006 +125,52907089 +127,81656258 +126,75059926 +128,37749583 +129,15952096 +129,65119556 +127,06129024 +124,05762254 +131,15012489 +132,32833075 +128,46065097 +124,02687269 +122,43505556 +130,57115114 +127,03117572 +122,99439800 +129,20357155 +126,34538805 +118,39501443 +120,45077294 +126,07181403 +133,69099749 +121,74887128 +120,40960888 +123,88075616 +126,53530126 +126,00919558 +121,32356963 +132,41848669 +126,47546413 +114,63836485 +127,05365835 +123,74085344 +126,19928755 +126,02672650 +107,14614468 +119,54931572 +126,17550018 +124,39545297 +120,18935655 +130,34229926 +125,32317323 +125,07117563 +127,04459839 +128,87935770 +128,11251406 +129,38683956 +128,35591273 +129,82576992 +122,16800539 +131,15611750 +130,17851870 +115,64333726 +120,85521927 +132,23425950 +128,33328998 +127,02997781 +128,07043346 +131,44866129 +125,16553966 +124,99611000 +128,10745417 +127,54143291 +122,05451429 +120,47748193 +123,47710545 +128,53234623 +127,66073502 +118,65114758 +127,52547319 +121,96084961 +132,00834501 +118,53860458 +121,73930347 +129,09373648 +113,70282284 +124,65980048 +123,86221928 +127,87682733 +124,70006966 +125,10567779 +130,58064513 +129,77222000 +125,31539098 +122,23240794 +126,49354799 +128,79249517 +123,41865099 +122,10152672 +121,96295780 +125,50066334 +123,55832272 +119,87153098 +128,19415332 +121,63334435 +123,28531417 +126,93143179 +124,79197216 +120,53195135 +126,20157954 +122,54642253 +126,53529134 +129,83010982 +127,24301263 +128,04372748 +120,68704768 +129,97918743 +124,47981486 +131,09788208 +125,64454321 +127,96404202 +119,90269500 +128,93421860 +121,84951375 +123,22307261 +128,53332308 +127,40045179 +125,08502511 +127,12906166 +130,15230831 +128,75903073 +132,69440085 +121,54257070 +128,76394829 +124,65900851 +120,10266973 +121,09735420 +121,11462190 +128,57588394 +131,67676265 +123,48326485 +123,82338731 +128,60027089 +129,73448204 +124,62836546 +125,15721519 +124,57196610 +128,80887990 +133,47967131 +128,89286497 +126,21325297 +124,38716919 +124,89126348 +117,36885601 +126,80837286 +126,87211913 +120,39140611 +126,35129363 +126,45519855 +119,52099254 +127,40884303 +120,61694311 +122,31406950 +131,09735584 +122,79555294 +120,58646696 +121,52303913 +126,54345632 +124,30690553 +129,43197644 +129,23866178 +132,70130298 +129,27968146 +127,89638046 +120,03586172 +125,18719293 +124,55353086 +123,02135967 +127,63882723 +132,83012319 +123,90374876 +125,83877748 +131,05222317 +125,71847211 +130,36748690 +119,69574114 +125,63174780 +122,35751513 +125,12006846 +126,25202372 +127,35255652 +120,98436499 +126,41819771 +130,84276527 +128,42033016 +128,80492862 +129,64581594 +130,77273865 +133,03849718 +116,45949101 +128,16189492 +123,35989139 +125,12292001 +126,74416879 +126,57751808 +128,44324581 +119,83223510 +130,28466429 +126,96877096 +124,89543661 +125,24582272 +121,24582825 +130,05442151 +130,35414888 +131,06178964 +121,09555601 +122,97627118 +130,04728348 +128,31509452 +132,14023528 +130,12128416 +121,90461526 +128,12797920 +124,18032886 +125,09181017 +123,09892898 +131,42087599 +127,16288922 +126,42962285 +128,46164107 +123,79714503 +127,25210783 +128,45595506 +122,82538892 +125,35902102 +125,59987757 +124,25353556 +126,47506181 +130,12923797 +125,04566156 +130,36307564 +124,39499826 +127,58684343 +133,22053919 +122,73005323 +127,29770644 +124,59105170 +121,98596832 +119,02485745 +126,18117015 +128,09420836 +130,82512006 +120,39317449 +130,89560830 +121,39848379 +125,22657675 +123,70822217 +124,55230834 +126,71041784 +122,27124295 +122,47731811 +131,82456049 +126,74175001 +126,35093951 +123,28023034 +121,79341625 +129,68015160 +115,95437733 +126,82834412 +128,57457389 +117,74001677 +130,83461833 +123,48729514 +130,04394527 +128,73785311 +128,64062217 +116,40764758 +126,75572420 +118,88977326 +131,23466635 +119,82196902 +117,42798350 +126,74090086 +124,78653681 +125,25136600 +124,50285995 +122,50592111 +119,80392267 +130,91894674 +122,51232081 +129,96876795 +122,14296229 +125,80954297 +127,99496849 +126,74766640 +134,25844685 +126,35456635 +131,48473678 +130,26450934 +129,21265779 +129,61498151 +127,01797346 +128,23222577 +126,63391826 +120,92613902 +125,24434769 +124,04165551 +128,59542994 +126,43167541 +124,37744437 +128,28029039 +123,76281029 +121,55813882 +128,53398868 +122,09626210 +127,77673368 +123,72488414 +127,46852015 +120,20150354 +123,86634226 +129,75229437 +129,00205205 +129,60524207 +123,81334607 +120,64321709 +132,01795224 +119,26600052 +133,10830202 +125,69719255 +127,82282647 +130,64644467 +128,87002956 +129,44408438 +129,48519069 +127,77906091 +130,46730977 +126,87022317 +123,93653152 +128,63820509 +131,82988112 +127,45318807 +129,02823028 +133,69232236 +120,32676187 +120,02502234 +122,78962919 +129,95209544 +124,44158539 +120,77468479 +126,14283207 +127,20650500 +128,82383152 +128,42851346 +119,79160061 +125,67199259 +127,91199152 +121,33755005 +129,62787844 +129,39336895 +123,78689000 +125,90021282 +132,61704146 +125,65389411 +125,28142044 +125,93437458 +124,09105065 +122,10835501 +127,74350385 +126,69433484 +127,82656413 +129,02141563 +127,86450841 +122,55768426 +122,59605033 +131,59129467 +128,69329952 +131,86618594 +128,90113643 +127,58521284 +123,97772660 +125,29048483 +128,94453893 +124,61960994 +127,60483428 +131,49670889 +118,42405379 +131,39480592 +128,61863027 +127,10532425 +122,31211815 +126,75602470 +124,98480108 +122,85366344 +128,91578793 +127,99474761 +130,09476965 +132,07285563 +129,21422082 +126,39695197 +124,33704419 +120,81715788 +125,83257594 +126,72455544 +127,88619338 +112,44966594 +125,63319957 +122,81241591 +127,73957467 +127,71756765 +121,26772924 +122,04067152 +128,25013537 +123,86971404 +116,87197169 +129,03027286 +129,54768948 +126,18399214 +124,02984821 +134,65671397 +120,99302595 +126,85996038 +127,00987546 +125,92883543 +128,96591235 +130,01750840 +130,07290434 +131,18201232 +120,91565812 +126,56018588 +129,61093013 +122,42361164 +123,04964304 +115,59585522 +126,31528891 +128,71126702 +122,06382021 +124,81595856 +121,58976397 +126,22525203 +122,48650673 +125,79616908 +130,42669450 +128,42956039 +128,50659803 +126,26835410 +122,97900767 +122,35327572 +127,87837914 +129,33544911 +124,47155151 +129,88923413 +125,44754326 +118,53273158 +116,64036589 +128,33566592 +130,89297916 +129,20004283 +114,81772894 +124,30457395 +117,26700554 +130,19306274 +122,79088753 +117,73281222 +130,31467547 +124,77795989 +117,29221921 +122,02978996 +121,16752133 +122,24860019 +129,58888716 +128,81917772 +123,95560083 +129,97388788 +129,84544330 +130,58784134 +131,26988181 +127,25439708 +131,40592965 +128,14059994 +125,45170301 +114,47761552 +128,52481038 +129,88707673 +120,85123417 +129,43270511 +128,05425477 +128,59943133 +110,10243157 +125,88334048 +128,06746771 +119,78554738 +127,63256477 +109,85557927 +129,06263254 +126,44401103 +128,32085720 +126,06861760 +125,09610399 +126,07028423 +129,09159490 +121,22307295 +122,96338286 +131,11992563 +117,85552316 +133,96253900 +122,81774278 +129,66185290 +120,82523239 +127,64347906 +126,94610793 +129,19024358 +128,66201893 +126,64950458 +126,04534167 +128,24775193 +125,61517569 +124,29809138 +128,19898645 +130,04411934 +126,92851846 +125,21739883 +127,51110686 +128,84721480 +127,69757596 +131,26774246 +118,27565582 +126,40708746 +120,03773270 +127,53864155 +130,08912639 +132,57273367 +128,26909111 +127,51632609 +126,26723434 +125,91378277 +125,94054300 +129,71895315 +129,21454055 +121,83837028 +108,09113426 +128,06098279 +127,08495111 +129,46363552 +123,02533848 +120,53987894 +127,21245659 +127,02746148 +126,81795739 +116,49895178 +131,83974515 +127,91517662 +124,86890283 +127,46293343 +126,10879061 +124,33151652 +118,89141081 +129,26054694 +129,03525861 +131,59763197 +127,90723584 +118,60791792 +130,84800719 +129,98592623 +128,07547613 +123,67797469 +132,61310426 +130,32957323 +121,81200804 +120,99545076 +120,48998833 +130,67669046 +114,42343083 +116,35255924 +124,95663917 +127,93350728 +125,00203730 +128,05038675 +131,07062954 +123,08494059 +121,84057032 +123,78432861 +123,76064558 +129,40639907 +123,52199922 +120,05644661 +127,95261680 +131,32590504 +121,71870687 +123,66337889 +119,69638125 +120,93787659 +131,72456638 +116,18351618 +121,04524648 +129,49118717 +128,54714858 +125,95102085 +124,19568539 +130,12404141 +119,68810974 +124,53703198 +126,49977523 +134,11439615 +125,42652569 +125,83674057 +125,61166842 +126,23534331 +112,45605464 +120,18772752 +130,83257071 +128,94675372 +128,57671104 +130,04753766 +125,68782040 +130,68356768 +110,25750528 +128,04738762 +124,40095231 +124,93183925 +131,83921490 +129,37052316 +125,78967692 +123,02198892 +122,96208196 +125,37833470 +121,89518282 +120,73953656 +122,40832136 +127,18828007 +124,06303685 +122,26208516 +124,69795018 +128,16002671 +128,02935232 +129,02938451 +130,71239037 +126,54402058 +123,80977554 +129,55144927 +120,85942343 +130,80538843 +125,05348202 +128,92716110 +130,59882422 +128,12059189 +130,11002416 +126,78412256 +126,71170357 +125,69294633 +125,24571759 +124,52082348 +116,31869252 +129,32739597 +127,34644589 +126,82753987 +129,71594839 +114,91322674 +125,56764648 +113,64707603 +128,46474669 +122,54105421 +130,90336816 +124,69652783 +119,48861716 +125,59678533 +127,28368276 +129,73806431 +124,09972879 +121,16626294 +129,82350528 +128,36542835 +122,74468774 +131,14706803 +131,05854610 +128,24057824 +132,80440155 +129,80529692 +113,86586934 +120,76993212 +130,27534155 +125,22490962 +123,00666162 +131,38612964 +122,66716637 +128,03126512 +128,65784290 +122,79759354 +126,39117848 +123,18275958 +124,01174548 +120,01207875 +129,07818964 +129,61729016 +131,41959605 +125,08045891 +120,15970332 +128,49292342 +126,86996192 +126,13379522 +132,80785977 +122,27523299 +128,22317333 +126,09292265 +128,38610482 +131,65043498 +124,75900337 +126,74604487 +130,22625465 +123,08566339 +124,41054141 +121,08314414 +128,69421386 +127,28850826 +132,32878673 +131,28184868 +130,82582734 +123,47349482 +123,90106919 +128,18273469 +131,72770813 +125,80178973 +124,26761550 +122,00129846 +124,12444081 +115,67510223 +134,28809980 +132,54477401 +123,55814804 +129,70123155 +132,50202123 +131,33206789 +129,51677245 +129,67144483 +122,50425397 +120,51795600 +123,88513931 +124,05825170 +131,91480339 +128,86203492 +124,81844286 +127,23322507 +127,92190026 +133,88308662 +130,34214325 +129,55697897 +126,68765013 +122,81032408 +119,51827728 +128,12356480 +126,68131478 +124,82700636 +119,47097849 +123,53356083 +126,67102363 +123,33493781 +127,64010968 +112,92806619 +121,79868463 +125,52701179 +127,28424088 +129,48908689 +126,50281014 +121,81354915 +123,60055910 +132,77203201 +131,06415526 +124,83424447 +128,41401822 +130,74039359 +119,15305380 +122,55586045 +129,33034773 +130,52436731 +117,98729562 +125,89583983 +131,18643066 +128,59472994 +125,81519632 +131,86131195 +125,56689420 +123,71805597 +128,42997743 +129,80041757 +128,21598242 +126,56127849 +122,10844306 +127,16695801 +124,72259380 +126,93477909 +127,01787059 +124,48912214 +127,36170941 +127,82268362 +122,41601929 +125,42696059 +125,26215646 +126,38898388 +131,52655685 +121,69518475 +123,21914298 +124,89743969 +127,80445692 +126,66455886 +126,11509187 +128,76434027 +122,60348580 +123,48731634 +117,25618602 +128,02803915 +128,67765747 +126,17096208 +128,33866160 +124,74427835 +130,43803138 +124,73177641 +123,28800518 +130,90370273 +118,93162149 +125,68562610 +121,06476491 +126,84683769 +126,61961994 +109,82777662 +126,48773821 +128,82579695 +131,23974056 +115,67978593 +123,12220359 +127,40551500 +126,02237638 +126,30753911 +129,80824931 +130,72839107 +122,83430496 +129,38440472 +122,36282346 +124,10424343 +122,19046229 +125,39329228 +123,04544063 +129,97728276 +127,65410286 +132,22915815 +129,75443141 +117,00159132 +129,98937227 +125,47442355 +125,74112050 +129,18912311 +121,42696245 +131,00183933 +124,47223680 +128,46869289 +125,45026678 +126,36641169 +128,84800838 +128,25727965 +128,65384023 +128,44681420 +126,31773130 +128,21800877 +131,56897952 +129,37095320 +120,34064617 +124,55179049 +124,08157700 +130,78469437 +127,44309882 +121,54513832 +129,39972710 +126,92521843 +129,27677819 +128,49027735 +130,84153918 +128,88330838 +129,93934621 +118,94443043 +118,59066346 +125,38549246 +119,04088263 +117,76881091 +127,27826221 +127,68750832 +131,33800056 +125,49652610 +121,44274971 +123,21792512 +124,04110944 +128,01892900 +131,88251630 +128,32331532 +122,70244597 +123,42945128 +126,92953211 +124,83724796 +127,19142665 +131,21624588 +126,69463289 +125,66831021 +126,70378410 +115,66752366 +127,69638743 +126,73233151 +127,13212090 +129,84035353 +127,53627474 +124,43910746 +128,53756647 +127,88961827 +120,18491844 +129,65378653 +129,30026968 +121,26064170 +125,50568986 +127,65621600 +130,32170423 +127,07054898 +129,05505997 +122,49722595 +122,85705174 +128,31088640 +125,07189421 +119,28565456 +127,49187905 +129,40388661 +128,98570850 +132,08359846 +124,50541612 +127,72577364 +130,89307904 +128,05017945 +130,02205637 +124,26507533 +117,90658628 +132,34151535 +124,15680399 +124,11291825 +122,42719851 +122,04575247 +122,39324739 +127,89471681 +123,61482137 +124,90000333 +124,84643083 +130,80195250 +123,35273518 +127,56239385 +127,42206234 +129,12973188 +119,81407938 +128,26285685 +130,92807945 +122,69947504 +122,87793368 +126,11501532 +129,56044850 +131,44602828 +126,30187507 +132,46306230 +122,60199082 +122,35619739 +125,51302130 +125,84783872 +124,53274225 +126,02299675 +124,60766677 +129,57084855 +128,79935023 +120,60719303 +127,24394300 +123,88336997 +127,65225905 +128,69884814 +126,70045076 +130,40195918 +128,88143491 +128,86750693 +121,99643798 +126,50461008 +128,19657485 +123,89014400 +128,11245782 +128,66325434 +123,42890966 +126,17645673 +124,84234781 +127,11446566 +129,99037067 +122,19813787 +127,48850635 +123,02419765 +120,61003562 +131,17243801 +125,30208824 +127,71650839 +122,64645932 +126,01746078 +124,81524449 +123,17780326 +116,31303100 +128,18029893 +122,91219556 +126,05056759 +128,72130576 +127,80044041 +122,04912995 +125,64011092 +129,66750264 +123,29440897 +115,24463589 +130,30577644 +126,04606683 +127,22823676 +128,49880777 +129,08233479 +125,06296092 +124,52777670 +121,41672002 +122,56229984 +131,56215171 +130,85545764 +121,25795046 +129,69476303 +115,99744333 +126,98728791 +122,33350229 +123,21549084 +129,59167649 +118,96816717 +124,92905260 +122,82870009 +119,06809963 +124,02701097 +123,36440660 +120,49794565 +120,42518860 +123,47538851 +116,07150847 +116,99824746 +132,24877561 +117,10370298 +121,55834782 +115,57123049 +124,79093760 +124,32288976 +126,86044101 +127,10207341 +129,71543149 +126,92799632 +129,45748245 +127,20688344 +129,98592741 +129,42643496 +129,19047781 +116,90469191 +125,87156716 +124,28804736 +119,07525343 +129,63002957 +128,79239528 +121,27005238 +122,39897178 +125,58501189 +124,81360464 +121,09293251 +123,56637827 +125,74028236 +133,26217284 +124,74259846 +128,94669682 +132,32445084 +124,13379129 +126,86590654 +119,60476121 +116,32479878 +122,62009546 +130,88309129 +127,95315262 +124,68076123 +132,96054971 +125,95595834 +128,45130521 +121,28403911 +125,78190730 +128,31565087 +125,65848128 +124,59310324 +129,15873851 +122,58375050 +125,51946420 +129,38794221 +127,89515322 +128,86029574 +130,20076151 +130,13882952 +128,74619293 +125,01721340 +128,56406932 +125,16834230 +123,31662448 +120,22529693 +125,51442175 +129,02664888 +120,06598294 +129,00165665 +115,31601186 +130,98445431 +123,49018942 +129,45416012 +124,81330023 +129,36002080 +120,46479555 +134,59358455 +130,06688794 +128,43935900 +126,46074612 +125,85531869 +129,16432282 +122,54311617 +124,49503115 +129,32088116 +132,54385933 +126,20889820 +124,40591295 +122,15327474 +122,20308547 +123,10763403 +123,13688811 +134,57537232 +129,85591782 +132,92016404 +125,29961611 +130,35061989 +129,56150231 +121,61668329 +129,08818771 +130,14295218 +131,51175799 +125,89396884 +128,05413015 +126,89979322 +126,48286173 +127,61108671 +125,54031908 +121,98745363 +122,52629003 +127,60934190 +126,38053072 +125,82902171 +128,18662951 +124,25437642 +124,00557032 +127,06590462 +127,81289068 +126,97852880 +125,25203650 +122,02249130 +126,78110834 +127,73788924 +120,61584702 +126,61215690 +120,56729590 +116,42488578 +128,93528778 +124,17236445 +129,09158718 +127,89181487 +128,59694163 +125,10606546 +118,84333263 +124,68778409 +126,84874834 +130,28437820 +128,88014525 +120,60491554 +125,71267810 +128,65770480 +127,78306528 +129,94574400 +131,42184435 +126,29084312 +117,89139287 +124,72079771 +120,22850000 +123,77489586 +129,43147308 +128,25983851 +129,13239411 +116,56041004 +123,91837888 +129,53658411 +128,31677826 +126,13577516 +131,24269315 +129,61744752 +126,74770477 +125,56771776 +124,85183316 +129,97675158 +128,41943052 +131,14729432 +131,13141347 +131,43980179 +116,65680945 +132,72103581 +121,75363128 +119,43895172 +131,20946186 +122,98981216 +127,36802059 +129,22249860 +132,48075896 +128,37676874 +128,84012144 +128,09735420 +122,07572622 +118,45469274 +117,87912352 +123,45856454 +129,61491455 +126,98490123 +127,88658851 +117,67998174 +131,07495051 +129,06448118 +127,41777066 +123,83518497 +126,43088236 +125,37692605 +129,22906821 +122,25368102 +131,25429064 +123,78283068 +129,31115616 +127,26325950 +127,96095921 +110,28740775 +118,43272057 +124,02860634 +125,00296143 +125,67774929 +118,66324989 +129,10407715 +129,18879712 +123,81961266 +127,94665205 +126,17322521 +129,09384761 +130,32956009 +113,92244428 +129,55305992 +125,62530154 +125,10508586 +130,84657022 +125,65899518 +127,57151015 +129,39546324 +130,04866317 +130,95260035 +114,31354774 +129,52517267 +122,99980156 +123,37504075 +128,30868513 +123,16943218 +129,84964136 +122,13459979 +128,98016637 +119,67751729 +124,12397730 +129,67392418 +129,67822462 +126,51632978 +129,07298599 +132,18567023 +127,93473375 +125,61448869 +127,54628157 +124,08330765 +121,45561901 +125,95535657 +120,90395586 +128,61680998 +124,87392141 +128,86779500 +129,85991166 +127,02382113 +127,21366773 +127,31972467 +130,86153763 +117,26442241 +120,37558028 +124,45375353 +119,72605884 +128,27540696 +134,45961171 +128,69175487 +126,70125509 +122,80984554 +125,43035977 +128,60944144 +129,08936516 +124,34856198 +127,32398521 +117,67738790 +114,44961745 +128,30035136 +123,75995619 +126,23018898 +126,05171990 +129,42568814 +127,88553788 +131,92703837 +123,88417768 +119,78263070 +124,52903111 +122,34298930 +123,84362896 +126,01048756 +125,07055058 +127,61589904 +129,67199479 +119,85190196 +129,91024111 +126,65229175 +129,36792355 +124,56415663 +127,42093790 +126,41244401 +131,23760151 +117,28339951 +127,78878450 +128,51263246 +131,76948051 +122,06572920 +123,56207547 +128,08295273 +128,98398587 +127,61598690 +123,86514033 +128,89407191 +127,01998382 +128,54530633 +126,44365532 +125,04569588 +121,47843227 +131,61020727 +117,93447917 +128,35914261 +120,45122883 +119,07569412 +130,81949305 +127,54183024 +127,73629525 +122,95943141 +125,30926044 +124,73582653 +128,89586177 +129,09797457 +126,80577215 +122,74093925 +125,59706512 +130,39511988 +129,73868065 +128,47990334 +120,52971860 +126,42027939 +132,91974630 +122,82560649 +126,21532851 +125,66589704 +122,66085281 +126,37950188 +132,88648625 +124,02103366 +120,24652609 +126,89583663 +126,92606123 +130,48572255 +130,84306732 +125,15019555 +130,47912045 +124,41726179 +131,10253732 +128,54673679 +125,67376582 +112,48344558 +127,81382114 +121,84858435 +127,56250562 +126,56230011 +126,79538151 +129,63712967 +118,05681404 +129,18260727 +125,56968316 +130,21355710 +126,95480441 +127,31418708 +128,32557591 +124,70305966 +124,21420702 +120,82023956 +128,83220992 +121,00981917 +127,15735507 +119,87296810 +125,75577574 +125,23468154 +131,48727092 +118,40768951 +128,01788679 +128,14727552 +128,85149863 +122,22677643 +131,06932291 +129,23832419 +131,26274501 +132,89346039 +115,32738397 +132,02994849 +130,71167065 +131,18956266 +122,36283303 +123,98655691 +121,38648788 +130,90241614 +118,98883255 +124,21934924 +125,29418334 +126,05270045 +126,06098074 +123,79728529 +123,29134567 +128,97220680 +129,85190221 +126,91208958 +130,01621078 +121,32349635 +126,81797713 +128,42754020 +124,10902680 +130,23246500 +124,86597838 +132,08661414 +129,28773232 +124,36578110 +116,03887298 +129,53405122 +117,76022525 +128,82385748 +123,50757635 +127,34056431 +127,36020603 +121,94635211 +121,87478831 +130,47723081 +120,11554413 +118,59831622 +123,40754189 +129,25003480 +124,98338798 +128,93268715 +123,96315213 +128,89998938 +117,85499032 +130,38321178 +126,46540522 +122,63930841 +128,11061469 +132,05411075 +128,53488815 +121,75201292 +123,31773969 +124,86986814 +130,50019821 +126,60394145 +132,26958776 +121,77804313 +128,41291048 +128,07704372 +125,86811626 +126,90885694 +129,31984597 +125,43710664 +120,87209923 +127,21071238 +126,86201757 +126,27937624 +125,41193785 +123,64137698 +115,79224326 +123,27948242 +130,83446551 +121,89226438 +120,54854236 +127,73067009 +125,42386024 +129,66972889 +115,40251208 +121,36283823 +120,49784650 +129,10491191 +125,12630765 +130,75421739 +125,30526264 +127,26251611 +128,92477726 +130,77604097 +129,39573745 +122,68389192 +123,49430725 +128,39029788 +128,21758391 +122,22806219 +127,27236401 +131,60320569 +126,92185190 +119,83179232 +122,46830170 +128,22665141 +124,45604414 +124,89518503 +124,38871676 +130,57925644 +130,63083780 +118,01561487 +131,33077601 +128,21541116 +121,98209687 +124,53782263 +126,98899700 +123,08439803 +122,39341945 +120,02973547 +127,77475011 +124,06060562 +130,07551738 +129,96078915 +125,11537077 +128,72594309 +130,26115683 +129,31072513 +126,33747491 +126,56401826 +133,30392062 +124,21102143 +125,02948277 +125,73131234 +128,83132364 +128,20933884 +123,79062878 +126,31787864 +126,70489525 +131,76311274 +128,87356555 +123,32618904 +123,19241444 +123,24205214 +129,79667885 +131,58447314 +127,71837336 +119,02402640 +128,17457030 +128,06887470 +127,40993125 +129,27015813 +125,10364349 +115,10801616 +130,09182179 +126,28775806 +125,72291991 +128,30379807 +126,22990288 +126,98669950 +124,15830166 +121,45374129 +123,01962733 +126,82615220 +129,98154112 +121,53897431 +130,22611076 +119,55282148 +129,59466853 +129,11234054 +132,82268555 +126,77562095 +121,76603184 +128,04294723 +123,75500502 +118,20927783 +127,36277019 +127,91236904 +132,29390449 +128,35289629 +127,48010469 +130,95240298 +125,09279176 +125,08748123 +127,79208042 +129,31462356 +126,57260981 +129,73850345 +123,24952430 +126,35442345 +126,01366259 +127,93239868 +115,82649104 +127,67914371 +123,91518565 +122,44089132 +131,83742745 +128,48969626 +123,93368147 +128,48529795 +125,21512891 +128,15611799 +124,98210324 +130,83410399 +118,62601639 +127,44488117 +124,90201726 +131,30743616 +125,55587623 +130,39683753 +126,54012922 +131,22341704 +128,49680549 +125,64437158 +120,26993534 +125,26558021 +131,02159537 +127,08690273 +129,04742278 +132,04124993 +124,08760796 +132,03921389 +120,08933984 +116,64817946 +128,07534458 +128,27765281 +113,39767129 +127,99130870 +124,02329576 +130,83320853 +118,07840436 +124,51365950 +121,40076650 +127,16486751 +126,08392610 +125,73936087 +129,92983407 +126,41678118 +125,01096025 +123,34952783 +126,77299213 +127,86538553 +125,56204809 +124,37150070 +127,11671762 +122,40393341 +127,87600326 +123,70747651 +129,52140524 +107,81094205 +128,69967708 +127,59647510 +126,28105975 +126,31484838 +124,40583189 +128,86675817 +123,02067247 +130,39094838 +127,77123994 +117,55840632 +129,87446544 +118,74810292 +125,93345483 +130,10913160 +121,95799267 +128,96103409 +119,44778012 +125,73229245 +123,90075966 +129,21284838 +130,06312377 +124,37471698 +124,86869230 +125,92233224 +118,29051247 +128,92325735 +126,07685236 +119,63840093 +118,57037589 +122,90316032 +125,74604912 +125,02704471 +127,43098281 +122,57001526 +119,15912100 +128,81092251 +131,26884524 +125,50060403 +119,94919760 +132,48883150 +130,10506145 +130,32407789 +122,91147604 +113,84367295 +122,48050123 +124,20662564 +126,36688627 +130,14757035 +129,41202384 +125,84040469 +131,68226529 +117,81187795 +127,64790433 +114,08926513 +128,27040190 +129,71308822 +129,89704439 +127,70272334 +124,03947284 +109,59771382 +129,86136716 +130,02176097 +128,60376589 +114,73052909 +124,74108461 +127,12140724 +127,08103583 +125,69590844 +120,07400514 +127,37832597 +123,50956370 +129,92779320 +125,31717569 +123,38125850 +124,44362178 +123,90934302 +131,27206831 +128,46677339 +124,83107190 +129,42523893 +124,11556982 +130,60712029 +126,33699158 +128,64641012 +127,51764788 +127,26098779 +125,05384583 +127,61246697 +129,74581087 +124,67339590 +115,68370625 +122,48412113 +129,53225036 +129,67448205 +132,97067798 +125,09766793 +130,80009233 +121,39659634 +130,16312179 +126,43919557 +125,16192773 +130,33948560 +129,70147642 +126,51890556 +127,65679098 +117,01120987 +124,39423090 +131,00358835 +116,11847621 +132,06987370 +129,83570110 +132,36757654 +123,49297776 +127,12866397 +123,70107303 +124,58424529 +129,57087981 +129,50885146 +132,13501159 +124,38336238 +118,56845409 +124,44688121 +125,12998099 +131,84363252 +126,60092356 +129,33952384 +127,25149419 +124,67275770 +129,00533685 +126,45185958 +125,16211630 +129,81044300 +125,98024120 +126,06529483 +124,07858826 +130,17420402 +127,15413697 +124,63534472 +124,38729848 +126,85367103 +126,80279358 +119,37814934 +116,51202834 +124,23654054 +124,83628537 +114,89510158 +128,07607411 +110,05223231 +126,42417778 +112,18170290 +127,59404803 +116,21647672 +128,27866673 +130,33715976 +130,06025817 +122,56029547 +121,86491104 +131,14003814 +129,03949754 +124,25894249 +125,70198918 +125,56845121 +126,69331969 +121,78824406 +128,01624017 +128,02247052 +127,56481772 +130,05236861 +130,88633101 +128,11738803 +122,91042248 +131,93340603 +121,11395420 +126,99688847 +131,36291890 +124,02191004 +126,57476743 +126,69370277 +127,31295323 +128,45925889 +129,30047631 +127,21287084 +116,17666026 +122,23083003 +126,89603528 +122,97009876 +122,77565892 +125,31852210 +129,18326399 +131,00444147 +130,19420412 +129,96499130 +132,20904711 +121,88764068 +129,57856077 +128,29404642 +131,28194684 +128,38627636 +128,31628926 +127,23882923 +115,85324114 +129,62866594 +123,81886503 +131,34080714 +129,72067788 +127,97330801 +125,49374127 +126,75699351 +123,21480522 +117,26287535 +129,99604400 +127,97280386 +124,90163134 +124,64758617 +122,05942323 +120,15754034 +120,99016425 +126,35305334 +122,30798895 +122,62261739 +120,86194476 +126,70160471 +123,97351157 +123,84707751 +133,51375356 +125,35730542 +120,86671465 +123,71338806 +124,42597715 +124,41052472 +128,35892908 +116,24579015 +127,99307437 +119,42721880 +126,54533317 +122,45520507 +121,69099503 +132,47161275 +127,26986333 +130,06486644 +126,72891872 +129,07760744 +124,29194234 +122,02426917 +117,37724312 +124,73265572 +121,26055488 +128,63699011 +127,21107836 +132,08935812 +126,99075033 +128,12568788 +132,17514075 +120,64058760 +122,84833760 +131,73992535 +133,64584316 +121,89799732 +130,76778339 +118,76534167 +130,80940498 +128,45905544 +125,77585510 +119,29323648 +128,19606068 +130,73387536 +129,66641018 +120,74524917 +130,89578814 +128,12227603 +127,71517096 +126,35198458 +126,82396580 +126,60563111 +117,14939895 +123,51543670 +118,59692528 +129,81171439 +125,69942604 +130,00917329 +127,69758041 +132,60235590 +123,15878586 +121,42753190 +126,33362437 +126,48489802 +128,22295899 +119,09833474 +130,15689613 +121,60718319 +130,28297440 +123,58864429 +127,68889442 +130,51493212 +123,46343694 +130,36820983 +127,46252756 +122,92985736 +130,73202725 +126,08354202 +126,60540036 +124,82496517 +125,23601748 +119,68043197 +128,37948475 +127,12892810 +128,71113020 +119,96542835 +133,80250276 +127,01315887 +119,89712184 +122,88210580 +125,19283751 +125,62225914 +123,59108851 +120,06596131 +112,18688407 +128,29552352 +117,60272815 +127,81835046 +126,01757183 +134,39260505 +125,89126156 +130,79826587 +119,30041502 +129,63520030 +129,09987212 +128,90187169 +123,85835207 +129,03694809 +129,52266128 +130,39449139 +121,53057148 +126,62319371 +129,16646266 +118,73095096 +127,10539007 +125,75598299 +119,56120617 +130,52260305 +125,94668467 +123,47210985 +119,74138086 +124,86771674 +123,95833387 +122,91347379 +126,65481996 +126,70492619 +119,14067588 +129,74353153 +129,48565576 +122,77656972 +126,35345589 +121,45098939 +125,90473420 +131,26566992 +123,74129121 +125,51757869 +130,24388609 +123,67902848 +129,90098110 +120,80924526 +125,94956557 +124,77970501 +127,38857332 +122,52773575 +120,97542802 +120,23288344 +115,31566721 +130,50974867 +127,80444984 +118,64103533 +124,49137908 +125,90263972 +130,20131993 +130,18898404 +127,25828795 +126,29040330 +131,35386544 +129,58857468 +128,72184528 +116,29641538 +126,48994568 +128,34632197 +127,90316512 +117,85039472 +116,29862720 +124,02754688 +127,40635611 +128,39771839 +123,46599778 +130,70208994 +131,74698893 +129,15974849 +125,90121449 +126,28186789 +125,77681050 +129,29043552 +122,40256329 +131,87668148 +126,93162994 +130,22173411 +119,77482075 +122,74035971 +126,70833045 +123,64321949 +119,43744804 +131,55734756 +123,92473998 +124,44851514 +122,67822726 +130,54624411 +127,66215659 +128,71636022 +132,34630992 +128,49424047 +128,50048060 +127,22325194 +126,44805133 +132,10590380 +126,55448724 +131,08189930 +127,98682005 +122,43120533 +126,39698654 +127,40977643 +130,34052454 +124,55813385 +128,37435556 +130,93010082 +129,63713224 +119,17249279 +121,36133179 +128,86190557 +125,37588898 +129,36801589 +126,96404174 +130,77491491 +129,99729566 +128,05629581 +128,79317730 +124,89428487 +123,55451344 +129,20782152 +124,50462270 +123,46716581 +132,45657101 +127,67753337 +126,97477043 +125,89047656 +123,80377763 +124,32688397 +128,75806238 +130,43976552 +127,50813733 +129,95503039 +128,70973516 +125,10430874 +124,56013502 +117,74641394 +118,08624418 +127,88745788 +123,96465768 +119,04278348 +129,36293074 +118,02937682 +131,99053487 +130,60392741 +117,50304749 +127,22824123 +126,54642161 +119,16988609 +125,61739032 +127,12431446 +114,69511285 +130,67306384 +121,89379763 +126,92224184 +131,60599334 +123,70046796 +118,97264194 +124,60858750 +121,61609599 +127,16568399 +120,39564900 +130,18703293 +125,90383153 +129,41399671 +124,21555672 +127,84550652 +129,73429235 +129,05886932 +121,24928363 +130,64810618 +118,80454628 +124,68660335 +122,13323350 +128,75308838 +130,63344560 +125,44938657 +117,27157695 +125,21490952 +128,51210085 +125,97098325 +123,04245266 +128,45760778 +131,55736415 +118,11482087 +125,63373265 +127,55980399 +117,27838998 +128,33632051 +133,82797348 +129,93480148 +128,99202676 +124,21947118 +121,60939020 +128,11021059 +123,24974588 +121,59628158 +121,88190274 +116,04258652 +122,27164116 +125,24779940 +132,84667621 +123,52686237 +130,50281827 +131,37334439 +123,31120112 +127,29161226 +120,45072805 +124,96408400 +122,67544815 +130,94401367 +125,43959613 +124,09800614 +128,11338793 +117,56723552 +115,24747002 +129,87100840 +129,74537549 +130,35373654 +126,33609022 +131,97759310 +126,54143461 +124,59369893 +120,05770022 +129,21203246 +122,16155984 +127,88894274 +122,26993026 +129,21481800 +133,48267869 +130,69745147 +129,28894072 +127,57724237 +128,85112915 +129,86139979 +113,35984602 +124,65094828 +119,68543389 +130,30550403 +129,48908519 +115,11371316 +124,42672474 +124,18226320 +124,63103294 +119,77730716 +131,17159653 +130,59062437 +127,78450748 +131,47490136 +125,55250216 +124,56135385 +127,15382688 +123,56528260 +128,81299301 +124,79605778 +128,84107882 +129,90872154 +129,64450344 +127,70417689 +129,67901494 +125,00213953 +121,19249226 +127,88521647 +123,21573560 +125,88349367 +130,14388174 +130,69456499 +124,54159298 +124,83090144 +129,52164318 +131,08895375 +129,31992168 +120,22635190 +123,92766751 +126,77581184 +120,98280126 +123,08008741 +123,45454816 +126,82934282 +127,52972795 +123,34577880 +124,66474625 +128,90629090 +124,07220407 +126,88111767 +130,05909103 +120,69544535 +127,80541710 +120,48189242 +126,38534340 +127,12198449 +127,24544529 +126,20681750 +127,11907187 +129,05916620 +127,07799058 +126,15854701 +128,12859826 +126,72001002 +127,40759628 +123,65926790 +129,22368210 +120,29336164 +122,47066319 +124,58146303 +126,70065163 +128,12919180 +115,87437437 +120,42243819 +121,14786033 +123,18585397 +122,99879068 +126,01849597 +129,59078066 +120,53518118 +131,20163288 +121,43010241 +133,95514728 +129,06466350 +122,51579305 +112,48896346 +128,73714242 +115,48144001 +125,70737824 +132,12240957 +123,35777063 +124,20011687 +125,51696293 +128,36517706 +119,36485165 +127,95891886 +129,03775091 +124,56283295 +128,70321263 +127,53944547 +129,44652893 +117,47442039 +126,99074748 +113,12293033 +126,36538699 +126,05288192 +131,24182696 +124,43741360 +130,60456368 +130,49772555 +127,54569437 +133,94162892 +129,56004416 +118,48712400 +131,48232262 +130,15708461 +126,86472190 +128,96968533 +126,43423942 +126,63870290 +121,01925236 +128,75187286 +126,15280360 +122,84980234 +123,31904791 +128,25678740 +128,49744442 +123,83560581 +131,96805800 +120,20652042 +133,49844878 +130,64163994 +115,79514488 +122,15669274 +118,13181103 +126,81654083 +125,78774097 +120,62074513 +130,02448765 +127,27055207 +125,16165076 +127,37680394 +129,13249842 +125,62064217 +128,26056249 +123,86053923 +128,72157658 +124,36517526 +114,47629663 +123,18619531 +128,02223495 +119,28077909 +124,53593801 +129,75349867 +116,60191194 +118,34093559 +127,51360169 +129,55434385 +129,00889913 +129,04140619 +122,57364040 +124,12462475 +122,23946702 +126,10969055 +118,25833586 +123,56758191 +123,72790584 +124,59578918 +132,28881937 +126,91333973 +127,47579700 +130,72003926 +130,01593034 +126,57190780 +124,87600670 +131,70863604 +120,73702591 +126,45618902 +128,18830517 +129,98173400 +132,79720696 +122,70242126 +130,20279393 +121,90228361 +131,15021318 +129,19330806 +124,22186196 +128,91819985 +130,14778466 +119,18184271 +126,74257088 +118,12443262 +127,42121446 +121,55112288 +129,97065862 +119,66751994 +121,13467974 +128,24695006 +125,65279534 +125,71408112 +126,78081167 +119,33637959 +129,92804803 +126,56950758 +130,03414827 +116,25506357 +128,64861797 +127,69951484 +129,96869290 +125,71826328 +130,95753748 +126,00899167 +124,82424787 +120,05993457 +129,02788807 +125,27868176 +129,43152536 +130,95487074 +123,86800333 +130,73537503 +132,50967222 +132,00538894 +128,18444075 +132,11866878 +121,91732197 +129,59800385 +133,63429314 +125,86923821 +126,07766717 +127,71704031 +119,93487755 +123,55517542 +119,52943362 +118,87289095 +127,53479841 +124,80444611 +124,17395417 +125,60697043 +124,75620076 +129,86257645 +120,26889338 +127,51867480 +124,76918092 +119,91843063 +119,54334462 +120,34057625 +127,14265642 +126,55393669 +125,59981358 +121,00895287 +127,07338302 +118,64502628 +126,11251988 +124,06592525 +131,56823878 +124,35050358 +125,91105518 +130,00841959 +131,35964249 +127,76149836 +127,55618653 +126,15518530 +124,09908041 +125,50410222 +121,33820606 +124,42799919 +130,88043330 +125,01971621 +125,21644567 +120,98490795 +122,13764409 +128,67286284 +130,06968198 +133,13136549 +124,65290118 +120,70225618 +131,30757350 +122,21073403 +124,90364633 +128,49274740 +124,62060975 +129,22298828 +129,88268266 +117,25467973 +121,34077221 +131,69278107 +123,76749297 +131,47883201 +126,64712590 +130,26067455 +128,33376767 +129,03233255 +122,09556516 +126,79125551 +124,77924403 +126,83368949 +127,64421925 +119,88576608 +127,87550909 +129,98256084 +126,37255138 +126,01465379 +128,05663969 +123,42330301 +125,12872443 +124,54421322 +121,53208536 +118,36105811 +132,18962336 +126,45873434 +127,46946801 +131,07755115 +130,47531209 +113,00180844 +125,87629965 +114,76577117 +125,90911076 +129,08302707 +128,08655244 +125,13562088 +130,40133469 +129,36471390 +118,63599117 +119,20357407 +128,61521682 +131,45437017 +114,79900884 +127,14141469 +120,55321228 +124,17395143 +130,46084704 +125,23665195 +129,92083054 +132,35175967 +122,80839082 +129,89052083 +127,64500519 +123,39774187 +119,30343466 +126,96040077 +130,72844607 +117,85369210 +122,77760408 +123,73290204 +122,03678945 +122,53835042 +123,89381285 +112,66249588 +128,08311871 +120,85129865 +131,18698871 +131,52451178 +129,69974440 +121,63670008 +125,09162345 +129,43108036 +128,96655077 +120,15280708 +130,12953179 +126,15539641 +129,11312805 +127,68747394 +130,11679998 +128,65157870 +123,34537628 +122,26049451 +130,25972782 +127,74090895 +127,20947600 +124,69370738 +129,51512441 +130,40612461 +123,03072442 +121,80811891 +122,71041901 +128,96655812 +106,93795017 +128,92777462 +110,80454419 +115,10581427 +132,24247434 +126,06390587 +131,37592271 +126,76044238 +122,06689996 +121,88562454 +119,02823313 +125,04699672 +128,27401230 +109,96949337 +123,51530418 +127,40702083 +125,67653490 +129,39668194 +125,78049531 +126,59344089 +130,84917495 +127,32854236 +124,89297016 +129,57545804 +128,56545466 +126,22589526 +127,84955318 +127,76522593 +129,86700912 +129,34501106 +131,76064103 +124,59873948 +128,44002198 +127,37801991 +124,21025548 +125,82041952 +125,39963056 +133,32357964 +122,55491030 +126,82570102 +116,88558920 +131,13442241 +129,33561187 +123,63776946 +130,51366036 +125,44374385 +122,75031961 +119,58656892 +120,85090568 +124,16968866 +130,70526067 +122,81957808 +128,15640427 +133,43457209 +119,57825840 +129,22252953 +124,42394649 +128,05122032 +128,40371393 +131,16706087 +121,78980375 +128,24356535 +129,17946305 +126,49356253 +129,28252488 +127,45380195 +127,45015199 +126,77180434 +132,99318619 +121,04481188 +132,64009478 +125,83920696 +126,48163136 +129,08289963 +128,46124654 +114,96867051 +124,16277848 +118,27776003 +122,04519113 +125,87242846 +128,19889260 +125,79076269 +112,13399312 +129,77698829 +130,50956210 +119,18183415 +130,57991558 +124,45771729 +121,98883384 +122,39078966 +112,48848775 +126,94770143 +126,88530642 +120,44865740 +113,48703891 +120,42725666 +128,35549827 +126,08632643 +127,55328218 +128,65686808 +126,23967436 +129,43919972 +127,93759869 +133,39395810 +118,90996229 +132,00481602 +121,28434584 +130,58357598 +130,44763981 +118,39789211 +127,44398384 +126,72274868 +123,94652518 +127,19996213 +129,78960253 +116,22315008 +130,73350721 +123,01983491 +129,64653064 +128,85786726 +128,00397696 +126,75118194 +129,24621042 +116,61529339 +123,27733251 +126,35401976 +116,81165564 +129,28878514 +124,05495146 +130,94765778 +126,89326218 +130,71037641 +125,52241549 +122,20717973 +130,89533691 +127,04357330 +128,47792613 +117,80010387 +127,62010322 +125,31203076 +123,09545778 +130,05401381 +123,26070192 +128,12845304 +122,77365694 +129,12319282 +128,98177536 +123,16378645 +121,61531467 +119,52553346 +129,68882722 +132,50015103 +127,98370237 +128,59160215 +128,66689377 +107,43307991 +130,15000806 +121,72879070 +121,94842555 +131,93854532 +132,12039047 +126,22904889 +131,59256968 +126,53751323 +124,66770089 +123,23240922 +132,53895384 +125,52692035 +120,96899076 +125,74269378 +129,83314134 +126,25805917 +124,81414728 +127,82886532 +128,83874774 +124,56343449 +119,72903474 +119,98047752 +124,93253950 +127,59873746 +119,10416435 +129,80433483 +123,72404271 +118,73854327 +127,25343013 +120,95310044 +126,45004993 +129,19209562 +122,58773120 +133,07949322 +128,20584731 +122,23012939 +125,16061297 +126,33562363 +128,05893173 +127,91885098 +127,63924436 +127,31377870 +121,40745797 +121,35648310 +132,25658232 +125,03014486 +117,31629184 +128,13870917 +125,23901737 +128,38765607 +127,77834713 +126,43542625 +131,81757029 +130,51465565 +126,67028427 +122,11488496 +131,01998621 +120,03355768 +128,64227324 +129,43780759 +126,21137195 +129,16662635 +125,98507688 +125,82557439 +127,35993749 +123,74408615 +130,76232848 +121,99003322 +121,34051420 +119,46933902 +122,60749418 +123,49263614 +131,94190669 +125,22126322 +127,70471163 +126,10766063 +125,42358144 +126,64800135 +124,41225853 +130,81939333 +127,77963703 +132,81842971 +122,85134867 +129,53384280 +125,75095034 +117,09036433 +123,47644355 +133,26641221 +130,35374590 +126,77418411 +129,00210392 +126,90892543 +122,68930533 +120,25690241 +126,68859965 +125,59392752 +124,25089411 +129,04389915 +126,60222708 +120,50478096 +119,24850166 +130,89622264 +129,54480260 +116,92182996 +119,01652546 +130,94572740 +124,56847261 +125,58358042 +128,86306094 +131,58251934 +125,19168952 +125,26017383 +123,38669512 +119,45624687 +131,24948790 +125,25865732 +132,03232189 +122,67355357 +131,01957019 +127,86793325 +123,37594258 +126,76331958 +132,53966945 +130,19775113 +120,86511977 +129,45136855 +130,63193445 +122,57188134 +128,89570013 +129,04981926 +131,90894137 +127,34603704 +125,84497647 +128,41871671 +125,38290701 +126,06577624 +129,56196780 +119,60703178 +131,20618081 +123,44710144 +127,69129248 +127,11290000 +124,30857049 +128,99166781 +125,85941272 +121,25170508 +125,67576005 +129,17613375 +126,81775384 +129,34821071 +124,82973990 +128,02572311 +130,27334894 +125,35650369 +120,15676169 +120,09393422 +127,44791768 +128,86386526 +127,27437205 +133,88325977 +123,20727792 +128,46867366 +129,82631636 +114,08317652 +121,25230113 +128,19374380 +122,60329940 +124,76722032 +126,52694095 +116,39235395 +123,19036428 +123,44011474 +120,80846834 +129,01325518 +128,55450709 +122,82059141 +118,14669338 +130,73669237 +126,65698313 +131,85498946 +126,67612912 +130,71700513 +127,11186906 +125,00983052 +130,97769905 +127,13716618 +121,67460038 +121,06997990 +123,78697446 +131,93885037 +126,67866818 +130,97716034 +127,86773572 +131,98241174 +131,62495854 +129,39159055 +132,13984785 +127,23983519 +131,87799558 +124,16488992 +122,44923187 +127,27889954 +127,79685625 +129,78247434 +125,20234335 +117,98064098 +122,90076847 +118,45292103 +131,85430492 +122,20529607 +124,20664532 +122,31139148 +122,91976182 +128,25355927 +120,42287574 +129,08932471 +118,05133045 +122,93296279 +130,06085692 +120,82529060 +132,75625774 +128,56566822 +131,15442923 +123,80740948 +130,38078011 +125,38516399 +124,44443780 +125,14016191 +125,48190989 +129,83552891 +119,62749883 +126,18243965 +129,31526516 +126,09484391 +130,21034825 +128,96206360 +118,75192888 +131,67872824 +123,61526508 +130,68838681 +125,71265484 +127,58516808 +118,72972057 +125,47719695 +124,08507202 +126,61687194 +126,04154721 +125,70099956 +130,55314960 +129,95698111 +128,96180131 +131,05995275 +127,73245310 +128,39742698 +128,15298510 +119,59368675 +127,15541643 +129,88781066 +127,01218953 +123,95822767 +126,71978777 +119,29403850 +126,63085403 +129,36158924 +133,92122966 +124,32100301 +125,33546230 +125,35680978 +128,68975319 +123,48154254 +123,08919397 +126,48651373 +131,48526861 +127,18339794 +122,42165567 +129,02773680 +117,13664468 +124,26790077 +128,89892908 +124,00049264 +124,68034704 +129,29478819 +128,60062220 +124,22304131 +127,48228280 +125,57507430 +124,91180265 +111,19680078 +126,73311984 +126,37457265 +122,13867436 +123,68987059 +127,79547153 +126,97452880 +123,51221460 +121,06642407 +131,72962440 +127,92060149 +123,74166026 +129,80543279 +126,03180435 +126,72113605 +125,48053311 +132,08979542 +121,84528314 +125,99863521 +125,34156463 +123,47462950 +122,75343112 +128,80205632 +118,75199390 +125,94403864 +128,95108587 +125,80477704 +125,24963599 +129,64285984 +125,23575260 +127,26283753 +121,48646881 +125,58940210 +129,72378350 +122,33308858 +122,58842226 +126,65198521 +123,33325924 +127,04450283 +127,48567456 +127,18732416 +131,15259999 +116,80711866 +131,15018896 +122,77330308 +127,97138257 +117,98558046 +120,94781198 +122,87038677 +118,19941225 +118,85714967 +118,86620919 +129,91300734 +124,55353392 +125,57544985 +122,15892884 +127,93236947 +123,70040166 +126,16800844 +126,59517758 +127,55023055 +123,73125119 +114,93478781 +123,12186999 +127,98769612 +119,73480852 +131,57820637 +134,44479841 +116,21748354 +132,13812787 +124,24837367 +130,58953189 +119,59596747 +117,51530551 +120,23446910 +129,78311592 +128,94761344 +129,45342858 +130,68546447 +127,82128964 +122,62291062 +120,17707804 +131,19681181 +125,42233343 +129,93895443 +128,53655424 +126,30242417 +131,49804879 +125,00336633 +122,21878260 +127,06168440 +127,08783743 +132,42420914 +127,00766724 +127,88361663 +118,07333257 +126,15120911 +130,34674279 +122,96451297 +127,89904022 +125,69452040 +130,76371054 +125,88800124 +125,46756975 +127,27887655 +121,32483098 +127,15067373 +128,19920824 +121,09335943 +124,85837064 +125,56591253 +127,87301188 +116,56933564 +131,05148409 +126,41702097 +125,17854949 +125,68926204 +128,03887957 +127,65948074 +124,81480740 +123,40496534 +124,77931582 +125,28664189 +128,41394383 +123,58071353 +129,48604243 +129,66151102 +128,72953739 +124,10576997 +126,09252643 +128,47789139 +124,09816586 +126,31446082 +126,98802188 +132,41633350 +127,83552349 +128,14795033 +124,92348055 +117,92868719 +127,40731642 +107,26185852 +119,13198390 +131,21472363 +128,02894980 +125,06538572 +117,16470210 +125,29769584 +123,79691095 +125,63818916 +126,09084304 +125,79169403 +123,01729581 +122,99647720 +130,88715309 +120,32197165 +129,22645570 +130,31732958 +121,83388823 +123,69013682 +125,26552245 +127,25127787 +125,33472652 +125,31827247 +125,58857142 +122,32596936 +126,87881735 +120,77051741 +130,61251935 +127,77946728 +127,57404717 +128,37264352 +126,88299753 +125,36080898 +127,64163996 +128,12850713 +126,02993888 +131,85883862 +127,16405579 +132,63918590 +127,50355330 +124,22508085 +126,44725815 +125,06508118 +127,93421246 +130,77058837 +128,59091736 +134,85646429 +126,98023620 +128,17365355 +127,87553674 +129,81190661 +122,95527652 +129,21124413 +116,95057092 +128,01443422 +128,64126197 +115,00446091 +122,38675240 +116,87379427 +124,45518063 +126,52327254 +130,12544821 +129,46492812 +112,41600990 +125,66716260 +127,59832456 +127,32444792 +127,06865352 +122,21174358 +128,11812299 +127,09911222 +123,61792439 +126,88462488 +126,40012461 +125,65611086 +112,54179590 +123,43141060 +127,91705564 +123,10159909 +125,86692477 +110,39811186 +127,13711657 +121,10760414 +118,87077812 +123,38508646 +122,94046712 +129,69933119 +116,88981541 +123,88867648 +129,31284787 +129,60215864 +123,63417739 +131,75047133 +128,06532309 +131,94669331 +125,95138349 +121,31185952 +128,57224407 +134,40897933 +126,21278855 +127,25376066 +128,32310032 +117,24098740 +129,78174055 +127,56296902 +128,40097726 +123,35504418 +122,24934545 +128,30078648 +127,29716421 +128,86445974 +126,43613300 +121,69761117 +124,40336487 +128,84990447 +129,09170563 +129,85849344 +124,55372913 +119,59144539 +129,00325981 +128,10222776 +130,85141227 +130,39576233 +117,20804346 +125,21504019 +126,17904625 +129,85415573 +132,01217692 +127,13316059 +127,76628883 +115,39016331 +133,10047688 +123,93430803 +128,75382899 +125,33521942 +122,51610813 +117,39312356 +123,84197605 +124,76545348 +126,91229901 +127,29973618 +125,38019415 +128,66805405 +130,95040201 +125,38084573 +130,44339617 +127,85905767 +122,19565467 +114,71439052 +129,72725747 +126,25985595 +125,10882567 +125,72220202 +126,87400673 +123,07232605 +120,48557959 +127,46229856 +113,13730657 +126,99553516 +133,43817968 +125,73662090 +128,72303260 +128,49044125 +125,92302078 +131,33154499 +123,93332118 +123,28215179 +123,77822194 +126,48889153 +127,59755305 +127,85471601 +119,44760076 +127,32091758 +127,53837043 +116,80613594 +129,67194937 +127,04138045 +118,62423999 +127,61744559 +128,77703064 +126,06542137 +131,63725422 +123,11547726 +115,42899991 +130,17311484 +125,12721284 +122,61313016 +129,90039472 +127,49157953 +128,85625058 +126,68849702 +130,08702695 +129,98810190 +124,04276988 +130,74928475 +122,28604098 +128,45418243 +125,42090615 +129,47121197 +119,08671131 +123,92170547 +127,51343302 +129,46072044 +123,98476971 +132,16367002 +130,27478743 +124,13932280 +125,49548187 +130,83092262 +128,25064686 +128,06377940 +127,37187827 +126,99703465 +124,57645341 +128,32978534 +127,51602530 +125,30652926 +126,15625223 +130,82864887 +128,65016593 +123,46255856 +120,73252586 +130,54470229 +125,48511713 +127,82283092 +129,71813569 +125,10500944 +129,17679057 +113,25265731 +130,09656213 +129,78714157 +125,68129473 +121,79837742 +128,72058899 +129,47968682 +119,57426471 +124,25537173 +118,06629215 +118,97698379 +126,75205321 +120,32026746 +122,97953554 +117,29924795 +126,19503924 +129,73576786 +125,20221450 +124,87953730 +126,25474839 +127,91197990 +129,31370661 +130,40008912 +129,24193849 +123,78550961 +124,58281366 +127,54591220 +123,98681724 +122,12625015 +113,36395935 +125,34924856 +122,20632238 +123,37642950 +121,77656067 +115,47231394 +127,45341183 +117,95003500 +124,50222254 +130,80809633 +124,16389419 +127,30926320 +123,25076925 +125,64701656 +126,93691446 +122,83089663 +129,00348542 +130,84184839 +124,02975271 +117,80838223 +127,57331040 +132,61887111 +128,81827002 +131,29981341 +123,94395045 +122,65381903 +123,27525465 +117,53008014 +120,43578375 +132,50496541 +127,54930877 +128,31452031 +123,19209500 +127,00914566 +127,51980274 +122,11072855 +130,48449884 +128,58370556 +132,41762640 +127,58710487 +127,61101581 +123,92948045 +120,31060953 +128,75353909 +126,20087450 +126,57469293 +127,58410789 +118,78942917 +124,38327799 +124,71286528 +124,23131101 +124,68467595 +130,54606423 +130,42380057 +121,89312869 +126,98148497 +128,98893034 +131,29137972 +132,99948719 +121,33146837 +125,32079818 +113,87995697 +128,17843253 +121,40179155 +123,38023561 +131,12362625 +124,82181125 +128,05034083 +117,67914321 +126,12569741 +129,41657919 +124,26560267 +128,60669554 +125,62398028 +117,09215418 +125,88417808 +129,71865452 +129,92525809 +128,59468556 +126,77771562 +132,49720106 +126,56189353 +124,50991196 +127,32769398 +124,65929322 +128,10785797 +121,70830847 +128,49524978 +118,27959418 +112,82635798 +126,99008155 +121,41297652 +117,95182481 +119,34722038 +123,32511337 +123,78697475 +127,75073558 +124,15199258 +119,55193810 +121,66070940 +120,69456222 +128,41434012 +123,60226385 +115,93959411 +120,46577594 +130,59492971 +130,26250038 +116,05762573 +128,05294551 +126,80421002 +126,03071555 +127,87961855 +115,21019235 +124,53116355 +120,42291323 +123,41171498 +118,32300307 +127,71917555 +114,98141467 +122,76437833 +128,57120915 +125,46475991 +131,66931131 +126,35314895 +130,22635070 +124,92482217 +129,68252961 +124,02911732 +129,83186973 +127,33867316 +128,72853877 +130,53608517 +130,85492939 +128,94585364 +128,20009069 +127,09021112 +120,56132864 +130,04956605 +130,33936206 +124,55625045 +128,41671024 +131,15947696 +127,22631212 +125,79998061 +122,34089162 +131,40480521 +121,91316025 +126,78742909 +127,09835465 +123,99176593 +131,20295370 +131,27100802 +125,28158433 +124,85147151 +131,14786786 +119,32529555 +127,36865699 +123,16475633 +125,94947132 +129,54872481 +123,51855635 +112,72574373 +122,82530875 +125,50533032 +121,91574490 +123,63843814 +121,28640436 +127,71241096 +129,12271241 +129,34243420 +131,66417721 +126,10882115 +128,37148839 +125,23228771 +126,38374177 +121,87693595 +119,14632941 +126,04912825 +122,22916306 +126,13035856 +124,36207049 +120,22233570 +125,71144441 +117,68798555 +128,82085542 +125,64852727 +130,12190444 +131,77871442 +128,54288922 +127,01836277 +129,18613004 +126,18433712 +118,32666451 +122,18251940 +126,34553388 +127,54177920 +124,89709846 +132,90174361 +129,15702311 +125,92947997 +122,84624057 +129,61920061 +127,15030016 +121,53126062 +127,90748182 +123,72418496 +129,78031889 +129,11676158 +127,10695419 +122,29921792 +129,07924651 +128,12356149 +126,48601792 +130,68181106 +129,65750396 +123,92178729 +124,81299856 +127,86378767 +125,48874072 +130,75721378 +129,92944481 +121,74293182 +122,90671203 +121,25015213 +124,86368526 +128,26485006 +129,00629690 +125,48414268 +130,19483762 +115,68199271 +125,91138362 +125,76108926 +125,79199347 +112,60121284 +128,61133429 +127,21704759 +130,71788399 +126,79517490 +127,95784616 +125,07538185 +126,52221242 +129,47649340 +129,89359172 +128,28392484 +126,11234411 +127,89527468 +124,02158898 +108,14526396 +128,62489354 +126,86192953 +115,55295372 +126,12127385 +117,31497400 +127,03147176 +131,35665539 +120,01320523 +130,54986620 +130,91662647 +129,40221702 +113,47948598 +120,90615009 +123,26511736 +121,44611136 +126,50391021 +124,73044578 +131,39330424 +126,39984634 +123,92845609 +127,69121682 +129,97659606 +129,06638711 +131,59764274 +116,38094778 +129,44384637 +120,49641019 +129,85417051 +111,59361221 +128,46899520 +122,61888073 +128,88042916 +130,21986420 +124,19706052 +118,48356498 +130,39687713 +128,74603499 +126,65763643 +125,16490772 +109,29829076 +122,38076220 +118,84944283 +122,31582739 +124,37445079 +131,31473284 +124,69411683 +127,58152002 +126,24349773 +120,46511028 +118,62359529 +112,08011576 +130,66783953 +129,64960165 +126,47886375 +129,97866990 +122,15105967 +114,10706041 +129,71222969 +123,12465650 +130,07344210 +131,04486800 +127,92749320 +131,42928876 +125,47786222 +129,88708792 +129,81388170 +133,69538710 +124,33919934 +122,12498841 +126,57969651 +129,53928913 +126,74606617 +128,51280909 +128,39052904 +125,69016740 +122,96114615 +125,97880592 +123,71989838 +116,39619661 +126,86385445 +129,98916021 +124,09475183 +120,20821260 +123,75654859 +121,93540359 +130,64133177 +116,56273471 +123,39880283 +119,83561603 +130,54786912 +127,79275855 +127,41931766 +131,19932986 +123,93931348 +119,40341171 +130,14502588 +125,78886950 +123,61649479 +128,61294909 +129,17269172 +126,09029694 +120,08323670 +121,71745410 +121,32820741 +124,09890082 +126,16837826 +124,36877010 +121,05635347 +122,50460831 +131,58628539 +128,50607519 +125,76154901 +130,29754474 +124,68528648 +123,45440685 +127,20753691 +132,72547475 +126,06293165 +120,54655950 +120,52538147 +129,10800582 +125,88816019 +124,63248500 +130,36437992 +115,54838336 +125,15390119 +130,38888887 +124,20428089 +124,08757696 +121,65411581 +123,20691085 +111,97102902 +123,07064970 +125,01990019 +126,91364790 +126,35933562 +124,25026581 +128,05703509 +126,85213799 +131,03012204 +125,53045593 +129,24579050 +130,10551882 +128,44871033 +120,31526384 +129,91626537 +128,17802020 +122,01109141 +123,87270736 +123,67362909 +120,19905369 +131,98722329 +123,52239753 +132,87445530 +122,72639628 +124,67081845 +129,91717841 +125,45837423 +122,17423299 +125,21499676 +113,82537568 +132,71698858 +127,86002572 +128,89545916 +122,04988099 +125,67713430 +122,91635629 +131,20221768 +127,38730639 +128,14606986 +125,67660693 +122,67083830 +129,74955819 +130,67900809 +128,28612799 +125,65611178 +129,45578105 +130,60805878 +125,77531083 +128,38339648 +130,78566991 +131,55533326 +130,02979844 +129,17354267 +123,92716114 +121,62196235 +121,69075641 +129,31820591 +123,81844655 +127,38396404 +123,75051880 +120,22053422 +129,79855813 +127,61696983 +117,07498917 +130,46524207 +127,56307491 +126,08769376 +127,25277121 +118,59570116 +124,78267071 +128,00977103 +123,37920162 +124,94882102 +132,51702695 +120,21910016 +131,17880615 +126,58306014 +120,98196092 +127,97672409 +127,84993584 +131,75072760 +130,49715861 +124,04860663 +126,82828853 +125,05914195 +125,80234102 +126,65968234 +125,89869381 +127,54714727 +129,76515303 +119,93981184 +127,55846237 +128,85484436 +132,22185418 +130,11372879 +127,46753439 +127,06903704 +121,62610641 +130,46589753 +129,59751628 +126,59988886 +122,79452920 +126,70810913 +124,07034906 +129,68119338 +126,66510976 +128,03990395 +118,06013585 +127,89465021 +130,49405562 +128,17313324 +126,29607071 +126,57393258 +126,84347438 +128,18696117 +123,43345659 +122,98539565 +127,39876998 +121,29142674 +117,33377773 +125,02176756 +126,85049764 +129,03867276 +126,33049775 +131,04160572 +129,93403104 +123,34063935 +122,23519623 +131,50134316 +130,58011859 +124,76437649 +128,63014994 +132,23214233 +121,92987453 +126,48289736 +119,92601689 +115,68276034 +128,93452736 +124,50695420 +114,18257268 +125,64377886 +120,83561955 +132,28924169 +130,00329358 +122,18315544 +124,78542747 +126,05078146 +131,04013025 +126,92702927 +127,65478974 +130,50192292 +129,60120585 +123,51288138 +126,84528379 +124,73650960 +111,95835362 +124,44583653 +118,77517061 +130,63124384 +129,59467742 +126,76061753 +124,03245038 +122,61808048 +127,00940717 +129,61174014 +124,56122121 +124,38880275 +126,98396754 +121,38797168 +128,82131047 +129,73536125 +126,49467262 +131,73630296 +129,90405363 +122,28912308 +129,51609740 +130,09392905 +129,33931904 +133,72326528 +125,42740823 +122,94493173 +129,07278906 +123,05171475 +123,47629909 +129,15618759 +124,16025958 +129,23852655 +132,21808245 +125,89958913 +131,05607722 +130,64716579 +125,12076123 +122,99407161 +127,57829263 +122,00005000 +128,46350876 +129,18681854 +124,38729501 +120,37981600 +126,99667801 +128,79377624 +130,22564213 +127,48118795 +123,90518082 +127,40023468 +125,95168309 +133,91066663 +124,34554737 +124,34897950 +119,50869378 +122,28106091 +126,88800182 +125,57968450 +120,29097949 +131,46114403 +124,53682818 +124,14724768 +131,09258031 +126,12680018 +122,75134116 +131,39355988 +128,78806283 +129,06655741 +130,05390022 +120,98524936 +132,20525270 +133,87966175 +131,21230671 +128,29046553 +127,20663107 +129,48678678 +130,33827546 +122,79924875 +130,34359574 +127,12466105 +125,83765578 +129,12299687 +123,99018119 +122,47411735 +129,19194946 +131,21156748 +129,93749672 +128,51015296 +134,26333168 +124,66454424 +124,90626200 +128,75913693 +131,43408316 +126,24015798 +128,55353579 +122,05209057 +127,31866402 +124,52263663 +126,17841788 +130,22820366 +114,12573554 +126,64955966 +127,26703977 +126,84742037 +124,43498957 +123,91273054 +124,45192813 +130,75760228 +125,02990231 +126,08735809 +125,26371671 +122,96064920 +125,78162489 +124,14718591 +126,53963638 +129,79313408 +131,55752968 +122,91283808 +125,65395655 +124,26695508 +131,26479096 +127,02936712 +126,89914415 +123,96611108 +126,32526170 +122,62438640 +116,00840772 +116,45358109 +120,73487831 +131,85234328 +131,58836240 +123,36287609 +125,00662299 +121,20094185 +130,12541048 +121,28966931 +128,50049707 +127,22587847 +122,82011719 +125,65931522 +125,22264804 +125,30669604 +126,52986997 +133,43711065 +126,35347193 +130,18285840 +132,01461502 +132,64433446 +126,24341291 +131,77283268 +130,03401189 +125,19722129 +130,65327964 +130,03920471 +126,36689533 +120,03996633 +125,76218041 +129,88172108 +124,79074866 +121,55507895 +122,98834205 +125,91872713 +128,32090365 +124,15066868 +130,91155431 +130,88283012 +128,25955407 +132,09780363 +124,06046954 +127,82811367 +127,66724973 +128,28810055 +124,14863478 +119,63432868 +130,45817722 +123,97112497 +127,71923057 +127,15017952 +127,98831401 +120,64557279 +124,32758950 +128,76105612 +122,78270935 +129,91469459 +128,23885350 +127,73105705 +128,67034763 +129,67982982 +132,01344671 +129,95749921 +128,22886951 +124,47706455 +130,92405680 +123,59482213 +130,52843735 +127,17434638 +117,20988562 +130,42734924 +115,78950145 +128,06053622 +117,23947677 +122,36072539 +126,24370744 +127,75637961 +119,39327603 +125,18863020 +120,11770130 +129,49487732 +124,55069463 +126,12219134 +129,67741765 +126,30191756 +127,37105938 +122,42710908 +125,83205854 +125,28232196 +125,83184538 +122,99788096 +128,60575863 +128,04134445 +128,16442975 +126,58091070 +126,70613515 +125,70985146 +120,74047704 +127,69681605 +125,17484257 +125,07923341 +126,77345465 +128,02251029 +126,30933347 +128,00148360 +127,87896883 +128,11626627 +126,47698700 +120,01502445 +125,35143958 +127,55401848 +125,72242155 +132,51572799 +130,60376702 +127,12388424 +124,12637171 +123,49576260 +129,70733998 +126,31885516 +129,77870551 +133,53304104 +123,13756058 +126,78599251 +121,30432366 +123,83061163 +122,18121165 +118,40164934 +128,42913925 +121,65245808 +125,35506275 +131,67767374 +122,83020527 +125,09084584 +129,61711494 +119,45201928 +124,65849645 +121,10598131 +126,09292941 +115,83372916 +122,25316160 +113,89857345 +127,00053126 +123,79524819 +132,94952387 +125,36919643 +131,43176999 +127,97773707 +127,96230010 +128,97621321 +129,96331599 +127,19054923 +120,23285481 +120,22260218 +127,97445794 +131,87669766 +121,35193620 +121,80698895 +127,16650775 +127,71778829 +125,19608429 +132,07348761 +129,81846186 +121,14490303 +121,61757332 +125,16207800 +124,83942702 +124,27291095 +126,52066746 +129,83939526 +131,07322407 +128,98890720 +126,04761553 +123,14844980 +126,00326895 +129,01457551 +127,89076867 +132,45119043 +124,72659984 +127,56972151 +124,79594800 +127,38652927 +126,44063971 +127,47267959 +130,48302634 +132,86597558 +121,80265228 +134,65931133 +128,86341537 +123,31116626 +129,61133518 +116,16509725 +127,64933931 +128,14645349 +126,46202634 +129,46743446 +124,78399999 +120,24534622 +133,12360761 +125,55248261 +126,84923954 +124,34874957 +131,84045740 +126,46001308 +128,85118230 +128,99160705 +126,83958948 +128,89485596 +129,96243242 +128,71695576 +120,53674346 +129,71141192 +108,56070561 +126,08986530 +122,95389881 +130,89340420 +126,97693284 +123,68713801 +122,96476342 +126,33777049 +128,03153995 +125,93847431 +122,26877869 +119,23518102 +124,37475995 +119,55491713 +129,65456779 +124,89146601 +121,92606980 +124,37262379 +130,97567168 +127,85923338 +126,37484235 +114,56515567 +126,44553238 +125,99774575 +132,06595786 +125,89869970 +123,34013870 +126,94463058 +122,68698171 +129,62562252 +126,53830682 +119,89190990 +131,33522715 +130,03456857 +132,14734406 +123,49593065 +126,53354584 +126,63493568 +126,50785419 +129,72618275 +124,63252493 +125,47299264 +124,11467006 +120,87640542 +130,64081724 +121,16955145 +129,86567633 +133,72617546 +133,32324043 +132,43006503 +130,48579559 +129,22115197 +132,93437817 +127,34925462 +110,49308021 +129,13827123 +120,10227139 +126,17602657 +122,13443400 +128,50748869 +125,24236874 +129,76706847 +130,75716662 +120,80291997 +130,37931600 +124,65444051 +124,05775792 +128,99959477 +131,64300434 +126,26990811 +122,99176440 +125,62271808 +118,58234010 +128,43814923 +130,08835218 +128,14025122 +124,15225348 +118,37256309 +123,75813884 +126,50706869 +127,92223862 +116,61483698 +118,56766756 +122,08644261 +126,94636046 +124,93685021 +121,96627680 +125,22294524 +126,41486467 +127,49794044 +128,51888736 +126,05797276 +125,38005950 +130,10063707 +115,89818086 +128,35763030 +122,71331115 +116,91659774 +118,36319891 +132,81624299 +131,13533186 +125,29785040 +131,39405618 +122,53472522 +124,09805370 +123,15630419 +126,32844726 +131,12788852 +119,14254131 +126,18251901 +132,49550470 +116,83484540 +127,68472132 +124,09307087 +127,51741314 +127,37680453 +130,94720518 +126,26487124 +128,17789489 +119,97811932 +130,10903722 +128,65349213 +124,92167093 +129,52802511 +123,58657667 +126,37390026 +128,33584154 +119,51679386 +123,71675100 +130,51517585 +126,13798108 +128,91971603 +133,18290829 +126,95146801 +128,49839014 +126,02580976 +122,53155455 +125,84037674 +129,15144503 +127,41100480 +124,42510283 +129,55118242 +123,59608560 +119,05789004 +132,50136690 +128,75471147 +123,40256645 +126,65348065 +128,63681549 +127,36735940 +129,52501260 +132,31999769 +129,93358062 +127,99236086 +126,52844897 +129,98454688 +129,90931396 +127,69415136 +126,21553480 +128,25197265 +123,84999395 +126,57247133 +130,37631641 +129,59388610 +130,35668598 +120,98900636 +119,54079865 +123,56017800 +125,29094181 +130,67905899 +131,68803380 +121,62327468 +126,14012261 +125,90260950 +130,12869293 +128,24431691 +114,80097690 +117,34990420 +123,87013508 +128,13331826 +128,12690263 +126,22918750 +129,86342514 +125,29824756 +130,70580070 +126,61230111 +125,93343214 +130,81905983 +118,84364238 +125,46471508 +124,79727853 +127,85360067 +125,80426386 +132,81055978 +130,05184007 +124,17425223 +122,63490101 +130,38075518 +130,84199231 +125,02741840 +130,67589347 +132,68923736 +121,17541662 +127,07387036 +125,60986752 +122,45333663 +130,36676007 +126,39941538 +131,85049403 +122,14287523 +124,64290577 +127,50657667 +131,60068799 +128,88235271 +119,30738914 +123,64356396 +125,75918225 +112,86774667 +124,80235873 +124,76312647 +131,31943789 +124,77044824 +130,52883894 +125,37644778 +125,03757965 +127,89463507 +133,39031957 +129,82022685 +131,09983478 +121,06214104 +127,85299648 +129,45358952 +125,80301340 +130,02907038 +121,16530532 +127,03351368 +131,37920153 +125,70119950 +129,63093304 +128,48936714 +128,57631639 +124,96319663 +127,05489070 +129,30352394 +129,35992990 +124,47537379 +126,75091914 +129,73994139 +118,73079579 +131,46256944 +127,62776595 +125,04233010 +130,94232541 +127,76852754 +121,24470560 +123,94752351 +127,01973685 +128,78933061 +120,42406142 +127,54717944 +131,20748557 +128,86418612 +126,57858431 +129,93977850 +126,29784077 +129,18272279 +130,85679642 +126,79198097 +122,13074927 +119,60552478 +114,45964405 +131,52583114 +131,89580007 +129,40874313 +129,60053140 +129,23988113 +125,38247557 +119,46794557 +124,27235163 +121,22087841 +127,53879420 +127,58750935 +128,06135795 +129,85715620 +129,00413923 +127,46213358 +132,06567928 +123,05774946 +126,58033452 +122,14801977 +127,95464096 +130,60349330 +129,84305023 +122,77636080 +121,16895676 +131,77298100 +124,02706779 +130,48165295 +122,15740664 +123,38748030 +127,44725813 +126,52150831 +129,53060274 +129,01384884 +121,72957515 +130,72709127 +129,03391009 +132,50442103 +125,82855758 +129,00260221 +125,91205576 +130,21936453 +118,07677185 +118,44329711 +119,81071072 +125,63638061 +125,69424561 +123,45596568 +131,04956875 +125,91961926 +124,80638025 +130,01190236 +122,87744292 +124,25851512 +122,85548427 +116,73134554 +127,60619163 +126,09812810 +113,74085015 +123,17628013 +132,35989047 +128,09006211 +120,59225741 +132,52607177 +125,06463275 +122,15846629 +118,95414071 +124,79534740 +127,41424063 +130,40727953 +125,08597631 +115,01431931 +120,70522823 +129,74733679 +122,32711950 +121,90234069 +128,36337491 +127,32603826 +125,02720552 +131,39894974 +127,13972831 +128,22030625 +134,15349158 +123,58164391 +129,22710588 +115,82400076 +123,27588201 +134,42186737 +126,14771976 +121,10704003 +127,02608028 +122,95191672 +127,52483347 +129,63189676 +131,42255258 +122,83465146 +132,64759917 +117,48662239 +129,46042053 +129,68538517 +129,05710308 +127,43560655 +125,06316863 +125,91786220 +122,95826031 +124,71884561 +126,16805354 +126,30139620 +119,19278069 +131,05675069 +128,45782272 +126,16171529 +131,61161567 +126,62257632 +126,36728459 +126,63290890 +117,25400834 +125,80071438 +119,94452048 +127,73946602 +125,70243900 +121,06866939 +128,95086457 +124,85390225 +129,46468813 +127,26187531 +119,08528232 +127,46954195 +131,74688330 +123,07059496 +134,07950611 +116,86604533 +124,70088902 +127,07042406 +127,69361311 +127,13177372 +133,39273570 +127,85549689 +127,23445296 +129,72293685 +122,71979710 +130,53789818 +126,57431685 +125,15556549 +123,47468087 +122,43179202 +129,38290916 +129,02464789 +109,98154205 +122,59549975 +132,65497696 +121,66514235 +132,77900354 +129,38958065 +119,61050145 +115,66498552 +128,15798602 +128,22092433 +124,43001592 +127,03271253 +125,00124826 +129,23554132 +126,97009125 +123,34263205 +114,55034559 +127,34684447 +123,88337899 +129,32685423 +128,61922765 +120,57228016 +127,09978894 +125,55625037 +132,70911675 +122,50104741 +115,57026696 +129,56335745 +125,13355622 +128,32810521 +129,40394869 +121,79376740 +129,64025815 +124,79114657 +116,63448513 +126,11109304 +117,82901827 +124,42452833 +117,60972324 +126,68567903 +116,61012113 +128,19230665 +129,17994665 +120,11965947 +123,96335646 +127,24036658 +128,18205749 +120,36788394 +130,40072459 +129,74170367 +127,07212208 +128,17904020 +131,98663088 +128,19454410 +131,29152197 +124,92493975 +123,02979236 +122,80062831 +126,69278912 +124,19051904 +129,56569514 +128,44816095 +120,52144832 +129,91113825 +125,02736970 +128,80892118 +122,03363893 +127,70805033 +127,63501757 +119,90467591 +130,41230467 +125,38572345 +125,40361974 +127,71079104 +117,73618773 +130,88608235 +129,33491470 +124,93048851 +124,76341663 +133,29685961 +125,43198599 +132,83006176 +131,31329487 +127,14640515 +130,72642611 +118,77737884 +126,08860075 +122,27309820 +127,73795253 +116,75958262 +127,19121023 +121,72671313 +127,31970201 +132,82874780 +116,09404877 +126,68817716 +118,50924499 +124,74174754 +123,63546979 +127,82618818 +115,47975746 +129,23994661 +130,12324704 +130,39028537 +123,96007635 +119,78335332 +130,43171749 +125,35850793 +123,79449678 +126,68542073 +120,44520223 +129,91257287 +130,21874561 +126,53393047 +127,97841008 +127,95614361 +129,67969398 +120,60824533 +131,01383781 +126,63788970 +133,01651471 +128,51425184 +126,46360783 +130,80466412 +126,26701125 +128,43737210 +116,73198440 +125,36668213 +121,78876893 +127,76807264 +132,27955380 +125,74530874 +128,51704095 +126,41178478 +124,57688152 +129,27842271 +127,22759475 +126,96713068 +122,77479625 +126,59561302 +126,60720978 +126,12339901 +130,69403477 +131,58644431 +123,95469814 +127,31135741 +125,40433517 +118,56874570 +125,33912303 +130,76935782 +131,52800842 +133,46815255 +126,52686688 +129,06106174 +115,76521582 +131,57408616 +128,22918127 +128,80109865 +125,00788891 +127,89611420 +127,10649271 +124,27160628 +127,57060605 +125,34062427 +126,39497762 +131,61495059 +128,44666356 +119,99529251 +123,68764394 +127,58896266 +127,15721904 +127,07170318 +122,07856003 +131,28388289 +129,87737186 +129,59916838 +122,52001174 +125,03118530 +123,29357960 +128,21529277 +125,28871406 +123,35350088 +129,87782583 +129,60716566 +133,99043607 +127,31718012 +126,12570793 +124,93673645 +128,39653797 +125,85029188 +128,99620017 +123,49285706 +124,64257843 +128,78824489 +131,42124760 +123,86112714 +125,29573708 +124,10723574 +125,59703730 +125,72974054 +116,98226153 +125,44057814 +127,43824190 +128,96700686 +128,03744601 +128,62599401 +126,81516608 +125,36639567 +128,00894699 +131,51931454 +129,22620813 +118,21021269 +122,83253877 +121,71253608 +123,43773884 +121,77375175 +118,65155369 +123,96076777 +126,06043619 +118,92642581 +118,44173371 +119,93957199 +132,37601975 +132,41131080 +130,26116389 +129,72463117 +126,58304033 +125,31517948 +125,00982359 +122,24132926 +129,50210590 +121,92180013 +130,63744080 +123,61919938 +127,64021207 +127,95710659 +127,85360024 +120,36633186 +125,49626463 +125,55899889 +126,38093765 +129,90793134 +129,42124348 +128,16196716 +130,14809231 +128,39673080 +129,33199365 +125,81051460 +124,18040578 +126,45732270 +128,16856316 +127,57268716 +129,36270310 +129,44487420 +130,29159260 +124,63164535 +130,23494570 +126,33240512 +118,30026238 +129,19038744 +128,48554450 +128,79502916 +128,18201088 +121,81195669 +118,71427608 +123,06278168 +120,96386825 +119,02950764 +121,92649168 +123,16488716 +125,90277682 +121,95842864 +109,51448361 +128,64329978 +130,80981332 +122,13172334 +124,62682362 +125,22717396 +124,90590040 +113,79734271 +134,06155578 +129,40504846 +121,59338123 +119,14066321 +129,86427669 +114,77152898 +128,43783404 +115,93882541 +125,63154685 +124,59043210 +131,22787014 +122,79631068 +129,63792950 +125,65899844 +122,20652636 +125,30708926 +124,76499300 +124,87089929 +119,01440537 +125,78355500 +126,11791021 +131,04148846 +125,99925162 +121,40633771 +125,88852298 +127,90478363 +121,20499322 +123,57823512 +127,74648105 +120,24403243 +126,14257179 +113,89103355 +127,10341843 +118,12595620 +124,02558514 +121,76019961 +129,05000710 +115,38729094 +130,50120270 +128,25459778 +119,74234794 +131,44542279 +129,04936073 +127,70845598 +126,03267384 +130,39527030 +116,39309779 +128,89832427 +128,84142566 +127,51449222 +128,13972422 +125,50431671 +123,53658934 +126,95579995 +131,09084360 +125,38166528 +125,70360270 +123,93536569 +129,33869249 +122,30316507 +126,01070114 +126,70129766 +130,23111139 +125,40794755 +129,88456996 +127,19590645 +125,98661022 +131,74903938 +123,02766404 +116,48811719 +128,46942040 +116,76779365 +129,17928226 +131,61548836 +125,49827504 +127,76688780 +121,60318468 +117,92175867 +127,01538758 +130,27378173 +113,43642975 +122,63455772 +127,64498619 +129,43337777 +121,27956985 +125,56908330 +124,09891423 +127,85871411 +123,74864524 +118,31617604 +118,32692357 +129,20952240 +125,33750082 +127,24445554 +122,52533928 +128,91599765 +124,03736693 +121,94053985 +128,53841804 +127,83808861 +127,38544281 +128,08510547 +123,97598440 +129,02480703 +131,46172450 +129,77654895 +127,92012334 +128,02976465 +117,51911181 +128,06878229 +125,12398271 +129,28498259 +134,09678135 +123,91329863 +123,96589532 +123,76956145 +121,71454300 +126,30048703 +119,35737304 +129,03186984 +123,86020866 +119,75226625 +126,65375384 +122,21853803 +127,17645808 +126,40099626 +129,01076167 +126,30402498 +129,20874594 +122,18551109 +124,14922218 +133,98226315 +128,17733670 +129,78482516 +127,60002756 +130,92471725 +125,41332452 +129,44134224 +130,72892209 +126,68030754 +125,74155564 +127,54287263 +121,99716806 +116,47256456 +122,41448655 +128,33884703 +119,59203948 +120,40121255 +130,68772869 +130,53566207 +133,64362534 +130,14581749 +130,27815910 +122,66282762 +125,06932099 +125,26370737 +121,53913347 +129,73637301 +132,89681802 +124,11335016 +120,92442572 +128,33929396 +129,40478328 +126,28782417 +130,16536776 +128,77241801 +123,89707372 +132,07012078 +131,57253145 +125,99674305 +129,39832319 +128,41009286 +125,65434073 +125,80045035 +127,20655194 +117,85949214 +128,22759048 +124,73480531 +122,12996264 +126,50390936 +132,42235645 +125,09124862 +122,25474674 +127,06479578 +119,78161153 +130,37153069 +125,77877447 +126,83751682 +125,40543763 +127,56864498 +130,71757662 +123,91870259 +129,23842687 +125,23543343 +116,83753105 +126,44457850 +129,33514464 +123,23059048 +122,81981704 +126,96718308 +128,23365827 +130,06177295 +119,77788922 +130,46489100 +122,30112446 +126,40283513 +124,26606915 +128,22405598 +128,73704663 +121,89560273 +127,37615565 +132,98911586 +128,81859059 +118,91681628 +126,65865784 +128,34866846 +124,04656394 +128,43437448 +123,14272938 +129,60890965 +131,08769225 +118,54271836 +112,42953399 +128,73943410 +124,72369070 +130,38600243 +127,87048791 +127,90931747 +129,18963179 +126,18004798 +130,98555380 +127,90266381 +131,58582226 +126,55758241 +128,20973507 +124,96862311 +123,55881370 +121,15126416 +128,44118069 +130,83657368 +126,71631479 +128,66125665 +126,91158085 +132,34495409 +119,46167111 +130,12355470 +123,30898086 +125,48806686 +124,37989294 +118,58524052 +133,40513066 +127,93532140 +127,11468220 +131,77029838 +128,87690539 +124,78207813 +122,41313422 +126,30786186 +115,56066672 +130,88592962 +123,85553672 +130,51153188 +123,80169622 +127,14905960 +129,73783830 +128,96291300 +122,32313269 +129,24933737 +126,93341529 +121,13295640 +131,23274320 +129,54977458 +124,24009099 +123,66968715 +125,32566463 +128,46647290 +129,70578785 +123,17856772 +125,08146496 +122,70623403 +124,35057423 +119,63443375 +132,24919196 +123,62268868 +113,86201280 +125,74194572 +119,35809742 +124,24497950 +128,80556201 +130,18969790 +130,34248133 +127,20407616 +115,78085222 +130,64684490 +129,60238091 +118,94989287 +121,01474087 +110,80225555 +127,65871852 +119,31703312 +131,95062025 +120,26483466 +126,47388821 +125,00868881 +124,94487713 +130,09658355 +131,87696149 +125,96808103 +118,40177876 +121,36220103 +125,19023039 +119,08153677 +125,53818034 +122,24556411 +126,28687060 +129,62673009 +127,43175190 +129,61209034 +128,47384920 +127,89162265 +120,78348578 +131,98811208 +127,68528616 +128,13676413 +120,92633347 +120,57148795 +122,59828386 +130,99438219 +126,57945865 +132,96571149 +125,22005984 +124,94263854 +128,53434697 +129,17061607 +119,10073432 +134,31710056 +129,39991611 +123,89061732 +131,18708560 +132,44198481 +130,84671573 +123,14981859 +126,42655664 +127,76206875 +126,20702145 +120,95812897 +126,40849676 +128,45544668 +125,98678369 +125,28654154 +124,20427481 +132,24824698 +128,01847859 +119,42337504 +124,62740472 +128,90178954 +127,80727852 +131,17535495 +124,15487678 +121,54393356 +131,21951785 +131,42239918 +129,50463011 +125,54082187 +119,62339226 +129,56282603 +123,65628961 +127,52962901 +131,46816375 +128,31138616 +126,91229811 +128,77633657 +130,43592197 +125,68826443 +126,69071572 +129,33936441 +125,11425201 +128,59719697 +128,62783998 +120,02981734 +121,19911529 +124,36137648 +123,62341988 +125,10197126 +131,28170674 +124,91923604 +117,48360856 +118,58122288 +125,88961964 +128,21699018 +128,59596226 +125,62184365 +127,77718429 +122,49795402 +133,30374028 +126,89412429 +128,45739491 +128,07428665 +119,98237290 +130,21270713 +119,77732668 +117,53452460 +127,67689059 +129,13266536 +128,60768184 +120,83128688 +119,79245567 +130,65802392 +121,01695944 +122,89006396 +129,69336975 +128,24776670 +128,75404827 +126,15184536 +131,01936021 +130,99063190 +118,56834840 +133,56325796 +125,46101397 +125,60601954 +128,57353986 +121,74867051 +126,05482639 +127,49591985 +124,16109666 +122,46261994 +131,76267771 +124,66145607 +124,95257650 +125,59058764 +125,65925686 +132,23001625 +127,84019046 +128,24866964 +126,87841099 +129,07809989 +124,39402960 +128,38603547 +126,53194016 +123,58544015 +124,07523513 +127,23030294 +116,08230705 +125,57561751 +128,58486662 +121,80931802 +130,69052999 +123,14999377 +126,43103353 +129,63950914 +128,02656341 +131,52536643 +122,69927783 +125,67421612 +128,55314791 +132,36372785 +127,22282067 +130,29699906 +124,74227670 +125,10696125 +118,05773886 +127,42695637 +130,45976064 +132,15237802 +128,56118370 +130,32862355 +119,78947221 +127,22541091 +124,78190847 +127,60584313 +124,51804762 +115,25332584 +119,81948262 +123,22161081 +124,78985506 +127,13308500 +125,19259863 +128,00010015 +125,05701243 +125,30889460 +120,97891396 +127,77536749 +129,75904185 +129,44563144 +122,73613272 +124,40809106 +135,26713877 +130,09870979 +123,47802992 +128,55605142 +121,86950046 +133,17024978 +125,19388273 +124,13303369 +129,10263277 +129,10369342 +116,65455007 +123,57693703 +126,57897114 +133,04982348 +123,57947115 +127,87975446 +129,88007739 +126,11115320 +118,60513061 +124,32889488 +126,84462246 +120,71282843 +127,30623906 +129,71292209 +121,74898187 +125,38524686 +129,27055482 +123,71451481 +117,45017266 +124,42788333 +123,29487417 +130,84736245 +129,06045780 +122,45824764 +118,56730653 +121,56874258 +123,04576083 +121,97732887 +127,41595169 +132,07396861 +115,01801054 +126,21946280 +120,87493101 +123,54671069 +123,16202850 +111,75938455 +132,48314799 +125,99550635 +123,92119716 +124,96992717 +125,14678331 +126,18397467 +127,96910257 +130,46102929 +113,64254838 +123,27197975 +126,83851488 +129,66433988 +120,41583897 +118,73625857 +127,57388818 +125,37804946 +128,35535449 +114,78309449 +126,84162952 +129,77323803 +123,11935463 +129,35675723 +126,72071402 +127,40786738 +123,06491478 +121,31337665 +124,89365146 +128,85990295 +128,07067838 +116,28162999 +127,59543517 +128,94481751 +128,94375853 +132,77755349 +128,35479909 +127,94666512 +124,19196377 +122,23384818 +129,44956528 +128,85459602 +127,34924034 +122,36737789 +122,48945303 +127,87964855 +124,79149462 +130,93897522 +126,68000078 +132,36988069 +129,26355549 +123,75535097 +128,78121697 +122,72807973 +132,69700291 +125,85339142 +114,17727727 +127,42028363 +133,61537316 +124,98226531 +121,21137931 +132,16451191 +132,72733240 +126,70647545 +127,67818657 +127,40205109 +128,37543664 +127,94666013 +123,43098864 +117,53691607 +123,97783217 +121,21338366 +125,56863954 +124,52580414 +121,01363074 +129,30538855 +127,79646327 +127,39698298 +127,67306501 +124,43523412 +132,60482211 +124,24568731 +129,53374943 +132,42455317 +122,30355261 +120,41715607 +127,65148168 +126,98934960 +123,22620394 +130,09918528 +126,21252515 +129,54646365 +131,98389345 +114,95449086 +125,98648043 +123,74900925 +130,47318118 +125,48584281 +128,08793126 +126,45227092 +132,00559298 +126,04697381 +125,87482065 +115,11460986 +127,09917523 +127,90252335 +129,11410178 +128,41548235 +126,47177121 +127,75465262 +123,97934242 +129,05808531 +127,11942519 +126,97905302 +124,21608872 +127,45370814 +126,12234355 +125,05683346 +127,64907353 +130,14614050 +120,10681343 +115,07494744 +123,52937420 +129,42517456 +124,76978805 +123,50073826 +125,43127026 +131,43968530 +123,65609605 +131,28811054 +126,69863153 +125,10811792 +132,40889966 +130,05895723 +132,40384520 +132,64786743 +129,75121444 +124,05458226 +130,21460817 +129,44005086 +125,02976410 +131,23707037 +128,02100423 +121,32363557 +120,85611805 +126,01102418 +131,08452254 +130,29794522 +124,21513779 +112,47010433 +127,99843873 +127,99324925 +123,26306391 +113,90186407 +129,07389010 +120,54085007 +122,49623267 +127,22528727 +123,82151205 +129,35642986 +123,84186079 +130,64095405 +123,83688523 +124,91214750 +130,35537783 +124,22400777 +127,26774433 +125,53173286 +129,61983749 +122,32154688 +124,63549628 +129,04896120 +133,09313947 +124,92893265 +123,62012305 +127,80630318 +125,02781462 +127,80861220 +129,24611841 +124,54369780 +131,91760512 +116,08884208 +127,45796644 +132,23347282 +130,16898054 +124,34169224 +125,07941800 +127,61581003 +123,05109341 +129,04925323 +129,15258258 +132,48625454 +128,21742543 +128,10406134 +128,51612673 +129,04837367 +127,92954260 +127,62096188 +127,41656456 +118,11289076 +125,78884022 +117,86451022 +126,06882328 +127,03588056 +127,32519832 +114,96079617 +118,71454024 +129,27342620 +128,46955731 +127,58771748 +128,48895485 +126,72158642 +131,46213817 +127,34197840 +123,62170495 +129,79230801 +125,14129476 +124,73511626 +127,58494009 +129,62391533 +115,52682271 +124,75020738 +126,79325476 +118,72652127 +126,30998356 +121,66226045 +124,25357568 +123,01682674 +124,25702934 +131,63670937 +126,70533717 +125,22664915 +120,07106617 +124,83552159 +126,95564898 +132,43128006 +126,62708099 +128,27246739 +126,02966787 +122,82335096 +120,37598209 +122,70424735 +130,54931677 +111,74542402 +129,11560827 +125,18746223 +125,56327987 +124,21135638 +129,10853337 +125,58778670 +122,39028103 +127,59847753 +127,26436603 +127,99581598 +127,96333271 +130,85396895 +124,61347861 +124,20242097 +122,85058797 +129,75806279 +122,51486663 +127,74613061 +123,48975547 +122,61837193 +133,25203676 +114,94509490 +130,51612631 +126,50515252 +127,78444207 +130,02261325 +127,86839670 +124,04193523 +127,71212047 +120,05353273 +127,30415031 +126,08905111 +128,54705893 +122,69571710 +126,51411921 +127,70311214 +123,86236551 +126,46342636 +124,46041799 +127,08102311 +129,49897229 +125,55063458 +121,70113290 +130,93194787 +128,27863630 +129,51972169 +123,47225989 +126,85147119 +115,99538998 +132,77932778 +125,26351611 +128,85677110 +124,51689007 +126,75576951 +125,81298674 +126,14815725 +124,86850405 +124,74379863 +118,35311095 +119,42695579 +131,77960756 +128,83702541 +126,06835376 +127,11537229 +125,55599189 +127,43602997 +124,43752815 +122,33200591 +129,88752476 +113,11193205 +126,97351044 +126,35311650 +118,79037890 +125,68025562 +128,94346309 +130,37346024 +128,61000899 +125,75570839 +124,96648851 +117,75715308 +130,17438596 +124,87575118 +128,22688620 +125,13017549 +130,35222433 +119,84767438 +127,29081456 +130,17881245 +121,67425274 +125,88895238 +129,91855355 +127,00778235 +122,02830321 +124,21620531 +131,12990649 +126,65405857 +130,24729527 +121,70387496 +121,65844430 +131,80589565 +126,53395884 +128,33669125 +130,14454915 +127,01051528 +127,67290937 +128,27740829 +126,53317999 +123,03454852 +124,86378660 +121,36942440 +128,94654782 +127,02246583 +125,89128677 +129,69488903 +127,28464367 +119,83255444 +126,25655826 +125,70422442 +128,22508890 +125,30648810 +130,22921641 +129,97536117 +130,11907396 +128,84163848 +122,93581371 +128,81301756 +129,27840583 +123,96875260 +127,25775922 +122,57239183 +127,11140083 +127,98000997 +119,22862604 +126,83377988 +122,88519364 +125,97496830 +123,23126793 +127,60379062 +120,46347897 +127,78068408 +125,97308373 +125,47345514 +122,77564845 +127,28493748 +131,36811475 +120,93317612 +127,72730801 +117,75421299 +123,31171525 +125,05911345 +126,28587864 +128,63029908 +127,17877649 +126,34522982 +123,85462884 +124,06828405 +129,40757581 +126,18747328 +125,69627052 +122,87136653 +125,38516329 +129,51842358 +129,34576247 +119,03766103 +126,19492353 +128,07192359 +128,21171434 +128,69341947 +130,99445307 +127,59985742 +121,13097359 +124,24226763 +124,88928538 +131,07382202 +127,33261381 +131,65264670 +125,82091174 +124,93306993 +129,28099215 +129,17772307 +119,17180278 +126,91269728 +121,64106960 +126,47603001 +129,87793961 +123,38592206 +124,73590273 +122,56663035 +130,35321255 +123,11978365 +127,56326965 +128,09885407 +129,11717927 +119,08028592 +114,42053661 +120,66003158 +110,30362144 +128,45321632 +127,57520868 +124,03096794 +129,58450570 +131,80600475 +125,80954887 +130,45657227 +129,49542669 +122,76634999 +121,63782421 +117,99468902 +120,82257968 +129,95757001 +125,84193594 +115,90555252 +127,09969685 +120,84330231 +134,14891994 +131,11691765 +128,47498692 +128,67478838 +119,70376672 +133,04267437 +130,41463142 +124,03960518 +129,66723774 +130,91019574 +130,04404497 +125,66696840 +123,07418882 +119,72729694 +128,82592604 +125,49770510 +121,18543010 +117,43329800 +125,16178731 +125,00527955 +128,32237807 +130,45980804 +126,18875854 +130,63959312 +124,41176732 +123,30260203 +126,02584162 +124,90643585 +129,77812835 +129,40325298 +131,52362570 +125,62133794 +127,89902209 +123,68555111 +118,85061765 +126,05820826 +128,90332936 +127,32045257 +123,93637031 +128,66863934 +124,15860080 +125,83266628 +130,48367145 +115,65109569 +129,54367026 +124,27296540 +126,53768485 +130,90404977 +126,55815929 +125,89288879 +127,87676241 +123,27075759 +128,30857709 +120,14629392 +128,50301448 +125,67951392 +128,84235457 +125,79396596 +122,75051146 +128,94607384 +118,72844937 +118,08504278 +126,79980628 +120,82453256 +124,05285501 +131,07171565 +118,95891191 +122,62237973 +120,92561996 +116,05587318 +113,86133743 +125,26605837 +124,88025703 +124,76353761 +123,18898675 +130,16020041 +129,26289100 +127,55328016 +123,73796637 +130,49312123 +129,61630520 +126,17011705 +128,11848128 +128,37243808 +116,29969980 +131,00644788 +120,50080193 +130,43267031 +131,58667075 +113,98235615 +121,96184752 +122,30125687 +126,35630089 +130,20434351 +112,70822242 +132,42252165 +120,84742727 +125,86696178 +130,09029861 +118,36037441 +117,17975520 +124,47442254 +130,56149182 +132,02025014 +127,74299801 +125,44350551 +124,17198085 +129,25882791 +123,25096702 +125,25550039 +123,59279616 +117,31405082 +124,85753439 +123,34535545 +123,99037133 +124,73313877 +128,69940086 +125,19318414 +125,23249426 +120,79453177 +123,16591839 +131,21462584 +120,00668151 +126,13981794 +129,13960288 +126,40101966 +118,10743956 +123,07015144 +119,07331446 +129,18421972 +119,64282000 +119,01190783 +130,11229344 +125,44232377 +119,98640083 +130,65696217 +132,49373788 +126,48356759 +125,74649608 +124,05619460 +118,89388633 +127,13461348 +128,63530912 +127,96492039 +114,10272067 +127,16264368 +122,99392256 +126,21028237 +128,83508870 +120,49387589 +118,22388810 +128,07412809 +119,82011079 +129,05198224 +121,96193442 +128,76002208 +117,34191522 +130,03254346 +131,68331617 +119,98190514 +127,01577499 +128,80815074 +125,05497321 +124,84935839 +128,00893153 +128,22613103 +127,94709770 +122,84563505 +128,70202090 +131,02932585 +124,46687638 +127,27098795 +127,57812018 +122,89519579 +129,84448801 +111,97655665 +124,51999551 +132,83855469 +129,78323662 +124,80520329 +127,55556375 +110,41390913 +131,16338497 +123,46849349 +120,66558463 +122,47029704 +130,34144141 +124,28195520 +127,95240625 +123,66969675 +125,86016068 +131,14468569 +125,94849326 +119,37664516 +128,09293682 +128,32913741 +115,79416268 +123,72086572 +129,87133069 +124,19294160 +122,67942151 +125,66371641 +119,26686583 +127,58181648 +115,33310513 +126,58193647 +121,75097689 +122,19064872 +122,86845336 +118,59032189 +118,96245256 +128,57500149 +126,73439944 +128,43926099 +122,34552910 +116,89622381 +125,75608009 +121,61049820 +128,82112441 +124,87030283 +127,15082410 +113,38027110 +118,98124347 +132,50229303 +131,09229280 +128,49850068 +118,49671229 +127,63549400 +130,01272160 +131,20890930 +126,42816386 +127,02887582 +128,43131415 +124,15747349 +122,09062783 +130,58628062 +131,00894782 +123,62822743 +126,67714032 +119,83400622 +127,24205730 +129,36357841 +130,41797260 +126,63469381 +127,75053655 +127,19212286 +126,95276768 +126,42193982 +127,63317649 +128,30708714 +121,80344982 +124,82788505 +123,88384979 +111,04999982 +122,31190835 +124,07563119 +127,93005661 +123,98239459 +131,40687207 +128,89162172 +130,90819908 +123,80996248 +128,31042761 +130,98031705 +131,06716065 +130,96774033 +128,43882783 +130,63506386 +127,67848491 +130,93584963 +129,45773665 +131,63071702 +130,08840247 +128,59884868 +127,32458601 +130,55219258 +131,12147987 +111,21639870 +130,02006182 +126,93102811 +123,94286382 +116,27298960 +122,85107818 +129,60701362 +125,24255415 +127,26622950 +127,45866399 +126,60333720 +124,08595497 +129,45024588 +132,18611592 +130,10821336 +130,12388708 +119,17366373 +131,68630169 +109,89465922 +127,42032758 +120,33533291 +130,34158937 +129,55087967 +127,07278313 +121,50766918 +127,46301478 +119,05983832 +115,69541696 +129,09364865 +128,89015672 +116,67159244 +131,18853065 +127,44213127 +125,19804852 +129,17834825 +129,58430705 +120,63570246 +123,20195015 +128,74965234 +128,29515014 +118,58720685 +125,38600014 +122,41444496 +129,91258739 +129,25270393 +114,90306838 +125,29002432 +122,78244835 +125,56483762 +125,86616315 +126,00991716 +133,71561277 +120,30295172 +124,25430386 +116,96983112 +123,81447437 +126,11016208 +117,88584791 +129,14276312 +128,12635672 +125,33634249 +128,26362405 +130,70369205 +134,07238953 +130,61098229 +130,20471157 +124,77903769 +129,68442847 +119,90871948 +127,64489928 +122,21226347 +129,57260492 +129,45059633 +126,35851671 +128,62636119 +125,36811953 +124,86487929 +125,48184770 +127,87472594 +122,17551201 +127,61847302 +114,29362496 +125,23711845 +129,40007379 +119,79725752 +116,97080228 +117,31335068 +125,12137428 +127,83466509 +120,30066911 +130,15901408 +123,01208645 +132,52010458 +127,10973069 +127,74639991 +128,33200886 +128,52906186 +133,27805846 +126,58955975 +122,70975229 +127,74774867 +123,25977109 +125,05812573 +126,38003334 +129,65696617 +122,54444587 +124,14603856 +127,87684083 +133,04232391 +126,06692957 +125,89158458 +126,33559475 +128,19900144 +131,57872449 +119,10307402 +117,49704528 +128,41065807 +125,98283983 +125,05300824 +119,25678992 +129,02639841 +127,83165308 +125,03146126 +126,58942235 +128,26655881 +120,02883419 +127,41077077 +124,87992860 +131,82741368 +124,16094694 +122,14890160 +123,43711630 +129,50267362 +131,18948121 +130,54245480 +127,95088703 +130,22863898 +125,19513230 +132,04898886 +124,98010182 +129,25902683 +128,11381800 +122,60563151 +127,80336871 +127,98333787 +124,27404540 +127,06480921 +128,11710273 +125,31374556 +122,32926783 +127,85754791 +118,36114319 +130,30397952 +127,00038558 +119,82859458 +126,33519343 +129,57312752 +130,39662350 +125,17261069 +124,25871313 +127,88662374 +125,01567080 +121,88406885 +118,97342496 +125,83967682 +126,61125128 +126,05902710 +123,92146574 +129,84267823 +125,92428060 +122,94542975 +130,07472117 +128,05309967 +129,30856426 +122,76720774 +127,92876272 +131,46510199 +121,68601883 +127,43216434 +129,99477441 +124,50247583 +123,64572616 +130,50888389 +131,48998810 +121,62718388 +120,38129343 +131,90367173 +128,48335810 +128,78822674 +130,26091351 +129,93085917 +124,77996622 +120,12912054 +112,56797637 +121,66755822 +130,25252322 +131,99905090 +122,94218755 +118,07320540 +116,31333591 \ No newline at end of file diff --git a/phitter_web/continuous/build_phitter_web_continuous.ipynb b/phitter_web/continuous/build_phitter_web_continuous.ipynb index acf7a8f..b834ee7 100644 --- a/phitter_web/continuous/build_phitter_web_continuous.ipynb +++ b/phitter_web/continuous/build_phitter_web_continuous.ipynb @@ -2,18 +2,19 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import os\n", "import re\n", + "\n", "import black" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -49,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -65,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -168,7 +169,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -178,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -197,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -210,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -234,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -244,16 +245,16 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ - "# black.format_str(CODE, mode=black.FileMode(line_length=300))" + "CODE = black.format_str(CODE, mode=black.FileMode(line_length=300))" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -279,7 +280,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.12.6" }, "orig_nbformat": 4 }, diff --git a/phitter_web/continuous/phitter_web_continuous.py b/phitter_web/continuous/phitter_web_continuous.py index eb67d07..c66e838 100644 --- a/phitter_web/continuous/phitter_web_continuous.py +++ b/phitter_web/continuous/phitter_web_continuous.py @@ -8,6 +8,8 @@ import warnings warnings.filterwarnings("ignore") + + class ALPHA: def __init__( self, @@ -16,9 +18,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -28,29 +28,37 @@ def __init__( self.alpha = self.parameters["alpha"] self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "alpha" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 5, "loc": 9, "scale": 57} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.loc) / self.scale result = scipy.stats.norm.cdf(self.alpha - (1 / z(x))) / scipy.stats.norm.cdf(self.alpha) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.alpha.pdf(x, self.alpha, loc=self.loc, scale=self.scale) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.loc + self.scale / (self.alpha - scipy.stats.norm.ppf(u * scipy.stats.norm.cdf(self.alpha))) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: f = lambda x: x**k * scipy.stats.alpha.pdf(x, self.alpha, loc=0, scale=1) return scipy.integrate.quad(f, 0, 2)[0] + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -65,48 +73,59 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + self.scale * Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return self.scale * self.scale * (Β΅2 - Β΅1**2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) central_Β΅3 = self.central_moments(3) return central_Β΅3 / (Β΅2 - Β΅1**2) ** 1.5 + @property def kurtosis(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) central_Β΅4 = self.central_moments(4) return central_Β΅4 / (Β΅2 - Β΅1**2) ** 2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return (self.scale * (numpy.sqrt(self.alpha * self.alpha + 8) - self.alpha)) / 4 + self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.scale > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.alpha.fit(continuous_measures.data_to_fit) parameters = {"alpha": scipy_parameters[0], "loc": scipy_parameters[1], "scale": scipy_parameters[2]} return parameters + class ARCSINE: def __init__( self, @@ -115,9 +134,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -126,26 +143,34 @@ def __init__( self.parameters = self.parameters_example self.a = self.parameters["a"] self.b = self.parameters["b"] + @property def name(self): return "arcsine" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 77, "b": 89} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.a) / (self.b - self.a) return 2 * numpy.arcsin(numpy.sqrt(z(x))) / numpy.pi + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return 1 / (numpy.pi * numpy.sqrt((x - self.a) * (self.b - x))) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.a + (self.b - self.a) * numpy.sin((u * numpy.pi) / 2) ** 2 return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (scipy.special.gamma(0.5) * scipy.special.gamma(k + 0.5)) / (numpy.pi * scipy.special.gamma(k + 1)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -160,18 +185,22 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 * (self.b - self.a) + self.a + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return (Β΅2 - Β΅1**2) * (self.b - self.a) ** 2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) @@ -179,6 +208,7 @@ def skewness(self) -> float: Β΅2 = self.non_central_moments(2) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅3 / std**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) @@ -186,24 +216,30 @@ def kurtosis(self) -> float: Β΅2 = self.non_central_moments(2) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅4 / std**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.b > self.a return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: a = continuous_measures.min - 1e-3 b = continuous_measures.max + 1e-3 parameters = {"a": a, "b": b} return parameters + class ARGUS: def __init__( self, @@ -212,9 +248,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -224,30 +258,38 @@ def __init__( self.chi = self.parameters["chi"] self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "argus" + @property def parameters_example(self) -> dict[str, int | float]: return {"chi": 3, "loc": 102, "scale": 5} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.argus.cdf(x, self.chi, loc=self.loc, scale=self.scale) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.argus.pdf(x, self.chi, loc=self.loc, scale=self.scale) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: y1 = (1 - u) * scipy.special.gammainc(1.5, (self.chi * self.chi) / 2) y2 = (2 * scipy.special.gammaincinv(1.5, y1)) / (self.chi * self.chi) result = self.loc + self.scale * numpy.sqrt(1 - y2) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: f = lambda x: x**k * self.pdf(x) return scipy.integrate.quad(f, self.loc, self.loc + self.scale)[0] + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -262,42 +304,52 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Ξ¨ = lambda t: scipy.stats.norm.cdf(t) - t * scipy.stats.norm.pdf(t) - 0.5 return self.loc + self.scale * numpy.sqrt(numpy.pi / 8) * ((self.chi * numpy.exp((-self.chi * self.chi) / 4) * scipy.special.iv(1, (self.chi * self.chi) / 4)) / Ξ¨(self.chi)) + @property def variance(self) -> float: Ξ¨ = lambda t: scipy.stats.norm.cdf(t) - t * scipy.stats.norm.pdf(t) - 0.5 return self.scale * self.scale * (1 - 3 / (self.chi * self.chi) + (self.chi * scipy.stats.norm.pdf(self.chi)) / Ξ¨(self.chi)) - (self.mean - self.loc) ** 2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) central_Β΅3 = self.central_moments(3) return central_Β΅3 / (Β΅2 - Β΅1**2) ** 1.5 + @property def kurtosis(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) central_Β΅4 = self.central_moments(4) return central_Β΅4 / (Β΅2 - Β΅1**2) ** 2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + self.scale * (1 / (numpy.sqrt(2) * self.chi)) * numpy.sqrt(self.chi * self.chi - 2 + numpy.sqrt(self.chi * self.chi * self.chi * self.chi + 4)) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.chi > 0 v2 = self.scale > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: chi, loc, scale = initial_solution @@ -309,6 +361,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_median - continuous_measures.median return (eq1, eq2, eq3) + bounds = ((0, -numpy.inf, 0), (numpy.inf, numpy.inf, numpy.inf)) x0 = (1, continuous_measures.min, 1) args = [continuous_measures] @@ -316,6 +369,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"chi": solution.x[0], "loc": solution.x[1], "scale": solution.x[2]} return parameters + class BETA: def __init__( self, @@ -324,9 +378,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -337,60 +389,76 @@ def __init__( self.beta = self.parameters["beta"] self.A = self.parameters["A"] self.B = self.parameters["B"] + @property def name(self): return "beta" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 42, "beta": 10, "A": 518, "B": 969} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.beta.cdf(x, self.alpha, self.beta, loc=self.A, scale=self.B - self.A) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.beta.pdf(x, self.alpha, self.beta, loc=self.A, scale=self.B - self.A) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.A + (self.B - self.A) * scipy.special.betaincinv(self.alpha, self.beta, u) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.A + (self.alpha / (self.alpha + self.beta)) * (self.B - self.A) + @property def variance(self) -> float: return ((self.alpha * self.beta) / ((self.alpha + self.beta + 1) * (self.alpha + self.beta) ** 2)) * (self.B - self.A) ** 2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 2 * ((self.beta - self.alpha) / (self.alpha + self.beta + 2)) * numpy.sqrt((self.alpha + self.beta + 1) / (self.alpha * self.beta)) + @property def kurtosis(self) -> float: - return 3 + (6 * ((self.alpha + self.beta + 1) * (self.alpha - self.beta) ** 2 - self.alpha * self.beta * (self.alpha + self.beta + 2))) / ( - self.alpha * self.beta * (self.alpha + self.beta + 2) * (self.alpha + self.beta + 3) - ) + return 3 + (6 * ((self.alpha + self.beta + 1) * (self.alpha - self.beta) ** 2 - self.alpha * self.beta * (self.alpha + self.beta + 2))) / (self.alpha * self.beta * (self.alpha + self.beta + 2) * (self.alpha + self.beta + 3)) + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.A + ((self.alpha - 1) / (self.alpha + self.beta - 2)) * (self.B - self.A) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 v3 = self.A < self.B return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: alpha, beta, A, B = initial_solution @@ -403,6 +471,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq3 = parametric_skewness - continuous_measures.skewness eq4 = parametric_kurtosis - continuous_measures.kurtosis return (eq1, eq2, eq3, eq4) + bounds = ((0, 0, -numpy.inf, continuous_measures.mean), (numpy.inf, numpy.inf, continuous_measures.mean, numpy.inf)) x0 = (1, 1, continuous_measures.min, continuous_measures.max) args = [continuous_measures] @@ -416,7 +485,10 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"alpha": scipy_parameters[0], "beta": scipy_parameters[1], "A": scipy_parameters[2], "B": scipy_parameters[3]} return parameters + warnings.filterwarnings("ignore") + + class BETA_PRIME: def __init__( self, @@ -425,9 +497,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -436,27 +506,35 @@ def __init__( self.parameters = self.parameters_example self.alpha = self.parameters["alpha"] self.beta = self.parameters["beta"] + @property def name(self): return "beta_prime" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 101, "beta": 54} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.special.betainc(self.alpha, self.beta, x / (1 + x)) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = (x ** (self.alpha - 1) * (1 + x) ** (-self.alpha - self.beta)) / (scipy.special.beta(self.alpha, self.beta)) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.special.betaincinv(self.alpha, self.beta, u) / (1 - scipy.special.betaincinv(self.alpha, self.beta, u)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (scipy.special.gamma(k + self.alpha) * scipy.special.gamma(self.beta - k)) / (scipy.special.gamma(self.alpha) * scipy.special.gamma(self.beta)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -471,39 +549,49 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return (self.alpha - 1) / (self.beta + 1) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: alpha, beta = initial_solution @@ -512,6 +600,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance return (eq1, eq2) + scipy_parameters = scipy.stats.betaprime.fit(continuous_measures.data_to_fit) try: x0 = (scipy_parameters[0], scipy_parameters[1]) @@ -523,7 +612,10 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"alpha": scipy_parameters[0], "beta": scipy_parameters[1]} return parameters + warnings.filterwarnings("ignore") + + class BETA_PRIME_4P: def __init__( self, @@ -532,9 +624,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -545,27 +635,35 @@ def __init__( self.beta = self.parameters["beta"] self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "beta_prime_4p" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 911, "beta": 937, "loc": -7, "scale": 125} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.betaprime.cdf(x, self.alpha, self.beta, loc=self.loc, scale=self.scale) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.betaprime.pdf(x, self.alpha, self.beta, loc=self.loc, scale=self.scale) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.betaprime.ppf(u, self.alpha, self.beta, loc=self.loc, scale=self.scale) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (scipy.special.gamma(k + self.alpha) * scipy.special.gamma(self.beta - k)) / (scipy.special.gamma(self.alpha) * scipy.special.gamma(self.beta)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -580,18 +678,22 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + self.scale * Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return self.scale**2 * (Β΅2 - Β΅1**2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: Β΅1 = self.non_central_moments(1) @@ -599,6 +701,7 @@ def skewness(self) -> float: std = numpy.sqrt(Β΅2 - Β΅1**2) central_Β΅3 = self.central_moments(3) return central_Β΅3 / std**3 + @property def kurtosis(self) -> float: Β΅1 = self.non_central_moments(1) @@ -606,20 +709,25 @@ def kurtosis(self) -> float: std = numpy.sqrt(Β΅2 - Β΅1**2) central_Β΅4 = self.central_moments(4) return central_Β΅4 / std**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + (self.scale * (self.alpha - 1)) / (self.beta + 1) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 v3 = self.scale > 0 return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: alpha, beta, loc, scale = initial_solution @@ -632,6 +740,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq3 = parametric_median - continuous_measures.median eq4 = parametric_mode - continuous_measures.mode return (eq1, eq2, eq3, eq4) + scipy_parameters = scipy.stats.betaprime.fit(continuous_measures.data_to_fit) try: x0 = (continuous_measures.mean, continuous_measures.mean, continuous_measures.min, scipy_parameters[3]) @@ -643,6 +752,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"alpha": scipy_parameters[0], "beta": scipy_parameters[1], "loc": scipy_parameters[2], "scale": scipy_parameters[3]} return parameters + class BRADFORD: def __init__( self, @@ -651,9 +761,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -663,43 +771,56 @@ def __init__( self.c = self.parameters["c"] self.min = self.parameters["min"] self.max = self.parameters["max"] + @property def name(self): return "bradford" + @property def parameters_example(self) -> dict[str, int | float]: return {"c": 4, "min": 19, "max": 50} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.log(1 + self.c * (x - self.min) / (self.max - self.min)) / numpy.log(self.c + 1) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = self.c / ((self.c * (x - self.min) + self.max - self.min) * numpy.log(self.c + 1)) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.min + ((numpy.exp(u * numpy.log(1 + self.c)) - 1) * (self.max - self.min)) / self.c return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return (self.c * (self.max - self.min) + numpy.log(1 + self.c) * (self.min * (self.c + 1) - self.max)) / (numpy.log(1 + self.c) * self.c) + @property def variance(self) -> float: return ((self.max - self.min) ** 2 * ((self.c + 2) * numpy.log(1 + self.c) - 2 * self.c)) / (2 * self.c * numpy.log(1 + self.c) ** 2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (numpy.sqrt(2) * (12 * self.c * self.c - 9 * numpy.log(1 + self.c) * self.c * (self.c + 2) + 2 * numpy.log(1 + self.c) * numpy.log(1 + self.c) * (self.c * (self.c + 3) + 3))) / ( numpy.sqrt(self.c * (self.c * (numpy.log(1 + self.c) - 2) + 2 * numpy.log(1 + self.c))) * (3 * self.c * (numpy.log(1 + self.c) - 2) + 6 * numpy.log(1 + self.c)) ) + @property def kurtosis(self) -> float: return ( @@ -708,18 +829,23 @@ def kurtosis(self) -> float: + 6 * self.c * numpy.log(1 + self.c) ** 2 * (3 * numpy.log(1 + self.c) - 14) + 12 * numpy.log(1 + self.c) ** 3 ) / (3 * self.c * (self.c * (numpy.log(1 + self.c) - 2) + 2 * numpy.log(1 + self.c)) ** 2) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.min + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.max > self.min return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations( initial_solution: tuple[float], @@ -732,6 +858,7 @@ def equations( parametric_mean = (c * (max_ - min_) + numpy.log(c + 1) * (min_ * (c + 1) - max_)) / (c * numpy.log(c + 1)) eq1 = parametric_mean - continuous_measures.mean return eq1 + min_ = continuous_measures.min - 1e-3 max_ = continuous_measures.max + 1e-3 bounds = ((-numpy.inf), (numpy.inf)) @@ -741,7 +868,10 @@ def equations( parameters = {"c": solution.x[0], "min": min_, "max": max_} return parameters + warnings.filterwarnings("ignore") + + class BURR: def __init__( self, @@ -750,9 +880,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -762,31 +890,35 @@ def __init__( self.A = self.parameters["A"] self.B = self.parameters["B"] self.C = self.parameters["C"] + @property def name(self): return "burr" + @property def parameters_example(self) -> dict[str, int | float]: return {"A": 1, "B": 10, "C": 5} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.burr12.cdf(x, self.B, self.C, scale=self.A) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.burr12.pdf(x, self.B, self.C, scale=self.A) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.A * ((1 - u) ** (-1 / self.C) - 1) ** (1 / self.B) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: - return ( - self.A**k - * self.C - * ((scipy.special.gamma((self.B * self.C - k) / self.B) * scipy.special.gamma((self.B + k) / self.B)) / scipy.special.gamma((self.B * self.C - k) / self.B + (self.B + k) / self.B)) - ) + return self.A**k * self.C * ((scipy.special.gamma((self.B * self.C - k) / self.B) * scipy.special.gamma((self.B + k) / self.B)) / scipy.special.gamma((self.B * self.C - k) / self.B + (self.B + k) / self.B)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -801,45 +933,58 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.A * ((self.B - 1) / (self.B * self.C + 1)) ** (1 / self.B) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.A > 0 v2 = self.C > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.burr12.fit(continuous_measures.data_to_fit) parameters = {"A": scipy_parameters[3], "B": scipy_parameters[0], "C": scipy_parameters[1]} return parameters + warnings.filterwarnings("ignore") + + class BURR_4P: def __init__( self, @@ -848,9 +993,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -861,31 +1004,35 @@ def __init__( self.B = self.parameters["B"] self.C = self.parameters["C"] self.loc = self.parameters["loc"] + @property def name(self): return "burr_4p" + @property def parameters_example(self) -> dict[str, int | float]: return {"A": 108, "B": 114, "C": 1, "loc": 0} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.burr12.cdf(x, self.B, self.C, loc=self.loc, scale=self.A) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.burr12.pdf(x, self.B, self.C, loc=self.loc, scale=self.A) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.A * ((1 - u) ** (-1 / self.C) - 1) ** (1 / self.B) + self.loc return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: - return ( - self.A**k - * self.C - * ((scipy.special.gamma((self.B * self.C - k) / self.B) * scipy.special.gamma((self.B + k) / self.B)) / scipy.special.gamma((self.B * self.C - k) / self.B + (self.B + k) / self.B)) - ) + return self.A**k * self.C * ((scipy.special.gamma((self.B * self.C - k) / self.B) * scipy.special.gamma((self.B + k) / self.B)) / scipy.special.gamma((self.B * self.C - k) / self.B + (self.B + k) / self.B)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -900,44 +1047,55 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + self.A * ((self.B - 1) / (self.B * self.C + 1)) ** (1 / self.B) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.A > 0 v2 = self.C > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.burr12.fit(continuous_measures.data_to_fit) parameters = {"A": scipy_parameters[3], "B": scipy_parameters[0], "C": scipy_parameters[1], "loc": scipy_parameters[2]} return parameters + class CAUCHY: def __init__( self, @@ -946,9 +1104,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -957,59 +1113,78 @@ def __init__( self.parameters = self.parameters_example self.x0 = self.parameters["x0"] self.gamma = self.parameters["gamma"] + @property def name(self): return "cauchy" + @property def parameters_example(self) -> dict[str, int | float]: return {"x0": 10, "gamma": 19} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (1 / numpy.pi) * numpy.arctan(((x - self.x0) / self.gamma)) + (1 / 2) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return 1 / (numpy.pi * self.gamma * (1 + ((x - self.x0) / self.gamma) ** 2)) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.x0 + self.gamma * numpy.tan(numpy.pi * (u - 0.5)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return None + @property def variance(self) -> float: return None + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return None + @property def kurtosis(self) -> float: return None + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.x0 + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.gamma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.cauchy.fit(continuous_measures.data_to_fit) parameters = {"x0": scipy_parameters[0], "gamma": scipy_parameters[1]} return parameters + class CHI_SQUARE: def __init__( self, @@ -1018,9 +1193,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1028,61 +1201,80 @@ def __init__( if init_parameters_examples: self.parameters = self.parameters_example self.df = self.parameters["df"] + @property def name(self): return "chi_square" + @property def parameters_example(self) -> dict[str, int | float]: return {"df": 7} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.special.gammainc(self.df / 2, x / 2) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.chi2.pdf(x, self.df) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = 2 * scipy.special.gammaincinv(self.df / 2, u) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.df + @property def variance(self) -> float: return self.df * 2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return numpy.sqrt(8 / self.df) + @property def kurtosis(self) -> float: return 12 / self.df + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return max(self.df - 2, 0) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.df > 0 v2 = type(self.df) == int return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: parameters = {"df": round(continuous_measures.mean)} return parameters + class CHI_SQUARE_3P: def __init__( self, @@ -1091,9 +1283,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1103,60 +1293,78 @@ def __init__( self.df = self.parameters["df"] self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "chi_square_3p" + @property def parameters_example(self) -> dict[str, int | float]: return {"df": 4, "loc": 10, "scale": 2} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.loc) / self.scale result = scipy.special.gammainc(self.df / 2, z(x) / 2) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.loc) / self.scale result = (1 / self.scale) * (1 / (2 ** (self.df / 2) * scipy.special.gamma(self.df / 2))) * (z(x) ** ((self.df / 2) - 1)) * (numpy.exp(-z(x) / 2)) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = 2 * self.scale * scipy.special.gammaincinv(self.df / 2, u) + self.loc return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.df * self.scale + self.loc + @property def variance(self) -> float: return self.df * 2 * (self.scale * self.scale) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return numpy.sqrt(8 / self.df) + @property def kurtosis(self) -> float: return 12 / self.df + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return max(self.df - 2, 0) * self.scale + self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.df > 0 v2 = type(self.df) == int v2 = True return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: df, loc, scale = initial_solution @@ -1169,6 +1377,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_median - continuous_measures.median return (eq1, eq2, eq3) + x0 = (1, continuous_measures.mean, 1) bounds = ((0, -numpy.inf, 0), (numpy.inf, numpy.inf, numpy.inf)) args = [continuous_measures] @@ -1176,6 +1385,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"df": solution.x[0], "loc": solution.x[1], "scale": solution.x[2]} return parameters + class DAGUM: def __init__( self, @@ -1184,9 +1394,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1196,29 +1404,33 @@ def __init__( self.a = self.parameters["a"] self.b = self.parameters["b"] self.p = self.parameters["p"] + @property def name(self): return "dagum" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 5, "b": 56, "p": 1} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (1 + (x / self.b) ** (-self.a)) ** (-self.p) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (self.a * self.p / x) * (((x / self.b) ** (self.a * self.p)) / ((((x / self.b) ** (self.a)) + 1) ** (self.p + 1))) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.b * (u ** (-1 / self.p) - 1) ** (-1 / self.a) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: - return ( - self.b**k - * self.p - * ((scipy.special.gamma((self.a * self.p + k) / self.a) * scipy.special.gamma((self.a - k) / self.a)) / scipy.special.gamma((self.a * self.p + k) / self.a + (self.a - k) / self.a)) - ) + return self.b**k * self.p * ((scipy.special.gamma((self.a * self.p + k) / self.a) * scipy.special.gamma((self.a - k) / self.a)) / scipy.special.gamma((self.a * self.p + k) / self.a + (self.a - k) / self.a)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -1233,47 +1445,59 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.b * ((self.a * self.p - 1) / (self.a + 1)) ** (1 / self.a) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.p > 0 v2 = self.a > 0 v3 = self.b > 0 return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def sse(parameters: dict) -> float: def __pdf(x: float, params: dict) -> float: return (params["a"] * params["p"] / x) * (((x / params["b"]) ** (params["a"] * params["p"])) / ((((x / params["b"]) ** (params["a"])) + 1) ** (params["p"] + 1))) + pdf_values = __pdf(continuous_measures.central_values, parameters) sse = numpy.sum(numpy.power(continuous_measures.densities_frequencies - pdf_values, 2)) return sse + def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: a, b, p = initial_solution mu = lambda k: (b**k) * p * scipy.special.beta((a * p + k) / a, (a - k) / a) @@ -1284,6 +1508,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_mode - continuous_measures.mode return (eq1, eq2, eq3) + s0_burr3_sc = scipy.stats.burr.fit(continuous_measures.data_to_fit) parameters_sc = {"a": s0_burr3_sc[0], "b": s0_burr3_sc[3], "p": s0_burr3_sc[1]} a0 = s0_burr3_sc[0] @@ -1302,7 +1527,10 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa else: return parameters_ls + warnings.filterwarnings("ignore") + + class DAGUM_4P: def __init__( self, @@ -1311,9 +1539,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1324,29 +1550,33 @@ def __init__( self.b = self.parameters["b"] self.p = self.parameters["p"] self.loc = self.parameters["loc"] + @property def name(self): return "dagum_4p" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 6, "b": 1, "p": 3, "loc": 100} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (1 + ((x - self.loc) / self.b) ** (-self.a)) ** (-self.p) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (self.a * self.p / x) * ((((x - self.loc) / self.b) ** (self.a * self.p)) / (((((x - self.loc) / self.b) ** (self.a)) + 1) ** (self.p + 1))) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.b * (u ** (-1 / self.p) - 1) ** (-1 / self.a) + self.loc return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: - return ( - self.b**k - * self.p - * ((scipy.special.gamma((self.a * self.p + k) / self.a) * scipy.special.gamma((self.a - k) / self.a)) / scipy.special.gamma((self.a * self.p + k) / self.a + (self.a - k) / self.a)) - ) + return self.b**k * self.p * ((scipy.special.gamma((self.a * self.p + k) / self.a) * scipy.special.gamma((self.a - k) / self.a)) / scipy.special.gamma((self.a * self.p + k) / self.a + (self.a - k) / self.a)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -1361,51 +1591,61 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + self.b * ((self.a * self.p - 1) / (self.a + 1)) ** (1 / self.a) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.p > 0 v2 = self.a > 0 v3 = self.b > 0 return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def sse(parameters: dict) -> float: def __pdf(x: float, params: dict) -> float: - return (params["a"] * params["p"] / (x - params["loc"])) * ( - (((x - params["loc"]) / params["b"]) ** (params["a"] * params["p"])) / ((((x / params["b"]) ** (params["a"])) + 1) ** (params["p"] + 1)) - ) + return (params["a"] * params["p"] / (x - params["loc"])) * ((((x - params["loc"]) / params["b"]) ** (params["a"] * params["p"])) / ((((x / params["b"]) ** (params["a"])) + 1) ** (params["p"] + 1))) + frequencies, bin_edges = numpy.histogram(continuous_measures.data, density=True) central_values = [(bin_edges[i] + bin_edges[i + 1]) / 2 for i in range(len(bin_edges) - 1)] pdf_values = [__pdf(c, parameters) for c in central_values] sse = numpy.sum(numpy.power(frequencies - pdf_values, 2)) return sse + def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: a, b, p, loc = initial_solution mu = lambda k: (b**k) * p * scipy.special.beta((a * p + k) / a, (a - k) / a) @@ -1418,6 +1658,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq3 = parametric_median - continuous_measures.median eq4 = parametric_mode - continuous_measures.mode return (eq1, eq2, eq3, eq4) + s0_burr3_sc = scipy.stats.burr.fit(continuous_measures.data_to_fit) parameters_sc = {"a": s0_burr3_sc[0], "b": s0_burr3_sc[3], "p": s0_burr3_sc[1], "loc": s0_burr3_sc[2]} if s0_burr3_sc[0] <= 2: @@ -1435,6 +1676,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa else: return parameters_ls + class ERLANG: def __init__( self, @@ -1443,9 +1685,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1454,27 +1694,35 @@ def __init__( self.parameters = self.parameters_example self.k = self.parameters["k"] self.beta = self.parameters["beta"] + @property def name(self): return "erlang" + @property def parameters_example(self) -> dict[str, int | float]: return {"k": 48, "beta": 5} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.special.gammainc(self.k, x / self.beta) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.erlang.pdf(x, self.k, scale=self.beta) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.beta * scipy.special.gammaincinv(self.k, u) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: - return self.beta**self.k * (scipy.special.gamma(self.k + k) / scipy.special.factorial(k - 1)) + return self.beta**k * (scipy.special.gamma(self.k + k) / scipy.special.gamma(self.k)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -1489,46 +1737,57 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.beta * (self.k - 1) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.k > 0 v2 = self.beta > 0 v3 = type(self.k) == int return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: k = round(continuous_measures.mean**2 / continuous_measures.variance) beta = continuous_measures.variance / continuous_measures.mean parameters = {"k": k, "beta": beta} return parameters + class ERLANG_3P: def __init__( self, @@ -1537,9 +1796,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1549,27 +1806,35 @@ def __init__( self.k = self.parameters["k"] self.beta = self.parameters["beta"] self.loc = self.parameters["loc"] + @property def name(self): return "erlang_3p" + @property def parameters_example(self) -> dict[str, int | float]: return {"k": 54, "beta": 5, "loc": 981} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: - result = scipy.special.gammainc(self.k, (x - self.loc) / self.beta) + result = scipy.stats.erlang.cdf(x, self.k, scale=self.beta, loc=self.loc) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.erlang.pdf(x, self.k, scale=self.beta, loc=self.loc) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.beta * scipy.special.gammaincinv(self.k, u) + self.loc return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: - return self.beta**self.k * (scipy.special.gamma(k + self.k) / scipy.special.factorial(k - 1)) + return self.beta**k * (scipy.special.gamma(k + self.k) / scipy.special.gamma(self.k)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -1584,40 +1849,50 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.beta * (self.k - 1) + self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.k > 0 v2 = self.beta > 0 v3 = type(self.k) == int return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: k = round((2 / continuous_measures.skewness) ** 2) beta = numpy.sqrt(continuous_measures.variance / ((2 / continuous_measures.skewness) ** 2)) @@ -1625,6 +1900,7 @@ def get_parameters(self, continuous_measures) -> dict[str, float | int]: parameters = {"k": k, "beta": beta, "loc": loc} return parameters + class ERROR_FUNCTION: def __init__( self, @@ -1633,9 +1909,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1643,59 +1917,78 @@ def __init__( if init_parameters_examples: self.parameters = self.parameters_example self.h = self.parameters["h"] + @property def name(self): return "error_function" + @property def parameters_example(self) -> dict[str, int | float]: return {"h": 9} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return scipy.stats.norm.cdf((2**0.5) * self.h * x) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return self.h * numpy.exp(-((self.h * x) ** 2)) / numpy.sqrt(numpy.pi) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.norm.ppf(u) / (self.h * numpy.sqrt(2)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return 0 + @property def variance(self) -> float: return 1 / (2 * self.h**2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return 0 + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.h > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: h = numpy.sqrt(1 / (2 * continuous_measures.variance)) parameters = {"h": h} return parameters + class EXPONENTIAL: def __init__( self, @@ -1704,9 +1997,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1714,59 +2005,78 @@ def __init__( if init_parameters_examples: self.parameters = self.parameters_example self.lambda_ = self.parameters["lambda"] + @property def name(self): return "exponential" + @property def parameters_example(self) -> dict[str, int | float]: return {"lambda": 0.05} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return 1 - numpy.exp(-self.lambda_ * x) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return self.lambda_ * numpy.exp(-self.lambda_ * x) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = -numpy.log(1 - u) / self.lambda_ return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return 1 / self.lambda_ + @property def variance(self) -> float: return 1 / (self.lambda_ * self.lambda_) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 2 + @property def kurtosis(self) -> float: return 9 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return 0 + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.lambda_ > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: lambda_ = 1 / continuous_measures.mean parameters = {"lambda": lambda_} return parameters + class EXPONENTIAL_2P: def __init__( self, @@ -1775,9 +2085,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1786,60 +2094,79 @@ def __init__( self.parameters = self.parameters_example self.lambda_ = self.parameters["lambda"] self.loc = self.parameters["loc"] + @property def name(self): return "exponential_2p" + @property def parameters_example(self) -> dict[str, int | float]: return {"lambda": 0.01, "loc": 50} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return 1 - numpy.exp(-self.lambda_ * (x - self.loc)) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return self.lambda_ * numpy.exp(-self.lambda_ * (x - self.loc)) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.loc - numpy.log(1 - u) / self.lambda_ return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return 1 / self.lambda_ + self.loc + @property def variance(self) -> float: return 1 / (self.lambda_ * self.lambda_) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 2 + @property def kurtosis(self) -> float: return 9 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.lambda_ > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: lambda_ = (1 - numpy.log(2)) / (continuous_measures.mean - continuous_measures.median) loc = continuous_measures.min - 1e-4 parameters = {"lambda": lambda_, "loc": loc} return parameters + class F: def __init__( self, @@ -1848,9 +2175,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1859,28 +2184,36 @@ def __init__( self.parameters = self.parameters_example self.df1 = self.parameters["df1"] self.df2 = self.parameters["df2"] + @property def name(self): return "f" + @property def parameters_example(self) -> dict[str, int | float]: return {"df1": 5, "df2": 5} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.f.cdf(x, self.df1, self.df2) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.f.pdf(x, self.df1, self.df2) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: t = scipy.special.betaincinv(self.df1 / 2, self.df2 / 2, u) result = (self.df2 * t) / (self.df1 * (1 - t)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.df2 / self.df1) ** k * (scipy.special.gamma(self.df1 / 2 + k) / scipy.special.gamma(self.df1 / 2)) * (scipy.special.gamma(self.df2 / 2 - k) / scipy.special.gamma(self.df2 / 2)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -1895,44 +2228,55 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return (self.df2 * (self.df1 - 2)) / (self.df1 * (self.df2 + 2)) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.df1 > 0 v2 = self.df2 > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.f.fit(continuous_measures.data_to_fit) parameters = {"df1": scipy_parameters[0], "df2": scipy_parameters[1]} return parameters + class FATIGUE_LIFE: def __init__( self, @@ -1941,9 +2285,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -1953,57 +2295,75 @@ def __init__( self.gamma = self.parameters["gamma"] self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "fatigue_life" + @property def parameters_example(self) -> dict[str, int | float]: return {"gamma": 5, "loc": 3, "scale": 9} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.fatiguelife.cdf(x, self.gamma, loc=self.loc, scale=self.scale) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.fatiguelife.pdf(x, self.gamma, loc=self.loc, scale=self.scale) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.fatiguelife.ppf(u, self.gamma, loc=self.loc, scale=self.scale) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.loc + self.scale * (1 + self.gamma**2 / 2) + @property def variance(self) -> float: return self.scale**2 * self.gamma**2 * (1 + (5 * self.gamma**2) / 4) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (4 * self.gamma**2 * (11 * self.gamma**2 + 6)) / ((5 * self.gamma**2 + 4) * numpy.sqrt(self.gamma**2 * (5 * self.gamma**2 + 4))) + @property def kurtosis(self) -> float: return 3 + (6 * self.gamma * self.gamma * (93 * self.gamma * self.gamma + 40)) / (5 * self.gamma**2 + 4) ** 2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.scale > 0 v2 = self.gamma > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: gamma, loc, scale = initial_solution @@ -2015,10 +2375,12 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_kurtosis - continuous_measures.kurtosis return (eq1, eq2, eq3) + scipy_parameters = scipy.stats.fatiguelife.fit(continuous_measures.data_to_fit) parameters = {"gamma": scipy_parameters[0], "loc": scipy_parameters[1], "scale": scipy_parameters[2]} return parameters + class FOLDED_NORMAL: def __init__( self, @@ -2027,9 +2389,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2038,30 +2398,38 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "folded_normal" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 100, "sigma": 59} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z1 = lambda t: (t + self.mu) / self.sigma z2 = lambda t: (t - self.mu) / self.sigma result = 0.5 * (scipy.special.erf(z1(x) / numpy.sqrt(2)) + scipy.special.erf(z2(x) / numpy.sqrt(2))) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.sqrt(2 / (numpy.pi * self.sigma**2)) * numpy.exp(-(x**2 + self.mu**2) / (2 * self.sigma**2)) * numpy.cosh(self.mu * x / (self.sigma**2)) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.foldnorm.ppf(u, self.mu / self.sigma, loc=0, scale=self.sigma) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: f = lambda x: x**k * self.pdf(x) return scipy.integrate.quad(f, 0, self.mu + 4 * self.sigma)[0] + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -2076,35 +2444,45 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: return self.sigma * numpy.sqrt(2 / numpy.pi) * numpy.exp((-self.mu * self.mu) / (2 * self.sigma * self.sigma)) - self.mu * (2 * scipy.stats.norm.cdf(-self.mu / self.sigma) - 1) + @property def variance(self) -> float: return self.mu * self.mu + self.sigma * self.sigma - self.mean**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: mu, sigma = initial_solution @@ -2113,12 +2491,14 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance return (eq1, eq2) + x0 = [continuous_measures.mean, continuous_measures.standard_deviation] bounds = ((-numpy.inf, 0), (numpy.inf, numpy.inf)) solution = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=[continuous_measures]) parameters = {"mu": solution.x[0], "sigma": solution.x[1]} return parameters + class FRECHET: def __init__( self, @@ -2127,9 +2507,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2139,27 +2517,35 @@ def __init__( self.alpha = self.parameters["alpha"] self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "frechet" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 5, "loc": 9, "scale": 21} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invweibull.cdf(x, self.alpha, loc=self.loc, scale=self.scale) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invweibull.pdf(x, self.alpha, loc=self.loc, scale=self.scale) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.loc + self.scale * (-numpy.log(u)) ** (-1 / self.alpha) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return scipy.special.gamma(1 - k / self.alpha) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -2174,18 +2560,22 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + self.scale * Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return self.scale**2 * (Β΅2 - Β΅1**2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) @@ -2193,6 +2583,7 @@ def skewness(self) -> float: Β΅2 = self.non_central_moments(2) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅3 / std**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) @@ -2200,19 +2591,24 @@ def kurtosis(self) -> float: Β΅2 = self.non_central_moments(2) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅4 / std**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + self.scale * (self.alpha / (self.alpha + 1)) ** (1 / self.alpha) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.scale > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: alpha, loc, scale = initial_solution @@ -2224,10 +2620,12 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_skewness - continuous_measures.skewness return (eq1, eq2, eq3) + scipy_parameters = scipy.stats.invweibull.fit(continuous_measures.data_to_fit) parameters = {"alpha": scipy_parameters[0], "loc": scipy_parameters[1], "scale": scipy_parameters[2]} return parameters + class F_4P: def __init__( self, @@ -2236,9 +2634,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2249,28 +2645,36 @@ def __init__( self.df2 = self.parameters["df2"] self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "f_4p" + @property def parameters_example(self) -> dict[str, int | float]: return {"df1": 76, "df2": 36, "loc": 925, "scale": 197} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.f.cdf(x, self.df1, self.df2, self.loc, self.scale) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.f.pdf(x, self.df1, self.df2, self.loc, self.scale) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: t = scipy.special.betaincinv(self.df1 / 2, self.df2 / 2, u) result = self.loc + (self.scale * (self.df2 * t)) / (self.df1 * (1 - t)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.df2 / self.df1) ** k * (scipy.special.gamma(self.df1 / 2 + k) / scipy.special.gamma(self.df1 / 2)) * (scipy.special.gamma(self.df2 / 2 - k) / scipy.special.gamma(self.df2 / 2)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -2285,40 +2689,50 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + self.scale * Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return self.scale**2 * (Β΅2 - Β΅1**2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return ((self.df2 * (self.df1 - 2)) / (self.df1 * (self.df2 + 2))) * self.scale + self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.df1 > 0 v2 = self.df2 > 0 v3 = self.scale > 0 return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: df1, df2, loc, scale = initial_solution @@ -2332,6 +2746,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq3 = parametric_median - continuous_measures.median eq4 = parametric_mode - continuous_measures.mode return (eq1, eq2, eq3, eq4) + try: bounds = ((0, 0, -numpy.inf, 0), (numpy.inf, numpy.inf, continuous_measures.min, numpy.inf)) x0 = (1, continuous_measures.standard_deviation, continuous_measures.min, continuous_measures.standard_deviation) @@ -2343,6 +2758,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"df1": scipy_parameters[0], "df2": scipy_parameters[1], "loc": scipy_parameters[2], "scale": scipy_parameters[3]} return parameters + class GAMMA: def __init__( self, @@ -2351,9 +2767,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2362,27 +2776,35 @@ def __init__( self.parameters = self.parameters_example self.alpha = self.parameters["alpha"] self.beta = self.parameters["beta"] + @property def name(self): return "gamma" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 1, "beta": 10} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.special.gammainc(self.alpha, x / self.beta) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.gamma.pdf(x, self.alpha, scale=self.beta) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.beta * scipy.special.gammaincinv(self.alpha, u) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return self.beta**k * (scipy.special.gamma(k + self.alpha) / scipy.special.gamma(self.alpha)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -2397,45 +2819,56 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.beta * (self.alpha - 1) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: alpha = continuous_measures.mean**2 / continuous_measures.variance beta = continuous_measures.variance / continuous_measures.mean parameters = {"alpha": alpha, "beta": beta} return parameters + class GAMMA_3P: def __init__( self, @@ -2444,9 +2877,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2456,27 +2887,35 @@ def __init__( self.alpha = self.parameters["alpha"] self.beta = self.parameters["beta"] self.loc = self.parameters["loc"] + @property def name(self): return "gamma_3p" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 22, "loc": 102, "beta": 2} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.special.gammainc(self.alpha, (x - self.loc) / self.beta) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.gamma.pdf(x, self.alpha, loc=self.loc, scale=self.beta) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.beta * scipy.special.gammaincinv(self.alpha, u) + self.loc return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return self.beta**k * (scipy.special.gamma(k + self.alpha) / scipy.special.factorial(self.alpha - 1)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -2491,39 +2930,49 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.beta * (self.alpha - 1) + self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: alpha = (2 / continuous_measures.skewness) ** 2 beta = numpy.sqrt(continuous_measures.variance / alpha) @@ -2531,6 +2980,7 @@ def get_parameters(self, continuous_measures) -> dict[str, float | int]: parameters = {"alpha": alpha, "loc": loc, "beta": beta} return parameters + class GENERALIZED_EXTREME_VALUE: def __init__( self, @@ -2539,9 +2989,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2551,36 +2999,44 @@ def __init__( self.xi = self.parameters["xi"] self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "generalized_extreme_value" + @property def parameters_example(self) -> dict[str, int | float]: return {"xi": 0, "mu": 10, "sigma": 1} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma if self.xi == 0: return numpy.exp(-numpy.exp(-z(x))) else: return numpy.exp(-((1 + self.xi * z(x)) ** (-1 / self.xi))) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma if self.xi == 0: return (1 / self.sigma) * numpy.exp(-z(x) - numpy.exp(-z(x))) else: return (1 / self.sigma) * numpy.exp(-((1 + self.xi * z(x)) ** (-1 / self.xi))) * (1 + self.xi * z(x)) ** (-1 - 1 / self.xi) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: if self.xi == 0: result = self.mu - self.sigma * numpy.log(-numpy.log(u)) else: result = self.mu + (self.sigma * ((-numpy.log(u)) ** -self.xi - 1)) / self.xi return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return scipy.special.gamma(1 - self.xi * k) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -2595,12 +3051,14 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: if self.xi == 0: return self.mu + self.sigma * 0.5772156649 Β΅1 = self.non_central_moments(1) return self.mu + (self.sigma * (Β΅1 - 1)) / self.xi + @property def variance(self) -> float: if self.xi == 0: @@ -2608,9 +3066,11 @@ def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return (self.sigma**2 * (Β΅2 - Β΅1**2)) / self.xi**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: if self.xi == 0: @@ -2620,6 +3080,7 @@ def skewness(self) -> float: Β΅2 = self.non_central_moments(2) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅3 / std**3 + @property def kurtosis(self) -> float: if self.xi == 0: @@ -2629,26 +3090,34 @@ def kurtosis(self) -> float: Β΅2 = self.non_central_moments(2) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅4 / std**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: if self.xi == 0: return self.mu return self.mu + (self.sigma * ((1 + self.xi) ** -self.xi - 1)) / self.xi + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.genextreme.fit(continuous_measures.data_to_fit) parameters = {"xi": -scipy_parameters[0], "mu": scipy_parameters[1], "sigma": scipy_parameters[2]} return parameters + warnings.filterwarnings("ignore") + + class GENERALIZED_GAMMA: def __init__( self, @@ -2657,9 +3126,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2669,26 +3136,35 @@ def __init__( self.a = self.parameters["a"] self.d = self.parameters["d"] self.p = self.parameters["p"] + @property def name(self): return "generalized_gamma" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 10, "d": 128, "p": 24} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: - result = scipy.special.gammainc(self.d / self.p, (x / self.a) ** self.p) + result = scipy.stats.gengamma.cdf(x, self.d / self.p, self.p, scale=self.a) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: - return (self.p / (self.a**self.d)) * (x ** (self.d - 1)) * numpy.exp(-((x / self.a) ** self.p)) / scipy.special.gamma(self.d / self.p) + result = scipy.stats.gengamma.cdf(x, self.d / self.p, self.p, scale=self.a) + return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: - result = self.a * scipy.special.gammaincinv(self.d / self.p, u) ** (1 / self.p) + result = scipy.stats.gengamma.ppf(u, self.d / self.p, self.p, scale=self.a) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.a**k * scipy.special.gamma((self.d + k) / self.p)) / scipy.special.gamma(self.d / self.p) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -2703,40 +3179,50 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.a * ((self.d - 1) / self.p) ** (1 / self.p) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.a > 0 v2 = self.d > 0 v3 = self.p > 0 return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: a, d, p = initial_solution @@ -2748,20 +3234,20 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_skewness - continuous_measures.skewness return (eq1, eq2, eq3) + try: - solution = scipy.optimize.fsolve(equations, (1, 1, 1), continuous_measures) - if all(x > 0 for x in solution) is False or all(x == 1 for x in solution) is True: - bounds = ((0, 0, 0), (numpy.inf, numpy.inf, numpy.inf)) - x0 = (1, 1, 1) - args = [continuous_measures] - response = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) - solution = response.x + bounds = ((1e-5, 1e-5, 1e-5), (numpy.inf, numpy.inf, numpy.inf)) + x0 = (continuous_measures.mean, 1, 1) + args = [continuous_measures] + response = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) + solution = response.x parameters = {"a": solution[0], "d": solution[1], "p": solution[2]} except: scipy_parameters = scipy.stats.gengamma.fit(continuous_measures.data_to_fit) parameters = {"a": scipy_parameters[0], "c": scipy_parameters[1], "mu": scipy_parameters[2]} return parameters + class GENERALIZED_GAMMA_4P: def __init__( self, @@ -2770,9 +3256,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2783,26 +3267,36 @@ def __init__( self.d = self.parameters["d"] self.p = self.parameters["p"] self.loc = self.parameters["loc"] + @property def name(self): return "generalized_gamma_4p" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 2, "d": 13, "p": 3, "loc": 28} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: - result = scipy.special.gammainc(self.d / self.p, ((x - self.loc) / self.a) ** self.p) + result = scipy.stats.gengamma.cdf(x, self.d / self.p, self.p, loc=self.loc, scale=self.a) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: - return (self.p / (self.a**self.d)) * ((x - self.loc) ** (self.d - 1)) * numpy.exp(-(((x - self.loc) / self.a) ** self.p)) / scipy.special.gamma(self.d / self.p) + result = (self.p / (self.a**self.d)) * ((x - self.loc) ** (self.d - 1)) * numpy.exp(-(((x - self.loc) / self.a) ** self.p)) / scipy.special.gamma(self.d / self.p) + result = scipy.stats.gengamma.pdf(x, self.d / self.p, self.p, loc=self.loc, scale=self.a) + return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: - result = self.a * scipy.special.gammaincinv(self.d / self.p, u) ** (1 / self.p) + result = scipy.stats.gengamma.ppf(u, self.d / self.p, self.p, loc=self.loc, scale=self.a) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.a**k * scipy.special.gamma((self.d + k) / self.p)) / scipy.special.gamma(self.d / self.p) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -2817,69 +3311,77 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + self.a * ((self.d - 1) / self.p) ** (1 / self.p) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.a > 0 v2 = self.d > 0 v3 = self.p > 0 return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: a, d, p, loc = initial_solution E = lambda r: a**r * (scipy.special.gamma((d + r) / p) / scipy.special.gamma(d / p)) parametric_mean = E(1) + loc parametric_variance = E(2) - E(1) ** 2 + parametric_skewness = (E(3) - 3 * E(2) * E(1) + 2 * E(1) ** 3) / ((E(2) - E(1) ** 2)) ** 1.5 parametric_kurtosis = (E(4) - 4 * E(1) * E(3) + 6 * E(1) ** 2 * E(2) - 3 * E(1) ** 4) / ((E(2) - E(1) ** 2)) ** 2 - parametric_median = a * scipy.stats.gamma.ppf(0.5, a=d / p, scale=1) ** (1 / p) + loc eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance - eq3 = parametric_median - continuous_measures.median + eq3 = parametric_skewness - continuous_measures.skewness eq4 = parametric_kurtosis - continuous_measures.kurtosis return (eq1, eq2, eq3, eq4) - solution = scipy.optimize.fsolve(equations, (1, 1, 1, 1), continuous_measures) - if all(x > 0 for x in solution) is False or all(x == 1 for x in solution) is True: - try: - bounds = ((0, 0, 0, 0), (numpy.inf, numpy.inf, numpy.inf, numpy.inf)) - if continuous_measures.mean < 0: - bounds = ((0, 0, 0, -numpy.inf), (numpy.inf, numpy.inf, numpy.inf, 0)) - x0 = (1, 1, 1, continuous_measures.mean) - args = [continuous_measures] - response = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) - solution = response.x - except: - scipy_parameters = scipy.stats.gengamma.fit(continuous_measures.data_to_fit) - solution = [scipy_parameters[3], scipy_parameters[0], scipy_parameters[1], scipy_parameters[2]] - parameters = {"a": solution[0], "d": solution[1], "p": solution[2], "loc": solution[3]} + + try: + bounds = ((1e-5, 1e-5, 1e-5, -numpy.inf), (numpy.inf, numpy.inf, numpy.inf, numpy.inf)) + x0 = (1, 1, continuous_measures.mean, continuous_measures.mean) + args = [continuous_measures] + response = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) + solution = response.x + parameters = {"a": solution[0], "d": solution[1], "p": solution[2], "loc": solution[3]} + except: + scipy_parameters = scipy.stats.gengamma.fit(continuous_measures.data_to_fit) + parameters = {"a": scipy_parameters[3], "d": scipy_parameters[0], "p": scipy_parameters[1], "loc": scipy_parameters[2]} return parameters + class GENERALIZED_LOGISTIC: def __init__( self, @@ -2888,9 +3390,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2900,57 +3400,75 @@ def __init__( self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] self.c = self.parameters["c"] + @property def name(self): return "generalized_logistic" + @property def parameters_example(self) -> dict[str, int | float]: return {"c": 2, "loc": 25, "scale": 32} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.loc) / self.scale return 1 / ((1 + numpy.exp(-z(x))) ** self.c) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.loc) / self.scale return (self.c / self.scale) * numpy.exp(-z(x)) * ((1 + numpy.exp(-z(x))) ** (-self.c - 1)) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.loc + self.scale * -numpy.log(u ** (-1 / self.c) - 1) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.loc + self.scale * (0.57721 + scipy.special.digamma(self.c)) + @property def variance(self) -> float: return self.scale * self.scale * ((numpy.pi * numpy.pi) / 6 + scipy.special.polygamma(1, self.c)) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (2.40411380631918 + scipy.special.polygamma(2, self.c)) / ((numpy.pi * numpy.pi) / 6 + scipy.special.polygamma(1, self.c)) ** 1.5 + @property def kurtosis(self) -> float: return 3 + (6.49393940226682 + scipy.special.polygamma(3, self.c)) / ((numpy.pi * numpy.pi) / 6 + scipy.special.polygamma(1, self.c)) ** 2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + self.scale * numpy.log(self.c) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.scale > 0 v2 = self.c > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: c, loc, scale = initial_solution @@ -2961,12 +3479,14 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_median - continuous_measures.median return (eq1, eq2, eq3) + x0 = [1, continuous_measures.min, 1] bounds = ((1e-5, -numpy.inf, 1e-5), (numpy.inf, numpy.inf, numpy.inf)) solution = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=[continuous_measures]) parameters = {"c": solution.x[0], "loc": solution.x[1], "scale": solution.x[2]} return parameters + class GENERALIZED_NORMAL: def __init__( self, @@ -2975,9 +3495,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -2987,60 +3505,79 @@ def __init__( self.beta = self.parameters["beta"] self.mu = self.parameters["mu"] self.alpha = self.parameters["alpha"] + @property def name(self): return "generalized_normal" + @property def parameters_example(self) -> dict[str, int | float]: return {"beta": 1, "mu": 0, "alpha": 3} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return 0.5 + (numpy.sign(x - self.mu) / 2) * scipy.special.gammainc(1 / self.beta, abs((x - self.mu) / self.alpha) ** self.beta) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return self.beta / (2 * self.alpha * scipy.special.gamma(1 / self.beta)) * numpy.exp(-((abs(x - self.mu) / self.alpha) ** self.beta)) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu + numpy.sign(u - 0.5) * (self.alpha**self.beta * scipy.special.gammaincinv(1 / self.beta, 2 * numpy.abs(u - 0.5))) ** (1 / self.beta) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + @property def variance(self) -> float: return (self.mu**2 * scipy.special.gamma(3 / self.alpha)) / scipy.special.gamma(1 / self.alpha) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return (scipy.special.gamma(5 / self.alpha) * scipy.special.gamma(1 / self.alpha)) / scipy.special.gamma(3 / self.alpha) ** 2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.gennorm.fit(continuous_measures.data_to_fit) parameters = {"beta": scipy_parameters[0], "mu": scipy_parameters[1], "alpha": scipy_parameters[2]} return parameters + class GENERALIZED_PARETO: def __init__( self, @@ -3049,9 +3586,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3061,58 +3596,76 @@ def __init__( self.c = self.parameters["c"] self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "generalized_pareto" + @property def parameters_example(self) -> dict[str, int | float]: return {"c": -3, "mu": 31, "sigma": 47} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma result = 1 - (1 + self.c * z(x)) ** (-1 / self.c) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma result = (1 / self.sigma) * (1 + self.c * z(x)) ** (-1 / self.c - 1) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu + (self.sigma * ((1 - u) ** -self.c - 1)) / self.c return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + self.sigma / (1 - self.c) + @property def variance(self) -> float: return (self.sigma * self.sigma) / ((1 - self.c) * (1 - self.c) * (1 - 2 * self.c)) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (2 * (1 + self.c) * numpy.sqrt(1 - 2 * self.c)) / (1 - 3 * self.c) + @property def kurtosis(self) -> float: return (3 * (1 - 2 * self.c) * (2 * self.c * self.c + self.c + 3)) / ((1 - 3 * self.c) * (1 - 4 * self.c)) + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: c, mu, sigma = initial_solution @@ -3123,6 +3676,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_median - numpy.percentile(continuous_measures.data, 50) return (eq1, eq2, eq3) + scipy_parameters = scipy.stats.genpareto.fit(continuous_measures.data_to_fit) parameters = {"c": scipy_parameters[0], "mu": scipy_parameters[1], "sigma": scipy_parameters[2]} if parameters["c"] < 0: @@ -3137,6 +3691,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters["sigma"] = parameters["sigma"] + delta_sigma + 1e-8 return parameters + class GIBRAT: def __init__( self, @@ -3145,9 +3700,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3156,62 +3709,81 @@ def __init__( self.parameters = self.parameters_example self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "gibrat" + @property def parameters_example(self) -> dict[str, int | float]: return {"loc": 29, "scale": 102} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.gibrat.cdf(x, self.loc, self.scale) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.gibrat.pdf(x, self.loc, self.scale) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.exp(scipy.stats.norm.ppf(u)) * self.scale + self.loc return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.loc + self.scale * numpy.sqrt(numpy.exp(1)) + @property def variance(self) -> float: return numpy.exp(1) * (numpy.exp(1) - 1) * self.scale * self.scale + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (2 + numpy.exp(1)) * numpy.sqrt(numpy.exp(1) - 1) + @property def kurtosis(self) -> float: return numpy.exp(1) ** 4 + 2 * numpy.exp(1) ** 3 + 3 * numpy.exp(1) ** 2 - 6 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return (1 / numpy.exp(1)) * self.scale + self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.scale > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scale = numpy.sqrt(continuous_measures.variance / (numpy.e**2 - numpy.e)) loc = continuous_measures.mean - scale * numpy.sqrt(numpy.e) parameters = {"loc": loc, "scale": scale} return parameters + class GUMBEL_LEFT: def __init__( self, @@ -3220,9 +3792,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3231,56 +3801,74 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "gumbel_left" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 100, "sigma": 30} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma return 1 - numpy.exp(-numpy.exp(z(x))) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma return (1 / self.sigma) * numpy.exp(z(x) - numpy.exp(z(x))) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu + self.sigma * numpy.log(-numpy.log(1 - u)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu - 0.5772156649 * self.sigma + @property def variance(self) -> float: return self.sigma**2 * (numpy.pi**2 / 6) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (-12 * numpy.sqrt(6) * 1.20205690315959) / numpy.pi**3 + @property def kurtosis(self) -> float: return 3 + 12 / 5 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: mu, sigma = initial_solution @@ -3289,12 +3877,14 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance return (eq1, eq2) + x0 = [continuous_measures.mode, 1] bounds = ((-numpy.inf, 1e-5), (numpy.inf, numpy.inf)) solution = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=[continuous_measures]) parameters = {"mu": solution.x[0], "sigma": solution.x[1]} return parameters + class GUMBEL_RIGHT: def __init__( self, @@ -3303,9 +3893,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3314,56 +3902,74 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "gumbel_right" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 98, "sigma": 59} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma return numpy.exp(-numpy.exp(-z(x))) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma return (1 / self.sigma) * numpy.exp(-z(x) - numpy.exp(-z(x))) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu - self.sigma * numpy.log(-numpy.log(u)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + 0.5772156649 * self.sigma + @property def variance(self) -> float: return self.sigma**2 * (numpy.pi**2 / 6) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (12 * numpy.sqrt(6) * 1.20205690315959) / numpy.pi**3 + @property def kurtosis(self) -> float: return 3 + 12 / 5 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: mu, sigma = initial_solution @@ -3372,12 +3978,14 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance return (eq1, eq2) + x0 = [continuous_measures.mode, 1] bounds = ((-numpy.inf, 1e-5), (numpy.inf, numpy.inf)) solution = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=[continuous_measures]) parameters = {"mu": solution.x[0], "sigma": solution.x[1]} return parameters + class HALF_NORMAL: def __init__( self, @@ -3386,9 +3994,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3397,64 +4003,83 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "half_normal" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 19, "sigma": 7} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma result = scipy.special.erf(z(x) / numpy.sqrt(2)) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma result = (1 / self.sigma) * numpy.sqrt(2 / numpy.pi) * numpy.exp(-(z(x) ** 2) / 2) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.norm.ppf((1 + u) / 2) * self.sigma + self.mu return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + self.sigma * numpy.sqrt(2 / numpy.pi) + @property def variance(self) -> float: return self.sigma * self.sigma * (1 - 2 / numpy.pi) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (numpy.sqrt(2) * (4 - numpy.pi)) / (numpy.pi - 2) ** 1.5 + @property def kurtosis(self) -> float: return 3 + (8 * (numpy.pi - 3)) / (numpy.pi - 2) ** 2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: sigma = numpy.sqrt(continuous_measures.variance / (1 - 2 / numpy.pi)) mu = continuous_measures.mean - sigma * numpy.sqrt(2) / numpy.sqrt(numpy.pi) parameters = {"mu": mu, "sigma": sigma} return parameters + class HYPERBOLIC_SECANT: def __init__( self, @@ -3463,9 +4088,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3474,62 +4097,81 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "hyperbolic_secant" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 1002, "sigma": 198} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: numpy.pi * (t - self.mu) / (2 * self.sigma) return (2 / numpy.pi) * numpy.arctan(numpy.exp((z(x)))) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: numpy.pi * (t - self.mu) / (2 * self.sigma) return (1 / numpy.cosh(z(x))) / (2 * self.sigma) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.log(numpy.tan((u * numpy.pi) / 2)) * ((2 * self.sigma) / numpy.pi) + self.mu return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + @property def variance(self) -> float: return self.sigma**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return 5 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: mu = continuous_measures.mean sigma = numpy.sqrt(continuous_measures.variance) parameters = {"mu": mu, "sigma": sigma} return parameters + class INVERSE_GAMMA: def __init__( self, @@ -3538,9 +4180,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3549,25 +4189,32 @@ def __init__( self.parameters = self.parameters_example self.alpha = self.parameters["alpha"] self.beta = self.parameters["beta"] + @property def name(self): return "inverse_gamma" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 4, "beta": 12} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgamma.cdf(x, a=self.alpha, scale=self.beta) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgamma.pdf(x, a=self.alpha, scale=self.beta) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.beta / scipy.special.gammaincinv(self.alpha, 1 - u) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: if k == 1: return self.beta**k / (self.alpha - 1) @@ -3578,6 +4225,7 @@ def non_central_moments(self, k: int) -> float | None: if k == 4: return self.beta**k / ((self.alpha - 1) * (self.alpha - 2) * (self.alpha - 3) * (self.alpha - 4)) return None + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -3592,44 +4240,55 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.beta / (self.alpha + 1) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.invgamma.fit(continuous_measures.data_to_fit) parameters = {"alpha": scipy_parameters[0], "beta": scipy_parameters[2]} return parameters + class INVERSE_GAMMA_3P: def __init__( self, @@ -3638,9 +4297,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3650,25 +4307,32 @@ def __init__( self.alpha = self.parameters["alpha"] self.beta = self.parameters["beta"] self.loc = self.parameters["loc"] + @property def name(self): return "inverse_gamma_3p" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 5, "loc": 99, "beta": 11} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgamma.cdf(x, a=self.alpha, loc=self.loc, scale=self.beta) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgamma.pdf(x, a=self.alpha, loc=self.loc, scale=self.beta) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.loc + self.beta / scipy.special.gammaincinv(self.alpha, 1 - u) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: if k == 1: return self.beta**k / (self.alpha - 1) @@ -3679,6 +4343,7 @@ def non_central_moments(self, k: int) -> float | None: if k == 4: return self.beta**k / ((self.alpha - 1) * (self.alpha - 2) * (self.alpha - 3) * (self.alpha - 4)) return None + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -3693,44 +4358,55 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.beta / (self.alpha + 1) + self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.invgamma.fit(continuous_measures.data_to_fit) parameters = {"alpha": scipy_parameters[0], "loc": scipy_parameters[1], "beta": scipy_parameters[2]} return parameters + class INVERSE_GAUSSIAN: def __init__( self, @@ -3739,9 +4415,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3750,63 +4424,82 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.lambda_ = self.parameters["lambda"] + @property def name(self): return "inverse_gaussian" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 10, "lambda": 19} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgauss.cdf(x, self.mu / self.lambda_, scale=self.lambda_) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgauss.pdf(x, self.mu / self.lambda_, scale=self.lambda_) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgauss.ppf(u, self.mu / self.lambda_, scale=self.lambda_) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + @property def variance(self) -> float: return self.mu**3 / self.lambda_ + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 3 * numpy.sqrt(self.mu / self.lambda_) + @property def kurtosis(self) -> float: return 15 * (self.mu / self.lambda_) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu * (numpy.sqrt(1 + (9 * self.mu * self.mu) / (4 * self.lambda_ * self.lambda_)) - (3 * self.mu) / (2 * self.lambda_)) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.mu > 0 v2 = self.lambda_ > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: mu = continuous_measures.mean lambda_ = mu**3 / continuous_measures.variance parameters = {"mu": mu, "lambda": lambda_} return parameters + class INVERSE_GAUSSIAN_3P: def __init__( self, @@ -3815,9 +4508,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3827,57 +4518,75 @@ def __init__( self.mu = self.parameters["mu"] self.lambda_ = self.parameters["lambda"] self.loc = self.parameters["loc"] + @property def name(self): return "inverse_gaussian_3p" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 9, "lambda": 77, "loc": 60} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgauss.cdf(x, self.mu / self.lambda_, loc=self.loc, scale=self.lambda_) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgauss.pdf(x, self.mu / self.lambda_, loc=self.loc, scale=self.lambda_) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.invgauss.ppf(u, self.mu / self.lambda_, loc=self.loc, scale=self.lambda_) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + self.loc + @property def variance(self) -> float: return self.mu**3 / self.lambda_ + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 3 * numpy.sqrt(self.mu / self.lambda_) + @property def kurtosis(self) -> float: return 15 * (self.mu / self.lambda_) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + self.mu * (numpy.sqrt(1 + (9 * self.mu * self.mu) / (4 * self.lambda_ * self.lambda_)) - (3 * self.mu) / (2 * self.lambda_)) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.mu > 0 v2 = self.lambda_ > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: mu = 3 * numpy.sqrt(continuous_measures.variance / (continuous_measures.skewness**2)) lambda_ = mu**3 / continuous_measures.variance @@ -3885,6 +4594,7 @@ def get_parameters(self, continuous_measures) -> dict[str, float | int]: parameters = {"mu": mu, "lambda": lambda_, "loc": loc} return parameters + class JOHNSON_SB: def __init__( self, @@ -3893,9 +4603,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -3906,28 +4614,36 @@ def __init__( self.lambda_ = self.parameters["lambda"] self.gamma_ = self.parameters["gamma"] self.delta_ = self.parameters["delta"] + @property def name(self): return "johnson_sb" + @property def parameters_example(self) -> dict[str, int | float]: return {"xi": 102, "lambda": 794, "gamma": 4, "delta": 1} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.johnsonsb.cdf(x, self.gamma_, self.delta_, loc=self.xi_, scale=self.lambda_) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.johnsonsb.pdf(x, self.gamma_, self.delta_, loc=self.xi_, scale=self.lambda_) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.johnsonsb.ppf(u, self.gamma_, self.delta_, loc=self.xi_, scale=self.lambda_) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: f = lambda x: x**k * (self.delta_ / (numpy.sqrt(2 * numpy.pi) * x * (1 - x))) * numpy.exp(-(1 / 2) * (self.gamma_ + self.delta_ * numpy.log(x / (1 - x))) ** 2) return scipy.integrate.quad(f, 0, 1)[0] + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -3942,48 +4658,59 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.xi_ + self.lambda_ * Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return self.lambda_ * self.lambda_ * (Β΅2 - Β΅1**2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) central_Β΅3 = self.central_moments(3) return central_Β΅3 / (Β΅2 - Β΅1**2) ** 1.5 + @property def kurtosis(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) central_Β΅4 = self.central_moments(4) return central_Β΅4 / (Β΅2 - Β΅1**2) ** 2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.delta_ > 0 v2 = self.lambda_ > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.johnsonsb.fit(continuous_measures.data_to_fit) parameters = {"xi": scipy_parameters[2], "lambda": scipy_parameters[3], "gamma": scipy_parameters[0], "delta": scipy_parameters[1]} return parameters + class JOHNSON_SU: def __init__( self, @@ -3992,9 +4719,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4005,73 +4730,86 @@ def __init__( self.lambda_ = self.parameters["lambda"] self.gamma_ = self.parameters["gamma"] self.delta_ = self.parameters["delta"] + @property def name(self): return "johnson_su" + @property def parameters_example(self) -> dict[str, int | float]: return {"xi": 43, "lambda": 382, "gamma": -16, "delta": 54} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.xi_) / self.lambda_ result = scipy.stats.norm.cdf(self.gamma_ + self.delta_ * numpy.arcsinh(z(x))) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.xi_) / self.lambda_ return (self.delta_ / (self.lambda_ * numpy.sqrt(2 * numpy.pi) * numpy.sqrt(z(x) ** 2 + 1))) * numpy.exp(-(1 / 2) * (self.gamma_ + self.delta_ * numpy.arcsinh(z(x))) ** 2) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.lambda_ * numpy.sinh((scipy.stats.norm.ppf(u) - self.gamma_) / self.delta_) + self.xi_ return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.xi_ - self.lambda_ * numpy.exp(self.delta_**-2 / 2) * numpy.sinh(self.gamma_ / self.delta_) + @property def variance(self) -> float: return (self.lambda_**2 / 2) * (numpy.exp(self.delta_**-2) - 1) * (numpy.exp(self.delta_**-2) * numpy.cosh((2 * self.gamma_) / self.delta_) + 1) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: - return -( - self.lambda_**3 - * numpy.sqrt(numpy.exp(self.delta_**-2)) - * (numpy.exp(self.delta_**-2) - 1) ** 2 - * (numpy.exp(self.delta_**-2) * (numpy.exp(self.delta_**-2) + 2) * numpy.sinh(3 * (self.gamma_ / self.delta_)) + 3 * numpy.sinh(self.gamma_ / self.delta_)) - ) / (4 * self.standard_deviation**3) + return -(self.lambda_**3 * numpy.sqrt(numpy.exp(self.delta_**-2)) * (numpy.exp(self.delta_**-2) - 1) ** 2 * (numpy.exp(self.delta_**-2) * (numpy.exp(self.delta_**-2) + 2) * numpy.sinh(3 * (self.gamma_ / self.delta_)) + 3 * numpy.sinh(self.gamma_ / self.delta_))) / ( + 4 * self.standard_deviation**3 + ) + @property def kurtosis(self) -> float: return ( self.lambda_**4 * (numpy.exp(self.delta_**-2) - 1) ** 2 * ( - numpy.exp(self.delta_**-2) ** 2 - * (numpy.exp(self.delta_**-2) ** 4 + 2 * numpy.exp(self.delta_**-2) ** 3 + 3 * numpy.exp(self.delta_**-2) ** 2 - 3) - * numpy.cosh(4 * (self.gamma_ / self.delta_)) + numpy.exp(self.delta_**-2) ** 2 * (numpy.exp(self.delta_**-2) ** 4 + 2 * numpy.exp(self.delta_**-2) ** 3 + 3 * numpy.exp(self.delta_**-2) ** 2 - 3) * numpy.cosh(4 * (self.gamma_ / self.delta_)) + 4 * numpy.exp(self.delta_**-2) ** 2 * (numpy.exp(self.delta_**-2) + 2) * numpy.cosh(2 * (self.gamma_ / self.delta_)) + 3 * (2 * numpy.exp(self.delta_**-2) + 1) ) ) / (8 * self.standard_deviation**4) + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.delta_ > 0 v2 = self.lambda_ > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: xi_, lambda_, gamma_, delta_ = initial_solution @@ -4089,6 +4827,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq3 = parametric_kurtosis - continuous_measures.kurtosis eq4 = parametric_median - continuous_measures.median return (eq1, eq2, eq3, eq4) + bounds = ((-numpy.inf, 1e-5, -numpy.inf, 1e-5), (numpy.inf, numpy.inf, numpy.inf, numpy.inf)) x0 = (continuous_measures.mean, 1, 1, 1) args = [continuous_measures] @@ -4096,6 +4835,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"xi": solution.x[0], "lambda": solution.x[1], "gamma": solution.x[2], "delta": solution.x[3]} return parameters + class KUMARASWAMY: def __init__( self, @@ -4104,9 +4844,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4117,28 +4855,36 @@ def __init__( self.beta = self.parameters["beta"] self.min = self.parameters["min"] self.max = self.parameters["max"] + @property def name(self): return "kumaraswamy" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 7, "beta": 5, "min": 11, "max": 19} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.min) / (self.max - self.min) result = 1 - (1 - z(x) ** self.alpha) ** self.beta return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.min) / (self.max - self.min) return (self.alpha * self.beta) * (z(x) ** (self.alpha - 1)) * ((1 - z(x) ** self.alpha) ** (self.beta - 1)) / (self.max - self.min) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = (1 - (1 - u) ** (1 / self.beta)) ** (1 / self.alpha) * (self.max - self.min) + self.min return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.beta * scipy.special.gamma(1 + k / self.alpha) * scipy.special.gamma(self.beta)) / scipy.special.gamma(1 + self.beta + k / self.alpha) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -4153,18 +4899,22 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.min + (self.max - self.min) * Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return (self.max - self.min) ** 2 * (Β΅2 - Β΅1**2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) @@ -4172,6 +4922,7 @@ def skewness(self) -> float: Β΅2 = self.non_central_moments(2) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅3 / std**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) @@ -4179,20 +4930,25 @@ def kurtosis(self) -> float: Β΅2 = self.non_central_moments(2) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅4 / std**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.min + (self.max - self.min) * ((self.alpha - 1) / (self.alpha * self.beta - 1)) ** (1 / self.alpha) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 v3 = self.min < self.max return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: alpha, beta, min_, max_ = initial_solution @@ -4206,6 +4962,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq3 = parametric_skewness - continuous_measures.skewness eq4 = parametric_kurtosis - continuous_measures.kurtosis return (eq1, eq2, eq3, eq4) + bounds = ((1e-5, 1e-5, -numpy.inf, -numpy.inf), (numpy.inf, numpy.inf, numpy.inf, numpy.inf)) x0 = (1, 1, continuous_measures.min, continuous_measures.max) args = [continuous_measures] @@ -4213,6 +4970,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"alpha": solution.x[0], "beta": solution.x[1], "min": solution.x[2], "max": solution.x[3]} return parameters + class LAPLACE: def __init__( self, @@ -4221,9 +4979,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4232,60 +4988,79 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.b = self.parameters["b"] + @property def name(self): return "laplace" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 17, "b": 4} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return 0.5 + 0.5 * numpy.sign(x - self.mu) * (1 - numpy.exp(-abs(x - self.mu) / self.b)) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (1 / (2 * self.b)) * numpy.exp(-abs(x - self.mu) / self.b) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu - self.b * numpy.sign(u - 0.5) * numpy.log(1 - 2 * numpy.abs(u - 0.5)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + @property def variance(self) -> float: return 2 * self.b**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return 6 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.b > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: mu = continuous_measures.mean b = numpy.sqrt(continuous_measures.variance / 2) parameters = {"mu": mu, "b": b} return parameters + class LEVY: def __init__( self, @@ -4294,9 +5069,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4305,62 +5078,81 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.c = self.parameters["c"] + @property def name(self): return "levy" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 0, "c": 1} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: y = lambda x: numpy.sqrt(self.c / ((x - self.mu))) result = 2 - 2 * scipy.stats.norm.cdf(y(x)) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.sqrt(self.c / (2 * numpy.pi)) * numpy.exp(-self.c / (2 * (x - self.mu))) / ((x - self.mu) ** 1.5) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu + self.c / scipy.stats.norm.ppf((2 - u) / 2) ** 2 return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return numpy.inf + @property def variance(self) -> float: return numpy.inf + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return None + @property def kurtosis(self) -> float: return None + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + self.c / 3 + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.c > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.levy.fit(continuous_measures.data_to_fit) parameters = {"mu": scipy_parameters[0], "c": scipy_parameters[1]} return parameters + class LOGGAMMA: def __init__( self, @@ -4369,9 +5161,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4381,59 +5171,77 @@ def __init__( self.c = self.parameters["c"] self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "loggamma" + @property def parameters_example(self) -> dict[str, int | float]: return {"c": 2, "mu": 8, "sigma": 4} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: y = lambda x: (x - self.mu) / self.sigma result = scipy.special.gammainc(self.c, numpy.exp(y(x))) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: y = lambda x: (x - self.mu) / self.sigma result = numpy.exp(self.c * y(x) - numpy.exp(y(x)) - scipy.special.gammaln(self.c)) / self.sigma return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu + self.sigma * numpy.log(scipy.special.gammaincinv(self.c, u)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return scipy.special.digamma(self.c) * self.sigma + self.mu + @property def variance(self) -> float: return scipy.special.polygamma(1, self.c) * self.sigma * self.sigma + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return scipy.special.polygamma(2, self.c) / scipy.special.polygamma(1, self.c) ** 1.5 + @property def kurtosis(self) -> float: return scipy.special.polygamma(3, self.c) / scipy.special.polygamma(1, self.c) ** 2 + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + self.sigma * numpy.log(self.c) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.c > 0 v2 = self.sigma > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution, data_mean, data_variance, data_skewness): c, mu, sigma = initial_solution @@ -4444,6 +5252,7 @@ def equations(initial_solution, data_mean, data_variance, data_skewness): eq2 = parametric_variance - data_variance eq3 = parametric_skewness - data_skewness return (eq1, eq2, eq3) + bounds = ((0, 0, 0), (numpy.inf, numpy.inf, numpy.inf)) x0 = (1, 1, 1) args = (continuous_measures.mean, continuous_measures.variance, continuous_measures.skewness) @@ -4451,6 +5260,7 @@ def equations(initial_solution, data_mean, data_variance, data_skewness): parameters = {"c": solution.x[0], "mu": solution.x[1], "sigma": solution.x[2]} return parameters + class LOGISTIC: def __init__( self, @@ -4459,9 +5269,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4470,64 +5278,83 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "logistic" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 9, "sigma": 5} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: numpy.exp(-(t - self.mu) / self.sigma) result = 1 / (1 + z(x)) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: numpy.exp(-(t - self.mu) / self.sigma) result = z(x) / (self.sigma * (1 + z(x)) ** 2) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu + self.sigma * numpy.log(u / (1 - u)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + @property def variance(self) -> float: return (self.sigma * self.sigma * numpy.pi * numpy.pi) / 3 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return 4.2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: mu = continuous_measures.mean sigma = numpy.sqrt(3 * continuous_measures.variance / (numpy.pi**2)) parameters = {"mu": mu, "sigma": sigma} return parameters + class LOGLOGISTIC: def __init__( self, @@ -4536,9 +5363,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4547,27 +5372,35 @@ def __init__( self.parameters = self.parameters_example self.alpha = self.parameters["alpha"] self.beta = self.parameters["beta"] + @property def name(self): return "loglogistic" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 5, "beta": 2} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.fisk.cdf(x, self.beta, 0, self.alpha) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.fisk.pdf(x, self.beta, 0, self.alpha) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.fisk.ppf(u, self.beta, 0, self.alpha) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.alpha**k * ((k * numpy.pi) / self.beta)) / numpy.sin((k * numpy.pi) / self.beta) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -4582,39 +5415,49 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.alpha * ((self.beta - 1) / (self.beta + 1)) ** (1 / self.beta) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution, continuous_measures): alpha, beta = initial_solution @@ -4624,6 +5467,7 @@ def equations(initial_solution, continuous_measures): eq2 = parametric_mean - continuous_measures.mean eq1 = parametric_median - continuous_measures.median return (eq1, eq2) + x0 = (continuous_measures.median, continuous_measures.median) bounds = ((0, 0), (numpy.inf, numpy.inf)) args = [continuous_measures] @@ -4631,6 +5475,7 @@ def equations(initial_solution, continuous_measures): parameters = {"alpha": solution.x[0], "beta": solution.x[1]} return parameters + class LOGLOGISTIC_3P: def __init__( self, @@ -4639,9 +5484,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4651,27 +5494,35 @@ def __init__( self.alpha = self.parameters["alpha"] self.beta = self.parameters["beta"] self.loc = self.parameters["loc"] + @property def name(self): return "loglogistic_3p" + @property def parameters_example(self) -> dict[str, int | float]: return {"loc": 100, "alpha": 4, "beta": 2} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.fisk.cdf(x, self.beta, self.loc, self.alpha) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.fisk.pdf(x, self.beta, self.loc, self.alpha) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.fisk.ppf(u, self.beta, self.loc, self.alpha) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.alpha**k * ((k * numpy.pi) / self.beta)) / numpy.sin((k * numpy.pi) / self.beta) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -4686,39 +5537,49 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + self.alpha * ((self.beta - 1) / (self.beta + 1)) ** (1 / self.beta) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: alpha, beta, loc = initial_solution @@ -4731,6 +5592,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_median - continuous_measures.median return (eq1, eq2, eq3) + bounds = ((0, 0, -numpy.inf), (numpy.inf, numpy.inf, numpy.inf)) x0 = (continuous_measures.min, continuous_measures.median, continuous_measures.median) args = [continuous_measures] @@ -4738,6 +5600,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"loc": solution.x[2], "alpha": solution.x[0], "beta": solution.x[1]} return parameters + class LOGNORMAL: def __init__( self, @@ -4746,9 +5609,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4757,62 +5618,81 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "lognormal" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 2, "sigma": 7} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.norm.cdf((numpy.log(x) - self.mu) / self.sigma) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (1 / (x * self.sigma * numpy.sqrt(2 * numpy.pi))) * numpy.exp(-(((numpy.log(x) - self.mu) ** 2) / (2 * self.sigma**2))) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.exp(self.mu + self.sigma * scipy.stats.norm.ppf(u)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return numpy.exp(self.mu + self.sigma**2 / 2) + @property def variance(self) -> float: return (numpy.exp(self.sigma**2) - 1) * numpy.exp(2 * self.mu + self.sigma**2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (numpy.exp(self.sigma * self.sigma) + 2) * numpy.sqrt(numpy.exp(self.sigma * self.sigma) - 1) + @property def kurtosis(self) -> float: return numpy.exp(4 * self.sigma * self.sigma) + 2 * numpy.exp(3 * self.sigma * self.sigma) + 3 * numpy.exp(2 * self.sigma * self.sigma) - 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return numpy.exp(self.mu - self.sigma * self.sigma) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.mu > 0 v2 = self.sigma > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: mu = numpy.log(continuous_measures.mean**2 / numpy.sqrt(continuous_measures.mean**2 + continuous_measures.variance)) sigma = numpy.sqrt(numpy.log((continuous_measures.mean**2 + continuous_measures.variance) / (continuous_measures.mean**2))) parameters = {"mu": mu, "sigma": sigma} return parameters + class MAXWELL: def __init__( self, @@ -4821,9 +5701,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4832,64 +5710,83 @@ def __init__( self.parameters = self.parameters_example self.alpha = self.parameters["alpha"] self.loc = self.parameters["loc"] + @property def name(self): return "maxwell" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 60, "loc": 100} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.loc) / self.alpha result = scipy.special.erf(z(x) / (numpy.sqrt(2))) - numpy.sqrt(2 / numpy.pi) * z(x) * numpy.exp(-z(x) ** 2 / 2) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.loc) / self.alpha result = 1 / self.alpha * numpy.sqrt(2 / numpy.pi) * z(x) ** 2 * numpy.exp(-z(x) ** 2 / 2) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.alpha * numpy.sqrt(2 * scipy.special.gammaincinv(1.5, u)) + self.loc return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return 2 * numpy.sqrt(2 / numpy.pi) * self.alpha + self.loc + @property def variance(self) -> float: return (self.alpha * self.alpha * (3 * numpy.pi - 8)) / numpy.pi + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (2 * numpy.sqrt(2) * (16 - 5 * numpy.pi)) / (3 * numpy.pi - 8) ** 1.5 + @property def kurtosis(self) -> float: return (4 * (-96 + 40 * numpy.pi - 3 * numpy.pi * numpy.pi)) / (3 * numpy.pi - 8) ** 2 + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return numpy.sqrt(2) * self.alpha + self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: alpha = numpy.sqrt(continuous_measures.variance * numpy.pi / (3 * numpy.pi - 8)) loc = continuous_measures.mean - 2 * alpha * numpy.sqrt(2 / numpy.pi) parameters = {"alpha": alpha, "loc": loc} return parameters + class MOYAL: def __init__( self, @@ -4898,9 +5795,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4909,64 +5804,83 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "moyal" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 19, "sigma": 9} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma result = scipy.special.erfc(numpy.exp(-0.5 * z(x)) / numpy.sqrt(2)) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma result = numpy.exp(-0.5 * (z(x) + numpy.exp(-z(x)))) / (self.sigma * numpy.sqrt(2 * numpy.pi)) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu - self.sigma * numpy.log(scipy.stats.norm.ppf(1 - u / 2) ** 2) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + self.sigma * (numpy.log(2) + 0.577215664901532) + @property def variance(self) -> float: return (self.sigma * self.sigma * numpy.pi * numpy.pi) / 2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 1.5351415907229 + @property def kurtosis(self) -> float: return 7 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: sigma = numpy.sqrt(2 * continuous_measures.variance / (numpy.pi * numpy.pi)) mu = continuous_measures.mean - sigma * (numpy.log(2) + 0.577215664901532) parameters = {"mu": mu, "sigma": sigma} return parameters + class NAKAGAMI: def __init__( self, @@ -4975,9 +5889,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -4986,65 +5898,78 @@ def __init__( self.parameters = self.parameters_example self.m = self.parameters["m"] self.omega = self.parameters["omega"] + @property def name(self): return "nakagami" + @property def parameters_example(self) -> dict[str, int | float]: return {"m": 11, "omega": 27} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.special.gammainc(self.m, (self.m / self.omega) * x**2) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (2 * self.m**self.m) / (scipy.special.gamma(self.m) * self.omega**self.m) * (x ** (2 * self.m - 1) * numpy.exp(-(self.m / self.omega) * x**2)) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.sqrt(scipy.special.gammaincinv(self.m, u) * (self.omega / self.m)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return (scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(self.omega / self.m) + @property def variance(self) -> float: return self.omega * (1 - (1 / self.m) * (scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) ** 2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: - return ( - (scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) - * numpy.sqrt(1 / self.m) - * (1 - 4 * self.m * (1 - ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 2)) - ) / (2 * self.m * (1 - ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 2) ** 1.5) + return ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m) * (1 - 4 * self.m * (1 - ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 2))) / ( + 2 * self.m * (1 - ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 2) ** 1.5 + ) + @property def kurtosis(self) -> float: - return 3 + ( - -6 * ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 4 * self.m - + (8 * self.m - 2) * ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 2 - - 2 * self.m - + 1 - ) / (self.m * (1 - ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 2) ** 2) + return 3 + (-6 * ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 4 * self.m + (8 * self.m - 2) * ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 2 - 2 * self.m + 1) / ( + self.m * (1 - ((scipy.special.gamma(self.m + 0.5) / scipy.special.gamma(self.m)) * numpy.sqrt(1 / self.m)) ** 2) ** 2 + ) + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return (numpy.sqrt(2) / 2) * numpy.sqrt((self.omega * (2 * self.m - 1)) / self.m) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.m >= 0.5 v2 = self.omega > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: E_x2 = numpy.sum(numpy.power(continuous_measures.data, 2)) / continuous_measures.size E_x4 = numpy.sum(numpy.power(continuous_measures.data, 4)) / continuous_measures.size @@ -5053,6 +5978,7 @@ def get_parameters(self, continuous_measures) -> dict[str, float | int]: parameters = {"m": m, "omega": omega} return parameters + class NON_CENTRAL_CHI_SQUARE: def __init__( self, @@ -5061,9 +5987,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5072,63 +5996,82 @@ def __init__( self.parameters = self.parameters_example self.lambda_ = self.parameters["lambda"] self.n = self.parameters["n"] + @property def name(self): return "non_central_chi_square" + @property def parameters_example(self) -> dict[str, int | float]: return {"lambda": 101, "n": 54} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.ncx2.cdf(x, self.n, self.lambda_) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.ncx2.pdf(x, self.n, self.lambda_) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.ncx2.ppf(u, self.n, self.lambda_) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.lambda_ + self.n + @property def variance(self) -> float: return 2 * (self.n + 2 * self.lambda_) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (2**1.5 * (self.n + 3 * self.lambda_)) / (self.n + 2 * self.lambda_) ** 1.5 + @property def kurtosis(self) -> float: return 3 + (12 * (self.n + 4 * self.lambda_)) / (self.n + 2 * self.lambda_) ** 2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.lambda_ > 0 v2 = self.n > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: lambda_ = continuous_measures.variance / 2 - continuous_measures.mean n = 2 * continuous_measures.mean - continuous_measures.variance / 2 parameters = {"lambda": lambda_, "n": n} return parameters + class NON_CENTRAL_F: def __init__( self, @@ -5137,9 +6080,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5149,48 +6090,47 @@ def __init__( self.lambda_ = self.parameters["lambda"] self.n1 = self.parameters["n1"] self.n2 = self.parameters["n2"] + @property def name(self): return "non_central_f" + @property def parameters_example(self) -> dict[str, int | float]: return {"lambda": 81, "n1": 12, "n2": 72} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.ncf.cdf(x, self.n1, self.n2, self.lambda_) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.ncf.pdf(x, self.n1, self.n2, self.lambda_) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.ncf.ppf(u, self.n1, self.n2, self.lambda_) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: if k == 1: return (self.n2 / self.n1) * ((self.n1 + self.lambda_) / (self.n2 - 2)) if k == 2: return (self.n2 / self.n1) ** 2 * (1 / ((self.n2 - 2) * (self.n2 - 4))) * (self.lambda_**2 + (2 * self.lambda_ + self.n1) * (self.n1 + 2)) if k == 3: - return ( - (self.n2 / self.n1) ** 3 - * (1 / ((self.n2 - 2) * (self.n2 - 4) * (self.n2 - 6))) - * (self.lambda_**3 + 3 * (self.n1 + 4) * self.lambda_**2 + (3 * self.lambda_ + self.n1) * (self.n1 + 4) * (self.n1 + 2)) - ) + return (self.n2 / self.n1) ** 3 * (1 / ((self.n2 - 2) * (self.n2 - 4) * (self.n2 - 6))) * (self.lambda_**3 + 3 * (self.n1 + 4) * self.lambda_**2 + (3 * self.lambda_ + self.n1) * (self.n1 + 4) * (self.n1 + 2)) if k == 4: return ( (self.n2 / self.n1) ** 4 * (1 / ((self.n2 - 2) * (self.n2 - 4) * (self.n2 - 6) * (self.n2 - 8))) - * ( - self.lambda_**4 - + 4 * (self.n1 + 6) * self.lambda_**3 - + 6 * (self.n1 + 6) * (self.n1 + 4) * self.lambda_**2 - + (4 * self.lambda_ + self.n1) * (self.n1 + 2) * (self.n1 + 4) * (self.n1 + 6) - ) + * (self.lambda_**4 + 4 * (self.n1 + 6) * self.lambda_**3 + 6 * (self.n1 + 6) * (self.n1 + 4) * self.lambda_**2 + (4 * self.lambda_ + self.n1) * (self.n1 + 2) * (self.n1 + 4) * (self.n1 + 6)) ) return None + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -5205,40 +6145,50 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.lambda_ > 0 v2 = self.n1 > 0 v3 = self.n2 > 0 return v1 and v2 and v3 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: lambda_, n1, n2 = initial_solution @@ -5252,13 +6202,15 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_skewness - continuous_measures.skewness return (eq1, eq2, eq3) + bounds = ((0, 0, 0), (numpy.inf, numpy.inf, numpy.inf)) - x0 = (continuous_measures.mean, 1, 10) + x0 = (continuous_measures.mean, continuous_measures.mean, continuous_measures.mean) args = [continuous_measures] solution = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) parameters = {"lambda": solution.x[0], "n1": solution.x[1], "n2": solution.x[2]} return parameters + class NON_CENTRAL_T_STUDENT: def __init__( self, @@ -5267,9 +6219,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5280,25 +6230,32 @@ def __init__( self.n = self.parameters["n"] self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "non_central_t_student" + @property def parameters_example(self) -> dict[str, int | float]: return {"lambda": 8, "n": 9, "loc": 474, "scale": 6} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.nct.cdf(x, self.n, self.lambda_, loc=self.loc, scale=self.scale) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.nct.pdf(x, self.n, self.lambda_, loc=self.loc, scale=self.scale) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.nct.ppf(u, self.n, self.lambda_, loc=self.loc, scale=self.scale) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: if k == 1: return (self.lambda_ * numpy.sqrt(self.n / 2) * scipy.special.gamma((self.n - 1) / 2)) / scipy.special.gamma(self.n / 2) @@ -5309,6 +6266,7 @@ def non_central_moments(self, k: int) -> float | None: if k == 4: return (self.n * self.n * (self.lambda_**4 + 6 * self.lambda_**2 + 3)) / ((self.n - 2) * (self.n - 4)) return None + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -5323,18 +6281,22 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + self.scale * Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return self.scale**2 * (Β΅2 - Β΅1**2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance()) + @property def skewness(self) -> float: Β΅1 = self.non_central_moments(1) @@ -5342,6 +6304,7 @@ def skewness(self) -> float: central_Β΅3 = self.central_moments(3) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅3 / std**3 + @property def kurtosis(self) -> float: Β΅1 = self.non_central_moments(1) @@ -5349,19 +6312,24 @@ def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) std = numpy.sqrt(Β΅2 - Β΅1**2) return central_Β΅4 / std**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.n > 0 v2 = self.scale > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: lambda_, n, loc, scale = initial_solution @@ -5378,6 +6346,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq3 = parametric_skewness - continuous_measures.skewness eq4 = parametric_kurtosis - continuous_measures.kurtosis return (eq1, eq2, eq3, eq4) + bounds = ((-numpy.inf, 1e-5, -numpy.inf, 1e-5), (numpy.inf, numpy.inf, numpy.inf, numpy.inf)) x0 = (1, 5, continuous_measures.mean, 1) args = [continuous_measures] @@ -5385,6 +6354,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"lambda": solution.x[0], "n": solution.x[1], "loc": solution.x[2], "scale": solution.x[3]} return parameters + class NORMAL: def __init__( self, @@ -5393,9 +6363,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5404,63 +6372,82 @@ def __init__( self.parameters = self.parameters_example self.mu = self.parameters["mu"] self.sigma = self.parameters["sigma"] + @property def name(self): return "normal" + @property def parameters_example(self) -> dict[str, int | float]: return {"mu": 5, "sigma": 3} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.mu) / self.sigma result = 0.5 * (1 + scipy.special.erf(z(x) / numpy.sqrt(2))) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = (1 / (self.sigma * numpy.sqrt(2 * numpy.pi))) * numpy.exp(-(((x - self.mu) ** 2) / (2 * self.sigma**2))) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.mu + self.sigma * scipy.stats.norm.ppf(u) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.mu + @property def variance(self) -> float: return self.sigma * 3 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.mu + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: mu = continuous_measures.mean sigma = continuous_measures.standard_deviation parameters = {"mu": mu, "sigma": sigma} return parameters + class PARETO_FIRST_KIND: def __init__( self, @@ -5469,9 +6456,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5481,27 +6466,35 @@ def __init__( self.xm = self.parameters["xm"] self.alpha = self.parameters["alpha"] self.loc = self.parameters["loc"] + @property def name(self): return "pareto_first_kind" + @property def parameters_example(self) -> dict[str, int | float]: return {"xm": 9, "alpha": 6, "loc": 100} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.pareto.cdf(x, self.alpha, loc=self.loc, scale=self.xm) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.pareto.pdf(x, self.alpha, loc=self.loc, scale=self.xm) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.loc + self.xm * (1 - u) ** -(1 / self.alpha) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.alpha * self.xm**k) / (self.alpha - k) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -5516,44 +6509,55 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.xm + self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.xm > 0 v2 = self.alpha > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.pareto.fit(continuous_measures.data_to_fit) parameters = {"xm": scipy_parameters[2], "alpha": scipy_parameters[0], "loc": scipy_parameters[1]} return parameters + class PARETO_SECOND_KIND: def __init__( self, @@ -5562,9 +6566,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5574,26 +6576,34 @@ def __init__( self.xm = self.parameters["xm"] self.alpha = self.parameters["alpha"] self.loc = self.parameters["loc"] + @property def name(self): return "pareto_second_kind" + @property def parameters_example(self) -> dict[str, int | float]: return {"xm": 32, "alpha": 7, "loc": 17} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.lomax.cdf(x, self.alpha, scale=self.xm, loc=self.loc) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (self.alpha * self.xm**self.alpha) / (((x - self.loc) + self.xm) ** (self.alpha + 1)) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.loc + self.xm / (1 - u) ** (1 / self.alpha) - self.xm return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.xm**k * scipy.special.gamma(self.alpha - k) * scipy.special.gamma(1 + k)) / scipy.special.gamma(self.alpha) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -5608,39 +6618,49 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.xm > 0 v2 = self.alpha > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: m = continuous_measures.mean v = continuous_measures.variance @@ -5650,6 +6670,7 @@ def get_parameters(self, continuous_measures) -> dict[str, float | int]: parameters = {"xm": xm, "alpha": alpha, "loc": loc} return parameters + class PERT: def __init__( self, @@ -5658,9 +6679,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5672,58 +6691,74 @@ def __init__( self.c = self.parameters["c"] self.alpha1 = (4 * self.b + self.c - 5 * self.a) / (self.c - self.a) self.alpha2 = (5 * self.c - self.a - 4 * self.b) / (self.c - self.a) + @property def name(self): return "pert" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 63, "b": 513, "c": 970} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.a) / (self.c - self.a) result = scipy.special.betainc(self.alpha1, self.alpha2, z(x)) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (x - self.a) ** (self.alpha1 - 1) * (self.c - x) ** (self.alpha2 - 1) / (scipy.special.beta(self.alpha1, self.alpha2) * (self.c - self.a) ** (self.alpha1 + self.alpha2 - 1)) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.a + (self.c - self.a) * scipy.special.betaincinv(self.alpha1, self.alpha2, u) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return (self.a + 4 * self.b + self.c) / 6 + @property def variance(self) -> float: return ((self.mean - self.a) * (self.c - self.mean)) / 7 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (2 * (self.alpha2 - self.alpha1) * numpy.sqrt(self.alpha1 + self.alpha2 + 1)) / ((self.alpha1 + self.alpha2 + 2) * numpy.sqrt(self.alpha1 * self.alpha2)) + @property def kurtosis(self) -> float: - return (6 * ((self.alpha2 - self.alpha1) ** 2 * (self.alpha1 + self.alpha2 + 1) - self.alpha1 * self.alpha2 * (self.alpha1 + self.alpha2 + 2))) / ( - self.alpha1 * self.alpha2 * (self.alpha1 + self.alpha2 + 2) * (self.alpha1 + self.alpha2 + 3) - ) + 3 + return (6 * ((self.alpha2 - self.alpha1) ** 2 * (self.alpha1 + self.alpha2 + 1) - self.alpha1 * self.alpha2 * (self.alpha1 + self.alpha2 + 2))) / (self.alpha1 * self.alpha2 * (self.alpha1 + self.alpha2 + 2) * (self.alpha1 + self.alpha2 + 3)) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.b + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.a < self.b < self.c return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: a, b, c = initial_solution @@ -5732,20 +6767,21 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parametric_mean = (a + 4 * b + c) / 6 parametric_variance = ((parametric_mean - a) * (c - parametric_mean)) / 7 parametric_median = scipy.special.betaincinv(self.alpha1, self.alpha2, 0.5) * (c - a) + a - parametric_mode = b eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_median - continuous_measures.median return (eq1, eq2, eq3) + bounds = ((-numpy.inf, continuous_measures.min, continuous_measures.mode), (continuous_measures.mode, continuous_measures.max, numpy.inf)) x0 = (continuous_measures.min, continuous_measures.mode, continuous_measures.max) args = [continuous_measures] solution = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) parameters = {"a": solution.x[0], "b": solution.x[1], "c": solution.x[2]} - parameters["a"] = min(continuous_measures.min - 1e-3, parameters["a"]) - parameters["c"] = max(continuous_measures.max + 1e-3, parameters["c"]) + parameters["a"] = min(continuous_measures.min - 1e-2, parameters["a"]) + parameters["c"] = max(continuous_measures.max + 1e-2, parameters["c"]) return parameters + class POWER_FUNCTION: def __init__( self, @@ -5754,9 +6790,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5766,41 +6800,43 @@ def __init__( self.alpha = self.parameters["alpha"] self.a = self.parameters["a"] self.b = self.parameters["b"] + @property def name(self): return "power_function" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 11, "a": -13, "b": 99} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return ((x - self.a) / (self.b - self.a)) ** self.alpha + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return self.alpha * ((x - self.a) ** (self.alpha - 1)) / ((self.b - self.a) ** self.alpha) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = u ** (1 / self.alpha) * (self.b - self.a) + self.a return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: if k == 1: return (self.a + self.b * self.alpha) / (self.alpha + 1) if k == 2: return (2 * self.a**2 + 2 * self.alpha * self.a * self.b + self.alpha * (self.alpha + 1) * self.b**2) / ((self.alpha + 1) * (self.alpha + 2)) if k == 3: - return ( - 6 * self.a**3 + 6 * self.a**2 * self.b * self.alpha + 3 * self.a * self.b**2 * self.alpha * (1 + self.alpha) + self.b**3 * self.alpha * (1 + self.alpha) * (2 + self.alpha) - ) / ((1 + self.alpha) * (2 + self.alpha) * (3 + self.alpha)) + return (6 * self.a**3 + 6 * self.a**2 * self.b * self.alpha + 3 * self.a * self.b**2 * self.alpha * (1 + self.alpha) + self.b**3 * self.alpha * (1 + self.alpha) * (2 + self.alpha)) / ((1 + self.alpha) * (2 + self.alpha) * (3 + self.alpha)) if k == 4: return ( - 24 * self.a**4 - + 24 * self.alpha * self.a**3 * self.b - + 12 * self.alpha * (self.alpha + 1) * self.a**2 * self.b**2 - + 4 * self.alpha * (self.alpha + 1) * (self.alpha + 2) * self.a * self.b**3 - + self.alpha * (self.alpha + 1) * (self.alpha + 2) * (self.alpha + 3) * self.b**4 + 24 * self.a**4 + 24 * self.alpha * self.a**3 * self.b + 12 * self.alpha * (self.alpha + 1) * self.a**2 * self.b**2 + 4 * self.alpha * (self.alpha + 1) * (self.alpha + 2) * self.a * self.b**3 + self.alpha * (self.alpha + 1) * (self.alpha + 2) * (self.alpha + 3) * self.b**4 ) / ((self.alpha + 1) * (self.alpha + 2) * (self.alpha + 3) * (self.alpha + 4)) return None + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -5815,39 +6851,49 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return numpy.max([self.a, self.b]) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.b > self.a return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: alpha, a, b = initial_solution @@ -5861,6 +6907,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_skewness - continuous_measures.skewness return (eq1, eq2, eq3) + bounds = ((0, -numpy.inf, -numpy.inf), (numpy.inf, numpy.inf, numpy.inf)) x0 = (1, 1, continuous_measures.max) args = [continuous_measures] @@ -5868,6 +6915,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"alpha": solution.x[0], "a": solution.x[1], "b": continuous_measures.max + 1e-3} return parameters + class RAYLEIGH: def __init__( self, @@ -5876,9 +6924,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5887,62 +6933,81 @@ def __init__( self.parameters = self.parameters_example self.gamma = self.parameters["gamma"] self.sigma = self.parameters["sigma"] + @property def name(self): return "rayleigh" + @property def parameters_example(self) -> dict[str, int | float]: return {"gamma": 10, "sigma": 2} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.gamma) / self.sigma return 1 - numpy.exp(-0.5 * (z(x) ** 2)) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.gamma) / self.sigma return z(x) * numpy.exp(-0.5 * (z(x) ** 2)) / self.sigma + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.sqrt(-2 * numpy.log(1 - u)) * self.sigma + self.gamma return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.sigma * numpy.sqrt(numpy.pi / 2) + self.gamma + @property def variance(self) -> float: return self.sigma * self.sigma * (2 - numpy.pi / 2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0.6311 + @property def kurtosis(self) -> float: return (24 * numpy.pi - 6 * numpy.pi * numpy.pi - 16) / ((4 - numpy.pi) * (4 - numpy.pi)) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.gamma + self.sigma + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.sigma > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: sigma = numpy.sqrt(continuous_measures.variance * 2 / (4 - numpy.pi)) gamma = continuous_measures.mean - sigma * numpy.sqrt(numpy.pi / 2) parameters = {"gamma": gamma, "sigma": sigma} return parameters + class RECIPROCAL: def __init__( self, @@ -5951,9 +7016,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -5962,25 +7025,33 @@ def __init__( self.parameters = self.parameters_example self.a = self.parameters["a"] self.b = self.parameters["b"] + @property def name(self): return "reciprocal" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 20, "b": 99} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (numpy.log(x) - numpy.log(self.a)) / (numpy.log(self.b) - numpy.log(self.a)) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return 1 / (x * (numpy.log(self.b) - numpy.log(self.a))) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.exp(u * (numpy.log(self.b) - numpy.log(self.a)) + numpy.log(self.a)) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return (self.b**k - self.a**k) / (k * (numpy.log(self.b) - numpy.log(self.a))) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -5995,44 +7066,55 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.a + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.b > self.a return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: a = continuous_measures.min - 1e-8 b = continuous_measures.max + 1e-8 parameters = {"a": a, "b": b} return parameters + class RICE: def __init__( self, @@ -6041,9 +7123,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -6052,35 +7132,39 @@ def __init__( self.parameters = self.parameters_example self.v = self.parameters["v"] self.sigma = self.parameters["sigma"] + @property def name(self): return "rice" + @property def parameters_example(self) -> dict[str, int | float]: return {"v": 4, "sigma": 5} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.rice.cdf(x, self.v / self.sigma, scale=self.sigma) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.rice.pdf(x, self.v / self.sigma, scale=self.sigma) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.rice.ppf(u, self.v / self.sigma, scale=self.sigma) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: if k == 1: return ( self.sigma * numpy.sqrt(numpy.pi / 2) * numpy.exp((-self.v * self.v) / (2 * self.sigma * self.sigma) / 2) - * ( - (1 - (-self.v * self.v) / (2 * self.sigma * self.sigma)) * scipy.special.iv(0, (-self.v * self.v) / (4 * self.sigma * self.sigma)) - + ((-self.v * self.v) / (2 * self.sigma * self.sigma)) * scipy.special.iv(1, (-self.v * self.v) / (4 * self.sigma * self.sigma)) - ) + * ((1 - (-self.v * self.v) / (2 * self.sigma * self.sigma)) * scipy.special.iv(0, (-self.v * self.v) / (4 * self.sigma * self.sigma)) + ((-self.v * self.v) / (2 * self.sigma * self.sigma)) * scipy.special.iv(1, (-self.v * self.v) / (4 * self.sigma * self.sigma))) ) if k == 2: return 2 * self.sigma * self.sigma + self.v * self.v @@ -6091,17 +7175,14 @@ def non_central_moments(self, k: int) -> float | None: * numpy.sqrt(numpy.pi / 2) * numpy.exp((-self.v * self.v) / (2 * self.sigma * self.sigma) / 2) * ( - (2 * ((-self.v * self.v) / (2 * self.sigma * self.sigma)) ** 2 - 6 * ((-self.v * self.v) / (2 * self.sigma * self.sigma)) + 3) - * scipy.special.iv(0, (-self.v * self.v) / (4 * self.sigma * self.sigma)) - - 2 - * ((-self.v * self.v) / (2 * self.sigma * self.sigma) - 2) - * ((-self.v * self.v) / (2 * self.sigma * self.sigma)) - * scipy.special.iv(1, (-self.v * self.v) / (4 * self.sigma * self.sigma)) + (2 * ((-self.v * self.v) / (2 * self.sigma * self.sigma)) ** 2 - 6 * ((-self.v * self.v) / (2 * self.sigma * self.sigma)) + 3) * scipy.special.iv(0, (-self.v * self.v) / (4 * self.sigma * self.sigma)) + - 2 * ((-self.v * self.v) / (2 * self.sigma * self.sigma) - 2) * ((-self.v * self.v) / (2 * self.sigma * self.sigma)) * scipy.special.iv(1, (-self.v * self.v) / (4 * self.sigma * self.sigma)) ) ) / 3 if k == 4: return 8 * self.sigma**4 + 8 * self.sigma * self.sigma * self.v * self.v + self.v**4 return None + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -6116,39 +7197,49 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.v > 0 v2 = self.sigma > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: v, sigma = initial_solution @@ -6158,6 +7249,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance return (eq1, eq2) + bounds = ((0, 0), (numpy.inf, numpy.inf)) x0 = (continuous_measures.mean, numpy.sqrt(continuous_measures.variance)) args = [continuous_measures] @@ -6165,6 +7257,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"v": solution.x[0], "sigma": solution.x[1]} return parameters + class SEMICIRCULAR: def __init__( self, @@ -6173,9 +7266,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -6184,58 +7275,76 @@ def __init__( self.parameters = self.parameters_example self.loc = self.parameters["loc"] self.R = self.parameters["R"] + @property def name(self): return "semicircular" + @property def parameters_example(self) -> dict[str, int | float]: return {"loc": 19, "R": 5} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: t - self.loc result = 0.5 + z(x) * numpy.sqrt(self.R**2 - z(x) ** 2) / (numpy.pi * self.R**2) + numpy.arcsin(z(x) / self.R) / numpy.pi return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: t - self.loc result = 2 * numpy.sqrt(self.R**2 - z(x) ** 2) / (numpy.pi * self.R**2) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.loc + self.R * (2 * scipy.special.betaincinv(1.5, 1.5, u) - 1) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.loc + @property def variance(self) -> float: return (self.R * self.R) / 4 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return 2 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.R > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: loc = continuous_measures.mean R = numpy.sqrt(4 * continuous_measures.variance) @@ -6246,6 +7355,7 @@ def get_parameters(self, continuous_measures) -> dict[str, float | int]: parameters = {"loc": loc, "R": R} return parameters + class TRAPEZOIDAL: def __init__( self, @@ -6254,9 +7364,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -6267,31 +7375,35 @@ def __init__( self.b = self.parameters["b"] self.c = self.parameters["c"] self.d = self.parameters["d"] + @property def name(self): return "trapezoidal" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 110, "b": 267, "c": 741, "d": 980} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.trapezoid.cdf(x, (self.b - self.a) / (self.d - self.a), (self.c - self.a) / (self.d - self.a), loc=self.a, scale=self.d - self.a) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.trapezoid.pdf(x, (self.b - self.a) / (self.d - self.a), (self.c - self.a) / (self.d - self.a), loc=self.a, scale=self.d - self.a) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.trapezoid.ppf(u, (self.b - self.a) / (self.d - self.a), (self.c - self.a) / (self.d - self.a), loc=self.a, scale=self.d - self.a) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: - return ( - (2 / (self.d + self.c - self.b - self.a)) - * (1 / ((k + 1) * (k + 2))) - * ((self.d ** (k + 2) - self.c ** (k + 2)) / (self.d - self.c) - (self.b ** (k + 2) - self.a ** (k + 2)) / (self.b - self.a)) - ) + return (2 / (self.d + self.c - self.b - self.a)) * (1 / ((k + 1) * (k + 2))) * ((self.d ** (k + 2) - self.c ** (k + 2)) / (self.d - self.c) - (self.b ** (k + 2) - self.a ** (k + 2)) / (self.b - self.a)) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -6306,48 +7418,57 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.a < self.b < self.c < self.d return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution, continuous_measures, a, d): b, c = initial_solution parametric_mean = (1 / (3 * (d + c - a - b))) * ((d**3 - c**3) / (d - c) - (b**3 - a**3) / (b - a)) - parametric_variance = (1 / (6 * (d + c - a - b))) * ((d**4 - c**4) / (d - c) - (b**4 - a**4) / (b - a)) - ( - (1 / (3 * (d + c - a - b))) * ((d**3 - c**3) / (d - c) - (b**3 - a**3) / (b - a)) - ) ** 2 + parametric_variance = (1 / (6 * (d + c - a - b))) * ((d**4 - c**4) / (d - c) - (b**4 - a**4) / (b - a)) - ((1 / (3 * (d + c - a - b))) * ((d**3 - c**3) / (d - c) - (b**3 - a**3) / (b - a))) ** 2 eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance return (eq1, eq2) + a = continuous_measures.min - 1e-3 d = continuous_measures.max + 1e-3 x0 = [(d + a) * 0.25, (d + a) * 0.75] @@ -6356,6 +7477,7 @@ def equations(initial_solution, continuous_measures, a, d): parameters = {"a": a, "b": solution.x[0], "c": solution.x[1], "d": d} return parameters + class TRIANGULAR: def __init__( self, @@ -6364,9 +7486,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -6376,58 +7496,74 @@ def __init__( self.a = self.parameters["a"] self.b = self.parameters["b"] self.c = self.parameters["c"] + @property def name(self): return "triangular" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 104, "b": 988, "c": 183} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.triang.cdf(x, (self.c - self.a) / (self.b - self.a), loc=self.a, scale=self.b - self.a) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.triang.pdf(x, (self.c - self.a) / (self.b - self.a), loc=self.a, scale=self.b - self.a) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.triang.ppf(u, (self.c - self.a) / (self.b - self.a), loc=self.a, scale=self.b - self.a) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return (self.a + self.b + self.c) / 3 + @property def variance(self) -> float: return (self.a**2 + self.b**2 + self.c**2 - self.a * self.b - self.a * self.c - self.b * self.c) / 18 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: - return (numpy.sqrt(2) * (self.a + self.b - 2 * self.c) * (2 * self.a - self.b - self.c) * (self.a - 2 * self.b + self.c)) / ( - 5 * (self.a**2 + self.b**2 + self.c**2 - self.a * self.b - self.a * self.c - self.b * self.c) ** (3 / 2) - ) + return (numpy.sqrt(2) * (self.a + self.b - 2 * self.c) * (2 * self.a - self.b - self.c) * (self.a - 2 * self.b + self.c)) / (5 * (self.a**2 + self.b**2 + self.c**2 - self.a * self.b - self.a * self.c - self.b * self.c) ** (3 / 2)) + @property def kurtosis(self) -> float: return 3 - 3 / 5 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.c + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.a < self.c < self.b return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: a = continuous_measures.min - 1e-3 b = continuous_measures.max + 1e-3 @@ -6435,6 +7571,7 @@ def get_parameters(self, continuous_measures) -> dict[str, float | int]: parameters = {"a": a, "b": b, "c": c} return parameters + class T_STUDENT: def __init__( self, @@ -6443,9 +7580,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -6453,63 +7588,80 @@ def __init__( if init_parameters_examples: self.parameters = self.parameters_example self.df = self.parameters["df"] + @property def name(self): return "t_student" + @property def parameters_example(self) -> dict[str, int | float]: return {"df": 8} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.special.betainc(self.df / 2, self.df / 2, (x + numpy.sqrt(x * x + self.df)) / (2 * numpy.sqrt(x * x + self.df))) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = (1 / (numpy.sqrt(self.df) * scipy.special.beta(0.5, self.df / 2))) * (1 + x * x / self.df) ** (-(self.df + 1) / 2) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: - result = numpy.sign(u - 0.5) * numpy.sqrt( - self.df * (1 - scipy.special.betaincinv(self.df / 2, 0.5, 2 * numpy.min([u, 1 - u]))) / scipy.special.betaincinv(self.df / 2, 0.5, 2 * numpy.min([u, 1 - u])) - ) + result = numpy.sign(u - 0.5) * numpy.sqrt(self.df * (1 - scipy.special.betaincinv(self.df / 2, 0.5, 2 * numpy.min([u, 1 - u]))) / scipy.special.betaincinv(self.df / 2, 0.5, 2 * numpy.min([u, 1 - u]))) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return 0 + @property def variance(self) -> float: return self.df / (self.df - 2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return 6 / (self.df - 4) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return 0 + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.df > 0 return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: df = 2 * continuous_measures.variance / (continuous_measures.variance - 1) parameters = {"df": df} return parameters + class T_STUDENT_3P: def __init__( self, @@ -6518,9 +7670,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -6530,62 +7680,81 @@ def __init__( self.df = self.parameters["df"] self.loc = self.parameters["loc"] self.scale = self.parameters["scale"] + @property def name(self): return "t_student_3p" + @property def parameters_example(self) -> dict[str, int | float]: return {"df": 15, "loc": 100, "scale": 3} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.t.cdf(x, self.df, loc=self.loc, scale=self.scale) return result + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.t.pdf(x, self.df, loc=self.loc, scale=self.scale) return result + def ppf(self, u): result = scipy.stats.t.ppf(u, self.df, loc=self.loc, scale=self.scale) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.loc + @property def variance(self) -> float: return (self.scale * self.scale * self.df) / (self.df - 2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return 6 / (self.df - 4) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return self.loc + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.df > 0 v2 = self.scale > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: scipy_parameters = scipy.stats.t.fit(continuous_measures.data_to_fit) parameters = {"df": scipy_parameters[0], "loc": scipy_parameters[1], "scale": scipy_parameters[2]} return parameters + class UNIFORM: def __init__( self, @@ -6594,9 +7763,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -6605,60 +7772,83 @@ def __init__( self.parameters = self.parameters_example self.a = self.parameters["a"] self.b = self.parameters["b"] + @property def name(self): return "uniform" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 50, "b": 299} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (x - self.a) / (self.b - self.a) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: - return 1 / (self.b - self.a) + pdf_value = 1 / (self.b - self.a) + if isinstance(x, numpy.ndarray): + return numpy.full_like(x, pdf_value) + else: + return pdf_value + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.a + u * (self.b - self.a) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return (self.a + self.b) / 2 + @property def variance(self) -> float: return (self.b - self.a) ** 2 / 12 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return 3 - 6 / 5 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.b > self.a return v1 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: a = continuous_measures.min - 1e-8 b = continuous_measures.max + 1e-8 parameters = {"a": a, "b": b} return parameters + class WEIBULL: def __init__( self, @@ -6667,9 +7857,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -6678,25 +7866,33 @@ def __init__( self.parameters = self.parameters_example self.alpha = self.parameters["alpha"] self.beta = self.parameters["beta"] + @property def name(self): return "weibull" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 7, "beta": 9} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return 1 - numpy.exp(-((x / self.beta) ** self.alpha)) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: return (self.alpha / self.beta) * ((x / self.beta) ** (self.alpha - 1)) * numpy.exp(-((x / self.beta) ** self.alpha)) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.beta * (-numpy.log(1 - u)) ** (1 / self.alpha) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return self.beta**k * scipy.special.gamma(1 + k / self.alpha) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -6711,41 +7907,51 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: if self.alpha <= 1: return 0 return self.beta * ((self.alpha - 1) / self.alpha) ** (1 / self.alpha) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: alpha, beta = initial_solution @@ -6755,13 +7961,15 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq1 = parametric_mean - continuous_measures.mean eq2 = parametric_variance - continuous_measures.variance return (eq1, eq2) + bounds = ((1e-5, 1e-5), (numpy.inf, numpy.inf)) - x0 = (1, 1) + x0 = (continuous_measures.mean, continuous_measures.mean) args = [continuous_measures] solution = scipy.optimize.least_squares(equations, x0=x0, bounds=bounds, args=args) parameters = {"alpha": solution.x[0], "beta": solution.x[1]} return parameters + class WEIBULL_3P: def __init__( self, @@ -6770,9 +7978,7 @@ def __init__( init_parameters_examples=False, ): if continuous_measures is None and parameters is None and init_parameters_examples == False: - raise ValueError( - "You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True." - ) + raise ValueError("You must initialize the distribution by providing one of the following: distribution parameters, a Continuous Measures [CONTINUOUS_MEASURES] instance, or by setting init_parameters_examples to True.") if continuous_measures != None: self.parameters = self.get_parameters(continuous_measures=continuous_measures) if parameters != None: @@ -6782,27 +7988,35 @@ def __init__( self.alpha = self.parameters["alpha"] self.beta = self.parameters["beta"] self.loc = self.parameters["loc"] + @property def name(self): return "weibull_3p" + @property def parameters_example(self) -> dict[str, int | float]: return {"alpha": 5, "loc": 99, "beta": 3} + def cdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.loc) / self.beta return 1 - numpy.exp(-(z(x) ** self.alpha)) + def pdf(self, x: float | numpy.ndarray) -> float | numpy.ndarray: z = lambda t: (t - self.loc) / self.beta return (self.alpha / self.beta) * (z(x) ** (self.alpha - 1)) * numpy.exp(-z(x) ** self.alpha) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = self.loc + self.beta * (-numpy.log(1 - u)) ** (1 / self.alpha) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return self.beta**k * scipy.special.gamma(1 + k / self.alpha) + def central_moments(self, k: int) -> float | None: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) @@ -6817,41 +8031,51 @@ def central_moments(self, k: int) -> float | None: if k == 4: return Β΅4 - 4 * Β΅1 * Β΅3 + 6 * Β΅1**2 * Β΅2 - 3 * Β΅1**4 return None + @property def mean(self) -> float: Β΅1 = self.non_central_moments(1) return self.loc + Β΅1 + @property def variance(self) -> float: Β΅1 = self.non_central_moments(1) Β΅2 = self.non_central_moments(2) return Β΅2 - Β΅1**2 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: central_Β΅3 = self.central_moments(3) return central_Β΅3 / self.standard_deviation**3 + @property def kurtosis(self) -> float: central_Β΅4 = self.central_moments(4) return central_Β΅4 / self.standard_deviation**4 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: if self.alpha <= 1: return 0 return self.loc + self.beta * ((self.alpha - 1) / self.alpha) ** (1 / self.alpha) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.alpha > 0 v2 = self.beta > 0 return v1 and v2 + def get_parameters(self, continuous_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], continuous_measures) -> tuple[float]: alpha, beta, loc = initial_solution @@ -6863,6 +8087,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa eq2 = parametric_variance - continuous_measures.variance eq3 = parametric_skewness - continuous_measures.skewness return (eq1, eq2, eq3) + bounds = ((1e-5, 1e-5, -numpy.inf), (numpy.inf, numpy.inf, numpy.inf)) x0 = (1, 1, continuous_measures.mean) args = [continuous_measures] @@ -6870,6 +8095,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa parameters = {"alpha": solution.x[0], "loc": solution.x[2], "beta": solution.x[1]} return parameters + CONTINUOUS_DISTRIBUTIONS = { "alpha": ALPHA, "arcsine": ARCSINE, @@ -6946,6 +8172,7 @@ def equations(initial_solution: tuple[float], continuous_measures) -> tuple[floa "weibull_3p": WEIBULL_3P, } + class CONTINUOUS_MEASURES: def __init__( self, @@ -6979,30 +8206,40 @@ def __init__( self.critical_value_ad = self.ad_critical_value(self.confidence_level, self.size) self.ecdf_frequencies = numpy.searchsorted(self.data, self.data_unique, side="right") / self.data.size self.qq_arr = (numpy.arange(1, self.size + 1) - 0.5) / self.size + def __str__(self) -> str: return str({"size": self.size, "mean": self.mean, "variance": self.variance, "skewness": self.skewness, "kurtosis": self.kurtosis, "median": self.median, "mode": self.mode}) + def __repr__(self) -> str: return str({"size": self.size, "mean": self.mean, "variance": self.variance, "skewness": self.skewness, "kurtosis": self.kurtosis, "median": self.median, "mode": self.mode}) + def get_dict(self) -> str: return {"size": self.size, "mean": self.mean, "variance": self.variance, "skewness": self.skewness, "kurtosis": self.kurtosis, "median": self.median, "mode": self.mode} + def calculate_mode(self) -> float: distribution = scipy.stats.gaussian_kde(self.data) x = numpy.linspace(self.min, self.max, 10000) y = distribution.pdf(x) return x[numpy.argmax(y)] + def critical_value_chi2(self, freedom_degrees: int): return scipy.stats.chi2.ppf(self.confidence_level, freedom_degrees) + def adinf(self, z: float): if z < 2: return (z**-0.5) * numpy.exp(-1.2337141 / z) * (2.00012 + (0.247105 - (0.0649821 - (0.0347962 - (0.011672 - 0.00168691 * z) * z) * z) * z) * z) return numpy.exp(-numpy.exp(1.0776 - (2.30695 - (0.43424 - (0.082433 - (0.008056 - 0.0003146 * z) * z) * z) * z) * z)) + def errfix(self, n: float, x: float) -> float: def g1(t: float) -> float: return numpy.sqrt(t) * (1 - t) * (49 * t - 102) + def g2(t: float) -> float: return -0.00022633 + (6.54034 - (14.6538 - (14.458 - (8.259 - 1.91864 * t) * t) * t) * t) * t + def g3(t: float) -> float: return -130.2137 + (745.2337 - (1705.091 - (1950.646 - (1116.360 - 255.7844 * t) * t) * t) * t) * t + c = 0.01265 + 0.1757 / n if x < c: return (0.0037 / (n**3) + 0.00078 / (n**2) + 0.00006 / n) * g1(x / c) @@ -7010,15 +8247,19 @@ def g3(t: float) -> float: return (0.04213 / n + 0.01365 / (n**2)) * g2((x - c) / (0.8 - c)) else: return (g3(x)) / n + def AD(self, n: float, z: float) -> float: return self.adinf(z) + self.errfix(n, self.adinf(z)) + def ad_critical_value(self, q: float, n: float) -> float: f = lambda x: self.AD(n, x) - q root = scipy.optimize.newton(f, 2) return root + def ad_p_value(self, n: float, z: float) -> float: return 1 - self.AD(n, z) + def evaluate_continuous_test_chi_square(distribution, continuous_measures): N = continuous_measures.size freedom_degrees = max(continuous_measures.num_bins - 1 - distribution.num_parameters, 1) @@ -7031,6 +8272,7 @@ def evaluate_continuous_test_chi_square(distribution, continuous_measures): result_test_chi2 = {"test_statistic": statistic_chi2, "critical_value": critical_value, "p-value": p_value, "rejected": rejected} return result_test_chi2 + def evaluate_continuous_test_kolmogorov_smirnov(distribution, continuous_measures): N = continuous_measures.size Fn = distribution.cdf(continuous_measures.data) @@ -7042,6 +8284,7 @@ def evaluate_continuous_test_kolmogorov_smirnov(distribution, continuous_measure result_test_ks = {"test_statistic": statistic_ks, "critical_value": critical_value, "p-value": p_value, "rejected": rejected} return result_test_ks + def evaluate_continuous_test_anderson_darling(distribution, continuous_measures): N = continuous_measures.size S = numpy.sum(((2 * (numpy.arange(N) + 1) - 1) / N) * (numpy.log(distribution.cdf(continuous_measures.data)) + numpy.log(1 - distribution.cdf(continuous_measures.data[::-1])))) @@ -7052,6 +8295,7 @@ def evaluate_continuous_test_anderson_darling(distribution, continuous_measures) result_test_ad = {"test_statistic": A2, "critical_value": critical_value, "p-value": p_value, "rejected": rejected} return result_test_ad + class PHITTER_CONTINUOUS: def __init__( self, @@ -7091,6 +8335,7 @@ def __init__( self.sorted_distributions_sse = None self.not_rejected_distributions = None self.distribution_instances = None + def test(self, test_function, label: str, distribution): validation_test = False try: @@ -7108,6 +8353,7 @@ def test(self, test_function, label: str, distribution): except: self.distribution_results[label] = self.none_results return validation_test + def process_distribution(self, id_distribution: str) -> tuple[str, dict, typing.Any] | None: distribution_class = CONTINUOUS_DISTRIBUTIONS[id_distribution] validate_estimation = True @@ -7126,18 +8372,11 @@ def process_distribution(self, id_distribution: str) -> tuple[str, dict, typing. if v1 or v2 or v3: self.distribution_results["sse"] = sse self.distribution_results["parameters"] = distribution.parameters - self.distribution_results["n_test_passed"] = ( - +int(self.distribution_results["chi_square"]["rejected"] == False) - + int(self.distribution_results["kolmogorov_smirnov"]["rejected"] == False) - + int(self.distribution_results["anderson_darling"]["rejected"] == False) - ) - self.distribution_results["n_test_null"] = ( - +int(self.distribution_results["chi_square"]["rejected"] == None) - + int(self.distribution_results["kolmogorov_smirnov"]["rejected"] == None) - + int(self.distribution_results["anderson_darling"]["rejected"] == None) - ) + self.distribution_results["n_test_passed"] = +int(self.distribution_results["chi_square"]["rejected"] == False) + int(self.distribution_results["kolmogorov_smirnov"]["rejected"] == False) + int(self.distribution_results["anderson_darling"]["rejected"] == False) + self.distribution_results["n_test_null"] = +int(self.distribution_results["chi_square"]["rejected"] == None) + int(self.distribution_results["kolmogorov_smirnov"]["rejected"] == None) + int(self.distribution_results["anderson_darling"]["rejected"] == None) return id_distribution, self.distribution_results, distribution return None + def fit(self, n_workers: int = 1): if n_workers <= 0: raise Exception("n_workers must be greater than 1") @@ -7150,10 +8389,12 @@ def fit(self, n_workers: int = 1): self.sorted_distributions_sse = {distribution: results for distribution, results, _ in sorted(processing_results, key=lambda x: (-x[1]["n_test_passed"], x[1]["sse"]))} self.not_rejected_distributions = {distribution: results for distribution, results in self.sorted_distributions_sse.items() if results["n_test_passed"] > 0} self.distribution_instances = {distribution: instance for distribution, _, instance in processing_results} + def parse_rgba_color(self, rgba_string): rgba = re.match(r"rgba\((\d+),(\d+),(\d+),(\d*(?:\.\d+)?)\)", rgba_string) r, g, b, a = map(float, rgba.groups()) return (r / 255, g / 255, b / 255, a) + def plot_histogram_plotly( self, plot_title: str, @@ -7182,6 +8423,7 @@ def plot_histogram_plotly( bargap=plot_bargap, ) fig.show(renderer=plotly_plot_renderer) + def plot_histogram_matplotlib( self, plot_title: str, @@ -7201,6 +8443,7 @@ def plot_histogram_matplotlib( plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def plot_histogram_distributions_pdf_plotly( self, n_distributions: int, @@ -7245,6 +8488,7 @@ def plot_histogram_distributions_pdf_plotly( bargap=plot_bargap, ) fig.show(renderer=plotly_plot_renderer) + def plot_histogram_distributions_pdf_matplotlib( self, n_distributions: int, @@ -7273,6 +8517,7 @@ def plot_histogram_distributions_pdf_matplotlib( plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def plot_distribution_pdf_plotly( self, id_distribution: str, @@ -7318,6 +8563,7 @@ def plot_distribution_pdf_plotly( bargap=plot_bargap, ) fig.show(renderer=plotly_plot_renderer) + def plot_distribution_pdf_matplotlib( self, id_distribution: str, @@ -7351,6 +8597,7 @@ def plot_distribution_pdf_matplotlib( plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def plot_ecdf_plotly( self, plot_title: str, @@ -7391,6 +8638,7 @@ def plot_ecdf_plotly( xaxis_range=[self.continuous_measures.min - plot_xaxis_min_offset, self.continuous_measures.max + plot_xaxis_max_offset], ) fig.show(renderer=plotly_plot_renderer) + def plot_ecdf_matplotlib( self, plot_title: str, @@ -7420,6 +8668,7 @@ def plot_ecdf_matplotlib( plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.xlim([self.continuous_measures.min - plot_xaxis_min_offset, self.continuous_measures.max + plot_xaxis_max_offset]) plt.show() + def plot_ecdf_distribution_plotly( self, id_distribution: str, @@ -7481,6 +8730,7 @@ def plot_ecdf_distribution_plotly( xaxis_range=[self.continuous_measures.min - plot_xaxis_min_offset, self.continuous_measures.max + plot_xaxis_max_offset], ) fig.show(renderer=plotly_plot_renderer) + def plot_ecdf_distribution_matplotlib( self, id_distribution: str, @@ -7524,6 +8774,7 @@ def plot_ecdf_distribution_matplotlib( plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.xlim([self.continuous_measures.min - plot_xaxis_min_offset, self.continuous_measures.max + plot_xaxis_max_offset]) plt.show() + def qq_plot_plotly( self, id_distribution: str, @@ -7557,6 +8808,7 @@ def qq_plot_plotly( legend=dict(orientation="v", yanchor="auto", y=1, xanchor="left", font=dict(size=10), title_font_size=10), ) fig.show(renderer=plotly_plot_renderer) + def qq_plot_matplotlib( self, id_distribution: str, @@ -7582,6 +8834,7 @@ def qq_plot_matplotlib( plt.ylabel(plot_yaxis_title) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def qq_plot_regression_plotly( self, id_distribution: str, @@ -7621,6 +8874,7 @@ def qq_plot_regression_plotly( legend=dict(orientation="v", yanchor="auto", y=1, xanchor="left", font=dict(size=10), title_font_size=10), ) fig.show(renderer=plotly_plot_renderer) + def qq_plot_regression_matplotlib( self, id_distribution: str, @@ -7647,11 +8901,8 @@ def qq_plot_regression_matplotlib( plt.figure(figsize=(plot_width / 100, plot_height / 100)) plt.plot(x, y_reg, label=regression_line_name, color=self.parse_rgba_color(regression_line_color), linewidth=regression_line_width) plt.scatter(x, y, label=qq_marker_name, color=self.parse_rgba_color(qq_marker_color), s=qq_marker_size) - plt.title( - f"{plot_title} {id_distribution.upper().replace('_', ' ')} DISTRIBUTION\nRegression: {linear_regression.intercept:.4f} + x * {linear_regression.slope:.4f} β€’ r = {linear_regression.rvalue:.4f}" - ) + plt.title(f"{plot_title} {id_distribution.upper().replace('_', ' ')} DISTRIBUTION\nRegression: {linear_regression.intercept:.4f} + x * {linear_regression.slope:.4f} β€’ r = {linear_regression.rvalue:.4f}") plt.xlabel(plot_xaxis_title, fontsize=10) plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() - diff --git a/phitter_web/discrete/build_phitter_web_discrete.ipynb b/phitter_web/discrete/build_phitter_web_discrete.ipynb index 12e86c2..6b82e06 100644 --- a/phitter_web/discrete/build_phitter_web_discrete.ipynb +++ b/phitter_web/discrete/build_phitter_web_discrete.ipynb @@ -7,7 +7,9 @@ "outputs": [], "source": [ "import os\n", - "import re" + "import re\n", + "\n", + "import black" ] }, { @@ -226,6 +228,15 @@ "execution_count": 10, "metadata": {}, "outputs": [], + "source": [ + "CODE = black.format_str(CODE, mode=black.FileMode(line_length=300))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], "source": [ "code_file = open(\"./phitter_web_discrete.py\", \"+w\", encoding=\"utf8\")\n", "code_file.write(CODE)\n", @@ -249,7 +260,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.12.6" }, "orig_nbformat": 4 }, diff --git a/phitter_web/discrete/phitter_web_discrete.py b/phitter_web/discrete/phitter_web_discrete.py index cee337d..080d8e0 100644 --- a/phitter_web/discrete/phitter_web_discrete.py +++ b/phitter_web/discrete/phitter_web_discrete.py @@ -4,6 +4,7 @@ import scipy.stats import typing + class BERNOULLI: def __init__( self, @@ -20,61 +21,80 @@ def __init__( if init_parameters_examples: self.parameters = self.parameters_example self.p = self.parameters["p"] + @property def name(self): return "bernoulli" + @property def parameters_example(self) -> dict[str, int | float]: return {"p": 0.7006} + def cdf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.bernoulli.cdf(x, self.p) return result + def pmf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = (self.p**x) * (1 - self.p) ** (1 - x) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.bernoulli.ppf(u, self.p) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.p + @property def variance(self) -> float: return self.p * (1 - self.p) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (1 - 2 * self.p) / numpy.sqrt(self.p * (1 - self.p)) + @property def kurtosis(self) -> float: return (6 * self.p * self.p - 6 * self.p + 1) / (self.p * (1 - self.p)) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return 0 if self.p < 0.5 else 1 + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = 0 < self.p < 1 return v1 + def get_parameters(self, discrete_measures) -> dict[str, float | int]: p = discrete_measures.mean parameters = {"p": p} return parameters + class BINOMIAL: def __init__( self, @@ -92,64 +112,83 @@ def __init__( self.parameters = self.parameters_example self.n = self.parameters["n"] self.p = self.parameters["p"] + @property def name(self): return "binomial" + @property def parameters_example(self) -> dict[str, int | float]: return {"n": 10, "p": 0.6994} + def cdf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.binom.cdf(x, self.n, self.p) return result + def pmf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.binom.pmf(x, self.n, self.p) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.binom.ppf(u, self.n, self.p) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.n * self.p + @property def variance(self) -> float: return self.n * self.p * (1 - self.p) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (1 - self.p - self.p) / numpy.sqrt(self.n * self.p * (1 - self.p)) + @property def kurtosis(self) -> float: return (1 - 6 * self.p * (1 - self.p)) / (self.n * self.p * (1 - self.p)) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return numpy.floor(self.p * (self.n + 1)) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = 0 < self.p < 1 v2 = self.n > 0 v3 = type(self.n) == int return v1 and v2 and v3 + def get_parameters(self, discrete_measures) -> dict[str, float | int]: p = 1 - discrete_measures.variance / discrete_measures.mean n = int(round(discrete_measures.mean / p, 0)) parameters = {"n": n, "p": p} return parameters + class GEOMETRIC: def __init__( self, @@ -166,61 +205,80 @@ def __init__( if init_parameters_examples: self.parameters = self.parameters_example self.p = self.parameters["p"] + @property def name(self): return "geometric" + @property def parameters_example(self) -> dict[str, int | float]: return {"p": 0.2973} + def cdf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = 1 - (1 - self.p) ** numpy.floor(x) return result + def pmf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = self.p * (1 - self.p) ** (x - 1) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.geom.ppf(u, self.p) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(0) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return 1 / self.p + @property def variance(self) -> float: return (1 - self.p) / (self.p * self.p) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (2 - self.p) / numpy.sqrt(1 - self.p) + @property def kurtosis(self) -> float: return 3 + 6 + (self.p * self.p) / (1 - self.p) + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return 1.0 + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = 0 < self.p < 1 return v1 + def get_parameters(self, discrete_measures) -> dict[str, float | int]: p = 1 / discrete_measures.mean parameters = {"p": p} return parameters + class HYPERGEOMETRIC: def __init__( self, @@ -239,61 +297,78 @@ def __init__( self.N = self.parameters["N"] self.K = self.parameters["K"] self.n = self.parameters["n"] + @property def name(self): return "hypergeometric" + @property def parameters_example(self) -> dict[str, int | float]: return {"N": 120, "K": 66, "n": 27} + def cdf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.hypergeom.cdf(x, self.N, self.n, self.K) return result + def pmf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.hypergeom.pmf(x, self.N, self.n, self.K) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.hypergeom.ppf(u, self.N, self.n, self.K) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return (self.n * self.K) / self.N + @property def variance(self) -> float: return ((self.n * self.K) / self.N) * ((self.N - self.K) / self.N) * ((self.N - self.n) / (self.N - 1)) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return ((self.N - 2 * self.K) * numpy.sqrt(self.N - 1) * (self.N - 2 * self.n)) / (numpy.sqrt(self.n * self.K * (self.N - self.K) * (self.N - self.n)) * (self.N - 2)) + @property def kurtosis(self) -> float: return 3 + (1 / (self.n * self.K * (self.N - self.K) * (self.N - self.n) * (self.N - 2) * (self.N - 3))) * ( - (self.N - 1) * self.N * self.N * (self.N * (self.N + 1) - 6 * self.K * (self.N - self.K) - 6 * self.n * (self.N - self.n)) - + 6 * self.n * self.K * (self.N - self.K) * (self.N - self.n) * (5 * self.N - 6) + (self.N - 1) * self.N * self.N * (self.N * (self.N + 1) - 6 * self.K * (self.N - self.K) - 6 * self.n * (self.N - self.n)) + 6 * self.n * self.K * (self.N - self.K) * (self.N - self.n) * (5 * self.N - 6) ) + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return numpy.floor(((self.n + 1) * (self.K + 1)) / (self.N + 2)) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.N > 0 and type(self.N) == int v2 = self.K > 0 and type(self.K) == int v3 = self.n > 0 and type(self.n) == int return v1 and v2 and v3 + def get_parameters(self, discrete_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], discrete_measures) -> tuple[float]: N, K, n = initial_solution @@ -304,6 +379,7 @@ def equations(initial_solution: tuple[float], discrete_measures) -> tuple[float] eq2 = parametric_variance - discrete_measures.variance eq3 = parametric_mode - discrete_measures.mode return (eq1, eq2, eq3) + bounds = ((discrete_measures.max, discrete_measures.max, 1), (numpy.inf, numpy.inf, numpy.inf)) x0 = (discrete_measures.max * 5, discrete_measures.max * 3, discrete_measures.max) args = [discrete_measures] @@ -311,6 +387,7 @@ def equations(initial_solution: tuple[float], discrete_measures) -> tuple[float] parameters = {"N": round(solution.x[0]), "K": round(solution.x[1]), "n": round(solution.x[2])} return parameters + class LOGARITHMIC: def __init__( self, @@ -327,71 +404,86 @@ def __init__( if init_parameters_examples: self.parameters = self.parameters_example self.p = self.parameters["p"] + @property def name(self): return "logarithmic" + @property def parameters_example(self) -> dict[str, int | float]: return {"p": 0.81} + def cdf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.logser.cdf(x, self.p) return result + def pmf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.logser.pmf(x, self.p) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.logser.ppf(u, self.p) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return -self.p / ((1 - self.p) * numpy.log(1 - self.p)) + @property def variance(self) -> float: return (-self.p * (self.p + numpy.log(1 - self.p))) / ((1 - self.p) ** 2 * numpy.log(1 - self.p) ** 2) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: - return ( - -(2 * self.p**2 + 3 * self.p * numpy.log(1 - self.p) + (1 + self.p) * numpy.log(1 - self.p) ** 2) - / (numpy.log(1 - self.p) * (self.p + numpy.log(1 - self.p)) * numpy.sqrt(-self.p * (self.p + numpy.log(1 - self.p)))) - ) * numpy.log(1 - self.p) + return (-(2 * self.p**2 + 3 * self.p * numpy.log(1 - self.p) + (1 + self.p) * numpy.log(1 - self.p) ** 2) / (numpy.log(1 - self.p) * (self.p + numpy.log(1 - self.p)) * numpy.sqrt(-self.p * (self.p + numpy.log(1 - self.p))))) * numpy.log(1 - self.p) + @property def kurtosis(self) -> float: - return -(6 * self.p**3 + 12 * self.p**2 * numpy.log(1 - self.p) + self.p * (4 * self.p + 7) * numpy.log(1 - self.p) ** 2 + (self.p**2 + 4 * self.p + 1) * numpy.log(1 - self.p) ** 3) / ( - self.p * (self.p + numpy.log(1 - self.p)) ** 2 - ) + return -(6 * self.p**3 + 12 * self.p**2 * numpy.log(1 - self.p) + self.p * (4 * self.p + 7) * numpy.log(1 - self.p) ** 2 + (self.p**2 + 4 * self.p + 1) * numpy.log(1 - self.p) ** 3) / (self.p * (self.p + numpy.log(1 - self.p)) ** 2) + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return 1 + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = 0 < self.p < 1 return v1 + def get_parameters(self, discrete_measures) -> dict[str, float | int]: def equations(initial_solution: tuple[float], discrete_measures) -> tuple[float]: p = initial_solution parametric_mean = -p / ((1 - p) * numpy.log(1 - p)) eq1 = parametric_mean - discrete_measures.mean return eq1 + solution = scipy.optimize.least_squares(equations, 0.5, bounds=(0, 1), args=([discrete_measures])) parameters = {"p": solution.x[0]} return parameters + class NEGATIVE_BINOMIAL: def __init__( self, @@ -409,64 +501,83 @@ def __init__( self.parameters = self.parameters_example self.r = self.parameters["r"] self.p = self.parameters["p"] + @property def name(self): return "negative_binomial" + @property def parameters_example(self) -> dict[str, int | float]: return {"r": 96, "p": 0.6893} + def cdf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.beta.cdf(self.p, self.r, x + 1) return result + def pmf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.nbinom.pmf(x, self.r, self.p) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.nbinom.ppf(u, self.r, self.p) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return (self.r * (1 - self.p)) / self.p + @property def variance(self) -> float: return (self.r * (1 - self.p)) / (self.p * self.p) + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return (2 - self.p) / numpy.sqrt(self.r * (1 - self.p)) + @property def kurtosis(self) -> float: return 6 / self.r + (self.p * self.p) / (self.r * (1 - self.p)) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return numpy.floor(((self.r - 1) * (1 - self.p)) / self.p) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.p > 0 and self.p < 1 v2 = self.r > 0 v3 = type(self.r) == int return v1 and v2 and v3 + def get_parameters(self, discrete_measures) -> dict[str, float | int]: p = discrete_measures.mean / discrete_measures.variance r = round(discrete_measures.mean * p / (1 - p)) parameters = {"r": r, "p": p} return parameters + class POISSON: def __init__( self, @@ -483,61 +594,80 @@ def __init__( if init_parameters_examples: self.parameters = self.parameters_example self.lambda_ = self.parameters["lambda"] + @property def name(self): return "poisson" + @property def parameters_example(self) -> dict[str, int | float]: return {"lambda": 4.969} + def cdf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.poisson.cdf(x, self.lambda_) return result + def pmf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.poisson.pmf(x, self.lambda_) return result + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = scipy.stats.poisson.ppf(u, self.lambda_) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return self.lambda_ + @property def variance(self) -> float: return self.lambda_ + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return self.lambda_**-0.5 + @property def kurtosis(self) -> float: return 1 / self.lambda_ + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return numpy.floor(self.lambda_) + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.lambda_ > 0 return v1 + def get_parameters(self, discrete_measures) -> dict[str, float | int]: lambda_ = discrete_measures.mean parameters = {"lambda": lambda_} return parameters + class UNIFORM: def __init__( self, @@ -555,64 +685,83 @@ def __init__( self.parameters = self.parameters_example self.a = self.parameters["a"] self.b = self.parameters["b"] + @property def name(self): return "uniform" + @property def parameters_example(self) -> dict[str, int | float]: return {"a": 3, "b": 10} + def cdf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: return (x - self.a + 1) / (self.b - self.a + 1) + def pmf(self, x: int | numpy.ndarray) -> float | numpy.ndarray: if type(x) == int: return 1 / (self.b - self.a + 1) return numpy.full(len(x), 1 / (self.b - self.a + 1)) + def ppf(self, u: float | numpy.ndarray) -> float | numpy.ndarray: result = numpy.ceil(u * (self.b - self.a + 1) + self.a - 1) return result + def sample(self, n: int, seed: int | None = None) -> numpy.ndarray: if seed: numpy.random.seed(seed) return self.ppf(numpy.random.rand(n)) + def non_central_moments(self, k: int) -> float | None: return None + def central_moments(self, k: int) -> float | None: return None + @property def mean(self) -> float: return (self.a + self.b) / 2 + @property def variance(self) -> float: return ((self.b - self.a + 1) * (self.b - self.a + 1) - 1) / 12 + @property def standard_deviation(self) -> float: return numpy.sqrt(self.variance) + @property def skewness(self) -> float: return 0 + @property def kurtosis(self) -> float: return ((-6 / 5) * ((self.b - self.a + 1) * (self.b - self.a + 1) + 1)) / ((self.b - self.a + 1) * (self.b - self.a + 1) - 1) + 3 + @property def median(self) -> float: return self.ppf(0.5) + @property def mode(self) -> float: return None + @property def num_parameters(self) -> int: return len(self.parameters) + def parameter_restrictions(self) -> bool: v1 = self.b > self.a v2 = type(self.b) == int v3 = type(self.a) == int return v1 and v2 and v3 + def get_parameters(self, discrete_measures) -> dict[str, float | int]: a = round(discrete_measures.min) b = round(discrete_measures.max) parameters = {"a": a, "b": b} return parameters + DISCRETE_DISTRIBUTIONS = { "bernoulli": BERNOULLI, "binomial": BINOMIAL, @@ -624,6 +773,7 @@ def get_parameters(self, discrete_measures) -> dict[str, float | int]: "uniform": UNIFORM, } + class DISCRETE_MEASURES: def __init__( self, @@ -653,15 +803,20 @@ def __init__( self.critical_value_ks = scipy.stats.kstwo.ppf(self.confidence_level, self.size) self.ecdf_frequencies = numpy.cumsum(self.densities_frequencies) self.qq_arr = (numpy.arange(1, self.size + 1) - 0.5) / self.size + def __str__(self) -> str: return str({"size": self.size, "mean": self.mean, "variance": self.variance, "skewness": self.skewness, "kurtosis": self.kurtosis, "median": self.median, "mode": self.mode}) + def __repr__(self) -> str: return str({"size": self.size, "mean": self.mean, "variance": self.variance, "skewness": self.skewness, "kurtosis": self.kurtosis, "median": self.median, "mode": self.mode}) + def get_dict(self) -> str: return {"size": self.size, "mean": self.mean, "variance": self.variance, "skewness": self.skewness, "kurtosis": self.kurtosis, "median": self.median, "mode": self.mode} + def critical_value_chi2(self, freedom_degrees): return scipy.stats.chi2.ppf(self.confidence_level, freedom_degrees) + def evaluate_discrete_test_chi_square(distribution, discrete_measures): N = discrete_measures.size freedom_degrees = max(len(discrete_measures.domain) - 1 - distribution.num_parameters, 1) @@ -674,6 +829,7 @@ def evaluate_discrete_test_chi_square(distribution, discrete_measures): result_test_chi2 = {"test_statistic": statistic_chi2, "critical_value": critical_value, "p-value": p_value, "rejected": rejected} return result_test_chi2 + def evaluate_discrete_test_kolmogorov_smirnov(distribution, discrete_measures): N = discrete_measures.size Fn = distribution.cdf(discrete_measures.data) @@ -685,6 +841,7 @@ def evaluate_discrete_test_kolmogorov_smirnov(distribution, discrete_measures): result_test_ks = {"test_statistic": statistic_ks, "critical_value": critical_value, "p-value": p_value, "rejected": rejected} return result_test_ks + class PHITTER_DISCRETE: def __init__( self, @@ -722,6 +879,7 @@ def __init__( self.sorted_distributions_sse = None self.not_rejected_distributions = None self.distribution_instances = None + def test(self, test_function, label: str, distribution): validation_test = False try: @@ -739,6 +897,7 @@ def test(self, test_function, label: str, distribution): except: self.distribution_results[label] = self.none_results return validation_test + def process_distribution(self, id_distribution: str) -> tuple[str, dict, typing.Any] | None: distribution_class = DISCRETE_DISTRIBUTIONS[id_distribution] validate_estimation = True @@ -756,12 +915,11 @@ def process_distribution(self, id_distribution: str) -> tuple[str, dict, typing. if v1 or v2: self.distribution_results["sse"] = sse self.distribution_results["parameters"] = distribution.parameters - self.distribution_results["n_test_passed"] = int(self.distribution_results["chi_square"]["rejected"] == False) + int( - self.distribution_results["kolmogorov_smirnov"]["rejected"] == False - ) + self.distribution_results["n_test_passed"] = int(self.distribution_results["chi_square"]["rejected"] == False) + int(self.distribution_results["kolmogorov_smirnov"]["rejected"] == False) self.distribution_results["n_test_null"] = int(self.distribution_results["chi_square"]["rejected"] == None) + int(self.distribution_results["kolmogorov_smirnov"]["rejected"] == None) return id_distribution, self.distribution_results, distribution return None + def fit(self, n_workers: int = 1): if n_workers <= 0: raise Exception("n_workers must be greater than 1") @@ -774,10 +932,12 @@ def fit(self, n_workers: int = 1): self.sorted_distributions_sse = {distribution: results for distribution, results, _ in sorted(processing_results, key=lambda x: (-x[1]["n_test_passed"], x[1]["sse"]))} self.not_rejected_distributions = {distribution: results for distribution, results in self.sorted_distributions_sse.items() if results["n_test_passed"] > 0} self.distribution_instances = {distribution: instance for distribution, _, instance in processing_results} + def parse_rgba_color(self, rgba_string): rgba = re.match(r"rgba\((\d+),(\d+),(\d+),(\d*(?:\.\d+)?)\)", rgba_string) r, g, b, a = map(float, rgba.groups()) return (r / 255, g / 255, b / 255, a) + def plot_histogram_plotly( self, plot_title: str, @@ -806,6 +966,7 @@ def plot_histogram_plotly( bargap=plot_bargap, ) fig.show(renderer=plotly_plot_renderer) + def plot_histogram_matplotlib( self, plot_title: str, @@ -827,6 +988,7 @@ def plot_histogram_matplotlib( plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def plot_histogram_distributions_pmf_plotly( self, n_distributions: int, @@ -870,6 +1032,7 @@ def plot_histogram_distributions_pmf_plotly( bargap=plot_bargap, ) fig.show(renderer=plotly_plot_renderer) + def plot_histogram_distributions_pmf_matplotlib( self, n_distributions: int, @@ -902,6 +1065,7 @@ def plot_histogram_distributions_pmf_matplotlib( plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def plot_distribution_pmf_plotly( self, id_distribution: str, @@ -946,6 +1110,7 @@ def plot_distribution_pmf_plotly( bargap=plot_bargap, ) fig.show(renderer=plotly_plot_renderer) + def plot_distribution_pmf_matplotlib( self, id_distribution: str, @@ -980,6 +1145,7 @@ def plot_distribution_pmf_matplotlib( plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def plot_ecdf_plotly( self, plot_title: str, @@ -1010,6 +1176,7 @@ def plot_ecdf_plotly( bargap=plot_bargap, ) fig.show(renderer=plotly_plot_renderer) + def plot_ecdf_matplotlib( self, plot_title: str, @@ -1037,6 +1204,7 @@ def plot_ecdf_matplotlib( plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def plot_ecdf_distribution_plotly( self, id_distribution: str, @@ -1087,6 +1255,7 @@ def plot_ecdf_distribution_plotly( bargap=plot_empirical_bargap, ) fig.show(renderer=plotly_plot_renderer) + def plot_ecdf_distribution_matplotlib( self, id_distribution: str, @@ -1122,6 +1291,7 @@ def plot_ecdf_distribution_matplotlib( plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def qq_plot_plotly( self, id_distribution: str, @@ -1155,6 +1325,7 @@ def qq_plot_plotly( legend=dict(orientation="v", yanchor="auto", y=1, xanchor="left", font=dict(size=10)), ) fig.show(renderer=plotly_plot_renderer) + def qq_plot_matplotlib( self, id_distribution: str, @@ -1180,6 +1351,7 @@ def qq_plot_matplotlib( plt.ylabel(plot_yaxis_title) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() + def qq_plot_regression_plotly( self, id_distribution: str, @@ -1219,6 +1391,7 @@ def qq_plot_regression_plotly( legend=dict(orientation="v", yanchor="auto", y=1, xanchor="left", font=dict(size=10)), ) fig.show(renderer=plotly_plot_renderer) + def qq_plot_regression_matplotlib( self, id_distribution: str, @@ -1245,11 +1418,8 @@ def qq_plot_regression_matplotlib( plt.figure(figsize=(plot_width / 100, plot_height / 100)) plt.plot(x, y_reg, label=regression_line_name, color=self.parse_rgba_color(regression_line_color), linewidth=regression_line_width) plt.scatter(x, y, label=qq_marker_name, color=self.parse_rgba_color(qq_marker_color), s=qq_marker_size) - plt.title( - f"{plot_title} {id_distribution.upper().replace('_', ' ')} DISTRIBUTION\nRegression: {linear_regression.intercept:.4f} + x * {linear_regression.slope:.4f} β€’ r = {linear_regression.rvalue:.4f}" - ) + plt.title(f"{plot_title} {id_distribution.upper().replace('_', ' ')} DISTRIBUTION\nRegression: {linear_regression.intercept:.4f} + x * {linear_regression.slope:.4f} β€’ r = {linear_regression.rvalue:.4f}") plt.xlabel(plot_xaxis_title, fontsize=10) plt.ylabel(plot_yaxis_title, fontsize=10) plt.legend(title=plot_legend_title, fontsize=8, bbox_to_anchor=(1.01, 1.01), loc="upper left") plt.show() - diff --git a/pyproject.toml b/pyproject.toml index 004a55b..2d712de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "phitter" -version = "0.07" +version = "0.0.8" description = "Find the best probability distribution for your dataset" authors = [{name = "SebastiΓ‘n JosΓ© Herrera Monterrosa", email = "phitter.email@gmail.com"}] readme = "README.md" diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..03f586d --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +pythonpath = . \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..23255de --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +scipy>=1.1.0 +plotly>=5.14.0 +kaleido>=0.2.1 +matplotlib>=3.3 +pytest \ No newline at end of file diff --git a/tests/phitter_local/distributions/test_distributions_continuous.ipynb b/tests/phitter_local/distributions/test_distributions_continuous.ipynb index 51aea83..5db321f 100644 --- a/tests/phitter_local/distributions/test_distributions_continuous.ipynb +++ b/tests/phitter_local/distributions/test_distributions_continuous.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -36,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -48,16 +48,16 @@ "CDF: 0.5781184223125094 [0.57811842 0.57811842]\n", "PDF: 0.1885417349404305 [0.18854173 0.18854173]\n", "PPF: 19.91539678521096 [19.91539679 19.91539679] - V: 0.5000000000000002\n", - "SAMPLE: [20.09375089 19.73417824 27.80120826 19.52223138 23.7092257 ]\n", - "SAMPLEX: [19.26955928 23.00047994 19.94068912]\n", + "SAMPLE: [23.82266796 23.97139739 17.39256178 21.24307409 18.96108618]\n", + "SAMPLEX: [18.30680205 20.84843469 19.46178334]\n", "\n", "STATS\n", "mean: 20.31187048011524 - 20.30963428847081\n", "variance: 5.176932542252066 - 5.05349975057239\n", - "skewness: 1.6941898859847813 - 1.3845239743392037\n", - "kurtosis: 12.097388506764505 - 6.743592588117072\n", + "skewness: 1.6941898859847813 - 1.3864507896443206\n", + "kurtosis: 12.097388506764505 - 6.761335065059094\n", "median: 19.91539678521096 - 19.89347807\n", - "mode: 19.290702484344784 - 19.42459580084722\n", + "mode: 19.290702484344784 - 19.424597812751276\n", "\n", "\n", "\n", @@ -66,52 +66,52 @@ "CDF: 0.49179359380093335 [0.49179359 0.49179359]\n", "PDF: 0.0578834561297963 [0.05788346 0.05788346]\n", "PPF: 83.50000335 [83.50000335 83.50000335] - V: 0.5000000000000001\n", - "SAMPLE: [81.59538571 85.83206188 79.39736796 88.68610167 84.76360147]\n", - "SAMPLEX: [77.00725134 81.25851969 77.12883163]\n", + "SAMPLE: [79.56861554 81.08378521 87.10945976 86.3333609 78.00037618]\n", + "SAMPLEX: [86.75047975 78.08116404 77.80598243]\n", "\n", "STATS\n", "mean: 83.50000335 - 83.35819728978683\n", "variance: 15.130387289631816 - 14.880130010016998\n", - "skewness: 6.280369834735096e-16 - 0.05170687338587516\n", - "kurtosis: 1.499999999999997 - 1.5218151827291764\n", + "skewness: 6.280369834735096e-16 - 0.0517788328440472\n", + "kurtosis: 1.499999999999997 - 1.5225847298196082\n", "median: 83.50000335 - 83.286979685\n", - "mode: None - 83.84309843339575\n", + "mode: None - 78.68649000822381\n", "\n", "\n", "\n", "ARGUS DISTRIBUTION\n", - "Parameters: {'chi': 3.2145270575654363, 'loc': 102.16232293171916, 'scale': 0.8376282574413997}\n", - "CDF: 0.37568649125401177 [0.37568649 0.37568649]\n", - "PDF: 3.205590703696008 [3.2055907 3.2055907]\n", - "PPF: 102.89977290363896 [102.8997729 102.8997729] - V: 0.49999999999998623\n", - "SAMPLE: [102.96380313 102.89005747 102.95903396 102.94950663 102.73822428]\n", - "SAMPLEX: [102. 102. 102.]\n", + "Parameters: {'chi': 0.7017971010482332, 'loc': 9.992017975286416, 'scale': 3.0093938140615064}\n", + "CDF: 0.4658488475355139 [0.46584885 0.46584885]\n", + "PDF: 0.47455738551636495 [0.47455739 0.47455739]\n", + "PPF: 11.879682275000944 [11.87968228 11.87968228] - V: 0.5000000000000001\n", + "SAMPLE: [12.51178121 12.55299579 11.01488665 11.53936051 11.6497727 ]\n", + "SAMPLEX: [106.62966694 106.40528352 106.51368037]\n", "\n", "STATS\n", - "mean: 102.86524949458423 - 102.8660748321594\n", - "variance: 0.01424667344612418 - 0.013091712337024407\n", - "skewness: None - -1.6874772155789601\n", - "kurtosis: None - 6.830568355937135\n", - "median: 102.89977290363896 - 102.89607345\n", - "mode: 102.96246787476652 - 102.9487987732924\n", + "mean: 11.808531306494064 - 11.808531306494999\n", + "variance: 0.4773607170416416 - 0.47736071706250155\n", + "skewness: -0.3540080716207409 - -0.3672482872960705\n", + "kurtosis: 2.244171778815248 - 2.2556370649906876\n", + "median: 11.879682275000944 - 11.879682275\n", + "mode: 12.245366351532429 - 12.243123568210821\n", "\n", "\n", "\n", "BETA DISTRIBUTION\n", - "Parameters: {'alpha': 42.69645291897831, 'beta': 10.007737543994365, 'A': 518.0204542201112, 'B': 969.2245223870551}\n", - "CDF: 0.47095016415460855 [0.47095016 0.47095016]\n", - "PDF: 0.016224273183381342 [0.01622427 0.01622427]\n", - "PPF: 885.3255088742897 [885.32550887 885.32550887] - V: 0.4999999999999991\n", - "SAMPLE: [855.24649765 864.40596568 883.73486695 890.17003869 880.52772102]\n", - "SAMPLEX: [874.55381499 843.82053509 923.84766124]\n", + "Parameters: {'alpha': 47.24155637324018, 'beta': 10.521363185742315, 'A': 491.2960119639201, 'B': 970.9077118211726}\n", + "CDF: 0.47110410036396944 [0.4711041 0.4711041]\n", + "PDF: 0.01624492285713661 [0.01624492 0.01624492]\n", + "PPF: 885.3139810215798 [885.31398102 885.31398102] - V: 0.49999999999999933\n", + "SAMPLE: [880.69372159 867.45013193 877.13311394 885.69362416 855.92234878]\n", + "SAMPLEX: [910.04892108 908.23577525 899.87970441]\n", "\n", "STATS\n", - "mean: 883.5476178879774 - 883.5477189089899\n", - "variance: 583.1432449388244 - 583.1414232036951\n", - "skewness: -0.4236892928512733 - -0.3689792478183117\n", - "kurtosis: 3.156723192701395 - 3.203325840558271\n", - "median: 885.3255088742897 - 885.5576721\n", - "mode: 889.0668906860146 - 888.6800014552408\n", + "mean: 883.547707845323 - 883.5477189089899\n", + "variance: 583.1417153692975 - 583.1414232036951\n", + "skewness: -0.42252919797268784 - -0.36949274911922364\n", + "kurtosis: 3.164644718689808 - 3.2095609906846714\n", + "median: 885.3139810215798 - 885.5576721\n", + "mode: 889.0153500404749 - 888.6555336058005\n", "\n", "\n", "\n", @@ -120,52 +120,52 @@ "CDF: 0.5369818806457101 [0.53698188 0.53698188]\n", "PDF: 1.2496797015894983 [1.2496797 1.2496797]\n", "PPF: 1.8615604855157772 [1.86156049 1.86156049] - V: 0.49999999999999656\n", - "SAMPLE: [1.99016502 2.30529244 1.72419115 2.49407433 1.98193294]\n", - "SAMPLEX: [2.32511596 1.32878821 1.96065914]\n", + "SAMPLE: [1.82762274 2.16164449 1.38185055 2.10572832 1.83626079]\n", + "SAMPLEX: [1.93963361 1.60744154 1.61197331]\n", "\n", "STATS\n", "mean: 1.8908166573128817 - 1.8908166612228916\n", "variance: 0.10346075124854437 - 0.10346070783536444\n", - "skewness: 0.5736186287510419 - 0.513646608740308\n", - "kurtosis: 3.621303790606237 - 3.5849829033396907\n", + "skewness: 0.5736186287510419 - 0.5143614408165199\n", + "kurtosis: 3.621303790606237 - 3.5924585963025706\n", "median: 1.8615604855157772 - 1.877312653\n", - "mode: 1.8051729125119669 - 1.9079885449462173\n", + "mode: 1.8051729125119669 - 1.9080080279603961\n", "\n", "\n", "\n", "BETA_PRIME_4P DISTRIBUTION\n", - "Parameters: {'alpha': 911.9956578164742, 'beta': 937.9417164855204, 'loc': -7.04196593881689, 'scale': 125.75133258454179}\n", - "CDF: 0.5084439362412101 [0.50844394 0.50844394]\n", - "PDF: 0.07006629247041286 [0.07006629 0.07006629]\n", - "PPF: 115.22950091044264 [115.22950091 115.22950091] - V: 0.5000000000000018\n", - "SAMPLE: [111.00607644 112.4784349 107.80138974 103.91948423 112.9695199 ]\n", - "SAMPLEX: [110.14771875 106.81479537 112.89079237]\n", + "Parameters: {'alpha': 32.82248384758116, 'beta': 9.988374877292136, 'loc': 100.63372621675387, 'scale': 4.023649866485873}\n", + "CDF: 0.5897630526036127 [0.58976305 0.58976305]\n", + "PDF: 0.07121835109772605 [0.07121835 0.07121835]\n", + "PPF: 114.17042869494779 [114.17042869 114.17042869] - V: 0.4999999999999991\n", + "SAMPLE: [107.98359759 114.27479733 111.55737488 107.74649464 112.20191533]\n", + "SAMPLEX: [121.32665612 122.21799993 104.40755022]\n", "\n", "STATS\n", - "mean: nan - 115.34993741992585\n", - "variance: nan - 34.42801524281049\n", - "skewness: nan - 1.6416028254136998\n", - "kurtosis: nan - 8.063379275839285\n", - "median: 115.22950091044264 - 114.11929695\n", - "mode: 114.96658468554928 - 112.318023378716\n", + "mean: 115.3267251797478 - 115.34993741992585\n", + "variance: 34.42548779527184 - 34.42801524281049\n", + "skewness: 1.6296173799585212 - 1.643887412396341\n", + "kurtosis: 8.650622533143563 - 8.08541160375172\n", + "median: 114.17042869494779 - 114.11929695\n", + "mode: 112.28627123040945 - 112.31557298937894\n", "\n", "\n", "\n", "BRADFORD DISTRIBUTION\n", - "Parameters: {'c': 4.234436916337417, 'min': 19.999243399999997, 'max': 50.00063537}\n", - "CDF: 0.567459559450316 [0.56745956 0.56745956]\n", - "PDF: 0.033331786771758916 [0.03333179 0.03333179]\n", - "PPF: 29.124061876194197 [29.12406188 29.12406188] - V: 0.49999999999999994\n", - "SAMPLE: [39.2111438 31.40250099 31.94514259 22.42673933 41.78817784]\n", - "SAMPLEX: [30.35667383 33.27317058 29.12654537]\n", + "Parameters: {'c': 4.234436911501597, 'min': 19.999243399999997, 'max': 50.00063537}\n", + "CDF: 0.5674595593467946 [0.56745956 0.56745956]\n", + "PDF: 0.03333178677548232 [0.03333179 0.03333179]\n", + "PPF: 29.1240618791272 [29.12406188 29.12406188] - V: 0.5\n", + "SAMPLE: [35.67106497 40.1061554 32.81685877 36.77998501 24.97708878]\n", + "SAMPLEX: [32.04244457 36.73364122 36.31974004]\n", "\n", "STATS\n", - "mean: 31.039037209068578 - 31.039037209068574\n", - "variance: 71.79091540075956 - 72.13896868726417\n", - "skewness: 0.5633042273987586 - 0.5546479082447489\n", - "kurtosis: 2.14793544432464 - 2.1391554383094133\n", - "median: 29.124061876194197 - 29.121159040000002\n", - "mode: 19.999243399999997 - 22.705253406379764\n", + "mean: 31.03903721109326 - 31.039037209068574\n", + "variance: 71.79091540413094 - 72.13896868726417\n", + "skewness: 0.5633042270951019 - 0.5554198010384922\n", + "kurtosis: 2.147935443949101 - 2.141931595800687\n", + "median: 29.1240618791272 - 29.121159040000002\n", + "mode: 19.999243399999997 - 22.703458938050805\n", "\n", "\n", "\n", @@ -174,16 +174,16 @@ "CDF: 0.6200097685108298 [0.62000977 0.62000977]\n", "PDF: 0.6752464652246202 [0.67524647 0.67524647]\n", "PPF: 2.2352206118707265 [2.23522061 2.23522061] - V: 0.5000000000000002\n", - "SAMPLE: [2.2597429 2.24849176 2.33381597 2.28213989 6.38924525]\n", - "SAMPLEX: [0.75184025 0.91062985 0.83597528]\n", + "SAMPLE: [2.99959024 2.29331353 2.34252281 1.82965546 2.14928165]\n", + "SAMPLEX: [0.8809315 0.79285387 0.82604695]\n", "\n", "STATS\n", "mean: 2.39797655989127 - 2.3924347343670065\n", "variance: 0.5643529689871292 - 0.5351015645784781\n", - "skewness: 3.8361746479095253 - 2.9121933235269104\n", - "kurtosis: 65.05109084099871 - 20.007160180896012\n", + "skewness: 3.8361746479095253 - 2.916246166793788\n", + "kurtosis: 65.05109084099871 - 20.068014721960456\n", "median: 2.2352206118707265 - 2.229214594\n", - "mode: 2.075750757527028 - 2.093041952497205\n", + "mode: 2.075750757527028 - 2.092902343328233\n", "\n", "\n", "\n", @@ -192,16 +192,16 @@ "CDF: 0.4885163183141247 [0.48851632 0.48851632]\n", "PDF: 0.28414597335947256 [0.28414597 0.28414597]\n", "PPF: 107.31297903969752 [107.31297904 107.31297904] - V: 0.5000000000000009\n", - "SAMPLE: [106.08992687 107.99078354 107.54398748 107.5403201 107.4069053 ]\n", - "SAMPLEX: [107.82491675 107.91376164 108.06935942]\n", + "SAMPLE: [108.44407484 106.70238713 106.89326947 106.42045612 105.9497692 ]\n", + "SAMPLEX: [107.7146764 108.45043703 109.52794399]\n", "\n", "STATS\n", "mean: 107.2686421277796 - 107.27261441070436\n", "variance: 2.459965625334007 - 2.378776649221853\n", - "skewness: -0.2003913702426687 - -0.056160671246448225\n", - "kurtosis: 4.084676638662979 - 3.2977154957559747\n", + "skewness: -0.2003913702426687 - -0.056238828969181004\n", + "kurtosis: 4.084676638662979 - 3.304257451184863\n", "median: 107.31297903969752 - 107.31811875\n", - "mode: 107.38382747727009 - 107.32503081723114\n", + "mode: 107.38382747727009 - 107.32505061131113\n", "\n", "\n", "\n", @@ -210,16 +210,16 @@ "CDF: 0.9569654150630034 [0.95696542 0.95696542]\n", "PDF: 0.0003008688414352775 [0.00030087 0.00030087]\n", "PPF: 10.759792996534902 [10.759793 10.759793] - V: 0.5\n", - "SAMPLE: [ 19.43434877 475.06679033 79.33815843 -32.49770143 -73.76661291]\n", - "SAMPLEX: [ -14.03003875 2928.11160386 29.53833387]\n", + "SAMPLE: [-25.85972519 85.68380561 85.9335114 49.9011358 -24.30932206]\n", + "SAMPLEX: [-21.18838906 19.19670127 330.80141044]\n", "\n", "STATS\n", "mean: None - 152.0575759044903\n", "variance: None - 49982394.03401568\n", - "skewness: None - 46.09070281944655\n", - "kurtosis: None - 2135.822485928052\n", + "skewness: None - 46.154846361387385\n", + "kurtosis: None - 2142.760612768349\n", "median: 10.759792996534902 - 10.873164280000001\n", - "mode: 10.759792996534902 - 152.0575759044903\n", + "mode: 10.759792996534902 - 24.38482806180582\n", "\n", "\n", "\n", @@ -228,71 +228,70 @@ "CDF: 0.5705556940333787 [0.57055569 0.57055569]\n", "PDF: 0.10420033221553353 [0.10420033 0.10420033]\n", "PPF: 6.345811195521515 [6.3458112 6.3458112] - V: 0.5\n", - "SAMPLE: [2.82725293 9.83082423 9.30810317 6.9556107 7.54292807]\n", - "SAMPLEX: [ 7.23564606 18.24195013 6.00728633]\n", + "SAMPLE: [ 9.2320838 1.20754936 6.0150962 10.01795868 9.21710604]\n", + "SAMPLEX: [20.09821991 17.68197517 5.67425596]\n", "\n", "STATS\n", "mean: 7 - 6.994580951601483\n", "variance: 14 - 14.044635753085412\n", - "skewness: 1.0690449676496976 - 1.0425414606439507\n", - "kurtosis: 4.714285714285714 - 4.517961369539591\n", + "skewness: 1.0690449676496976 - 1.0439923454822189\n", + "kurtosis: 4.714285714285714 - 4.52846962724633\n", "median: 6.345811195521515 - 6.390949411499999\n", - "mode: 5 - 4.723438750940335\n", + "mode: 5 - 4.722570044189719\n", "\n", "\n", "\n", "CHI_SQUARE_3P DISTRIBUTION\n", - "Parameters: {'df': 4.811877353088947, 'loc': 10.204810078297559, 'scale': 2.0781674632342275}\n", - "CDF: 0.5857464128684806 [0.58574641 0.58574641]\n", - "PDF: 0.0597852944278416 [0.05978529 0.05978529]\n", - "PPF: 18.858587263604345 [18.85858726 18.85858726] - V: 0.4999999999999999\n", - "SAMPLE: [14.74411165 18.864559 15.59744394 21.63550704 25.67122836]\n", - "SAMPLEX: [34.54270912 14.5219996 13.17931621]\n", + "Parameters: {'df': 5.427666780269736, 'loc': 9.680108790326281, 'scale': 1.9390767884542408}\n", + "CDF: 0.5807485082359263 [0.58074851 0.58074851]\n", + "PDF: 0.06056418335905264 [0.06056418 0.06056418]\n", + "PPF: 18.944111894999995 [18.94411189 18.94411189] - V: 0.49999999999999994\n", + "SAMPLE: [19.58374088 11.62486587 19.5453931 19.42339568 20.09820822]\n", + "SAMPLEX: [14.46088749 17.99642295 18.68184807]\n", "\n", "STATS\n", - "mean: 20.204697030560645 - 20.204771459411493\n", - "variance: 41.562879400427256 - 40.816258175867965\n", - "skewness: 1.2894001571933147 - 1.1876437508663389\n", - "kurtosis: 5.493829148055216 - 4.910891836578435\n", - "median: 18.858587263604345 - 18.944111895\n", - "mode: 16.04836210409219 - 15.954908321949759\n", + "mean: 20.20477145941149 - 20.204771459411493\n", + "variance: 40.81625817586797 - 40.816258175867965\n", + "skewness: 1.2140551201053449 - 1.1892965717626238\n", + "kurtosis: 5.210894751981005 - 4.922677280334262\n", + "median: 18.944111894999995 - 18.944111895\n", + "mode: 16.326617882503008 - 15.956569099450945\n", "\n", "\n", "\n", - "2.3726576212909982e-06 5.660046918572365e-06\n", "DAGUM DISTRIBUTION\n", "Parameters: {'a': 5.084379838794465, 'b': 50.71729648898703, 'p': 2.8443698187871824}\n", "CDF: 0.605083322097179 [0.60508332 0.60508332]\n", "PDF: 0.020216795271427276 [0.0202168 0.0202168]\n", "PPF: 65.33321818913466 [65.33321819 65.33321819] - V: 0.5\n", - "SAMPLE: [55.69577983 41.67932152 47.64383997 73.80627429 62.41515652]\n", - "SAMPLEX: [83.77202079 30.67441237 39.31318014]\n", + "SAMPLE: [ 51.51086929 88.79212949 125.06811659 90.32380396 69.68599358]\n", + "SAMPLEX: [62.67062403 57.30300873 51.86000836]\n", "\n", "STATS\n", "mean: 70.25128717809493 - 70.07960452432344\n", "variance: 548.5680908267377 - 522.9339743533989\n", - "skewness: 3.045109424363756 - 2.0668729232787917\n", - "kurtosis: 37.16052545430604 - 10.42741484084183\n", + "skewness: 3.045109424363756 - 2.069749350452403\n", + "kurtosis: 37.16052545430604 - 10.457131259188692\n", "median: 65.33321818913466 - 64.59603301499999\n", - "mode: 59.29104107064981 - 60.31949820462048\n", + "mode: 59.29104107064981 - 60.32673728647465\n", "\n", "\n", "\n", "DAGUM_4P DISTRIBUTION\n", - "Parameters: {'a': 6.536753030088207, 'b': 1.841807854467683, 'p': 3.2349415674007895, 'loc': 100.13400720393962}\n", - "CDF: 0.5961640399759871 [0.59616404 0.59616404]\n", - "PDF: 0.018166031566686478 [0.01816603 0.01816603]\n", - "PPF: 102.42672205005665 [102.42672205 102.42672205] - V: 0.49999999999999434\n", - "SAMPLE: [102.79048538 102.47849208 102.15523884 102.65980372 102.62054972]\n", - "SAMPLEX: [102.36853545 101.03695387 101.43521846]\n", + "Parameters: {'a': 6.528214274414596, 'b': 1.8387937385262798, 'p': 3.2260462197272473, 'loc': 100.13817627626732}\n", + "CDF: 0.596184240374687 [0.59618424 0.59618424]\n", + "PDF: 0.01813792873510887 [0.01813793 0.01813793]\n", + "PPF: 102.42672202112432 [102.42672202 102.42672202] - V: 0.4999999999999938\n", + "SAMPLE: [102.17130539 102.95448356 101.84344238 102.888971 102.15574713]\n", + "SAMPLEX: [101.2637695 100.96051008 101.76833601]\n", "\n", "STATS\n", - "mean: 102.54203670075157 - 102.54203670078776\n", - "variance: 0.3457309275285878 - 0.34573092752841106\n", - "skewness: 2.249279235983378 - 1.9352246099275523\n", - "kurtosis: 17.019655966376906 - 10.009290063343727\n", - "median: 102.42672205005665 - 102.42672205\n", - "mode: 102.27476736400888 - 102.27476736403356\n", + "mean: 102.54203671642009 - 102.54203670078776\n", + "variance: 0.3457309264341992 - 0.34573092752841106\n", + "skewness: 2.2514452456827967 - 1.937917824683206\n", + "kurtosis: 17.060511816418312 - 10.037647403743227\n", + "median: 102.42672202112432 - 102.42672205\n", + "mode: 102.27482922573985 - 102.27482921647164\n", "\n", "\n", "\n", @@ -301,34 +300,34 @@ "CDF: 0.5292073131288131 [0.52920731 0.52920731]\n", "PDF: 0.010992912744366368 [0.01099291 0.01099291]\n", "PPF: 248.2721035083003 [248.27210351 248.27210351] - V: 0.4999999999999999\n", - "SAMPLE: [222.76569085 264.93063414 255.62015411 274.34781293 224.10851463]\n", - "SAMPLEX: [241.83150781 185.36701 285.72672925]\n", + "SAMPLE: [375.80262352 269.86926588 254.72047479 269.56491178 253.96869201]\n", + "SAMPLEX: [246.93532812 233.09795604 178.20513463]\n", "\n", "STATS\n", "mean: 3.132984302301155e+95 - 250.91493972391106\n", "variance: -9.815590638465453e+190 - 1306.8805170231467\n", - "skewness: nan - 0.34021294368763233\n", - "kurtosis: nan - 3.1161872221488744\n", + "skewness: nan - 0.3406864114780396\n", + "kurtosis: nan - 3.1221391358324304\n", "median: 248.2721035083003 - 248.89499165\n", - "mode: 244.79763687117958 - 240.18711997562662\n", + "mode: 244.79763687117958 - 240.064625850065\n", "\n", "\n", "\n", "ERLANG_3P DISTRIBUTION\n", - "Parameters: {'k': 54, 'beta': 5.875808066172129, 'loc': 981.8971477917021}\n", - "CDF: 0.5244098320695467 [0.52440983 0.52440983]\n", - "PDF: 0.00920416334368795 [0.00920416 0.00920416]\n", - "PPF: 1297.2343445892247 [1297.23434459 1297.23434459] - V: 0.49999999999999906\n", - "SAMPLE: [1266.31695222 1300.18892117 1310.54609122 1255.7225185 1312.52937401]\n", - "SAMPLEX: [1249.27591507 1251.48380974 1202.45945315]\n", + "Parameters: {'k': 54, 'beta': 5.883985314902859, 'loc': 982.3390574483549}\n", + "CDF: 0.5162686047215298 [0.5162686 0.5162686]\n", + "PDF: 0.00921803347101864 [0.00921803 0.00921803]\n", + "PPF: 1298.115102939236 [1298.11510294 1298.11510294] - V: 0.49999999999999983\n", + "SAMPLE: [1329.51606501 1356.8919948 1331.12412266 1375.97673573 1346.6283779 ]\n", + "SAMPLEX: [1237.58270004 1259.08313323 1233.2775678 ]\n", "\n", "STATS\n", - "mean: 7.815710779239919e+112 - 1299.8757266367006\n", - "variance: -6.108533498472707e+225 - 1868.3810984473935\n", - "skewness: nan - 0.27187223922669507\n", - "kurtosis: nan - 2.9640369010964918\n", - "median: 1297.2343445892247 - 1297.264582\n", - "mode: 1293.314975298825 - 1299.8756860248334\n", + "mean: 8.425260740227153e+112 - 1299.8757266367006\n", + "variance: -7.0985018540813e+225 - 1868.3810984473935\n", + "skewness: nan - 0.27225059857711975\n", + "kurtosis: nan - 2.969494263494989\n", + "median: 1298.115102939236 - 1297.264582\n", + "mode: 1294.1902791382065 - 1294.5418045623562\n", "\n", "\n", "\n", @@ -337,16 +336,16 @@ "CDF: 0.5108835278548217 [0.51088353 0.51088353]\n", "PDF: 5.576796346589474 [5.57679635 5.57679635]\n", "PPF: 0.0 [0. 0.] - V: 0.5\n", - "SAMPLE: [-0.1326572 -0.04203222 0.026597 0.03640286 0.06024681]\n", - "SAMPLEX: [-0.10805082 0.01968199 0.0032271 ]\n", + "SAMPLE: [-0.04200223 -0.13628159 0.05134198 0.01971527 -0.05837012]\n", + "SAMPLEX: [-0.03615472 -0.08418757 -0.01649286]\n", "\n", "STATS\n", "mean: 0 - 0.0019510892548656174\n", "variance: 0.005113605931064271 - 0.005113605931064271\n", - "skewness: 0 - -0.02998257998934544\n", - "kurtosis: 3 - 2.9752705583810837\n", + "skewness: 0 - -0.03002430616749843\n", + "kurtosis: 3 - 2.980764434798136\n", "median: 0.0 - 0.0018351819999999999\n", - "mode: 0 - -0.0011182793554310644\n", + "mode: 0 - -0.0011271224216421183\n", "\n", "\n", "\n", @@ -355,17 +354,16 @@ "CDF: 0.6321205588285577 [0.63212056 0.63212056]\n", "PDF: 0.018473677617069185 [0.01847368 0.01847368]\n", "PPF: 13.803131283310114 [13.80313128 13.80313128] - V: 0.5\n", - "SAMPLE: [4.28346625e+00 1.08205393e+01 3.10599593e+00 2.18719019e+01\n", - " 2.15062400e-02]\n", - "SAMPLEX: [29.92220166 13.57283554 1.24128427]\n", + "SAMPLE: [12.23289265 0.13911762 55.16753066 20.69406323 46.55713019]\n", + "SAMPLEX: [72.11606654 20.2088628 15.55544898]\n", "\n", "STATS\n", "mean: 19.913709051170816 - 19.913709051170816\n", "variance: 396.55580817468245 - 406.28768633708944\n", - "skewness: 2 - 2.0595649306916135\n", - "kurtosis: 9 - 9.454783177192272\n", + "skewness: 2 - 2.0602284740702146\n", + "kurtosis: 9 - 9.460925730476117\n", "median: 13.803131283310114 - 13.81871893\n", - "mode: 0 - 4.856368452933974\n", + "mode: 0 - 4.853637154510451\n", "\n", "\n", "\n", @@ -374,16 +372,16 @@ "CDF: 0.6279519957229074 [0.627952 0.627952]\n", "PDF: 0.03703860735287641 [0.03703861 0.03703861]\n", "PPF: 56.96258041747158 [56.96258042 56.96258042] - V: 0.4999999999999999\n", - "SAMPLE: [67.44485893 72.16001056 50.78106166 68.43981135 52.40230462]\n", - "SAMPLEX: [ 56.18740097 124.35299631 62.31778514]\n", + "SAMPLE: [71.59905591 57.59642764 96.36622611 53.17468154 56.05326651]\n", + "SAMPLEX: [102.96431301 105.66505129 120.56657778]\n", "\n", "STATS\n", "mean: 60.04487716777327 - 59.9316954803017\n", "variance: 100.89941789280593 - 100.54380438793787\n", - "skewness: 2 - 1.9947588061721144\n", - "kurtosis: 9 - 8.438551529640378\n", + "skewness: 2 - 1.995401470541671\n", + "kurtosis: 9 - 8.443929963831717\n", "median: 56.96258041747158 - 56.849398730000004\n", - "mode: 50.00000694 - 52.47732919218296\n", + "mode: 50.00000694 - 52.477343657407744\n", "\n", "\n", "\n", @@ -392,34 +390,34 @@ "CDF: 0.6871768928407547 [0.68717689 0.68717689]\n", "PDF: 0.24499346854938225 [0.24499347 0.24499347]\n", "PPF: 1.0093624996023873 [1.0093625 1.0093625] - V: 0.49999999999999967\n", - "SAMPLE: [0.60501868 0.43553325 0.66030285 0.52475413 4.21456475]\n", - "SAMPLEX: [0.86740224 0.39687056 3.27999249]\n", + "SAMPLE: [ 2.53078104 35.51557486 6.05942454 0.20270192 0.9703394 ]\n", + "SAMPLEX: [4.55954314 0.7195062 1.65609083]\n", "\n", "STATS\n", "mean: 1.626401059271763 - 1.5730915461709916\n", "variance: 6.976909897404658 - 4.591570217925138\n", - "skewness: -7.851585463179836 - 6.304983562690212\n", - "kurtosis: 25.313933748803034 - 73.33289821512857\n", + "skewness: -7.851585463179836 - 6.313758086679873\n", + "kurtosis: 25.313933748803034 - 73.56708339453186\n", "median: 1.0093624996023873 - 0.9883941955\n", - "mode: 0.4627665643744898 - 0.7336208230316449\n", + "mode: 0.4627665643744898 - 0.7320689545520552\n", "\n", "\n", "\n", "FATIGUE_LIFE DISTRIBUTION\n", - "Parameters: {'gamma': 5.042873484860856, 'loc': 3.0006971680567887, 'scale': 9.756370495758599}\n", - "CDF: 0.7495720411633073 [0.74957204 0.74957204]\n", - "PDF: 0.0009469473462068222 [0.00094695 0.00094695]\n", - "PPF: 12.757067663815388 [12.75706766 12.75706766] - V: 0.5\n", - "SAMPLE: [ 10.7969614 48.05282569 4.03165498 3.12255011 551.00228723]\n", - "SAMPLEX: [ 4.75019992 3.9124565 68.51630044]\n", + "Parameters: {'gamma': 3.0220423970905346, 'loc': 15.000532142725103, 'scale': 4.842627949023088}\n", + "CDF: 0.7387327670517312 [0.73873277 0.73873277]\n", + "PDF: 0.005562828674306227 [0.00556283 0.00556283]\n", + "PPF: 19.84316009174819 [19.84316009 19.84316009] - V: 0.49999999999999994\n", + "SAMPLE: [15.11379018 21.90715734 81.90409105 78.05001806 27.0081061 ]\n", + "SAMPLEX: [309.03116657 9.36727176 10.49605776]\n", "\n", "STATS\n", - "mean: 136.81211364100733 - 134.21222086637997\n", - "variance: 79368.92614285974 - 75093.66318470016\n", - "skewness: 3.837397713129348 - 3.342075881704996\n", - "kurtosis: 24.334119812129014 - 17.1616230870167\n", - "median: 12.757067663815388 - 11.691447705\n", - "mode: None - 134.2122009275275\n", + "mean: 41.95639168420374 - 41.89757506483001\n", + "variance: 2659.1473640135623 - 2612.306599336672\n", + "skewness: 3.6769604981529125 - 3.657841022621265\n", + "kurtosis: 22.75806372598052 - 22.702905199069754\n", + "median: 19.84316009174819 - 19.81841397\n", + "mode: None - 17.875319496440643\n", "\n", "\n", "\n", @@ -428,52 +426,52 @@ "CDF: 0.514736005001805 [0.51473601 0.51473601]\n", "PDF: 0.0067109481881419955 [0.00671095 0.00671095]\n", "PPF: 100.56394907848052 [100.56394908 100.56394908] - V: 0.5\n", - "SAMPLE: [124.94392384 141.33432167 52.28626222 50.88147512 160.78266372]\n", - "SAMPLEX: [132.10674964 122.41880187 106.29214557]\n", + "SAMPLE: [ 18.42073409 109.84485691 214.82845032 73.31679461 157.77986692]\n", + "SAMPLEX: [150.76219392 89.35881711 82.96890378]\n", "\n", "STATS\n", "mean: 102.75831348218443 - 102.75831348218443\n", "variance: 3092.594793430695 - 3092.5947934306937\n", - "skewness: 0.30743482113058646 - 0.32472670284044114\n", - "kurtosis: 2.6724998712705315 - 2.572558695398622\n", + "skewness: 0.30743482113058646 - 0.325178618728219\n", + "kurtosis: 2.6724998712705315 - 2.5767435921962547\n", "median: 100.56394907848052 - 99.254987315\n", - "mode: 100.50878875724395 - 102.75829894805487\n", + "mode: 100.50878875724395 - 96.94891256072808\n", "\n", "\n", "\n", "FRECHET DISTRIBUTION\n", - "Parameters: {'alpha': 5.230890657679189, 'loc': 9.04433346650689, 'scale': 21.020707763054645}\n", - "CDF: 0.06365461474020018 [0.06365461 0.06365461]\n", - "PDF: 0.06365461474020018 [0.06365461 0.06365461]\n", - "PPF: 31.590725527785658 [31.59072553 31.59072553] - V: 0.08040703588701024\n", - "SAMPLE: [33.54637672 32.51685528 35.53821471 27.1687068 24.99381138]\n", - "SAMPLEX: [26.69865725 27.46323694 34.70998953]\n", + "Parameters: {'alpha': 5.1683615950040664, 'loc': 9.208306060340457, 'scale': 20.767193940203455}\n", + "CDF: 0.6247736865961532 [0.62477369 0.62477369]\n", + "PDF: 0.06320548841536631 [0.06320549 0.06320549]\n", + "PPF: 31.501674351482265 [31.50167435 31.50167435] - V: 0.5\n", + "SAMPLE: [34.28479143 31.49265701 29.03459784 32.5366058 36.7339452 ]\n", + "SAMPLEX: [24.58170468 29.96552371 31.75230271]\n", "\n", "STATS\n", - "mean: 33.31182720333093 - 33.290319956260426\n", - "variance: 51.81779712907573 - 47.81393103444276\n", - "skewness: 3.312014908622424 - 2.329327046807426\n", - "kurtosis: 39.05470252083117 - 12.526613262452479\n", - "median: 31.590725527785658 - 31.587727545\n", - "mode: 29.373666814095735 - 29.705326854614047\n", + "mean: 33.23572637075711 - 33.238460540479004\n", + "variance: 52.364141216910014 - 52.907835261319285\n", + "skewness: 3.367980646082366 - 3.5348988564230917\n", + "kurtosis: 41.12762239832176 - 37.405836207908855\n", + "median: 31.501674351482265 - 31.428760235\n", + "mode: 29.276805508047538 - 29.80564343271827\n", "\n", "\n", "\n", "F_4P DISTRIBUTION\n", - "Parameters: {'df1': 76.4779735141037, 'df2': 36.602294411085026, 'loc': 925.6569748755267, 'scale': 197.93628519974175}\n", - "CDF: 0.5698176882714455 [0.56981769 0.56981769]\n", - "PDF: 0.006497351450474573 [0.00649735 0.00649735]\n", - "PPF: 1125.4973404342409 [1125.49734043 1125.49734043] - V: 0.4999999999999959\n", - "SAMPLE: [1130.94486949 1186.12735403 1086.27307887 1122.35403953 1067.71735034]\n", - "SAMPLEX: [1101.58472561 1236.34860207 1190.76973536]\n", + "Parameters: {'df1': 41.944143698782646, 'df2': 31.04362609365504, 'loc': 958.7278950287805, 'scale': 165.27625176462124}\n", + "CDF: 0.5745566530242945 [0.57455665 0.57455665]\n", + "PDF: 0.006539708248948322 [0.00653971 0.00653971]\n", + "PPF: 1124.939461911451 [1124.93946191 1124.93946191] - V: 0.499999999999994\n", + "SAMPLE: [1206.8421191 1122.21614029 1242.36842304 1092.95478193 1123.68679461]\n", + "SAMPLEX: [1192.30714112 1118.74717551 1219.08714245]\n", "\n", "STATS\n", - "mean: 1135.03390518673 - 1135.8369327451342\n", - "variance: 3906.0701108715334 - 3906.066991834918\n", - "skewness: 1.3848041233843367e-07 - 1.3288203563171104\n", - "kurtosis: 3.4335428459385384e-09 - 6.1014455655558955\n", - "median: 1125.4973404342409 - 1124.076318\n", - "mode: 1108.4299942195346 - 1109.0476200812539\n", + "mean: 1135.385387636516 - 1135.8369327451342\n", + "variance: 3906.0823634020426 - 3906.066991834918\n", + "skewness: 2.692391017018054e-07 - 1.3306696499716495\n", + "kurtosis: 7.94639643323401e-09 - 6.117100799874921\n", + "median: 1124.939461911451 - 1124.076318\n", + "mode: 1106.5968428476074 - 1107.0069703867387\n", "\n", "\n", "\n", @@ -482,34 +480,34 @@ "CDF: 0.5950100656796262 [0.59501007 0.59501007]\n", "PDF: 0.026353929424225205 [0.02635393 0.02635393]\n", "PPF: 16.968359583121963 [16.96835958 16.96835958] - V: 0.49999999999999994\n", - "SAMPLE: [22.04464559 8.91598925 5.35948229 7.39982366 1.20254901]\n", - "SAMPLEX: [ 7.54642208 17.56375652 5.26327709]\n", + "SAMPLE: [23.84688415 7.84183065 5.80330265 27.88699388 13.5414217 ]\n", + "SAMPLEX: [ 5.50871388 17.13407605 9.02394407]\n", "\n", "STATS\n", "mean: 20.30186591862929 - 20.30186591862929\n", "variance: 210.59459935682872 - 210.59459935682892\n", - "skewness: 1.429610256480555 - 1.4017911789696504\n", - "kurtosis: 6.065678228151577 - 5.805622129298339\n", + "skewness: 1.429610256480555 - 1.4037420247103363\n", + "kurtosis: 6.065678228151577 - 5.820315815461966\n", "median: 16.968359583121963 - 17.174645995\n", - "mode: 9.928701195696888 - 10.40386522849644\n", + "mode: 9.928701195696888 - 10.429678071230422\n", "\n", "\n", "\n", "GAMMA_3P DISTRIBUTION\n", - "Parameters: {'alpha': 22.51507586824517, 'loc': 102.3019966606281, 'beta': 2.1314695926314546}\n", - "CDF: 0.5280316434674004 [0.52803164 0.52803164]\n", - "PDF: 0.03929948883924988 [0.03929949 0.03929949]\n", - "PPF: 149.58360681464885 [149.58360681 149.58360681] - V: 0.5000000000000003\n", - "SAMPLE: [154.10530794 164.0309665 137.18454587 156.53149169 147.92129542]\n", - "SAMPLEX: [138.96596676 150.70718496 137.717504 ]\n", + "Parameters: {'alpha': 22.45253885238332, 'loc': 102.36869087852193, 'beta': 2.134435917743617}\n", + "CDF: 0.5280706699859753 [0.52807067 0.52807067]\n", + "PDF: 0.03929908378251095 [0.03929908 0.03929908]\n", + "PPF: 149.58262607043383 [149.58262607 149.58262607] - V: 0.5000000000000006\n", + "SAMPLE: [156.553111 170.81269336 140.70835733 157.76614601 157.13785955]\n", + "SAMPLEX: [128.28139696 134.57732778 148.14655225]\n", "\n", "STATS\n", "mean: 150.29219624958293 - 150.29219624958293\n", "variance: 102.28965116817153 - 102.28965116817176\n", - "skewness: 0.4214958357643134 - 0.4214958357643085\n", - "kurtosis: 3.2664881093497136 - 3.2581585233280426\n", - "median: 149.58360681464885 - 149.33796055\n", - "mode: 148.16072665695148 - 146.65880741969215\n", + "skewness: 0.4220824233875825 - 0.4220824233875248\n", + "kurtosis: 3.2672303581989097 - 3.2645719022845845\n", + "median: 149.58262607043383 - 149.33796055\n", + "mode: 148.1577603318393 - 146.6511360909091\n", "\n", "\n", "\n", @@ -518,70 +516,70 @@ "CDF: 0.6283453522244865 [0.62834535 0.62834535]\n", "PDF: 0.1249900553651496 [0.12499006 0.12499006]\n", "PPF: 10.833802163222325 [10.83380216 10.83380216] - V: 0.5000000000000002\n", - "SAMPLE: [ 8.60740794 11.63433456 8.96530727 9.26830395 9.8110829 ]\n", - "SAMPLEX: [11.55120402 10.41268755 11.78888031]\n", + "SAMPLE: [10.79493136 9.11821855 9.98762129 16.59182542 13.0551769 ]\n", + "SAMPLEX: [ 9.94934292 9.22217861 11.89421047]\n", "\n", "STATS\n", "mean: 11.731822887759584 - 11.730463970072753\n", "variance: 13.719252385717047 - 13.168139526895617\n", - "skewness: 3.7185005813597183 - 2.594873907690061\n", - "kurtosis: 57.360948202636 - 13.973746630565422\n", + "skewness: 3.7185005813597183 - 2.5984851436475838\n", + "kurtosis: 57.360948202636 - 14.014990089615965\n", "median: 10.833802163222325 - 10.838461365\n", - "mode: 9.707409633176697 - 10.111914636382576\n", + "mode: 9.707409633176697 - 10.110495135674567\n", "\n", "\n", "\n", "GENERALIZED_GAMMA DISTRIBUTION\n", - "Parameters: {'a': 10.325690241727713, 'd': 128.7187279533886, 'p': 24.037516978373706}\n", - "CDF: 0.4744816011342142 [0.4744816 0.4744816]\n", - "PDF: 1.9377682317062173 [1.93776823 1.93776823]\n", - "PPF: 11.04305831176691 [11.04305831 11.04305831] - V: 0.5000000000000008\n", - "SAMPLE: [11.23718402 11.27141083 10.7698202 11.11714105 11.17441342]\n", - "SAMPLEX: [10.79529614 10.80075799 10.27172337]\n", + "Parameters: {'a': 10.327607318928946, 'd': 128.58559922596027, 'p': 24.067385087362943}\n", + "CDF: 0.4744471245050614 [0.47444712 0.47444712]\n", + "PDF: 1.9377961299248632 [1.93779613 1.93779613]\n", + "PPF: 11.04307562434236 [11.04307562 11.04307562] - V: 0.5000000000000001\n", + "SAMPLE: [10.86175932 11.17957312 11.16527124 11.12871304 10.82644702]\n", + "SAMPLEX: [10.38596906 10.69130158 10.75102756]\n", "\n", "STATS\n", - "mean: 11.029961038744382 - 11.029961038744208\n", - "variance: 0.04286204988089537 - 0.0428620498823726\n", - "skewness: -0.38991534388132526 - -0.38991534507884046\n", - "kurtosis: 3.2992665726084756 - 3.1680643873761642\n", - "median: 11.04305831176691 - 11.04321047\n", - "mode: 11.068670557809735 - 11.066658907008435\n", + "mean: 11.0299610387445 - 11.029961038744208\n", + "variance: 0.042862049881335906 - 0.0428620498823726\n", + "skewness: -0.39045798405359233 - -0.39045798274241467\n", + "kurtosis: 3.300093601156225 - 3.174184923239094\n", + "median: 11.04307562434236 - 11.04321047\n", + "mode: 11.068720190516837 - 11.066675847040704\n", "\n", "\n", "\n", "GENERALIZED_GAMMA_4P DISTRIBUTION\n", - "Parameters: {'a': 0.0620989835370887, 'd': 13.306452327430588, 'p': 0.5827000751362538, 'loc': 28.251672176074496}\n", - "CDF: 0.5545366610130721 [0.55453666 0.55453666]\n", - "PDF: 0.08089724874937976 [0.08089725 0.08089725]\n", - "PPF: 12.994014065210518 [12.99401407 12.99401407] - V: nan\n", - "SAMPLE: [10.60539526 12.28417341 21.21683644 11.07645433 8.02421802]\n", - "SAMPLEX: [3.36434265 2.78026865 4.42274861]\n", + "Parameters: {'a': 0.08251144434585118, 'd': 12.58274184324251, 'p': 0.6000017286848119, 'loc': 28.4307489020028}\n", + "CDF: 0.5546999626514585 [0.55469996 0.55469996]\n", + "PDF: 0.08087483739935136 [0.08087484 0.08087484]\n", + "PPF: 12.812935800296042 [12.8129358 12.8129358] - V: nan\n", + "SAMPLE: [18.84534803 20.43611509 16.67405675 16.90612635 17.35227689]\n", + "SAMPLEX: [3.18079783 2.90275085 3.09123177]\n", "\n", "STATS\n", - "mean: 41.93392196292464 - 41.90250600697404\n", - "variance: 24.403948174334687 - 24.4067315461278\n", - "skewness: 0.8805122683562028 - 0.8891099254468949\n", - "kurtosis: 4.295152087412357 - 4.302309019142285\n", - "median: 12.994014065210518 - 41.27839826\n", - "mode: 39.904888009293494 - 39.96925924866395\n", + "mean: 41.936191432170745 - 41.90250600697404\n", + "variance: 24.404360856945402 - 24.4067315461278\n", + "skewness: 0.8852507859260114 - 0.8903472825776013\n", + "kurtosis: 4.304719506193446 - 4.312116317782512\n", + "median: 12.812935800296042 - 41.27839826\n", + "mode: 39.89307626933885 - 39.96876234859186\n", "\n", "\n", "\n", "GENERALIZED_LOGISTIC DISTRIBUTION\n", - "Parameters: {'c': 2.269256517368696, 'loc': 25.324041682617022, 'scale': 32.13110289047772}\n", - "CDF: 0.5387210140176738 [0.53872101 0.53872101]\n", + "Parameters: {'c': 2.269256517368694, 'loc': 25.32404168261707, 'scale': 32.13110289047771}\n", + "CDF: 0.5387210140176737 [0.53872101 0.53872101]\n", "PDF: 0.00907761321600571 [0.00907761 0.00907761]\n", - "PPF: 58.39835503999999 [58.39835504 58.39835504] - V: 0.5\n", - "SAMPLE: [28.31655598 -0.3227299 42.11649757 85.89245241 1.60908933]\n", - "SAMPLEX: [72.34899482 34.61861001 57.4984658 ]\n", + "PPF: 58.39835503999999 [58.39835504 58.39835504] - V: 0.4999999999999999\n", + "SAMPLE: [ 59.71315697 38.80121548 105.92819247 51.69286073 30.70761512]\n", + "SAMPLEX: [ 72.38478027 121.84021789 65.06306831]\n", "\n", "STATS\n", "mean: 62.61002586906673 - 62.61002586906673\n", - "variance: 2267.656643205184 - 2267.6566432051836\n", - "skewness: 0.6471107139006758 - 0.5454367939341366\n", - "kurtosis: 4.411304515085634 - 3.8924422451472878\n", + "variance: 2267.656643205183 - 2267.6566432051836\n", + "skewness: 0.6471107139006752 - 0.5461958677977927\n", + "kurtosis: 4.411304515085633 - 3.900917307756859\n", "median: 58.39835503999999 - 58.39835504\n", - "mode: 51.65394632014395 - 62.609982293683984\n", + "mode: 51.65394632014397 - 55.40957131427945\n", "\n", "\n", "\n", @@ -590,88 +588,88 @@ "CDF: 0.5062510119084326 [0.50625101 0.50625101]\n", "PDF: 0.16431553018196116 [0.16431553 0.16431553]\n", "PPF: 0.0384705616662287 [0.03847056 0.03847056] - V: 0.5\n", - "SAMPLE: [ 5.61447693 1.47928973 3.06852678 -1.59049517 -3.43191119]\n", - "SAMPLEX: [ 7.14530605 -2.08503364 -3.93511819]\n", + "SAMPLE: [ 2.30468977 -1.72911865 -1.43690432 4.31297496 -5.54095558]\n", + "SAMPLEX: [-5.31680062 9.3583833 7.17504093]\n", "\n", "STATS\n", "mean: 0.0384705616662287 - 0.07631881358202029\n", "variance: 0.0005467682462990007 - 16.139365543527234\n", - "skewness: 0 - 0.3479804577005924\n", - "kurtosis: 2.3961301058177478 - 5.447562151550874\n", + "skewness: 0 - 0.3484647353904019\n", + "kurtosis: 2.3961301058177478 - 5.461091995135014\n", "median: 0.0384705616662287 - 0.0398251705\n", - "mode: 0.0384705616662287 - 0.088840501678401\n", + "mode: 0.0384705616662287 - 0.08907282535553485\n", "\n", "\n", "\n", "GENERALIZED_PARETO DISTRIBUTION\n", - "Parameters: {'c': -3.0858957859059766, 'mu': 31.91570194431324, 'sigma': 47.5772037317425}\n", - "CDF: 0.36635752189384396 [0.36635752 0.36635752]\n", - "PDF: 0.05444189829315396 [0.0544419 0.0544419]\n", - "PPF: 45.517523084012964 [45.51752308 45.51752308] - V: 0.4999999999999998\n", - "SAMPLE: [36.28226988 38.43360131 47.32905554 46.57283477 47.2038349 ]\n", - "SAMPLEX: [46.556109 43.51505826 45.51454409]\n", + "Parameters: {'c': -3.085895785906186, 'mu': 31.915701944313007, 'sigma': 47.57720373174645}\n", + "CDF: 0.36635752189382753 [0.36635752 0.36635752]\n", + "PDF: 0.05444189829315171 [0.0544419 0.0544419]\n", + "PPF: 45.517523084013206 [45.51752308 45.51752308] - V: 0.5000000000000002\n", + "SAMPLE: [46.09596245 46.20885634 47.03662073 47.16696692 45.25462072]\n", + "SAMPLEX: [37.44960556 42.54259763 45.31385986]\n", "\n", "STATS\n", - "mean: 43.55995481435875 - 43.561697366839674\n", - "variance: 18.905823397668332 - 18.911482301808256\n", - "skewness: -1.089148189756464 - -1.0971029153057839\n", - "kurtosis: 2.9802753138920886 - 3.0029492766857326\n", - "median: 45.517523084012964 - 45.519558585\n", - "mode: 31.91570194431324 - 46.899763547166536\n", + "mean: 43.55995481435888 - 43.561697366839674\n", + "variance: 18.905823397668424 - 18.911482301808256\n", + "skewness: -1.0891481897565387 - -1.0986297322679157\n", + "kurtosis: 2.9802753138922666 - 3.0085331203510397\n", + "median: 45.517523084013206 - 45.519558585\n", + "mode: 31.915701944313007 - 46.899432127911794\n", "\n", "\n", "\n", "GIBRAT DISTRIBUTION\n", - "Parameters: {'loc': 29.87250188028215, 'scale': 102.4716963951791}\n", - "CDF: 0.6882122724993619 [0.68821227 0.68821227]\n", - "PDF: 0.0021127780643103015 [0.00211278 0.00211278]\n", - "PPF: 132.34419827546125 [132.34419828 132.34419828] - V: 0.5\n", - "SAMPLE: [181.85546032 156.10852867 283.74857668 194.63225449 109.6190121 ]\n", - "SAMPLEX: [334.0360031 64.05165369 156.99973372]\n", + "Parameters: {'loc': 31.891804979322103, 'scale': 100.30742787958874}\n", + "CDF: 0.6914624612740131 [0.69146246 0.69146246]\n", + "PDF: 0.0021288395028993333 [0.00212884 0.00212884]\n", + "PPF: 132.19923285891085 [132.19923286 132.19923286] - V: 0.5\n", + "SAMPLE: [1136.19375282 86.03447785 213.83128273 214.71494184 39.55048184]\n", + "SAMPLEX: [228.90665794 67.16827406 193.30493392]\n", "\n", "STATS\n", - "mean: 198.81976737173957 - 197.27079493361913\n", - "variance: 49045.224972294134 - 46995.36939447393\n", - "skewness: 6.184877138632554 - 5.441226820156899\n", - "kurtosis: 110.9363921763115 - 61.46256704354792\n", - "median: 132.34419827546125 - 133.02809205\n", - "mode: 67.56973228603033 - 197.2707737751703\n", + "mean: 197.27079493361913 - 197.27079493361913\n", + "variance: 46995.36939447393 - 46995.36939447393\n", + "skewness: 6.184877138632554 - 5.448799270551408\n", + "kurtosis: 110.9363921763115 - 61.658168751721206\n", + "median: 132.19923285891085 - 133.02809205\n", + "mode: 68.79284549300996 - 99.62915136463147\n", "\n", "\n", "\n", "GUMBEL_LEFT DISTRIBUTION\n", - "Parameters: {'mu': 100.44546088205152, 'sigma': 30.825984132035938}\n", - "CDF: 0.4296239983254678 [0.429624 0.429624]\n", - "PDF: 0.010388736137926109 [0.01038874 0.01038874]\n", - "PPF: 89.14733940801499 [89.14733941 89.14733941] - V: 0.5\n", - "SAMPLE: [118.66006963 99.71784993 64.57229565 121.26908643 74.69140169]\n", - "SAMPLEX: [ 92.28209825 108.5782299 87.39496496]\n", + "Parameters: {'mu': 100.44546088205172, 'sigma': 30.82598413203629}\n", + "CDF: 0.42962399832546794 [0.429624 0.429624]\n", + "PDF: 0.010388736137925991 [0.01038874 0.01038874]\n", + "PPF: 89.14733940801506 [89.14733941 89.14733941] - V: 0.5\n", + "SAMPLE: [49.10760945 93.0237276 -1.46528247 41.6620463 91.78268398]\n", + "SAMPLEX: [102.06638899 70.54700228 99.38336955]\n", "\n", "STATS\n", "mean: 82.65221995508155 - 82.65221995508155\n", - "variance: 1563.0842823268308 - 1563.0842823268663\n", - "skewness: -1.1395470994046446 - -1.2200010603562845\n", - "kurtosis: 5.4 - 5.792574583347256\n", - "median: 89.14733940801499 - 89.259783545\n", - "mode: 100.44546088205152 - 101.20694603071242\n", + "variance: 1563.0842823268665 - 1563.0842823268663\n", + "skewness: -1.1395470994046446 - -1.2216989122959556\n", + "kurtosis: 5.4 - 5.807225859606174\n", + "median: 89.14733940801506 - 89.259783545\n", + "mode: 100.44546088205172 - 101.80863591056107\n", "\n", "\n", "\n", "GUMBEL_RIGHT DISTRIBUTION\n", - "Parameters: {'mu': 98.85417257620577, 'sigma': 59.50019547747279}\n", + "Parameters: {'mu': 98.85417257620388, 'sigma': 59.50019547747606}\n", "CDF: 0.5703760016745322 [0.570376 0.570376]\n", - "PDF: 0.005382217869533973 [0.00538222 0.00538222]\n", - "PPF: 120.66176299583427 [120.661763 120.661763] - V: 0.5000000000000001\n", - "SAMPLE: [264.7540365 126.10320628 218.56553447 84.43814518 142.71403709]\n", - "SAMPLEX: [141.89534187 143.34527237 82.11819175]\n", + "PDF: 0.005382217869533678 [0.00538222 0.00538222]\n", + "PPF: 120.66176299583357 [120.661763 120.661763] - V: 0.5\n", + "SAMPLE: [140.83755471 95.3700306 35.07751826 241.78675523 80.28367234]\n", + "SAMPLEX: [ 18.88924589 251.45663378 126.00061856]\n", "\n", "STATS\n", "mean: 133.1986174704152 - 133.1986174704152\n", - "variance: 5823.51609438125 - 5823.51609438189\n", - "skewness: 1.1395470994046446 - 1.0782924931332027\n", - "kurtosis: 5.4 - 4.869545061241633\n", - "median: 120.66176299583427 - 121.83716154999999\n", - "mode: 98.85417257620577 - 133.1985908509311\n", + "variance: 5823.51609438189 - 5823.51609438189\n", + "skewness: 1.1395470994046446 - 1.0797931319936842\n", + "kurtosis: 5.4 - 4.881196110927604\n", + "median: 120.66176299583357 - 121.83716154999999\n", + "mode: 98.85417257620388 - 103.09978902056709\n", "\n", "\n", "\n", @@ -680,16 +678,16 @@ "CDF: 0.5750625163166381 [0.57506252 0.57506252]\n", "PDF: 0.08192128609256695 [0.08192129 0.08192129]\n", "PPF: 24.698971623594147 [24.69897162 24.69897162] - V: 0.4999999999999997\n", - "SAMPLE: [21.93757075 22.01552336 24.11974629 22.61875136 21.0991397 ]\n", - "SAMPLEX: [19.15188795 22.43862874 19.91710281]\n", + "SAMPLE: [27.46800175 23.93602467 20.1981147 20.54372294 22.01754535]\n", + "SAMPLEX: [25.87247901 24.84181969 22.6572558 ]\n", "\n", "STATS\n", "mean: 25.57314981637164 - 25.57314981637164\n", "variance: 18.237589573716566 - 18.237589573716562\n", - "skewness: 0.9952717464311565 - 1.0727025622584148\n", - "kurtosis: 3.869177303605974 - 4.314468117853801\n", + "skewness: 0.9952717464311565 - 1.074195421719938\n", + "kurtosis: 3.869177303605974 - 4.324314938578842\n", "median: 24.698971623594147 - 24.67356607\n", - "mode: 19.920616456355567 - 22.145251244971362\n", + "mode: 19.920616456355567 - 22.145439412283228\n", "\n", "\n", "\n", @@ -698,34 +696,34 @@ "CDF: 0.5 [0.5 0.5]\n", "PDF: 0.002520622848442602 [0.00252062 0.00252062]\n", "PPF: 1002.4091081955514 [1002.4091082 1002.4091082] - V: 0.5\n", - "SAMPLE: [1065.07203924 949.64204859 940.13700542 1151.59918918 1048.2998327 ]\n", - "SAMPLEX: [ 915.61117899 1052.43942439 1176.38916525]\n", + "SAMPLE: [1135.72775272 1089.85367947 1114.60220546 1248.53076619 903.98667413]\n", + "SAMPLEX: [1076.65265006 974.05672918 1077.88827684]\n", "\n", "STATS\n", "mean: 1002.4091081955514 - 1002.4091081955514\n", "variance: 39348.14574853985 - 39348.14574853984\n", - "skewness: 0 - 0.013059889524440049\n", - "kurtosis: 5 - 4.967126129679518\n", + "skewness: 0 - 0.013078064720742332\n", + "kurtosis: 5 - 4.9790943580770435\n", "median: 1002.4091081955514 - 1004.047745\n", - "mode: 1002.4091081955514 - 1002.4091081955514\n", + "mode: 1002.4091081955514 - 1010.170669627023\n", "\n", "\n", "\n", "INVERSE_GAMMA DISTRIBUTION\n", - "Parameters: {'alpha': 4.949375842799234, 'beta': 0.9973602325923583}\n", - "CDF: 0.6253870443528251 [0.62538704 0.62538704]\n", - "PDF: 3.1073560902762347 [3.10735609 3.10735609]\n", - "PPF: 0.21586336614387125 [0.21586337 0.21586337] - V: 0.5\n", - "SAMPLE: [0.23254856 0.1706734 0.15388783 0.21121439 0.1317861 ]\n", - "SAMPLEX: [2.92840509 2.62913002 4.32594078]\n", + "Parameters: {'alpha': 5.020824149919777, 'beta': 10.007994494978572}\n", + "CDF: 0.6313778417465411 [0.63137784 0.63137784]\n", + "PDF: 0.3125156318800715 [0.31251563 0.31251563]\n", + "PPF: 2.1331210738506035 [2.13312107 2.13312107] - V: 0.5\n", + "SAMPLE: [1.19530387 3.67622154 2.48981694 2.65443968 4.66170809]\n", + "SAMPLEX: [3.0823477 5.52896767 3.49077996]\n", "\n", "STATS\n", - "mean: 0.25253616578700966 - 0.2511704404981464\n", - "variance: 0.021623054649378304 - 0.021196377839718113\n", - "skewness: 3.523947834436666 - 2.9511581077243085\n", - "kurtosis: 47.56784248692872 - 19.63980546750347\n", - "median: 0.21586336614387125 - 0.215128287\n", - "mode: 0.16764115412199132 - 0.1757199324707836\n", + "mean: 2.4890405851691497 - 2.498139946359\n", + "variance: 2.0508717909924394 - 2.003908279140037\n", + "skewness: 3.4402831658274393 - 2.8424424362712597\n", + "kurtosis: 44.02209242754984 - 18.51165473962481\n", + "median: 2.1331210738506035 - 2.1435116450000002\n", + "mode: 1.662229994727868 - 1.69848296869987\n", "\n", "\n", "\n", @@ -734,16 +732,16 @@ "CDF: 0.6228183065037807 [0.62281831 0.62281831]\n", "PDF: 0.32766684847552124 [0.32766685 0.32766685]\n", "PPF: 102.13808494981464 [102.13808495 102.13808495] - V: 0.5000000000000018\n", - "SAMPLE: [102.21156623 102.10259991 102.88721927 101.67122731 102.21751939]\n", - "SAMPLEX: [103.9502819 101.72074921 100.73039041]\n", + "SAMPLE: [101.56772647 103.16266522 101.66593391 103.4490402 103.27606372]\n", + "SAMPLEX: [103.73747421 100.64225513 101.33121178]\n", "\n", "STATS\n", "mean: 102.4689760162437 - 102.46873644620018\n", "variance: 1.8454741816921958 - 1.8459055559124586\n", - "skewness: 3.0547682004521777 - 2.9000484571801577\n", - "kurtosis: 31.056229704933834 - 20.664427802783656\n", + "skewness: 3.0547682004521777 - 2.9040843986708382\n", + "kurtosis: 31.056229704933834 - 20.72741873465414\n", "median: 102.13808494981464 - 102.15817955\n", - "mode: 101.68635416388331 - 101.78267973841771\n", + "mode: 101.68635416388331 - 101.78275627452746\n", "\n", "\n", "\n", @@ -752,88 +750,88 @@ "CDF: 0.6284479886473603 [0.62844799 0.62844799]\n", "PDF: 0.05545179798016068 [0.0554518 0.0554518]\n", "PPF: 8.104538630854004 [8.10453863 8.10453863] - V: 0.5000000000000001\n", - "SAMPLE: [ 6.08424912 10.51483514 5.8890402 7.34569287 8.2593525 ]\n", - "SAMPLEX: [11.19545506 4.37550821 4.48913252]\n", + "SAMPLE: [13.57073847 14.50041901 11.69890502 33.82318712 4.63615791]\n", + "SAMPLEX: [7.73338035 7.45232175 7.48201441]\n", "\n", "STATS\n", "mean: 10.103339078619557 - 10.103339078619557\n", "variance: 51.759356333162366 - 51.759356333162366\n", - "skewness: 2.1362435259383403 - 2.194512927903282\n", - "kurtosis: 10.605894003522451 - 10.941746976359456\n", + "skewness: 2.1362435259383403 - 2.197566989208923\n", + "kurtosis: 10.605894003522451 - 10.973135186239901\n", "median: 8.104538630854004 - 8.002110461000001\n", - "mode: 5.00916278145656 - 5.854734101346961\n", + "mode: 5.00916278145656 - 5.857481585753675\n", "\n", "\n", "\n", "INVERSE_GAUSSIAN_3P DISTRIBUTION\n", - "Parameters: {'mu': 9.310220278992432, 'lambda': 77.24474111926902, 'loc': 60.74342361366743}\n", - "CDF: 0.5673292131332601 [0.56732921 0.56732921]\n", - "PDF: 0.12342541385441225 [0.12342541 0.12342541]\n", - "PPF: 69.5288607757285 [69.52886078 69.52886078] - V: 0.5000000000000007\n", - "SAMPLE: [68.23942017 70.17574319 73.03207271 70.36000641 66.66370912]\n", - "SAMPLEX: [69.31956385 67.52908329 65.04519449]\n", + "Parameters: {'mu': 9.297281431785187, 'lambda': 76.92313662768895, 'loc': 60.756362460874676}\n", + "CDF: 0.5674179596855075 [0.56741796 0.56741796]\n", + "PDF: 0.1234254138544122 [0.12342541 0.12342541]\n", + "PPF: 69.52822374955878 [69.52822375 69.52822375] - V: 0.4999999999999997\n", + "SAMPLE: [69.08372931 66.96720812 71.05950076 67.8041937 73.8681688 ]\n", + "SAMPLEX: [67.26866033 69.78454165 69.74258273]\n", "\n", "STATS\n", "mean: 70.05364389265986 - 70.05364389265986\n", "variance: 10.447465541778724 - 10.447465541778724\n", - "skewness: 1.041517980634489 - 1.041517980634489\n", - "kurtosis: 4.807932839974907 - 5.121116062826515\n", - "median: 69.5288607757285 - 69.57526511\n", - "mode: 68.52135305660465 - 68.67145450995972\n", + "skewness: 1.042967441115373 - 1.0429674411153729\n", + "kurtosis: 4.812968472044582 - 5.133584822007\n", + "median: 69.52822374955878 - 69.57526511\n", + "mode: 68.51963483610321 - 68.67004748722572\n", "\n", "\n", "\n", "JOHNSON_SB DISTRIBUTION\n", "Parameters: {'xi': 102.36446542254836, 'lambda': 794.6625774199844, 'gamma': 4.197410572472888, 'delta': 1.843941900930812}\n", "CDF: 0.5828705169510376 [0.58287052 0.58287052]\n", - "PDF: 0.009791024861239688 [0.00979102 0.00979102]\n", - "PPF: 176.3497832578772 [176.34978326 176.34978326] - V: 0.5\n", - "SAMPLE: [193.1735505 163.32004285 129.77781453 176.66014229 189.348937 ]\n", - "SAMPLEX: [121.40021323 105.45730552 121.86580211]\n", + "PDF: 0.009791024861239686 [0.00979102 0.00979102]\n", + "PPF: 176.34978325787716 [176.34978326 176.34978326] - V: 0.5\n", + "SAMPLE: [149.91711895 189.04441688 201.47766726 170.19866623 238.63797482]\n", + "SAMPLEX: [113.68540321 106.04347028 121.10453176]\n", "\n", "STATS\n", "mean: 184.33234806450042 - 184.32327105565003\n", "variance: 1629.7967402144113 - 1624.2295268052465\n", - "skewness: 1.2599883249631394 - 1.2911809989868201\n", - "kurtosis: 5.4750493458005325 - 6.115440081332915\n", - "median: 176.3497832578772 - 176.0584664\n", - "mode: None - 162.8144694747812\n", + "skewness: 1.2599883249631394 - 1.2931200324755174\n", + "kurtosis: 5.4750493458005325 - 6.132384092318572\n", + "median: 176.34978325787716 - 176.0584664\n", + "mode: None - 162.55169717116712\n", "\n", "\n", "\n", "JOHNSON_SU DISTRIBUTION\n", - "Parameters: {'xi': 43.75363252117316, 'lambda': 382.7933269123347, 'gamma': -16.042225885304514, 'delta': 54.142965901378126}\n", - "CDF: 0.5014431127297463 [0.50144311 0.50144311]\n", - "PDF: 0.05403631938944683 [0.05403632 0.05403632]\n", - "PPF: 158.83974090751235 [158.83974091 158.83974091] - V: 0.5\n", - "SAMPLE: [149.51861987 167.22210473 164.08067691 169.69206148 157.13342779]\n", - "SAMPLEX: [145.06693148 159.2672388 167.46354575]\n", + "Parameters: {'xi': -104.75150038181813, 'lambda': 446.23546681983976, 'gamma': -39.41708297389563, 'delta': 70.28440370939174}\n", + "CDF: 0.501757862659875 [0.50175786 0.50175786]\n", + "PDF: 0.05409974605661959 [0.05409975 0.05409975]\n", + "PPF: 158.8339546172645 [158.83395462 158.83395462] - V: 0.5\n", + "SAMPLE: [156.57896521 164.40858813 148.12724897 154.43466566 158.99975632]\n", + "SAMPLEX: [168.51692266 160.18287258 164.00908662]\n", "\n", "STATS\n", - "mean: 158.859372062974 - 158.86644688175002\n", - "variance: 54.5230970908829 - 54.38671687056677\n", - "skewness: 0.015958424074243128 - -0.0643814706486721\n", - "kurtosis: 3.0017047877501355 - 2.881527029631716\n", - "median: 158.83974090751235 - 158.82814725\n", - "mode: None - 158.16180763866356\n", + "mean: 158.86063521136106 - 158.86644688175002\n", + "variance: 54.38671640867414 - 54.38671687056677\n", + "skewness: 0.021712330126703355 - -0.06447815564305887\n", + "kurtosis: 3.001438570340695 - 2.887127235543611\n", + "median: 158.8339546172645 - 158.82814725\n", + "mode: None - 158.15975967953796\n", "\n", "\n", "\n", "KUMARASWAMY DISTRIBUTION\n", - "Parameters: {'alpha': 7.897254830219312, 'beta': 5.688240298567377, 'min': 11.25509131355796, 'max': 19.649818789553876}\n", - "CDF: 0.44725249178096393 [0.44725249 0.44725249]\n", - "PDF: 0.4354762178204565 [0.43547622 0.43547622]\n", - "PPF: 17.63676026270727 [17.63676026 17.63676026] - V: 0.5000000000000012\n", - "SAMPLE: [16.90984864 17.40186893 18.00934543 18.13620793 17.63037055]\n", - "SAMPLEX: [17.35495445 18.34394078 16.31995776]\n", + "Parameters: {'alpha': 7.968264856300301, 'beta': 5.791304683231665, 'min': 11.209564679555108, 'max': 19.661342512750057}\n", + "CDF: 0.4472484247892823 [0.44724842 0.44724842]\n", + "PDF: 0.4358073785047594 [0.43580738 0.43580738]\n", + "PPF: 17.63667986854915 [17.63667987 17.63667987] - V: 0.5\n", + "SAMPLE: [18.01624138 18.4867149 17.87479967 18.23347248 16.79366332]\n", + "SAMPLEX: [17.68363103 18.31973024 17.60187805]\n", "\n", "STATS\n", - "mean: 17.51855905620508 - 17.51855905620482\n", - "variance: 0.7831928893529665 - 0.7831928893538114\n", - "skewness: -0.7236789392640139 - -0.7236789392728671\n", - "kurtosis: 3.5294642497465816 - 3.5294642498197666\n", - "median: 17.63676026270727 - 17.62417818\n", - "mode: 17.895563791629257 - 17.782372013486544\n", + "mean: 17.51855905620483 - 17.51855905620482\n", + "variance: 0.7831928893536023 - 0.7831928893538114\n", + "skewness: -0.7246860692884496 - -0.724686069291578\n", + "kurtosis: 3.53675948422465 - 3.5367594842646977\n", + "median: 17.63667986854915 - 17.62417818\n", + "mode: 17.894642514722253 - 17.78239986210921\n", "\n", "\n", "\n", @@ -842,16 +840,16 @@ "CDF: 0.5 [0.5 0.5]\n", "PDF: 0.10775391155575634 [0.10775391 0.10775391]\n", "PPF: 17.166699778639945 [17.16669978 17.16669978] - V: 0.5\n", - "SAMPLE: [28.06217728 31.6169745 18.94462958 16.32640833 19.40657008]\n", - "SAMPLEX: [17.83209812 17.40280041 19.28677532]\n", + "SAMPLE: [ 2.89938697 9.65808101 17.56683176 17.8081463 19.4875491 ]\n", + "SAMPLEX: [20.17164279 12.91432362 14.55651513]\n", "\n", "STATS\n", "mean: 17.166699778639945 - 17.166699778639945\n", "variance: 43.06296368646443 - 43.06296368646442\n", - "skewness: 0 - 0.3069186673429846\n", - "kurtosis: 6 - 6.368300918780959\n", + "skewness: 0 - 0.3073458001313099\n", + "kurtosis: 6 - 6.384823543040074\n", "median: 17.166699778639945 - 17.04971406\n", - "mode: 17.166699778639945 - 16.83102319963394\n", + "mode: 17.166699778639945 - 16.832650346876687\n", "\n", "\n", "\n", @@ -860,34 +858,34 @@ "CDF: 0.9727987159154532 [0.97279872 0.97279872]\n", "PDF: 1.5681620488208165e-05 [1.56816205e-05 1.56816205e-05]\n", "PPF: 2.203468984358575 [2.20346898 2.20346898] - V: 0.5\n", - "SAMPLE: [ 0.44050536 71.80839604 0.95392317 1.42342707 1.77828123]\n", - "SAMPLEX: [ 0.24180049 12.05043517 9.04181412]\n", + "SAMPLE: [ 0.12812172 17.32788437 1.3245452 0.49167929 4.18333621]\n", + "SAMPLEX: [154.75852246 0.36416117 118.74576297]\n", "\n", "STATS\n", "mean: inf - 866.9499100687491\n", "variance: inf - 222024483.09644082\n", - "skewness: None - 27.857547897951907\n", - "kurtosis: None - 861.8915539700395\n", + "skewness: None - 27.89631670993902\n", + "kurtosis: None - 864.6888799555187\n", "median: 2.203468984358575 - 2.289557808\n", - "mode: 0.32374616681718843 - 866.9499100687491\n", + "mode: 0.32374616681718843 - 51.56589659922532\n", "\n", "\n", "\n", "LOGGAMMA DISTRIBUTION\n", - "Parameters: {'c': 2.5897731558463875, 'mu': 8.138316460776824, 'sigma': 4.658120186585784}\n", - "CDF: 0.45716711424785783 [0.45716711 0.45716711]\n", - "PDF: 0.12684055399181085 [0.12684055 0.12684055]\n", - "PPF: 11.946988328869994 [11.94698833 11.94698833] - V: 0.49999999999999983\n", - "SAMPLE: [ 9.47192869 10.56710474 10.22424599 13.13113749 5.31773846]\n", - "SAMPLEX: [10.67022258 9.59262924 11.2516333 ]\n", + "Parameters: {'c': 2.5833821025027386, 'mu': 8.157448161661904, 'sigma': 4.651233632356285}\n", + "CDF: 0.45711128224795394 [0.45711128 0.45711128]\n", + "PDF: 0.12684480031118417 [0.1268448 0.1268448]\n", + "PPF: 11.947397246955045 [11.94739725 11.94739725] - V: 0.5000000000000002\n", + "SAMPLE: [11.34981352 9.84192859 7.10823378 11.23823209 11.11810188]\n", + "SAMPLEX: [9.64863544 4.8706009 4.77506308]\n", "\n", "STATS\n", - "mean: 11.6144478320885 - 11.614447832088509\n", - "variance: 10.198509345166196 - 10.198509345166132\n", - "skewness: -0.6743560840026045 - -0.6743560840026546\n", - "kurtosis: 3.895901679328371 - 3.715215641281469\n", - "median: 11.946988328869994 - 11.95693968\n", - "mode: 12.570845224819706 - 12.358250068559595\n", + "mean: 11.614447832088501 - 11.614447832088509\n", + "variance: 10.198509345166178 - 10.198509345166132\n", + "skewness: -0.6752945723551607 - -0.675294572355213\n", + "kurtosis: 3.8983298489628333 - 3.7231146443462304\n", + "median: 11.947397246955045 - 11.95693968\n", + "mode: 12.571931364449725 - 12.357549033368137\n", "\n", "\n", "\n", @@ -896,52 +894,52 @@ "CDF: 0.5 [0.5 0.5]\n", "PDF: 0.04880319756226821 [0.0488032 0.0488032]\n", "PPF: 9.968101233234014 [9.96810123 9.96810123] - V: 0.5\n", - "SAMPLE: [4.56647862 6.73536535 7.48052418 3.3172488 6.23153095]\n", - "SAMPLEX: [ 10.181819 -12.36888438 2.20523027]\n", + "SAMPLE: [11.71450123 4.28224094 24.47452191 9.79812546 7.78579827]\n", + "SAMPLEX: [23.93064945 11.53572583 12.84974356]\n", "\n", "STATS\n", "mean: 9.968101233234014 - 9.968101233234014\n", "variance: 86.33004208146421 - 86.3300420814642\n", - "skewness: 0 - -0.20673265437653562\n", - "kurtosis: 4.2 - 4.4618963343831695\n", + "skewness: 0 - -0.2070203602233847\n", + "kurtosis: 4.2 - 4.47222235760633\n", "median: 9.968101233234014 - 10.246197465\n", - "mode: 9.968101233234014 - 11.147454227535958\n", + "mode: 9.968101233234014 - 11.14999502438944\n", "\n", "\n", "\n", "LOGLOGISTIC DISTRIBUTION\n", - "Parameters: {'alpha': 5.010832444082141, 'beta': 2.879209073094212}\n", - "CDF: 0.662675578413836 [0.66267558 0.66267558]\n", - "PDF: 0.10159213305179349 [0.10159213 0.10159213]\n", - "PPF: 5.010832444082141 [5.01083244 5.01083244] - V: 0.5\n", - "SAMPLE: [ 6.30915248 11.73205687 7.31934438 8.01495271 4.75193072]\n", - "SAMPLEX: [5.88545196 8.63889743 9.95920619]\n", + "Parameters: {'alpha': 5.053376015000118, 'beta': 3.0046102367246204}\n", + "CDF: 0.638516333949057 [0.63851633 0.63851633]\n", + "PDF: 0.11356185556919124 [0.11356186 0.11356186]\n", + "PPF: 5.053376015000118 [5.05337602 5.05337602] - V: 0.5\n", + "SAMPLE: [8.14528757 4.96412757 4.5874738 2.10981304 3.76073363]\n", + "SAMPLEX: [ 2.90726798 7.20791527 15.38181235]\n", "\n", "STATS\n", - "mean: 6.162967909328087 - 6.335222515081093\n", - "variance: 28.93602984273695 - 34.974684211165595\n", - "skewness: -25.074328954907106 - 8.278860484046303\n", - "kurtosis: 101.81615538774054 - 117.66422207812008\n", - "median: 5.010832444082141 - 5.061351935499999\n", - "mode: 3.895698900899288 - 4.342698236137355\n", + "mean: 6.106837333896483 - 6.1068373338869995\n", + "variance: 24.255612465120535 - 22.909391728906094\n", + "skewness: 697.3264603451637 - 5.735740181082208\n", + "kurtosis: -3475.61008478288 - 79.68957786381935\n", + "median: 5.053376015000118 - 5.0533760149999996\n", + "mode: 4.013826120970414 - 4.050079550525053\n", "\n", "\n", "\n", "LOGLOGISTIC_3P DISTRIBUTION\n", - "Parameters: {'loc': 100.12550131594958, 'alpha': 4.848968883084579, 'beta': 2.913915481097609}\n", - "CDF: 0.6419982556668059 [0.64199826 0.64199826]\n", - "PDF: 0.11303141525177084 [0.11303142 0.11303142]\n", - "PPF: 104.97447019903416 [104.9744702 104.9744702] - V: 0.5000000000000003\n", - "SAMPLE: [109.14037426 101.88696254 103.02765363 106.37829041 103.98019095]\n", - "SAMPLEX: [104.55824514 104.03308542 102.86401005]\n", + "Parameters: {'loc': 89.83028706453175, 'alpha': 30.173644637013005, 'beta': 45.49445302648463}\n", + "CDF: 0.5090396539574022 [0.50903965 0.50903965]\n", + "PDF: 0.37651605251490833 [0.37651605 0.37651605]\n", + "PPF: 120.00393170154476 [120.0039317 120.0039317] - V: 0.5000000000000026\n", + "SAMPLE: [118.38931494 118.5043282 119.56106878 120.48313932 119.86568082]\n", + "SAMPLEX: [104.98662325 103.77285512 107.04299512]\n", "\n", "STATS\n", - "mean: 106.05896737509185 - 106.05061621024096\n", - "variance: 25.62451297021216 - 20.583920947987384\n", - "skewness: -35.801863849519776 - 3.599776571383725\n", - "kurtosis: 153.78658367420195 - 25.147270764428715\n", - "median: 104.97447019903416 - 104.9784228\n", - "mode: 103.9188868903957 - 104.14495225904149\n", + "mean: 120.0279256120213 - 120.027925613573\n", + "variance: 1.452234483733264 - 1.4522344838234733\n", + "skewness: 0.19201213341838996 - 0.2793265392726788\n", + "kurtosis: 4.291106770447346 - 4.432098364813366\n", + "median: 120.00393170154476 - 120.00393170000001\n", + "mode: 119.97478422361282 - 120.03973357847885\n", "\n", "\n", "\n", @@ -950,16 +948,16 @@ "CDF: 0.558236657811877 [0.55823666 0.55823666]\n", "PDF: 0.06441241662775471 [0.06441242 0.06441242]\n", "PPF: 20.034129984605062 [20.03412998 20.03412998] - V: 0.5\n", - "SAMPLE: [10.24965769 11.78322014 18.54906622 32.06609433 13.53417449]\n", - "SAMPLEX: [1.42996327e+00 3.22442450e-06 8.93750159e+04]\n", + "SAMPLE: [16.74894187 15.01385317 18.24215765 19.21843661 23.54693495]\n", + "SAMPLEX: [3.57765742e-03 5.14658765e+00 2.05660692e+02]\n", "\n", "STATS\n", "mean: 20.912808590688144 - 20.91280859068814\n", "variance: 39.204438665681884 - 39.20443866568182\n", - "skewness: 0.9250461245114702 - 0.8272771321003696\n", - "kurtosis: 4.559189929998482 - 4.05316995912756\n", + "skewness: 0.9250461245114702 - 0.8284284377254422\n", + "kurtosis: 4.559189929998482 - 4.062167453086232\n", "median: 20.034129984605062 - 20.11002738\n", - "mode: 18.38597802319918 - 18.363331374006787\n", + "mode: 18.38597802319918 - 18.360675962800883\n", "\n", "\n", "\n", @@ -968,16 +966,16 @@ "CDF: 0.5330502005906137 [0.5330502 0.5330502]\n", "PDF: 0.009417476228738763 [0.00941748 0.00941748]\n", "PPF: 192.9039720788454 [192.90397208 192.90397208] - V: 0.4999999999999997\n", - "SAMPLE: [188.60784236 259.95991536 186.06072026 168.62402223 129.97102929]\n", - "SAMPLEX: [292.46766281 212.6315789 197.39644049]\n", + "SAMPLE: [215.92700749 167.91180796 223.74444994 124.78154508 136.47202072]\n", + "SAMPLEX: [134.85771788 217.49929505 230.15548459]\n", "\n", "STATS\n", "mean: 196.38240470834106 - 196.38240470834106\n", "variance: 1654.1191339102268 - 1654.1191339102268\n", - "skewness: 0.4856928280495921 - 0.3960045478645527\n", - "kurtosis: 3.108163842816288 - 2.9200586549630443\n", + "skewness: 0.4856928280495921 - 0.3965556597541719\n", + "kurtosis: 3.108163842816288 - 2.925373069926468\n", "median: 192.9039720788454 - 193.6635328\n", - "mode: 185.41776700245697 - 196.38236410994585\n", + "mode: 185.41776700245697 - 187.6627086318632\n", "\n", "\n", "\n", @@ -986,88 +984,88 @@ "CDF: 0.5962233166147803 [0.59622332 0.59622332]\n", "PDF: 0.020311440998016073 [0.02031144 0.02031144]\n", "PPF: 26.998388739617766 [26.99838874 26.99838874] - V: 0.5\n", - "SAMPLE: [31.37026024 25.08659679 64.10545716 16.93494721 33.30344931]\n", - "SAMPLEX: [14.6425402 40.00416856 21.46517002]\n", + "SAMPLE: [30.29569866 7.38445509 23.3164051 25.42827524 29.11057645]\n", + "SAMPLEX: [16.67007642 12.22142165 30.27945325]\n", "\n", "STATS\n", "mean: 31.364450277548194 - 31.364450277548194\n", "variance: 403.62444294673946 - 403.6244429467394\n", - "skewness: 1.5351415907229 - 1.5092755632460513\n", - "kurtosis: 7 - 6.758208083815601\n", + "skewness: 1.5351415907229 - 1.5113759929307664\n", + "kurtosis: 7 - 6.775998067145582\n", "median: 26.998388739617766 - 26.996639610000003\n", - "mode: 19.875465927996277 - 22.848565125724853\n", + "mode: 19.875465927996277 - 22.839392359141417\n", "\n", "\n", "\n", "NAKAGAMI DISTRIBUTION\n", - "Parameters: {'m': 11.695762015483838, 'omega': 27.849561421370005}\n", - "CDF: 0.509902120162462 [0.50990212 0.50990212]\n", - "PDF: 0.5175428487198692 [0.51754285 0.51754285]\n", - "PPF: 5.20192147555642 [5.20192148 5.20192148] - V: 0.4999999999999996\n", - "SAMPLE: [4.15380665 5.0600118 4.84842221 4.83336752 3.93173481]\n", - "SAMPLEX: [5.66689804 5.10937679 4.70026064]\n", - "\n", - "STATS\n", - "mean: 5.221184153929981 - 5.221038704985634\n", - "variance: 0.5887974521204663 - 0.5905899370815594\n", - "skewness: 0.15010000748278615 - 0.12706189700800025\n", - "kurtosis: 3.0014557219835765 - 3.1314838817837654\n", + "Parameters: {'m': 11.695762015483593, 'omega': 27.849561421369998}\n", + "CDF: 0.5099021201624621 [0.50990212 0.50990212]\n", + "PDF: 0.5175428487198636 [0.51754285 0.51754285]\n", + "PPF: 5.20192147555642 [5.20192148 5.20192148] - V: 0.5000000000000001\n", + "SAMPLE: [4.6128278 5.63091708 4.92053428 4.17891513 5.33960211]\n", + "SAMPLEX: [5.30313366 5.34021094 4.27165094]\n", + "\n", + "STATS\n", + "mean: 5.221184153929982 - 5.221038704985634\n", + "variance: 0.5887974521204539 - 0.5905899370815594\n", + "skewness: 0.15010000748336536 - 0.12723872659881258\n", + "kurtosis: 3.001455721976781 - 3.137485515918959\n", "median: 5.20192147555642 - 5.206188184\n", - "mode: 5.163233286388246 - 5.1972780184517156\n", + "mode: 5.163233286388244 - 5.19724535460786\n", "\n", "\n", "\n", "NON_CENTRAL_CHI_SQUARE DISTRIBUTION\n", - "Parameters: {'lambda': 101.2936270896756, 'n': 54.14907326079708}\n", - "CDF: 0.5163571699508847 [0.51635717 0.51635717]\n", - "PDF: 0.0194514706223633 [0.01945147 0.01945147]\n", - "PPF: 154.60366262556684 [154.60366263 154.60366263] - V: 0.5000000000000016\n", - "SAMPLE: [157.36627868 154.74535767 166.14112559 148.98098506 157.69014206]\n", - "SAMPLEX: [156.1471716 172.50958389 154.77734273]\n", + "Parameters: {'lambda': 102.76165853709863, 'n': 2.806643470455384}\n", + "CDF: 0.5194798746958171 [0.51947987 0.51947987]\n", + "PDF: 0.019474946804417477 [0.01947495 0.01947495]\n", + "PPF: 104.57122357218186 [104.57122357 104.57122357] - V: 0.5\n", + "SAMPLE: [ 79.15747108 87.68371145 115.68707966 99.50842505 103.20803786]\n", + "SAMPLEX: [158.88326326 155.95575006 166.75334505]\n", "\n", "STATS\n", - "mean: 155.44270035047268 - 155.44270035047268\n", - "variance: 513.4726548802965 - 513.4726548802965\n", - "skewness: 0.24616900497555982 - 0.27094063728301465\n", - "kurtosis: 3.083622922188929 - 2.9607464522273044\n", - "median: 154.60366262556684 - 154.21593845\n", - "mode: None - 151.28071442948408\n", + "mean: 105.56830200755401 - 105.56830200755401\n", + "variance: 416.65992108930527 - 416.65992108930527\n", + "skewness: 0.2926211463286474 - 0.2976508943976982\n", + "kurtosis: 3.114425859134797 - 3.1694737006474316\n", + "median: 104.57122357218186 - 104.41960385\n", + "mode: None - 102.05705730812781\n", "\n", "\n", "\n", "NON_CENTRAL_F DISTRIBUTION\n", - "Parameters: {'lambda': 81.49438633555636, 'n1': 12.155317094460031, 'n2': 72.65264181485942}\n", - "CDF: 0.5464234154750901 [0.54642342 0.54642342]\n", - "PDF: 0.19206227157737346 [0.19206227 0.19206227]\n", - "PPF: 7.6851261389435 [7.68512614 7.68512614] - V: 0.5000000000000003\n", - "SAMPLE: [8.26708373 6.73653826 5.45658966 8.74699051 7.31527962]\n", - "SAMPLEX: [ 8.72888372 10.71268749 6.13877989]\n", + "Parameters: {'lambda': 81.6932594725671, 'n1': 12.186227050047805, 'n2': 72.42481904130977}\n", + "CDF: 0.5464805050095478 [0.54648051 0.54648051]\n", + "PDF: 0.19207157096191882 [0.19207157 0.19207157]\n", + "PPF: 7.684856242100601 [7.68485624 7.68485624] - V: 0.5000000000000012\n", + "SAMPLE: [14.68678704 6.43233227 8.99084892 7.76169819 5.734513 ]\n", + "SAMPLEX: [ 9.49181748 6.39754997 11.9362242 ]\n", "\n", "STATS\n", - "mean: 7.9225158928054995 - 7.922515892960148\n", - "variance: 4.408459597498769 - 4.408459597289212\n", - "skewness: 0.7319095052687129 - 0.7319095060077102\n", - "kurtosis: 4.010079268221283 - 3.752783302290046\n", - "median: 7.6851261389435 - 7.6729419435\n", - "mode: None - 7.050399291706432\n", + "mean: 7.922515892818366 - 7.922515892960148\n", + "variance: 4.408459597488502 - 4.408459597289212\n", + "skewness: 0.7329280896610256 - 0.7329280903473634\n", + "kurtosis: 4.013163504498049 - 3.7608044157447154\n", + "median: 7.684856242100601 - 7.6729419435\n", + "mode: None - 7.049783839483549\n", "\n", "\n", "\n", "NON_CENTRAL_T_STUDENT DISTRIBUTION\n", - "Parameters: {'lambda': 8.801411228591236, 'n': 9.716910775552646, 'loc': 474.9600125269121, 'scale': 6.155286148062951}\n", - "CDF: 0.5751886172458607 [0.57518862 0.57518862]\n", - "PDF: 0.025153538852856577 [0.02515354 0.02515354]\n", - "PPF: 530.9667348802338 [530.96673488 530.96673488] - V: 0.5000000000000009\n", - "SAMPLE: [526.95538188 529.95535592 516.0237546 555.41116267 525.50773431]\n", - "SAMPLEX: [522.76819748 525.30675844 525.02081278]\n", + "Parameters: {'lambda': 16.96752285262298, 'n': 10.10573259379949, 'loc': 469.37012335679293, 'scale': 3.508098505684748}\n", + "CDF: 0.5768682121149333 [0.57686821 0.57686821]\n", + "PDF: 0.02505675048505615 [0.02505675 0.02505675]\n", + "PPF: 530.8982874981828 [530.8982875 530.8982875] - V: 0.5000000000000011\n", + "SAMPLE: [520.53716752 548.84675527 525.18144736 544.31934556 541.26296266]\n", + "SAMPLEX: [548.07388867 542.27582212 524.61568981]\n", "\n", "STATS\n", - "mean: 533.8188904323877 - 533.8194365232159\n", - "variance: 278.9470386223637 - 278.9524632976287\n", - "skewness: 1.377344756406952 - 1.4790456595562962\n", - "kurtosis: 7.218960329028366 - 7.203011092186624\n", - "median: 530.9667348802338 - 531.0058693999999\n", - "mode: None - 527.6976856114314\n", + "mean: 533.8192000945157 - 533.8194365232159\n", + "variance: 278.95045583240926 - 278.9524632976287\n", + "skewness: 1.3959919191758585 - 1.4811040188672355\n", + "kurtosis: 7.2349513945769335 - 7.2222468687155\n", + "median: 530.8982874981828 - 531.0058693999999\n", + "mode: None - 527.7056040471647\n", "\n", "\n", "\n", @@ -1076,16 +1074,16 @@ "CDF: 0.5 [0.5 0.5]\n", "PDF: 0.13205305553402363 [0.13205306 0.13205306]\n", "PPF: 5.106023722272475 [5.10602372 5.10602372] - V: 0.5\n", - "SAMPLE: [7.08039428 3.1713372 6.51793981 1.73999344 3.64794224]\n", - "SAMPLEX: [4.46725869 6.31904336 6.86667353]\n", + "SAMPLE: [6.50713663 0.80589854 6.12350315 1.51823548 7.19449171]\n", + "SAMPLEX: [6.82578553 4.81685028 3.11496936]\n", "\n", "STATS\n", "mean: 5.106023722272475 - 5.106023722272475\n", "variance: 9.063227173080705 - 9.126898532318716\n", - "skewness: 0 - -0.012424337381566002\n", - "kurtosis: 3 - 3.0246383411484525\n", + "skewness: 0 - -0.012441628092211993\n", + "kurtosis: 3 - 3.0302926832171004\n", "median: 5.106023722272475 - 5.134499063\n", - "mode: 5.106023722272475 - 5.186998894547505\n", + "mode: 5.106023722272475 - 5.18776468730893\n", "\n", "\n", "\n", @@ -1094,16 +1092,16 @@ "CDF: 0.661536089690643 [0.66153609 0.66153609]\n", "PDF: 0.20791142853375122 [0.20791143 0.20791143]\n", "PPF: 111.0110317114638 [111.01103171 111.01103171] - V: 0.5000000000000009\n", - "SAMPLE: [113.76983354 112.30117199 110.30132436 113.83489601 111.3537989 ]\n", - "SAMPLEX: [110.70051632 110.89173872 110.15192073]\n", + "SAMPLE: [110.16506069 110.80907268 110.70433836 110.5244415 110.17081053]\n", + "SAMPLEX: [109.39623394 111.13684859 109.1669665 ]\n", "\n", "STATS\n", "mean: 111.62792425936091 - 111.628037747415\n", "variance: 3.7824909667454563 - 3.758102598780667\n", - "skewness: 3.4934789755380296 - 3.144104926472922\n", - "kurtosis: 30.374797651094095 - 19.292811755261717\n", + "skewness: 3.4934789755380296 - 3.14504837808538\n", + "kurtosis: 30.374797651094095 - 19.305422406385443\n", "median: 111.0110317114638 - 111.02289545\n", - "mode: 110.0000177 - 110.42366402985029\n", + "mode: 110.0000177 - 110.42369085883588\n", "\n", "\n", "\n", @@ -1112,52 +1110,52 @@ "CDF: 0.6589638213995412 [0.65896382 0.65896382]\n", "PDF: 0.0662323554871668 [0.06623236 0.06623236]\n", "PPF: 20.231167982353718 [20.23116798 20.23116798] - V: 0.5000000000000002\n", - "SAMPLE: [40.98299081 17.65999359 18.38403932 17.59296603 18.16370739]\n", - "SAMPLEX: [19.32102283 27.22489534 21.09680457]\n", + "SAMPLE: [23.50986254 20.40280903 21.58848345 18.8413116 20.93987146]\n", + "SAMPLEX: [19.18118915 31.95276843 21.42777889]\n", "\n", "STATS\n", "mean: 22.150391201496753 - 22.150391201496756\n", "variance: 36.567130565165854 - 36.56713056516584\n", - "skewness: 3.296778302948232 - 3.1915847492381344\n", - "kurtosis: 26.115057256815327 - 22.573375597011502\n", + "skewness: 3.296778302948232 - 3.196026416162208\n", + "kurtosis: 26.115057256815327 - 22.642571396398615\n", "median: 20.231167982353718 - 20.199032019999997\n", - "mode: 17.00130392999638 - 18.55394135020322\n", + "mode: 17.00130392999638 - 18.550758604467447\n", "\n", "\n", "\n", "PERT DISTRIBUTION\n", - "Parameters: {'a': 63.928259677300325, 'b': 513.8311954559779, 'c': 970.0567361}\n", - "CDF: 0.498334375526359 [0.49833438 0.49833438]\n", - "PDF: 0.0020692853331532955 [0.00206929 0.00206929]\n", - "PPF: 514.6361245549442 [514.63612455 514.63612455] - V: 0.49999999999999994\n", - "SAMPLE: [302.35827322 339.96959778 535.55228132 360.70291365 607.89460754]\n", - "SAMPLEX: [409.36047773 261.34949995 549.46085535]\n", + "Parameters: {'a': 64.47870543081501, 'b': 513.5960332646198, 'c': 970.0567361}\n", + "CDF: 0.49855119249085994 [0.49855119 0.49855119]\n", + "PDF: 0.0020705568630174187 [0.00207056 0.00207056]\n", + "PPF: 514.5309164670289 [514.53091647 514.53091647] - V: 0.5000000000000004\n", + "SAMPLE: [775.44937276 401.17251335 598.88285616 264.09115105 613.78756598]\n", + "SAMPLEX: [467.42470601 548.04123889 434.67324951]\n", "\n", "STATS\n", - "mean: 514.8849629335353 - 513.8311954559778\n", - "variance: 29323.25174892053 - 28905.763308114256\n", - "skewness: 0.00615373409550231 - 0.08804631566670111\n", - "kurtosis: 2.333383824591091 - 2.4046762790851752\n", - "median: 514.6361245549442 - 513.7756638000001\n", - "mode: 513.8311954559779 - 513.8311954559778\n", + "mean: 514.8199290982157 - 513.8311954559778\n", + "variance: 29287.41438908912 - 28905.763308114256\n", + "skewness: 0.0071516119320155554 - 0.08816884802564182\n", + "kurtosis: 2.3334015274043014 - 2.4083154888007665\n", + "median: 514.5309164670289 - 513.7756638000001\n", + "mode: 513.5960332646198 - 527.8939460117912\n", "\n", "\n", "\n", "POWER_FUNCTION DISTRIBUTION\n", - "Parameters: {'alpha': 11.92876993101196, 'a': -13.155728186343996, 'b': 99.99886203}\n", - "CDF: 0.3833781472712492 [0.38337815 0.38337815]\n", - "PDF: 0.043798148419377236 [0.04379815 0.04379815]\n", - "PPF: 93.61115104510941 [93.61115105 93.61115105] - V: 0.49999999999999994\n", - "SAMPLE: [86.56776857 94.57976156 80.95678805 98.54954136 82.91014714]\n", - "SAMPLEX: [94.44646407 97.43608605 91.20425501]\n", + "Parameters: {'alpha': 12.004403719733158, 'a': -13.77023160138152, 'b': 99.99886203}\n", + "CDF: 0.38312764368042584 [0.38312764 0.38312764]\n", + "PDF: 0.04378934225602456 [0.04378934 0.04378934]\n", + "PPF: 93.61576889944931 [93.6157689 93.6157689] - V: 0.4999999999999998\n", + "SAMPLE: [99.71763217 98.25699094 67.00346589 89.64134072 89.51190141]\n", + "SAMPLEX: [98.08331875 89.71319672 95.19288221]\n", "\n", "STATS\n", - "mean: 91.24670766263651 - 91.26032318611676\n", - "variance: 65.6013588712267 - 65.61847063835052\n", - "skewness: -1.582106829316464 - -1.5821068293162952\n", - "kurtosis: 6.142204685750648 - 6.002773062359705\n", - "median: 93.61115104510941 - 93.722315805\n", - "mode: 99.99886203 - 97.18269638969412\n", + "mean: 91.2503568248943 - 91.26032318611676\n", + "variance: 65.60601814098663 - 65.61847063835052\n", + "skewness: -1.5843086168681895 - -1.5843086168689535\n", + "kurtosis: 6.154902954556569 - 6.018107570354146\n", + "median: 93.61576889944931 - 93.722315805\n", + "mode: 99.99886203 - 97.18363752489748\n", "\n", "\n", "\n", @@ -1166,16 +1164,16 @@ "CDF: 0.5440618722340037 [0.54406187 0.54406187]\n", "PDF: 0.28495006324504685 [0.28495006 0.28495006]\n", "PPF: 12.39169722189173 [12.39169722 12.39169722] - V: 0.5\n", - "SAMPLE: [12.9036002 11.8221126 13.22509301 12.76989288 11.61290967]\n", - "SAMPLEX: [11.60955018 12.1964632 14.05427595]\n", + "SAMPLE: [13.18976515 11.74738615 13.88800714 14.07362704 15.29727916]\n", + "SAMPLEX: [12.55609372 12.227319 14.74677544]\n", "\n", "STATS\n", "mean: 12.54391396038925 - 12.54391396038925\n", "variance: 1.7260668619273554 - 1.7260668619273551\n", - "skewness: 0.6311 - 0.5073218254407699\n", - "kurtosis: 3.245089300687639 - 2.8547910931382594\n", + "skewness: 0.6311 - 0.5080278554380804\n", + "kurtosis: 3.245089300687639 - 2.8598933616116233\n", "median: 12.39169722189173 - 12.406943909999999\n", - "mode: 12.035922372593731 - 11.839690843831262\n", + "mode: 12.035922372593731 - 11.839658703478348\n", "\n", "\n", "\n", @@ -1184,16 +1182,16 @@ "CDF: 0.5653571196427553 [0.56535712 0.56535712]\n", "PDF: 0.012513976134767898 [0.01251398 0.01251398]\n", "PPF: 44.72394914380329 [44.72394914 44.72394914] - V: 0.5000000000000001\n", - "SAMPLE: [38.29785194 21.76295298 25.92055842 21.8011572 24.37877103]\n", - "SAMPLEX: [75.53637557 41.85718617 20.42058382]\n", + "SAMPLE: [46.50747577 53.2711573 59.34817265 74.93693873 45.38192858]\n", + "SAMPLEX: [28.33042595 76.54259647 97.84258954]\n", "\n", "STATS\n", "mean: 49.703406815392135 - 49.68153353221037\n", "variance: 510.9744979558468 - 513.307326528377\n", - "skewness: 0.5478995808486575 - 0.542015063944278\n", - "kurtosis: 2.1291455314688146 - 2.090861318252458\n", + "skewness: 0.5478995808486575 - 0.5427693758523187\n", + "kurtosis: 2.1291455314688146 - 2.0934804999386873\n", "median: 44.72394914380329 - 44.051035604999996\n", - "mode: 20.01096169 - 27.75195380480532\n", + "mode: 20.01096169 - 27.72650631941694\n", "\n", "\n", "\n", @@ -1202,16 +1200,16 @@ "CDF: 0.5369519643219779 [0.53695196 0.53695196]\n", "PDF: 0.09531188018987888 [0.09531188 0.09531188]\n", "PPF: 7.3539032712781305 [7.35390327 7.35390327] - V: 0.5000000000001998\n", - "SAMPLE: [ 4.70428582 10.85303716 2.04635553 11.14245132 10.93611484]\n", - "SAMPLEX: [ 4.24856309 11.33498881 8.42931688]\n", + "SAMPLE: [ 8.66028643 11.82173219 13.15882898 11.26311947 12.83777484]\n", + "SAMPLEX: [ 5.96550573 3.20599153 11.75332591]\n", "\n", "STATS\n", "mean: 7.73746991667147 - 7.737469916671456\n", "variance: 15.270797722292414 - 15.270797722292532\n", - "skewness: 0.535513413391435 - 0.47539642638354024\n", - "kurtosis: 3.0449645968004773 - 2.823921200528028\n", + "skewness: 0.535513413391435 - 0.47605802641888156\n", + "kurtosis: 3.0449645968004773 - 2.828923129120711\n", "median: 7.3539032712781305 - 7.388576382\n", - "mode: None - 6.735131001340149\n", + "mode: None - 6.734278031771177\n", "\n", "\n", "\n", @@ -1220,16 +1218,16 @@ "CDF: 0.5 [0.5 0.5]\n", "PDF: 0.12699596415382666 [0.12699596 0.12699596]\n", "PPF: 19.968734054921363 [19.96873405 19.96873405] - V: 0.500000000000018\n", - "SAMPLE: [22.18524644 21.51286227 21.83876723 17.86313598 22.7294 ]\n", - "SAMPLEX: [21.51798897 21.20886094 19.24707581]\n", + "SAMPLE: [20.90063496 23.861671 16.73503435 18.8127924 23.03555973]\n", + "SAMPLEX: [19.80845576 21.66803412 19.80652994]\n", "\n", "STATS\n", "mean: 19.96873405492122 - 19.96873405492122\n", "variance: 6.282325226769194 - 6.192034201566578\n", - "skewness: 0 - 0.031956686460610964\n", - "kurtosis: 2 - 2.00098054643763\n", + "skewness: 0 - 0.03200115996465594\n", + "kurtosis: 2 - 2.0033075785516767\n", "median: 19.968734054921363 - 19.972244494999998\n", - "mode: 19.96873405492122 - 20.87820924309529\n", + "mode: 19.96873405492122 - 20.877720869741974\n", "\n", "\n", "\n", @@ -1238,16 +1236,16 @@ "CDF: 0.5029609680983862 [0.50296097 0.50296097]\n", "PDF: 0.0014888568536497518 [0.00148886 0.00148886]\n", "PPF: 525.1213583144618 [525.12135831 525.12135831] - V: 0.5000000000000001\n", - "SAMPLE: [555.72040396 896.9381037 653.21488551 333.10791512 557.01786948]\n", - "SAMPLEX: [825.54142892 785.7923765 756.4213789 ]\n", + "SAMPLE: [607.74417483 803.13791478 748.60185858 947.18797576 821.14623603]\n", + "SAMPLEX: [369.95659416 195.65123568 646.44041063]\n", "\n", "STATS\n", "mean: 527.1101110217002 - 527.1101110216999\n", "variance: 40989.764006058394 - 40989.76400605859\n", - "skewness: 0.053078575015396715 - 0.06301063878848441\n", - "kurtosis: 1.9821852419885513 - 2.019708300108602\n", + "skewness: 0.053078575015396715 - 0.06310526513355216\n", + "kurtosis: 1.9821852419885513 - 2.022285448962272\n", "median: 525.1213583144618 - 526.72550525\n", - "mode: None - 527.1101110216999\n", + "mode: None - 624.029454140954\n", "\n", "\n", "\n", @@ -1256,16 +1254,16 @@ "CDF: 0.554581439834488 [0.55458144 0.55458144]\n", "PDF: 0.001583272941999224 [0.00158327 0.00158327]\n", "PPF: 391.9615904640965 [391.96159046 391.96159046] - V: 0.49999999999999983\n", - "SAMPLE: [315.82611677 877.33402699 532.59843112 573.28307345 298.73225344]\n", - "SAMPLEX: [576.02270391 265.66765863 442.19648875]\n", + "SAMPLE: [354.82681476 608.39883988 190.03015889 263.92051324 405.45249864]\n", + "SAMPLEX: [414.82765559 564.79298555 557.8375039 ]\n", "\n", "STATS\n", "mean: 425.43943252009996 - 425.43943252009996\n", "variance: 39832.27401470548 - 40376.949403879335\n", - "skewness: 0.5491380907398545 - 0.5767759559421999\n", - "kurtosis: 2.4 - 2.455962517770766\n", + "skewness: 0.5491380907398545 - 0.5776421303166096\n", + "kurtosis: 2.4 - 2.460069943638273\n", "median: 391.9615904640965 - 389.55011005\n", - "mode: 183.58060526029988 - 425.43943252009996\n", + "mode: 183.58060526029988 - 251.9296778361436\n", "\n", "\n", "\n", @@ -1274,34 +1272,34 @@ "CDF: 0.5003450512001695 [0.50034505 0.50034505]\n", "PDF: 0.38784200060895446 [0.387842 0.387842]\n", "PPF: 0.0 [0. 0.] - V: 0.5000000000000001\n", - "SAMPLE: [ 1.46994758 1.46994758 -1.46994758 -1.46994758 1.46994758]\n", - "SAMPLEX: [-1.73793238 1.73793238 1.73793238]\n", + "SAMPLE: [ 2.61238295 -2.61238295 2.61238295 -2.61238295 2.61238295]\n", + "SAMPLEX: [-0.34009594 -0.34009594 -0.34009594]\n", "\n", "STATS\n", "mean: 0 - 0.0008896692423539682\n", "variance: 1.2923592574156013 - 1.2923592574156013\n", - "skewness: 0 - -0.14639702541770783\n", - "kurtosis: 4.239439336185757 - 3.669369398586155\n", + "skewness: 0 - -0.14660076333371835\n", + "kurtosis: 4.239439336185757 - 3.67711938245672\n", "median: 0.0 - 0.038670735\n", - "mode: 0 - 0.08145615827299536\n", + "mode: 0 - 0.0810165669000904\n", "\n", "\n", "\n", "T_STUDENT_3P DISTRIBUTION\n", - "Parameters: {'df': 25486.273944939698, 'loc': 100.03221567199674, 'scale': 3.134301835709682}\n", - "CDF: 0.5000003742739596 [0.50000037 0.50000037]\n", - "PDF: 0.39893836711629643 [0.39893837 0.39893837]\n", - "PPF: 100.03221567199674 [100.03221567 100.03221567] - V: 0.5000000000000002\n", - "SAMPLE: [ 92.47890435 92.47890435 107.58552699 107.58552699 92.47890435]\n", - "SAMPLEX: [103.65843718 96.34156282 103.65843718]\n", + "Parameters: {'df': 25486.273957882884, 'loc': 100.03221572098931, 'scale': 3.1343022400192084}\n", + "CDF: 0.5000003680380645 [0.50000037 0.50000037]\n", + "PDF: 0.12728139680388506 [0.1272814 0.1272814]\n", + "PPF: 100.03221572098931 [100.03221572 100.03221572] - V: 0.5\n", + "SAMPLE: [100.89446167 99.09366342 100.6539461 99.89262202 99.84769048]\n", + "SAMPLEX: [103.25897071 102.21983513 100.49792211]\n", "\n", "STATS\n", - "mean: 100.03221567199674 - 100.03221861252\n", - "variance: 9.824618970680689 - 9.825747857222153\n", - "skewness: 0 - 0.02151655063048857\n", - "kurtosis: 3.00023545779364 - 3.3764887312607668\n", - "median: 100.03221567199674 - 100.053145355\n", - "mode: 100.03221567199674 - 100.44909958490997\n", + "mean: 100.03221572098931 - 100.03221861252\n", + "variance: 9.824621505335546 - 9.825747857222153\n", + "skewness: 0 - 0.021523007102159073\n", + "kurtosis: 3.00023545779352 - 3.3779530203765553\n", + "median: 100.03221572098931 - 100.053145355\n", + "mode: 100.03221572098931 - 100.44909860127814\n", "\n", "\n", "\n", @@ -1310,52 +1308,52 @@ "CDF: 0.5039169853440972 [0.50391699 0.50391699]\n", "PDF: 0.004007468628553946 0.004007468628553946\n", "PPF: 175.22261928 [175.22261928 175.22261928] - V: 0.5000000000000001\n", - "SAMPLE: [279.58704493 139.90637463 288.33748868 183.04854919 243.71020654]\n", - "SAMPLEX: [ 51.64622323 127.3363509 87.95875698]\n", + "SAMPLE: [ 71.43400791 111.70475122 103.06446617 148.77945309 218.35045942]\n", + "SAMPLEX: [261.48930833 207.16592401 129.75286293]\n", "\n", "STATS\n", "mean: 175.22261928 - 176.200040616798\n", "variance: 5188.938117569282 - 5222.821456027946\n", - "skewness: 0 - -0.022039110863393257\n", - "kurtosis: 1.8 - 1.7772416854947901\n", + "skewness: 0 - -0.02206978226880755\n", + "kurtosis: 1.8 - 1.7788414740484466\n", "median: 175.22261928 - 177.41602905\n", - "mode: None - 176.200040616798\n", + "mode: None - 261.58252387593154\n", "\n", "\n", "\n", "WEIBULL DISTRIBUTION\n", - "Parameters: {'alpha': 7.233567918626775, 'beta': 9.98138216742396}\n", - "CDF: 0.4645641261206046 [0.46456413 0.46456413]\n", - "PDF: 0.2586858205551503 [0.25868582 0.25868582]\n", - "PPF: 9.488240869415371 [9.48824087 9.48824087] - V: 0.4999999999999998\n", - "SAMPLE: [ 8.78289831 8.32824322 9.89402223 10.18185913 8.66412391]\n", - "SAMPLEX: [9.1015464 7.52217928 9.81223104]\n", + "Parameters: {'alpha': 7.233567918596889, 'beta': 9.981382167429047}\n", + "CDF: 0.4645641261200216 [0.46456413 0.46456413]\n", + "PDF: 0.25868582055391226 [0.25868582 0.25868582]\n", + "PPF: 9.48824086941822 [9.48824087 9.48824087] - V: 0.4999999999999999\n", + "SAMPLE: [11.9335544 9.97833671 8.81095394 10.85469119 11.40031139]\n", + "SAMPLEX: [10.74236557 7.81722627 9.06364129]\n", "\n", "STATS\n", - "mean: 9.352784689558838 - 9.35278468956163\n", - "variance: 2.3233873112538816 - 2.3233873112733456\n", - "skewness: -0.48114069713372914 - -0.38391095518267665\n", - "kurtosis: 3.221123148282632 - 3.079735902598218\n", - "median: 9.488240869415371 - 9.4476757845\n", - "mode: 9.77817722980806 - 9.898588338763938\n", + "mean: 9.352784689561629 - 9.35278468956163\n", + "variance: 2.3233873112730805 - 2.3233873112733456\n", + "skewness: -0.4811406971312325 - -0.38444523665266805\n", + "kurtosis: 3.221123148274552 - 3.085569334461946\n", + "median: 9.48824086941822 - 9.4476757845\n", + "mode: 9.778177229811318 - 9.89838705860386\n", "\n", "\n", "\n", "WEIBULL_3P DISTRIBUTION\n", - "Parameters: {'alpha': 5.27211622859177, 'loc': 99.87804190778495, 'beta': 3.122585507662947}\n", - "CDF: 0.4768583764417561 [0.47685838 0.47685838]\n", - "PDF: 0.6213727228117327 [0.62137272 0.62137272]\n", - "PPF: 102.79092172416556 [102.79092172 102.79092172] - V: 0.500000000000004\n", - "SAMPLE: [102.63836021 102.88597771 102.32951979 103.78966423 102.17223067]\n", - "SAMPLEX: [101.31347295 101.15228661 102.39307462]\n", + "Parameters: {'alpha': 5.275296292928666, 'loc': 99.87645352200698, 'beta': 3.124202203900962}\n", + "CDF: 0.476831443277424 [0.47683144 0.47683144]\n", + "PDF: 0.6213869222985611 [0.62138692 0.62138692]\n", + "PPF: 102.79096359873303 [102.7909636 102.7909636] - V: 0.4999999999999981\n", + "SAMPLE: [103.36169118 103.0562987 102.49194462 102.89163877 102.1172759 ]\n", + "SAMPLEX: [101.12606925 101.67301665 102.88560296]\n", "\n", "STATS\n", - "mean: 102.75386455232292 - 102.75386455231695\n", - "variance: 0.3938224901267482 - 0.39382249013379567\n", - "skewness: -0.29024792193427673 - -0.29024792200227917\n", - "kurtosis: 2.921922802201777 - 2.9362505363680103\n", - "median: 102.79092172416556 - 102.7980368\n", - "mode: 102.87850897977745 - 102.92093979950047\n", + "mean: 102.75386455232012 - 102.75386455231695\n", + "variance: 0.3938224901289793 - 0.39382249013379567\n", + "skewness: -0.290651854416857 - -0.29065185443592256\n", + "kurtosis: 2.9224146479857858 - 2.9416175816229857\n", + "median: 102.79096359873303 - 102.7980368\n", + "mode: 102.87862655639756 - 102.9210142989499\n", "\n", "\n", "\n" @@ -1364,7 +1362,7 @@ ], "source": [ "for id_distribution, distribution_class in phitter.continuous.CONTINUOUS_DISTRIBUTIONS.items():\n", - " data = get_data(f\"../../phitter/continuous/continuous_distributions_sample/sample_{id_distribution}.txt\")\n", + " data = get_data(f\"../../../phitter/continuous/continuous_distributions_sample/sample_{id_distribution}.txt\")\n", " continuous_measures = phitter.continuous.CONTINUOUS_MEASURES(data)\n", " distribution = distribution_class(continuous_measures=continuous_measures)\n", "\n", @@ -1402,7 +1400,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.12.6" } }, "nbformat": 4, diff --git a/tests/phitter_local/fit/test_fit_continuous.ipynb b/tests/phitter_local/fit/test_fit_continuous.ipynb index bb72aef..161fd0c 100644 --- a/tests/phitter_local/fit/test_fit_continuous.ipynb +++ b/tests/phitter_local/fit/test_fit_continuous.ipynb @@ -6,15 +6,22 @@ "metadata": {}, "outputs": [], "source": [ - "import sys\n", - "\n", + "import sys" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ "sys.path.append(\"../../../\")\n", "import phitter" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -27,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -37,100 +44,81 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "phitter_cont = phitter.PHITTER(data)\n", - "phitter_cont.fit(n_workers=4)" + "phi = phitter.PHITTER(data)\n", + "phi.fit(n_workers=1)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'id': 'beta',\n", - " 'parameters': {'alpha': 2.175778100999519,\n", - " 'beta': 35.64422972697963,\n", - " 'A': 10.370162708449998,\n", - " 'B': 181.31819264569893}}" + " 'parameters': {'alpha': 2.175778100999521,\n", + " 'beta': 35.64422972697983,\n", + " 'A': 10.370162708450033,\n", + " 'B': 181.31819264569944}}" ] }, - "execution_count": 5, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "phitter_cont.best_distribution" + "phi.best_distribution" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'beta': {'chi_square': {'test_statistic': 12.777936935651027,\n", + "{'beta': {'chi_square': {'test_statistic': 12.777936935651505,\n", " 'critical_value': 22.362032494826934,\n", - " 'p_value': 0.4651071732045676,\n", + " 'p_value': 0.4651071732045302,\n", " 'rejected': False},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.007345572461153305,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.00734557246115522,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.9997745331059441,\n", + " 'p_value': 0.999774533105943,\n", " 'rejected': False},\n", " 'anderson_darling': {'test_statistic': 0.10356649008099339,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 0.9999579564557265,\n", " 'rejected': False},\n", - " 'sse': 5.178150848523698e-05,\n", - " 'parameters': {'alpha': 2.175778100999519,\n", - " 'beta': 35.64422972697963,\n", - " 'A': 10.370162708449998,\n", - " 'B': 181.31819264569893},\n", - " 'n_test_passed': 3,\n", - " 'n_test_null': 0},\n", - " 'generalized_gamma_4p': {'chi_square': {'test_statistic': 14.367517511786758,\n", - " 'critical_value': 22.362032494826934,\n", - " 'p_value': 0.34848008833569033,\n", - " 'rejected': False},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.0088100721907024,\n", - " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.9956468057050929,\n", - " 'rejected': False},\n", - " 'anderson_darling': {'test_statistic': 0.2711163654626034,\n", - " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.9581491140545149,\n", - " 'rejected': False},\n", - " 'sse': 6.172469746957357e-05,\n", - " 'parameters': {'a': 6.273846909315609,\n", - " 'd': 2.115565224087939,\n", - " 'p': 1.1729825048594196,\n", - " 'loc': 10.163246718160899},\n", + " 'sse': 5.178150848523465e-05,\n", + " 'parameters': {'alpha': 2.175778100999521,\n", + " 'beta': 35.64422972697983,\n", + " 'A': 10.370162708450033,\n", + " 'B': 181.31819264569944},\n", " 'n_test_passed': 3,\n", " 'n_test_null': 0},\n", - " 'chi_square_3p': {'chi_square': {'test_statistic': 14.032328162319153,\n", + " 'chi_square_3p': {'chi_square': {'test_statistic': 14.032328162319619,\n", " 'critical_value': 23.684791304840576,\n", - " 'p_value': 0.4473053542825338,\n", + " 'p_value': 0.44730535428249896,\n", " 'rejected': False},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.011863899605092681,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.011863899605092543,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.9180573074945443,\n", + " 'p_value': 0.918057307494551,\n", " 'rejected': False},\n", " 'anderson_darling': {'test_statistic': 0.3710177502471197,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 0.8769132003647108,\n", " 'rejected': False},\n", - " 'sse': 6.330895360011506e-05,\n", - " 'parameters': {'df': 5.427666780269712,\n", - " 'loc': 9.680108790326306,\n", - " 'scale': 1.9390767884542448},\n", + " 'sse': 6.330895360011566e-05,\n", + " 'parameters': {'df': 5.427666780269736,\n", + " 'loc': 9.680108790326281,\n", + " 'scale': 1.9390767884542408},\n", " 'n_test_passed': 3,\n", " 'n_test_null': 0},\n", " 'gamma_3p': {'chi_square': {'test_statistic': 15.040767799454457,\n", @@ -206,23 +194,42 @@ " 'loc': 4.089126837001704},\n", " 'n_test_passed': 3,\n", " 'n_test_null': 0},\n", - " 'beta_prime_4p': {'chi_square': {'test_statistic': 17.49359220317106,\n", + " 'generalized_gamma_4p': {'chi_square': {'test_statistic': 12.480128411515107,\n", + " 'critical_value': 22.362032494826934,\n", + " 'p_value': 0.48872010444438474,\n", + " 'rejected': False},\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.007053658159405271,\n", + " 'critical_value': 0.02915677208094496,\n", + " 'p_value': 0.9999014588665803,\n", + " 'rejected': False},\n", + " 'anderson_darling': {'test_statistic': None,\n", + " 'critical_value': None,\n", + " 'p_value': None,\n", + " 'rejected': None},\n", + " 'sse': 6.160283895771248e-05,\n", + " 'parameters': {'a': 7.68680056429614,\n", + " 'd': 1.7558512086490556,\n", + " 'p': 1.2618449981466326,\n", + " 'loc': 10.746753057837207},\n", + " 'n_test_passed': 2,\n", + " 'n_test_null': 1},\n", + " 'beta_prime_4p': {'chi_square': {'test_statistic': 17.49371339751891,\n", " 'critical_value': 22.362032494826934,\n", - " 'p_value': 0.1777107726303484,\n", + " 'p_value': 0.17770570608115666,\n", " 'rejected': False},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.016819127945068735,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.016819209669176882,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.5689309795990657,\n", + " 'p_value': 0.5689247127275272,\n", " 'rejected': False},\n", " 'anderson_darling': {'test_statistic': None,\n", " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'sse': 9.515799063987906e-05,\n", - " 'parameters': {'alpha': 2.231611442702672,\n", - " 'beta': 1421691.1596667375,\n", - " 'loc': 10.710662081048575,\n", - " 'scale': 6080108.145993804},\n", + " 'sse': 9.515898908422578e-05,\n", + " 'parameters': {'alpha': 2.2316123115358315,\n", + " 'beta': 1032476.7638728666,\n", + " 'loc': 10.71066455190706,\n", + " 'scale': 4415561.539998108},\n", " 'n_test_passed': 2,\n", " 'n_test_null': 1},\n", " 'inverse_gamma_3p': {'chi_square': {'test_statistic': 33.480546427418616,\n", @@ -243,56 +250,56 @@ " 'beta': 110.811390840395},\n", " 'n_test_passed': 2,\n", " 'n_test_null': 0},\n", - " 'generalized_logistic': {'chi_square': {'test_statistic': 31.0328578137447,\n", + " 'generalized_logistic': {'chi_square': {'test_statistic': 31.013597749042056,\n", " 'critical_value': 23.684791304840576,\n", - " 'p_value': 0.005485095406597695,\n", + " 'p_value': 0.005519264183732608,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.028661560535210885,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.02867801945853262,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.056597036243644094,\n", + " 'p_value': 0.05636630947268784,\n", " 'rejected': False},\n", - " 'anderson_darling': {'test_statistic': 3.540180645752116,\n", + " 'anderson_darling': {'test_statistic': 3.540635142542669,\n", " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.014679135745914063,\n", + " 'p_value': 0.014671528489848207,\n", " 'rejected': True},\n", - " 'sse': 0.0002110031552545248,\n", - " 'parameters': {'c': 2270.502647524526,\n", - " 'loc': -21.264798060542663,\n", - " 'scale': 4.980712092015947},\n", + " 'sse': 0.00021077747477441482,\n", + " 'parameters': {'c': 2352.116965135642,\n", + " 'loc': -21.441555452033054,\n", + " 'scale': 4.980735392699375},\n", " 'n_test_passed': 1,\n", " 'n_test_null': 0},\n", - " 'non_central_f': {'chi_square': {'test_statistic': 34.71903784322476,\n", + " 'non_central_f': {'chi_square': {'test_statistic': 34.7190378434076,\n", " 'critical_value': 23.684791304840576,\n", - " 'p_value': 0.0016174314375395626,\n", + " 'p_value': 0.0016174314374390875,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.026752053356717043,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.026752053356747685,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.08947511124772412,\n", + " 'p_value': 0.08947511124708918,\n", " 'rejected': False},\n", - " 'anderson_darling': {'test_statistic': 3.8008579439588175,\n", + " 'anderson_darling': {'test_statistic': 3.8008579439947425,\n", " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.010917573973185823,\n", + " 'p_value': 0.010917573972742067,\n", " 'rejected': True},\n", - " 'sse': 0.00024828028152567086,\n", - " 'parameters': {'lambda': 160.80540815240118,\n", - " 'n1': 8.992506952029206,\n", - " 'n2': 30.552742339730774},\n", + " 'sse': 0.0002482802815268144,\n", + " 'parameters': {'lambda': 160.8054081491822,\n", + " 'n1': 8.992506951845515,\n", + " 'n2': 30.552742339908647},\n", " 'n_test_passed': 1,\n", " 'n_test_null': 0},\n", - " 'gumbel_right': {'chi_square': {'test_statistic': 34.68963043326703,\n", + " 'gumbel_right': {'chi_square': {'test_statistic': 34.68963043327159,\n", " 'critical_value': 24.995790139728616,\n", - " 'p_value': 0.0027218333371575865,\n", + " 'p_value': 0.0027218333371534786,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.02667666797608398,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.026676667976091917,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.0910486034697221,\n", + " 'p_value': 0.09104860346955534,\n", " 'rejected': False},\n", - " 'anderson_darling': {'test_statistic': 3.8194313897638494,\n", + " 'anderson_darling': {'test_statistic': 3.819431389764759,\n", " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.010690646134851378,\n", + " 'p_value': 0.010690646134840387,\n", " 'rejected': True},\n", - " 'sse': 0.0002505579927223056,\n", - " 'parameters': {'mu': 17.329489393985902, 'sigma': 4.981295970066288},\n", + " 'sse': 0.0002505579927223524,\n", + " 'parameters': {'mu': 17.32948939398601, 'sigma': 4.981295970066274},\n", " 'n_test_passed': 1,\n", " 'n_test_null': 0},\n", " 'generalized_extreme_value': {'chi_square': {'test_statistic': 38.192105113750806,\n", @@ -349,23 +356,23 @@ " 'scale': 107.6883180758189},\n", " 'n_test_passed': 1,\n", " 'n_test_null': 0},\n", - " 'johnson_su': {'chi_square': {'test_statistic': 34.04719725548736,\n", + " 'johnson_su': {'chi_square': {'test_statistic': 34.047197036547686,\n", " 'critical_value': 22.362032494826934,\n", - " 'p_value': 0.0011838486525883596,\n", + " 'p_value': 0.0011838487432873634,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.0347492797490948,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.03474927962134309,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.010646621417771174,\n", + " 'p_value': 0.01064662182683307,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 4.764748088762644,\n", + " 'anderson_darling': {'test_statistic': 4.764748058618352,\n", " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.0037164687879718272,\n", + " 'p_value': 0.0037164689118851513,\n", " 'rejected': True},\n", - " 'sse': 0.00021592108160984098,\n", - " 'parameters': {'xi': 0.8138662217434972,\n", - " 'lambda': 0.5021618907327251,\n", - " 'gamma': -13.267945637211966,\n", - " 'delta': 3.094583710785166},\n", + " 'sse': 0.00021592107965877084,\n", + " 'parameters': {'xi': 0.8138659259283298,\n", + " 'lambda': 0.5021561708094049,\n", + " 'gamma': -13.26798101416236,\n", + " 'delta': 3.0945837319934024},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", " 'erlang_3p': {'chi_square': {'test_statistic': 41.224054124293865,\n", @@ -448,24 +455,6 @@ " 'parameters': {'mu': 16.55126817015228, 'sigma': 2.8759525692299546},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'generalized_gamma': {'chi_square': {'test_statistic': 64.19794120965146,\n", - " 'critical_value': 23.684791304840576,\n", - " 'p_value': 2.1260720739491035e-08,\n", - " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.04285222116050472,\n", - " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.0007007334017719025,\n", - " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 8.877890273275625,\n", - " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 3.881697215635249e-05,\n", - " 'rejected': True},\n", - " 'sse': 0.0004062919800248942,\n", - " 'parameters': {'a': 0.011399363272113666,\n", - " 'd': 20.301355047176205,\n", - " 'p': 0.497534002382584},\n", - " 'n_test_passed': 0,\n", - " 'n_test_null': 0},\n", " 'chi_square': {'chi_square': {'test_statistic': 107.01213587017764,\n", " 'critical_value': 26.29622760486423,\n", " 'p_value': 1.6653345369377348e-15,\n", @@ -599,20 +588,20 @@ " 'parameters': {'alpha': 9.486760490382952, 'loc': 5.066092004789137},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'pert': {'chi_square': {'test_statistic': 277.1692661188242,\n", + " 'pert': {'chi_square': {'test_statistic': 275.45710076503997,\n", " 'critical_value': 23.684791304840576,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.07020788719594862,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.07030162444749499,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 1.076823963330753e-09,\n", + " 'p_value': 1.0171311570772446e-09,\n", " 'rejected': True},\n", " 'anderson_darling': {'test_statistic': None,\n", " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'sse': 0.0009428768998802616,\n", - " 'parameters': {'a': 10.40183141, 'b': 14.714532177253732, 'c': 56.757607},\n", + " 'sse': 0.0009465999424431249,\n", + " 'parameters': {'a': 10.39283141, 'b': 14.71453217725374, 'c': 56.766607},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 1},\n", " 'nakagami': {'chi_square': {'test_statistic': 195.8971625367923,\n", @@ -649,23 +638,23 @@ " 'alpha': 7.080044925240214},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'f_4p': {'chi_square': {'test_statistic': 278.6919100336272,\n", + " 'f_4p': {'chi_square': {'test_statistic': 269.86305035433685,\n", " 'critical_value': 22.362032494826934,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.06394372023527455,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.06316528509155693,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 4.094224226314225e-08,\n", + " 'p_value': 6.283214426527906e-08,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 33.40556918320635,\n", + " 'anderson_darling': {'test_statistic': 32.52470862487644,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 2.7803521773783757e-07,\n", " 'rejected': True},\n", - " 'sse': 0.0015810459296225568,\n", - " 'parameters': {'df1': 169.86955427879388,\n", - " 'df2': 11.75886613123556,\n", - " 'loc': 7.8562580171296945,\n", - " 'scale': 10.157510231696214},\n", + " 'sse': 0.0015515850893428104,\n", + " 'parameters': {'df1': 193.8155293650847,\n", + " 'df2': 11.816652370026668,\n", + " 'loc': 7.769680062619332,\n", + " 'scale': 10.238366153878935},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", " 'rice': {'chi_square': {'test_statistic': 6786.42096833632,\n", @@ -798,22 +787,22 @@ " 'parameters': {'mu': 11.74855659737131, 'sigma': 10.598293634772402},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 1},\n", - " 'loglogistic_3p': {'chi_square': {'test_statistic': 341.8738568842825,\n", + " 'loglogistic_3p': {'chi_square': {'test_statistic': 341.8738568848753,\n", " 'critical_value': 23.684791304840576,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.0927501723420926,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.09275017234215138,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 48.82022529646383,\n", + " 'anderson_darling': {'test_statistic': 48.82022529654387,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 2.7803521773783757e-07,\n", " 'rejected': True},\n", - " 'sse': 0.002235826815654466,\n", - " 'parameters': {'loc': 8.927033880874662,\n", - " 'alpha': 10.017078014123767,\n", - " 'beta': 3.7699942759666256},\n", + " 'sse': 0.0022358268156570282,\n", + " 'parameters': {'loc': 8.9270338808787,\n", + " 'alpha': 10.017078014119727,\n", + " 'beta': 3.7699942759657046},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", " 'hyperbolic_secant': {'chi_square': {'test_statistic': 391.5511060112556,\n", @@ -836,7 +825,7 @@ " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.12306952127487347,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.1250636578515114,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", @@ -844,17 +833,17 @@ " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'sse': 0.00286723714326922,\n", - " 'parameters': {'chi': 0.07368527606078723,\n", - " 'loc': 3.0238074239792145,\n", - " 'scale': 27.72729293676165},\n", + " 'sse': 0.002825221812963957,\n", + " 'parameters': {'chi': 0.08722834477886716,\n", + " 'loc': 2.9553460092932182,\n", + " 'scale': 27.743727182519326},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 2},\n", " 'loggamma': {'chi_square': {'test_statistic': None,\n", " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.12022169842430941,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.12022169834237356,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", @@ -862,10 +851,10 @@ " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'sse': 0.002977928894167068,\n", - " 'parameters': {'c': 4.956084270890284,\n", - " 'mu': 2.2770841228019e-19,\n", - " 'sigma': 13.513553913434826},\n", + " 'sse': 0.002977928892569286,\n", + " 'parameters': {'c': 4.95608427062564,\n", + " 'mu': 2.38154673530424e-19,\n", + " 'sigma': 13.51355391308331},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 2},\n", " 'laplace': {'chi_square': {'test_statistic': 551.8043905699922,\n", @@ -950,22 +939,22 @@ " 'parameters': {'a': 10.402831399999998, 'b': 56.75660701},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'generalized_pareto': {'chi_square': {'test_statistic': 1408.2601113324265,\n", + " 'generalized_pareto': {'chi_square': {'test_statistic': 1408.260109902511,\n", " 'critical_value': 23.684791304840576,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.3484163969771993,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.3484163967675219,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 519.9827045172515,\n", + " 'anderson_darling': {'test_statistic': 519.9827038776352,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 2.7803521773783757e-07,\n", " 'rejected': True},\n", - " 'sse': 0.006362504938162338,\n", - " 'parameters': {'c': -0.6167554068456506,\n", + " 'sse': 0.006362504932753907,\n", + " 'parameters': {'c': -0.6167554064795882,\n", " 'mu': 10.40183141,\n", - " 'sigma': 28.589558488249285},\n", + " 'sigma': 28.589558471280544},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", " 'levy': {'chi_square': {'test_statistic': 1250.8124602320809,\n", @@ -1064,22 +1053,22 @@ " 'parameters': {'c': 87.88192569428135, 'min': 10.40183141, 'max': 56.757607},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'trapezoidal': {'chi_square': {'test_statistic': 8337.392099696759,\n", + " 'trapezoidal': {'chi_square': {'test_statistic': 8337.387315007247,\n", " 'critical_value': 22.362032494826934,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.5969167528555841,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.5969166406262135,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 2355.167420966969,\n", + " 'anderson_darling': {'test_statistic': 2355.1665379161386,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 2.7803521773783757e-07,\n", " 'rejected': True},\n", - " 'sse': 0.017008226002602114,\n", + " 'sse': 0.017008221525564818,\n", " 'parameters': {'a': 10.40183141,\n", - " 'b': 32.77400176520185,\n", - " 'c': 32.77409503864898,\n", + " 'b': 32.774004228230005,\n", + " 'c': 32.77407120939514,\n", " 'd': 56.757607},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", @@ -1162,21 +1151,39 @@ " 'sse': 0.027078663509948635,\n", " 'parameters': {'loc': 15.330952472218815, 'scale': 2.956120645621934},\n", " 'n_test_passed': 0,\n", - " 'n_test_null': 2}}" + " 'n_test_null': 2},\n", + " 'generalized_gamma': {'chi_square': {'test_statistic': 67.02995885479366,\n", + " 'critical_value': 23.684791304840576,\n", + " 'p_value': 6.625780257785152e-09,\n", + " 'rejected': True},\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.043606840576800386,\n", + " 'critical_value': 0.02915677208094496,\n", + " 'p_value': 0.0005283856662181563,\n", + " 'rejected': True},\n", + " 'anderson_darling': {'test_statistic': 9.237392994469701,\n", + " 'critical_value': 2.4923268305268924,\n", + " 'p_value': 2.380666820489541e-05,\n", + " 'rejected': True},\n", + " 'sse': 12.468956912681984,\n", + " 'parameters': {'a': 0.029189792697758087,\n", + " 'd': 18.583491494023377,\n", + " 'p': 0.5423508931200788},\n", + " 'n_test_passed': 0,\n", + " 'n_test_null': 0}}" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "phitter_cont.sorted_distributions_sse" + "phi.sorted_distributions_sse" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -1213,70 +1220,70 @@ " 0\n", " beta\n", " 0.000052\n", - " 'alpha': 2.176, 'beta': 35.64, 'A': 10.37, 'B'...\n", + " alpha: 2.176, beta: 35.64, A: 10.37, B: 181.3\n", " βœ…\n", " βœ…\n", " βœ…\n", " \n", " \n", " 1\n", - " generalized_gamma_4p\n", - " 0.000062\n", - " 'a': 6.274, 'd': 2.116, 'p': 1.173, 'loc': 10.16\n", - " βœ…\n", - " βœ…\n", - " βœ…\n", - " \n", - " \n", - " 2\n", " chi_square_3p\n", " 0.000063\n", - " 'df': 5.428, 'loc': 9.68, 'scale': 1.939\n", + " df: 5.428, loc: 9.68, scale: 1.939\n", " βœ…\n", " βœ…\n", " βœ…\n", " \n", " \n", - " 3\n", + " 2\n", " gamma_3p\n", " 0.000069\n", - " 'alpha': 2.828, 'loc': 9.461, 'beta': 3.799\n", + " alpha: 2.828, loc: 9.461, beta: 3.799\n", " βœ…\n", " βœ…\n", " βœ…\n", " \n", " \n", - " 4\n", + " 3\n", " johnson_sb\n", " 0.000071\n", - " 'xi': 9.37, 'lambda': 61.32, 'gamma': 2.283, '...\n", + " xi: 9.37, lambda: 61.32, gamma: 2.283, delta: ...\n", " βœ…\n", " βœ…\n", " βœ…\n", " \n", " \n", - " 5\n", + " 4\n", " fatigue_life\n", " 0.000129\n", - " 'gamma': 0.5141, 'loc': 7.619, 'scale': 11.12\n", + " gamma: 0.5141, loc: 7.619, scale: 11.12\n", " βœ…\n", " βœ…\n", " βœ…\n", " \n", " \n", - " 6\n", + " 5\n", " inverse_gaussian_3p\n", " 0.000133\n", - " 'mu': 16.12, 'lambda': 102.5, 'loc': 4.089\n", + " mu: 16.12, lambda: 102.5, loc: 4.089\n", + " βœ…\n", " βœ…\n", " βœ…\n", + " \n", + " \n", + " 6\n", + " generalized_gamma_4p\n", + " 0.000062\n", + " a: 7.687, d: 1.756, p: 1.262, loc: 10.75\n", + " βœ…\n", " βœ…\n", + " βœ–οΈ\n", " \n", " \n", " 7\n", " beta_prime_4p\n", " 0.000095\n", - " 'alpha': 2.232, 'beta': 1.422e+06, 'loc': 10.7...\n", + " alpha: 2.232, beta: 1.032e+06, loc: 10.71, sca...\n", " βœ…\n", " βœ…\n", " βœ–οΈ\n", @@ -1285,7 +1292,7 @@ " 8\n", " inverse_gamma_3p\n", " 0.000231\n", - " 'alpha': 7.758, 'loc': 3.852, 'beta': 110.8\n", + " alpha: 7.758, loc: 3.852, beta: 110.8\n", " βœ–οΈ\n", " βœ…\n", " βœ…\n", @@ -1294,7 +1301,7 @@ " 9\n", " generalized_logistic\n", " 0.000211\n", - " 'c': 2271, 'loc': -21.26, 'scale': 4.981\n", + " c: 2352, loc: -21.44, scale: 4.981\n", " βœ–οΈ\n", " βœ…\n", " βœ–οΈ\n", @@ -1303,7 +1310,7 @@ " 10\n", " non_central_f\n", " 0.000248\n", - " 'lambda': 160.8, 'n1': 8.993, 'n2': 30.55\n", + " lambda: 160.8, n1: 8.993, n2: 30.55\n", " βœ–οΈ\n", " βœ…\n", " βœ–οΈ\n", @@ -1312,7 +1319,7 @@ " 11\n", " gumbel_right\n", " 0.000251\n", - " 'mu': 17.33, 'sigma': 4.981\n", + " mu: 17.33, sigma: 4.981\n", " βœ–οΈ\n", " βœ…\n", " βœ–οΈ\n", @@ -1321,7 +1328,7 @@ " 12\n", " generalized_extreme_value\n", " 0.000273\n", - " 'xi': 0.1055, 'mu': 17.11, 'sigma': 4.495\n", + " xi: 0.1055, mu: 17.11, sigma: 4.495\n", " βœ–οΈ\n", " βœ…\n", " βœ–οΈ\n", @@ -1330,7 +1337,7 @@ " 13\n", " frechet\n", " 0.000273\n", - " 'alpha': 9.479, 'loc': -25.5, 'scale': 42.61\n", + " alpha: 9.479, loc: -25.5, scale: 42.61\n", " βœ–οΈ\n", " βœ…\n", " βœ–οΈ\n", @@ -1339,7 +1346,7 @@ " 14\n", " alpha\n", " 0.000301\n", - " 'alpha': 4.49, 'loc': -5.138, 'scale': 107.7\n", + " alpha: 4.49, loc: -5.138, scale: 107.7\n", " βœ–οΈ\n", " βœ…\n", " βœ–οΈ\n", @@ -1348,7 +1355,7 @@ " 15\n", " johnson_su\n", " 0.000216\n", - " 'xi': 0.8139, 'lambda': 0.5022, 'gamma': -13.2...\n", + " xi: 0.8139, lambda: 0.5022, gamma: -13.27, del...\n", " βœ–οΈ\n", " βœ–οΈ\n", " βœ–οΈ\n", @@ -1357,7 +1364,7 @@ " 16\n", " erlang_3p\n", " 0.000248\n", - " 'k': 3, 'beta': 3.799, 'loc': 9.461\n", + " k: 3, beta: 3.799, loc: 9.461\n", " βœ–οΈ\n", " βœ–οΈ\n", " βœ–οΈ\n", @@ -1366,7 +1373,7 @@ " 17\n", " inverse_gaussian\n", " 0.000266\n", - " 'mu': 20.2, 'lambda': 202.1\n", + " mu: 20.2, lambda: 202.1\n", " βœ–οΈ\n", " βœ–οΈ\n", " βœ–οΈ\n", @@ -1375,7 +1382,7 @@ " 18\n", " lognormal\n", " 0.000294\n", - " 'mu': 2.958, 'sigma': 0.3087\n", + " mu: 2.958, sigma: 0.3087\n", " βœ–οΈ\n", " βœ–οΈ\n", " βœ–οΈ\n", @@ -1384,7 +1391,7 @@ " 19\n", " loglogistic\n", " 0.000306\n", - " 'alpha': 18.94, 'beta': 5.086\n", + " alpha: 18.94, beta: 5.086\n", " βœ–οΈ\n", " βœ–οΈ\n", " βœ–οΈ\n", @@ -1396,12 +1403,12 @@ "text/plain": [ " distribution sse \\\n", "0 beta 0.000052 \n", - "1 generalized_gamma_4p 0.000062 \n", - "2 chi_square_3p 0.000063 \n", - "3 gamma_3p 0.000069 \n", - "4 johnson_sb 0.000071 \n", - "5 fatigue_life 0.000129 \n", - "6 inverse_gaussian_3p 0.000133 \n", + "1 chi_square_3p 0.000063 \n", + "2 gamma_3p 0.000069 \n", + "3 johnson_sb 0.000071 \n", + "4 fatigue_life 0.000129 \n", + "5 inverse_gaussian_3p 0.000133 \n", + "6 generalized_gamma_4p 0.000062 \n", "7 beta_prime_4p 0.000095 \n", "8 inverse_gamma_3p 0.000231 \n", "9 generalized_logistic 0.000211 \n", @@ -1417,26 +1424,26 @@ "19 loglogistic 0.000306 \n", "\n", " parameters chi_square \\\n", - "0 'alpha': 2.176, 'beta': 35.64, 'A': 10.37, 'B'... βœ… \n", - "1 'a': 6.274, 'd': 2.116, 'p': 1.173, 'loc': 10.16 βœ… \n", - "2 'df': 5.428, 'loc': 9.68, 'scale': 1.939 βœ… \n", - "3 'alpha': 2.828, 'loc': 9.461, 'beta': 3.799 βœ… \n", - "4 'xi': 9.37, 'lambda': 61.32, 'gamma': 2.283, '... βœ… \n", - "5 'gamma': 0.5141, 'loc': 7.619, 'scale': 11.12 βœ… \n", - "6 'mu': 16.12, 'lambda': 102.5, 'loc': 4.089 βœ… \n", - "7 'alpha': 2.232, 'beta': 1.422e+06, 'loc': 10.7... βœ… \n", - "8 'alpha': 7.758, 'loc': 3.852, 'beta': 110.8 βœ–οΈ \n", - "9 'c': 2271, 'loc': -21.26, 'scale': 4.981 βœ–οΈ \n", - "10 'lambda': 160.8, 'n1': 8.993, 'n2': 30.55 βœ–οΈ \n", - "11 'mu': 17.33, 'sigma': 4.981 βœ–οΈ \n", - "12 'xi': 0.1055, 'mu': 17.11, 'sigma': 4.495 βœ–οΈ \n", - "13 'alpha': 9.479, 'loc': -25.5, 'scale': 42.61 βœ–οΈ \n", - "14 'alpha': 4.49, 'loc': -5.138, 'scale': 107.7 βœ–οΈ \n", - "15 'xi': 0.8139, 'lambda': 0.5022, 'gamma': -13.2... βœ–οΈ \n", - "16 'k': 3, 'beta': 3.799, 'loc': 9.461 βœ–οΈ \n", - "17 'mu': 20.2, 'lambda': 202.1 βœ–οΈ \n", - "18 'mu': 2.958, 'sigma': 0.3087 βœ–οΈ \n", - "19 'alpha': 18.94, 'beta': 5.086 βœ–οΈ \n", + "0 alpha: 2.176, beta: 35.64, A: 10.37, B: 181.3 βœ… \n", + "1 df: 5.428, loc: 9.68, scale: 1.939 βœ… \n", + "2 alpha: 2.828, loc: 9.461, beta: 3.799 βœ… \n", + "3 xi: 9.37, lambda: 61.32, gamma: 2.283, delta: ... βœ… \n", + "4 gamma: 0.5141, loc: 7.619, scale: 11.12 βœ… \n", + "5 mu: 16.12, lambda: 102.5, loc: 4.089 βœ… \n", + "6 a: 7.687, d: 1.756, p: 1.262, loc: 10.75 βœ… \n", + "7 alpha: 2.232, beta: 1.032e+06, loc: 10.71, sca... βœ… \n", + "8 alpha: 7.758, loc: 3.852, beta: 110.8 βœ–οΈ \n", + "9 c: 2352, loc: -21.44, scale: 4.981 βœ–οΈ \n", + "10 lambda: 160.8, n1: 8.993, n2: 30.55 βœ–οΈ \n", + "11 mu: 17.33, sigma: 4.981 βœ–οΈ \n", + "12 xi: 0.1055, mu: 17.11, sigma: 4.495 βœ–οΈ \n", + "13 alpha: 9.479, loc: -25.5, scale: 42.61 βœ–οΈ \n", + "14 alpha: 4.49, loc: -5.138, scale: 107.7 βœ–οΈ \n", + "15 xi: 0.8139, lambda: 0.5022, gamma: -13.27, del... βœ–οΈ \n", + "16 k: 3, beta: 3.799, loc: 9.461 βœ–οΈ \n", + "17 mu: 20.2, lambda: 202.1 βœ–οΈ \n", + "18 mu: 2.958, sigma: 0.3087 βœ–οΈ \n", + "19 alpha: 18.94, beta: 5.086 βœ–οΈ \n", "\n", " kolmogorov_smirnov anderson_darling \n", "0 βœ… βœ… \n", @@ -1445,7 +1452,7 @@ "3 βœ… βœ… \n", "4 βœ… βœ… \n", "5 βœ… βœ… \n", - "6 βœ… βœ… \n", + "6 βœ… βœ–οΈ \n", "7 βœ… βœ–οΈ \n", "8 βœ… βœ… \n", "9 βœ… βœ–οΈ \n", @@ -1461,18 +1468,18 @@ "19 βœ–οΈ βœ–οΈ " ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "phitter_cont.summarize()" + "phi.summarize()" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -1509,31 +1516,22 @@ " 0\n", " beta\n", " 0.000052\n", - " {'alpha': 2.175778100999519, 'beta': 35.644229...\n", + " {'alpha': 2.175778100999521, 'beta': 35.644229...\n", " False\n", " False\n", " False\n", " \n", " \n", " 1\n", - " generalized_gamma_4p\n", - " 0.000062\n", - " {'a': 6.273846909315609, 'd': 2.11556522408793...\n", - " False\n", - " False\n", - " False\n", - " \n", - " \n", - " 2\n", " chi_square_3p\n", " 0.000063\n", - " {'df': 5.427666780269712, 'loc': 9.68010879032...\n", + " {'df': 5.427666780269736, 'loc': 9.68010879032...\n", " False\n", " False\n", " False\n", " \n", " \n", - " 3\n", + " 2\n", " gamma_3p\n", " 0.000069\n", " {'alpha': 2.8280016422950003, 'loc': 9.4610083...\n", @@ -1542,7 +1540,7 @@ " False\n", " \n", " \n", - " 4\n", + " 3\n", " johnson_sb\n", " 0.000071\n", " {'xi': 9.370285793984166, 'lambda': 61.3215907...\n", @@ -1551,7 +1549,7 @@ " False\n", " \n", " \n", - " 5\n", + " 4\n", " fatigue_life\n", " 0.000129\n", " {'gamma': 0.5141141319475797, 'loc': 7.6188878...\n", @@ -1560,7 +1558,7 @@ " False\n", " \n", " \n", - " 6\n", + " 5\n", " inverse_gaussian_3p\n", " 0.000133\n", " {'mu': 16.11564462240979, 'lambda': 102.543906...\n", @@ -1569,10 +1567,19 @@ " False\n", " \n", " \n", + " 6\n", + " generalized_gamma_4p\n", + " 0.000062\n", + " {'a': 7.68680056429614, 'd': 1.755851208649055...\n", + " False\n", + " False\n", + " None\n", + " \n", + " \n", " 7\n", " beta_prime_4p\n", " 0.000095\n", - " {'alpha': 2.231611442702672, 'beta': 1421691.1...\n", + " {'alpha': 2.2316123115358315, 'beta': 1032476....\n", " False\n", " False\n", " None\n", @@ -1590,185 +1597,65 @@ " 9\n", " generalized_logistic\n", " 0.000211\n", - " {'c': 2270.502647524526, 'loc': -21.2647980605...\n", - " True\n", - " False\n", - " True\n", - " \n", - " \n", - " 10\n", - " non_central_f\n", - " 0.000248\n", - " {'lambda': 160.80540815240118, 'n1': 8.9925069...\n", - " True\n", - " False\n", - " True\n", - " \n", - " \n", - " 11\n", - " gumbel_right\n", - " 0.000251\n", - " {'mu': 17.329489393985902, 'sigma': 4.98129597...\n", - " True\n", - " False\n", - " True\n", - " \n", - " \n", - " 12\n", - " generalized_extreme_value\n", - " 0.000273\n", - " {'xi': 0.10549391499263064, 'mu': 17.106033156...\n", - " True\n", - " False\n", - " True\n", - " \n", - " \n", - " 13\n", - " frechet\n", - " 0.000273\n", - " {'alpha': 9.478996012556, 'loc': -25.503552867...\n", - " True\n", - " False\n", - " True\n", - " \n", - " \n", - " 14\n", - " alpha\n", - " 0.000301\n", - " {'alpha': 4.490095442386853, 'loc': -5.1382100...\n", + " {'c': 2352.116965135642, 'loc': -21.4415554520...\n", " True\n", " False\n", " True\n", " \n", - " \n", - " 15\n", - " johnson_su\n", - " 0.000216\n", - " {'xi': 0.8138662217434972, 'lambda': 0.5021618...\n", - " True\n", - " True\n", - " True\n", - " \n", - " \n", - " 16\n", - " erlang_3p\n", - " 0.000248\n", - " {'k': 3, 'beta': 3.7990653615348218, 'loc': 9....\n", - " True\n", - " True\n", - " True\n", - " \n", - " \n", - " 17\n", - " inverse_gaussian\n", - " 0.000266\n", - " {'mu': 20.204771459411493, 'lambda': 202.08246...\n", - " True\n", - " True\n", - " True\n", - " \n", - " \n", - " 18\n", - " lognormal\n", - " 0.000294\n", - " {'mu': 2.9582715148177727, 'sigma': 0.30869814...\n", - " True\n", - " True\n", - " True\n", - " \n", - " \n", - " 19\n", - " loglogistic\n", - " 0.000306\n", - " {'alpha': 18.944111895, 'beta': 5.085779152252...\n", - " True\n", - " True\n", - " True\n", - " \n", " \n", "\n", "" ], "text/plain": [ - " distribution sse \\\n", - "0 beta 0.000052 \n", - "1 generalized_gamma_4p 0.000062 \n", - "2 chi_square_3p 0.000063 \n", - "3 gamma_3p 0.000069 \n", - "4 johnson_sb 0.000071 \n", - "5 fatigue_life 0.000129 \n", - "6 inverse_gaussian_3p 0.000133 \n", - "7 beta_prime_4p 0.000095 \n", - "8 inverse_gamma_3p 0.000231 \n", - "9 generalized_logistic 0.000211 \n", - "10 non_central_f 0.000248 \n", - "11 gumbel_right 0.000251 \n", - "12 generalized_extreme_value 0.000273 \n", - "13 frechet 0.000273 \n", - "14 alpha 0.000301 \n", - "15 johnson_su 0.000216 \n", - "16 erlang_3p 0.000248 \n", - "17 inverse_gaussian 0.000266 \n", - "18 lognormal 0.000294 \n", - "19 loglogistic 0.000306 \n", + " distribution sse \\\n", + "0 beta 0.000052 \n", + "1 chi_square_3p 0.000063 \n", + "2 gamma_3p 0.000069 \n", + "3 johnson_sb 0.000071 \n", + "4 fatigue_life 0.000129 \n", + "5 inverse_gaussian_3p 0.000133 \n", + "6 generalized_gamma_4p 0.000062 \n", + "7 beta_prime_4p 0.000095 \n", + "8 inverse_gamma_3p 0.000231 \n", + "9 generalized_logistic 0.000211 \n", "\n", - " parameters chi_square \\\n", - "0 {'alpha': 2.175778100999519, 'beta': 35.644229... False \n", - "1 {'a': 6.273846909315609, 'd': 2.11556522408793... False \n", - "2 {'df': 5.427666780269712, 'loc': 9.68010879032... False \n", - "3 {'alpha': 2.8280016422950003, 'loc': 9.4610083... False \n", - "4 {'xi': 9.370285793984166, 'lambda': 61.3215907... False \n", - "5 {'gamma': 0.5141141319475797, 'loc': 7.6188878... False \n", - "6 {'mu': 16.11564462240979, 'lambda': 102.543906... False \n", - "7 {'alpha': 2.231611442702672, 'beta': 1421691.1... False \n", - "8 {'alpha': 7.758002769054861, 'loc': 3.85203721... True \n", - "9 {'c': 2270.502647524526, 'loc': -21.2647980605... True \n", - "10 {'lambda': 160.80540815240118, 'n1': 8.9925069... True \n", - "11 {'mu': 17.329489393985902, 'sigma': 4.98129597... True \n", - "12 {'xi': 0.10549391499263064, 'mu': 17.106033156... True \n", - "13 {'alpha': 9.478996012556, 'loc': -25.503552867... True \n", - "14 {'alpha': 4.490095442386853, 'loc': -5.1382100... True \n", - "15 {'xi': 0.8138662217434972, 'lambda': 0.5021618... True \n", - "16 {'k': 3, 'beta': 3.7990653615348218, 'loc': 9.... True \n", - "17 {'mu': 20.204771459411493, 'lambda': 202.08246... True \n", - "18 {'mu': 2.9582715148177727, 'sigma': 0.30869814... True \n", - "19 {'alpha': 18.944111895, 'beta': 5.085779152252... True \n", + " parameters chi_square \\\n", + "0 {'alpha': 2.175778100999521, 'beta': 35.644229... False \n", + "1 {'df': 5.427666780269736, 'loc': 9.68010879032... False \n", + "2 {'alpha': 2.8280016422950003, 'loc': 9.4610083... False \n", + "3 {'xi': 9.370285793984166, 'lambda': 61.3215907... False \n", + "4 {'gamma': 0.5141141319475797, 'loc': 7.6188878... False \n", + "5 {'mu': 16.11564462240979, 'lambda': 102.543906... False \n", + "6 {'a': 7.68680056429614, 'd': 1.755851208649055... False \n", + "7 {'alpha': 2.2316123115358315, 'beta': 1032476.... False \n", + "8 {'alpha': 7.758002769054861, 'loc': 3.85203721... True \n", + "9 {'c': 2352.116965135642, 'loc': -21.4415554520... True \n", "\n", - " kolmogorov_smirnov anderson_darling \n", - "0 False False \n", - "1 False False \n", - "2 False False \n", - "3 False False \n", - "4 False False \n", - "5 False False \n", - "6 False False \n", - "7 False None \n", - "8 False False \n", - "9 False True \n", - "10 False True \n", - "11 False True \n", - "12 False True \n", - "13 False True \n", - "14 False True \n", - "15 True True \n", - "16 True True \n", - "17 True True \n", - "18 True True \n", - "19 True True " + " kolmogorov_smirnov anderson_darling \n", + "0 False False \n", + "1 False False \n", + "2 False False \n", + "3 False False \n", + "4 False False \n", + "5 False False \n", + "6 False None \n", + "7 False None \n", + "8 False False \n", + "9 False True " ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "phitter_cont.summarize_info()" + "phi.summarize_info()" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -1839,24 +1726,6 @@ " \n", " \n", " 1\n", - " generalized_gamma_4p\n", - " 0.000062\n", - " a: 6.274, d: 2.116, p: 1.173, loc: 10.16\n", - " 14.367518\n", - " 22.362032\n", - " 0.348480\n", - " False\n", - " 0.008810\n", - " 0.029157\n", - " 0.995647\n", - " False\n", - " 0.271116\n", - " 2.492327\n", - " 0.958149\n", - " False\n", - " \n", - " \n", - " 2\n", " chi_square_3p\n", " 0.000063\n", " df: 5.428, loc: 9.68, scale: 1.939\n", @@ -1874,7 +1743,7 @@ " False\n", " \n", " \n", - " 3\n", + " 2\n", " gamma_3p\n", " 0.000069\n", " alpha: 2.828, loc: 9.461, beta: 3.799\n", @@ -1892,7 +1761,7 @@ " False\n", " \n", " \n", - " 4\n", + " 3\n", " johnson_sb\n", " 0.000071\n", " xi: 9.37, lambda: 61.32, gamma: 2.283, delta: ...\n", @@ -1910,7 +1779,7 @@ " False\n", " \n", " \n", - " 5\n", + " 4\n", " fatigue_life\n", " 0.000129\n", " gamma: 0.5141, loc: 7.619, scale: 11.12\n", @@ -1928,7 +1797,7 @@ " False\n", " \n", " \n", - " 6\n", + " 5\n", " inverse_gaussian_3p\n", " 0.000133\n", " mu: 16.12, lambda: 102.5, loc: 4.089\n", @@ -1946,17 +1815,35 @@ " False\n", " \n", " \n", - " 7\n", + " 6\n", + " generalized_gamma_4p\n", + " 0.000062\n", + " a: 7.687, d: 1.756, p: 1.262, loc: 10.75\n", + " 12.480128\n", + " 22.362032\n", + " 0.488720\n", + " False\n", + " 0.007054\n", + " 0.029157\n", + " 0.999901\n", + " False\n", + " NaN\n", + " NaN\n", + " NaN\n", + " None\n", + " \n", + " \n", + " 7\n", " beta_prime_4p\n", " 0.000095\n", - " alpha: 2.232, beta: 1.422e+06, loc: 10.71, sca...\n", - " 17.493592\n", + " alpha: 2.232, beta: 1.032e+06, loc: 10.71, sca...\n", + " 17.493713\n", " 22.362032\n", - " 0.177711\n", + " 0.177706\n", " False\n", " 0.016819\n", " 0.029157\n", - " 0.568931\n", + " 0.568925\n", " False\n", " NaN\n", " NaN\n", @@ -1985,18 +1872,18 @@ " 9\n", " generalized_logistic\n", " 0.000211\n", - " c: 2271, loc: -21.26, scale: 4.981\n", - " 31.032858\n", + " c: 2352, loc: -21.44, scale: 4.981\n", + " 31.013598\n", " 23.684791\n", - " 0.005485\n", + " 0.005519\n", " True\n", - " 0.028662\n", + " 0.028678\n", " 0.029157\n", - " 0.056597\n", + " 0.056366\n", " False\n", - " 3.540181\n", + " 3.540635\n", " 2.492327\n", - " 0.014679\n", + " 0.014672\n", " True\n", " \n", " \n", @@ -2097,12 +1984,12 @@ " distribution sse \\\n", " \n", "0 beta 0.000052 \n", - "1 generalized_gamma_4p 0.000062 \n", - "2 chi_square_3p 0.000063 \n", - "3 gamma_3p 0.000069 \n", - "4 johnson_sb 0.000071 \n", - "5 fatigue_life 0.000129 \n", - "6 inverse_gaussian_3p 0.000133 \n", + "1 chi_square_3p 0.000063 \n", + "2 gamma_3p 0.000069 \n", + "3 johnson_sb 0.000071 \n", + "4 fatigue_life 0.000129 \n", + "5 inverse_gaussian_3p 0.000133 \n", + "6 generalized_gamma_4p 0.000062 \n", "7 beta_prime_4p 0.000095 \n", "8 inverse_gamma_3p 0.000231 \n", "9 generalized_logistic 0.000211 \n", @@ -2115,15 +2002,15 @@ " parameters chi_square \\\n", " test_statistic \n", "0 alpha: 2.176, beta: 35.64, A: 10.37, B: 181.3 12.777937 \n", - "1 a: 6.274, d: 2.116, p: 1.173, loc: 10.16 14.367518 \n", - "2 df: 5.428, loc: 9.68, scale: 1.939 14.032328 \n", - "3 alpha: 2.828, loc: 9.461, beta: 3.799 15.040768 \n", - "4 xi: 9.37, lambda: 61.32, gamma: 2.283, delta: ... 16.516062 \n", - "5 gamma: 0.5141, loc: 7.619, scale: 11.12 19.087054 \n", - "6 mu: 16.12, lambda: 102.5, loc: 4.089 21.531715 \n", - "7 alpha: 2.232, beta: 1.422e+06, loc: 10.71, sca... 17.493592 \n", + "1 df: 5.428, loc: 9.68, scale: 1.939 14.032328 \n", + "2 alpha: 2.828, loc: 9.461, beta: 3.799 15.040768 \n", + "3 xi: 9.37, lambda: 61.32, gamma: 2.283, delta: ... 16.516062 \n", + "4 gamma: 0.5141, loc: 7.619, scale: 11.12 19.087054 \n", + "5 mu: 16.12, lambda: 102.5, loc: 4.089 21.531715 \n", + "6 a: 7.687, d: 1.756, p: 1.262, loc: 10.75 12.480128 \n", + "7 alpha: 2.232, beta: 1.032e+06, loc: 10.71, sca... 17.493713 \n", "8 alpha: 7.758, loc: 3.852, beta: 110.8 33.480546 \n", - "9 c: 2271, loc: -21.26, scale: 4.981 31.032858 \n", + "9 c: 2352, loc: -21.44, scale: 4.981 31.013598 \n", "10 lambda: 160.8, n1: 8.993, n2: 30.55 34.719038 \n", "11 mu: 17.33, sigma: 4.981 34.689630 \n", "12 xi: 0.1055, mu: 17.11, sigma: 4.495 38.192105 \n", @@ -2133,15 +2020,15 @@ " kolmogorov_smirnov \\\n", " critical_value p_value rejected test_statistic critical_value \n", "0 22.362032 0.465107 False 0.007346 0.029157 \n", - "1 22.362032 0.348480 False 0.008810 0.029157 \n", - "2 23.684791 0.447305 False 0.011864 0.029157 \n", - "3 23.684791 0.375374 False 0.011760 0.029157 \n", - "4 22.362032 0.222381 False 0.012046 0.029157 \n", - "5 23.684791 0.161649 False 0.017096 0.029157 \n", - "6 23.684791 0.088762 False 0.018768 0.029157 \n", - "7 22.362032 0.177711 False 0.016819 0.029157 \n", + "1 23.684791 0.447305 False 0.011864 0.029157 \n", + "2 23.684791 0.375374 False 0.011760 0.029157 \n", + "3 22.362032 0.222381 False 0.012046 0.029157 \n", + "4 23.684791 0.161649 False 0.017096 0.029157 \n", + "5 23.684791 0.088762 False 0.018768 0.029157 \n", + "6 22.362032 0.488720 False 0.007054 0.029157 \n", + "7 22.362032 0.177706 False 0.016819 0.029157 \n", "8 23.684791 0.002455 True 0.022574 0.029157 \n", - "9 23.684791 0.005485 True 0.028662 0.029157 \n", + "9 23.684791 0.005519 True 0.028678 0.029157 \n", "10 23.684791 0.001617 True 0.026752 0.029157 \n", "11 24.995790 0.002722 True 0.026677 0.029157 \n", "12 23.684791 0.000486 True 0.025198 0.029157 \n", @@ -2151,15 +2038,15 @@ " anderson_darling \n", " p_value rejected test_statistic critical_value p_value rejected \n", "0 0.999775 False 0.103566 2.492327 0.999958 False \n", - "1 0.995647 False 0.271116 2.492327 0.958149 False \n", - "2 0.918057 False 0.371018 2.492327 0.876913 False \n", - "3 0.922981 False 0.560148 2.492327 0.686423 False \n", - "4 0.909036 False 0.296681 2.492327 0.940625 False \n", - "5 0.547818 False 0.993176 2.492327 0.360878 False \n", - "6 0.427542 False 1.774308 2.492327 0.122680 False \n", - "7 0.568931 False NaN NaN NaN None \n", + "1 0.918057 False 0.371018 2.492327 0.876913 False \n", + "2 0.922981 False 0.560148 2.492327 0.686423 False \n", + "3 0.909036 False 0.296681 2.492327 0.940625 False \n", + "4 0.547818 False 0.993176 2.492327 0.360878 False \n", + "5 0.427542 False 1.774308 2.492327 0.122680 False \n", + "6 0.999901 False NaN NaN NaN None \n", + "7 0.568925 False NaN NaN NaN None \n", "8 0.218150 False 2.316964 2.492327 0.061901 False \n", - "9 0.056597 False 3.540181 2.492327 0.014679 True \n", + "9 0.056366 False 3.540635 2.492327 0.014672 True \n", "10 0.089475 False 3.800858 2.492327 0.010918 True \n", "11 0.091049 False 3.819431 2.492327 0.010691 True \n", "12 0.126896 False 2.846564 2.492327 0.032767 True \n", @@ -2167,18 +2054,18 @@ "14 0.058096 False 3.323355 2.492327 0.018816 True " ] }, - "execution_count": 7, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "phitter_cont.df_not_rejected_distributions" + "phi.df_not_rejected_distributions" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -2252,25 +2139,6 @@ " \n", " \n", " 1\n", - " generalized_gamma_4p\n", - " βœ…\n", - " 0.000062\n", - " a: 6.274, d: 2.116, p: 1.173, loc: 10.16\n", - " 14.367518\n", - " 22.362032\n", - " 0.348480\n", - " False\n", - " 0.008810\n", - " 0.029157\n", - " 0.995647\n", - " False\n", - " 0.271116\n", - " 2.492327\n", - " 0.958149\n", - " False\n", - " \n", - " \n", - " 2\n", " chi_square_3p\n", " βœ…\n", " 0.000063\n", @@ -2289,7 +2157,7 @@ " False\n", " \n", " \n", - " 3\n", + " 2\n", " gamma_3p\n", " βœ…\n", " 0.000069\n", @@ -2308,7 +2176,7 @@ " False\n", " \n", " \n", - " 4\n", + " 3\n", " johnson_sb\n", " βœ…\n", " 0.000071\n", @@ -2327,7 +2195,7 @@ " False\n", " \n", " \n", - " 5\n", + " 4\n", " fatigue_life\n", " βœ…\n", " 0.000129\n", @@ -2346,1228 +2214,210 @@ " False\n", " \n", " \n", - " 6\n", + " 5\n", " inverse_gaussian_3p\n", " βœ…\n", " 0.000133\n", " mu: 16.12, lambda: 102.5, loc: 4.089\n", " 21.531715\n", - " 23.684791\n", - " 0.088762\n", - " False\n", - " 0.018768\n", - " 0.029157\n", - " 0.427542\n", - " False\n", - " 1.774308\n", - " 2.492327\n", - " 0.122680\n", - " False\n", - " \n", - " \n", - " 7\n", - " beta_prime_4p\n", - " βœ…\n", - " 0.000095\n", - " alpha: 2.232, beta: 1.422e+06, loc: 10.71, sca...\n", - " 17.493592\n", - " 22.362032\n", - " 0.177711\n", - " False\n", - " 0.016819\n", - " 0.029157\n", - " 0.568931\n", - " False\n", - " NaN\n", - " NaN\n", - " NaN\n", - " None\n", - " \n", - " \n", - " 8\n", - " inverse_gamma_3p\n", - " βœ…\n", - " 0.000231\n", - " alpha: 7.758, loc: 3.852, beta: 110.8\n", - " 33.480546\n", - " 23.684791\n", - " 0.002455\n", - " True\n", - " 0.022574\n", - " 0.029157\n", - " 0.218150\n", - " False\n", - " 2.316964\n", - " 2.492327\n", - " 0.061901\n", - " False\n", - " \n", - " \n", - " 9\n", - " generalized_logistic\n", - " βœ…\n", - " 0.000211\n", - " c: 2271, loc: -21.26, scale: 4.981\n", - " 31.032858\n", - " 23.684791\n", - " 0.005485\n", - " True\n", - " 0.028662\n", - " 0.029157\n", - " 0.056597\n", - " False\n", - " 3.540181\n", - " 2.492327\n", - " 0.014679\n", - " True\n", - " \n", - " \n", - "\n", - "" - ], - "text/plain": [ - " distribution passed sse \\\n", - " \n", - "0 beta βœ… 0.000052 \n", - "1 generalized_gamma_4p βœ… 0.000062 \n", - "2 chi_square_3p βœ… 0.000063 \n", - "3 gamma_3p βœ… 0.000069 \n", - "4 johnson_sb βœ… 0.000071 \n", - "5 fatigue_life βœ… 0.000129 \n", - "6 inverse_gaussian_3p βœ… 0.000133 \n", - "7 beta_prime_4p βœ… 0.000095 \n", - "8 inverse_gamma_3p βœ… 0.000231 \n", - "9 generalized_logistic βœ… 0.000211 \n", - "\n", - " parameters chi_square \\\n", - " test_statistic \n", - "0 alpha: 2.176, beta: 35.64, A: 10.37, B: 181.3 12.777937 \n", - "1 a: 6.274, d: 2.116, p: 1.173, loc: 10.16 14.367518 \n", - "2 df: 5.428, loc: 9.68, scale: 1.939 14.032328 \n", - "3 alpha: 2.828, loc: 9.461, beta: 3.799 15.040768 \n", - "4 xi: 9.37, lambda: 61.32, gamma: 2.283, delta: ... 16.516062 \n", - "5 gamma: 0.5141, loc: 7.619, scale: 11.12 19.087054 \n", - "6 mu: 16.12, lambda: 102.5, loc: 4.089 21.531715 \n", - "7 alpha: 2.232, beta: 1.422e+06, loc: 10.71, sca... 17.493592 \n", - "8 alpha: 7.758, loc: 3.852, beta: 110.8 33.480546 \n", - "9 c: 2271, loc: -21.26, scale: 4.981 31.032858 \n", - "\n", - " kolmogorov_smirnov \\\n", - " critical_value p_value rejected test_statistic critical_value \n", - "0 22.362032 0.465107 False 0.007346 0.029157 \n", - "1 22.362032 0.348480 False 0.008810 0.029157 \n", - "2 23.684791 0.447305 False 0.011864 0.029157 \n", - "3 23.684791 0.375374 False 0.011760 0.029157 \n", - "4 22.362032 0.222381 False 0.012046 0.029157 \n", - "5 23.684791 0.161649 False 0.017096 0.029157 \n", - "6 23.684791 0.088762 False 0.018768 0.029157 \n", - "7 22.362032 0.177711 False 0.016819 0.029157 \n", - "8 23.684791 0.002455 True 0.022574 0.029157 \n", - "9 23.684791 0.005485 True 0.028662 0.029157 \n", - "\n", - " anderson_darling \n", - " p_value rejected test_statistic critical_value p_value rejected \n", - "0 0.999775 False 0.103566 2.492327 0.999958 False \n", - "1 0.995647 False 0.271116 2.492327 0.958149 False \n", - "2 0.918057 False 0.371018 2.492327 0.876913 False \n", - "3 0.922981 False 0.560148 2.492327 0.686423 False \n", - "4 0.909036 False 0.296681 2.492327 0.940625 False \n", - "5 0.547818 False 0.993176 2.492327 0.360878 False \n", - "6 0.427542 False 1.774308 2.492327 0.122680 False \n", - "7 0.568931 False NaN NaN NaN None \n", - "8 0.218150 False 2.316964 2.492327 0.061901 False \n", - "9 0.056597 False 3.540181 2.492327 0.014679 True " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "phitter_cont.df_sorted_distributions_sse.head(10)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "summarize = []\n", - "for id_distribution, info in phitter_cont.sorted_distributions_sse.items():\n", - " summarize.append(\n", - " {\n", - " \"distribution\": id_distribution,\n", - " \"sse\": info[\"sse\"],\n", - " \"parameters\": \", \".join([f\"'{k}': {v:.4g}\" for k, v in info[\"parameters\"].items()]),\n", - " # \"parameters\": info[\"parameters\"],\n", - " \"chi_square\": \"βœ…\" if info[\"chi_square\"][\"rejected\"] == False else \"βœ–οΈ\",\n", - " \"kolmogorov_smirnov\": \"βœ…\" if info[\"kolmogorov_smirnov\"][\"rejected\"] == False else \"βœ–οΈ\",\n", - " \"anderson_darling\": \"βœ…\" if info[\"anderson_darling\"][\"rejected\"] == False else \"βœ–οΈ\",\n", - " }\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [], - "source": [ - "summarize = []\n", - "for id_distribution, info in phitter_cont.sorted_distributions_sse.items():\n", - " summarize.append(\n", - " {\n", - " \"distribution\": id_distribution,\n", - " \"sse\": info[\"sse\"],\n", - " \"parameters\": info[\"parameters\"],\n", - " \"chi_square\": info[\"chi_square\"][\"rejected\"],\n", - " \"kolmogorov_smirnov\": info[\"kolmogorov_smirnov\"][\"rejected\"],\n", - " \"anderson_darling\": info[\"anderson_darling\"][\"rejected\"],\n", - " }\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'distribution': 'beta',\n", - " 'sse': 5.178150848523698e-05,\n", - " 'parameters': {'alpha': 2.175778100999519,\n", - " 'beta': 35.64422972697963,\n", - " 'A': 10.370162708449998,\n", - " 'B': 181.31819264569893},\n", - " 'chi_square': False,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': False},\n", - " {'distribution': 'generalized_gamma_4p',\n", - " 'sse': 6.172469746957357e-05,\n", - " 'parameters': {'a': 6.273846909315609,\n", - " 'd': 2.115565224087939,\n", - " 'p': 1.1729825048594196,\n", - " 'loc': 10.163246718160899},\n", - " 'chi_square': False,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': False},\n", - " {'distribution': 'chi_square_3p',\n", - " 'sse': 6.330895360011506e-05,\n", - " 'parameters': {'df': 5.427666780269712,\n", - " 'loc': 9.680108790326306,\n", - " 'scale': 1.9390767884542448},\n", - " 'chi_square': False,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': False},\n", - " {'distribution': 'gamma_3p',\n", - " 'sse': 6.890205703761247e-05,\n", - " 'parameters': {'alpha': 2.8280016422950003,\n", - " 'loc': 9.461008377804967,\n", - " 'beta': 3.7990653615348218},\n", - " 'chi_square': False,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': False},\n", - " {'distribution': 'johnson_sb',\n", - " 'sse': 7.122972743748936e-05,\n", - " 'parameters': {'xi': 9.370285793984166,\n", - " 'lambda': 61.321590706344494,\n", - " 'gamma': 2.2832017111439042,\n", - " 'delta': 1.3380389157015704},\n", - " 'chi_square': False,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': False},\n", - " {'distribution': 'fatigue_life',\n", - " 'sse': 0.0001289779702568724,\n", - " 'parameters': {'gamma': 0.5141141319475797,\n", - " 'loc': 7.618887806727249,\n", - " 'scale': 11.115332222550894},\n", - " 'chi_square': False,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': False},\n", - " {'distribution': 'inverse_gaussian_3p',\n", - " 'sse': 0.00013306247004036715,\n", - " 'parameters': {'mu': 16.11564462240979,\n", - " 'lambda': 102.54390628233934,\n", - " 'loc': 4.089126837001704},\n", - " 'chi_square': False,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': False},\n", - " {'distribution': 'beta_prime_4p',\n", - " 'sse': 9.515799063987906e-05,\n", - " 'parameters': {'alpha': 2.231611442702672,\n", - " 'beta': 1421691.1596667375,\n", - " 'loc': 10.710662081048575,\n", - " 'scale': 6080108.145993804},\n", - " 'chi_square': False,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': None},\n", - " {'distribution': 'inverse_gamma_3p',\n", - " 'sse': 0.00023085911397116473,\n", - " 'parameters': {'alpha': 7.758002769054861,\n", - " 'loc': 3.8520372177240043,\n", - " 'beta': 110.811390840395},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': False},\n", - " {'distribution': 'generalized_logistic',\n", - " 'sse': 0.0002110031552545248,\n", - " 'parameters': {'c': 2270.502647524526,\n", - " 'loc': -21.264798060542663,\n", - " 'scale': 4.980712092015947},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'non_central_f',\n", - " 'sse': 0.00024828028152567086,\n", - " 'parameters': {'lambda': 160.80540815240118,\n", - " 'n1': 8.992506952029206,\n", - " 'n2': 30.552742339730774},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'gumbel_right',\n", - " 'sse': 0.0002505579927223056,\n", - " 'parameters': {'mu': 17.329489393985902, 'sigma': 4.981295970066288},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'generalized_extreme_value',\n", - " 'sse': 0.0002727429009405155,\n", - " 'parameters': {'xi': 0.10549391499263064,\n", - " 'mu': 17.1060331568264,\n", - " 'sigma': 4.495205248984734},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'frechet',\n", - " 'sse': 0.0002727748976729193,\n", - " 'parameters': {'alpha': 9.478996012556,\n", - " 'loc': -25.503552867172992,\n", - " 'scale': 42.60957998041624},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'alpha',\n", - " 'sse': 0.0003008772267346973,\n", - " 'parameters': {'alpha': 4.490095442386853,\n", - " 'loc': -5.138210026342925,\n", - " 'scale': 107.6883180758189},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': False,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'johnson_su',\n", - " 'sse': 0.00021592108160984098,\n", - " 'parameters': {'xi': 0.8138662217434972,\n", - " 'lambda': 0.5021618907327251,\n", - " 'gamma': -13.267945637211966,\n", - " 'delta': 3.094583710785166},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'erlang_3p',\n", - " 'sse': 0.0002478244078469845,\n", - " 'parameters': {'k': 3, 'beta': 3.7990653615348218, 'loc': 9.461008377804967},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'inverse_gaussian',\n", - " 'sse': 0.00026646940455742323,\n", - " 'parameters': {'mu': 20.204771459411493, 'lambda': 202.08246878322814},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'lognormal',\n", - " 'sse': 0.00029401473334525924,\n", - " 'parameters': {'mu': 2.9582715148177727, 'sigma': 0.3086981456308027},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'loglogistic',\n", - " 'sse': 0.0003057022754124817,\n", - " 'parameters': {'alpha': 18.944111895, 'beta': 5.085779152252433},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'moyal',\n", - " 'sse': 0.00034965616694694374,\n", - " 'parameters': {'mu': 16.55126817015228, 'sigma': 2.8759525692299546},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'generalized_gamma',\n", - " 'sse': 0.0004062919800248942,\n", - " 'parameters': {'a': 0.011399363272113666,\n", - " 'd': 20.301355047176205,\n", - " 'p': 0.497534002382584},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'chi_square',\n", - " 'sse': 0.000493402890909617,\n", - " 'parameters': {'df': 20},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'burr',\n", - " 'sse': 0.0005159198283932439,\n", - " 'parameters': {'A': 16.635379013340874,\n", - " 'B': 7.252211488550277,\n", - " 'C': 0.591610857388996},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'rayleigh',\n", - " 'sse': 0.0005516403344855835,\n", - " 'parameters': {'gamma': 7.982700027202803, 'sigma': 9.75180209678908},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'erlang',\n", - " 'sse': 0.0005890209694131997,\n", - " 'parameters': {'k': 10, 'beta': 2.020129663820351},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'burr_4p',\n", - " 'sse': 0.0005897893689857567,\n", - " 'parameters': {'A': 16.635379013340874,\n", - " 'B': 7.252211488550277,\n", - " 'C': 0.591610857388996,\n", - " 'loc': 0.17158404180103276},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'gamma',\n", - " 'sse': 0.0005908419958456811,\n", - " 'parameters': {'alpha': 10.001720098105688, 'beta': 2.020129663820351},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'non_central_chi_square',\n", - " 'sse': 0.0005909099895452212,\n", - " 'parameters': {'lambda': 0.20335762852248962, 'n': 20.001413830889003},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'maxwell',\n", - " 'sse': 0.0007802104832128493,\n", - " 'parameters': {'alpha': 9.486760490382952, 'loc': 5.066092004789137},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'pert',\n", - " 'sse': 0.0009428768998802616,\n", - " 'parameters': {'a': 10.40183141, 'b': 14.714532177253732, 'c': 56.757607},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': None},\n", - " {'distribution': 'nakagami',\n", - " 'sse': 0.0011023058617072325,\n", - " 'parameters': {'m': 2.0539587622175457, 'omega': 449.03013397419807},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'generalized_normal',\n", - " 'sse': 0.0014525409555299768,\n", - " 'parameters': {'beta': 1.4214183149383268,\n", - " 'mu': 19.448651174341528,\n", - " 'alpha': 7.080044925240214},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'f_4p',\n", - " 'sse': 0.0015810459296225568,\n", - " 'parameters': {'df1': 169.86955427879388,\n", - " 'df2': 11.75886613123556,\n", - " 'loc': 7.8562580171296945,\n", - " 'scale': 10.157510231696214},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'rice',\n", - " 'sse': 0.0016385774943857845,\n", - " 'parameters': {'v': 18.99990031081072, 'sigma': 6.635240616689415},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'folded_normal',\n", - " 'sse': 0.0017481155480779877,\n", - " 'parameters': {'mu': 20.20200167441504, 'sigma': 6.3975132864113675},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'normal',\n", - " 'sse': 0.0017508439769282342,\n", - " 'parameters': {'mu': 20.204771459411493, 'sigma': 6.388760300392241},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 't_student_3p',\n", - " 'sse': 0.0017604260234717402,\n", - " 'parameters': {'df': 16.14251302665636,\n", - " 'loc': 20.16944456733963,\n", - " 'scale': 6.39344736578904},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'weibull',\n", - " 'sse': 0.0018041120977567411,\n", - " 'parameters': {'alpha': 3.5031740407808845, 'beta': 22.454975012344264},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'cauchy',\n", - " 'sse': 0.0020410000975140184,\n", - " 'parameters': {'x0': 18.396186986547832, 'gamma': 3.4769181429799687},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'logistic',\n", - " 'sse': 0.0020725859200492786,\n", - " 'parameters': {'mu': 20.204771459411493, 'sigma': 3.522308159529851},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'half_normal',\n", - " 'sse': 0.002082465286351326,\n", - " 'parameters': {'mu': 11.74855659737131, 'sigma': 10.598293634772402},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': None},\n", - " {'distribution': 'loglogistic_3p',\n", - " 'sse': 0.002235826815654466,\n", - " 'parameters': {'loc': 8.927033880874662,\n", - " 'alpha': 10.017078014123767,\n", - " 'beta': 3.7699942759666256},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'hyperbolic_secant',\n", - " 'sse': 0.0025566114557647674,\n", - " 'parameters': {'mu': 20.204771459411493, 'sigma': 6.388760300392241},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'argus',\n", - " 'sse': 0.00286723714326922,\n", - " 'parameters': {'chi': 0.07368527606078723,\n", - " 'loc': 3.0238074239792145,\n", - " 'scale': 27.72729293676165},\n", - " 'chi_square': None,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': None},\n", - " {'distribution': 'loggamma',\n", - " 'sse': 0.002977928894167068,\n", - " 'parameters': {'c': 4.956084270890284,\n", - " 'mu': 2.2770841228019e-19,\n", - " 'sigma': 13.513553913434826},\n", - " 'chi_square': None,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': None},\n", - " {'distribution': 'laplace',\n", - " 'sse': 0.003765106320289124,\n", - " 'parameters': {'mu': 20.204771459411493, 'b': 4.5175357317827585},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'inverse_gamma',\n", - " 'sse': 0.004286526770000391,\n", - " 'parameters': {'alpha': 7.758002769054861, 'beta': 110.811390840395},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'pareto_first_kind',\n", - " 'sse': 0.0048727754482138464,\n", - " 'parameters': {'xm': 536870911.99999994,\n", - " 'alpha': 54771904.095587015,\n", - " 'loc': -536870901.59716856},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'gumbel_left',\n", - " 'sse': 0.005251245484719215,\n", - " 'parameters': {'mu': 23.08005352483598, 'sigma': 4.98129597006453},\n", - " 'chi_square': None,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': None},\n", - " {'distribution': 'reciprocal',\n", - " 'sse': 0.0056579413802510786,\n", - " 'parameters': {'a': 10.402831399999998, 'b': 56.75660701},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'generalized_pareto',\n", - " 'sse': 0.006362504938162338,\n", - " 'parameters': {'c': -0.6167554068456506,\n", - " 'mu': 10.40183141,\n", - " 'sigma': 28.589558488249285},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'levy',\n", - " 'sse': 0.006578041801354057,\n", - " 'parameters': {'mu': 10.24486341578697, 'c': 5.7306175233485845},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'exponential',\n", - " 'sse': 0.008479588006810765,\n", - " 'parameters': {'lambda': 0.04949325964952672},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'semicircular',\n", - " 'sse': 0.010573102670266758,\n", - " 'parameters': {'loc': 20.204771459411493, 'R': 36.56183554058851},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'uniform',\n", - " 'sse': 0.011500590315016561,\n", - " 'parameters': {'a': 10.402831399999998, 'b': 56.75660701},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'arcsine',\n", - " 'sse': 0.01245415824731023,\n", - " 'parameters': {'a': 10.40183141, 'b': 56.757607},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'bradford',\n", - " 'sse': 0.013796259756425618,\n", - " 'parameters': {'c': 87.88192569428135, 'min': 10.40183141, 'max': 56.757607},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'trapezoidal',\n", - " 'sse': 0.017008226002602114,\n", - " 'parameters': {'a': 10.40183141,\n", - " 'b': 32.77400176520185,\n", - " 'c': 32.77409503864898,\n", - " 'd': 56.757607},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'error_function',\n", - " 'sse': 0.018216954044066022,\n", - " 'parameters': {'h': 0.11067981078318657},\n", - " 'chi_square': None,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': None},\n", - " {'distribution': 't_student',\n", - " 'sse': 0.019738442301172034,\n", - " 'parameters': {'df': 2.050230737181933},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'f',\n", - " 'sse': 0.01987781198871016,\n", - " 'parameters': {'df1': 5.793652465881418, 'df2': 33.28791967557436},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'exponential_2p',\n", - " 'sse': 0.02672254309484221,\n", - " 'parameters': {'lambda': 0.24340656915041212, 'loc': 10.40273141},\n", - " 'chi_square': True,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': True},\n", - " {'distribution': 'gibrat',\n", - " 'sse': 0.027078663509948635,\n", - " 'parameters': {'loc': 15.330952472218815, 'scale': 2.956120645621934},\n", - " 'chi_square': None,\n", - " 'kolmogorov_smirnov': True,\n", - " 'anderson_darling': None}]" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "summarize " - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
distributionsseparameterschi_squarekolmogorov_smirnovanderson_darling
0beta0.000052{'alpha': 2.175778100999519, 'beta': 35.644229...FalseFalseFalse
1generalized_gamma_4p0.000062{'a': 6.273846909315609, 'd': 2.11556522408793...FalseFalseFalse
2chi_square_3p0.000063{'df': 5.427666780269712, 'loc': 9.68010879032...FalseFalseFalse
3gamma_3p0.000069{'alpha': 2.8280016422950003, 'loc': 9.4610083...FalseFalseFalse
4johnson_sb0.000071{'xi': 9.370285793984166, 'lambda': 61.3215907...FalseFalseFalse
.....................
58trapezoidal0.017008{'a': 10.40183141, 'b': 32.77400176520185, 'c'...TrueTrueTrue
59error_function0.018217{'h': 0.11067981078318657}NoneTrueNone
60t_student0.019738{'df': 2.050230737181933}TrueTrueTrue
61f0.019878{'df1': 5.793652465881418, 'df2': 33.287919675...TrueTrueTrue
62exponential_2p0.026723{'lambda': 0.24340656915041212, 'loc': 10.4027...TrueTrueTrue
\n", - "

63 rows Γ— 6 columns

\n", - "
" - ], - "text/plain": [ - " distribution sse \\\n", - "0 beta 0.000052 \n", - "1 generalized_gamma_4p 0.000062 \n", - "2 chi_square_3p 0.000063 \n", - "3 gamma_3p 0.000069 \n", - "4 johnson_sb 0.000071 \n", - ".. ... ... \n", - "58 trapezoidal 0.017008 \n", - "59 error_function 0.018217 \n", - "60 t_student 0.019738 \n", - "61 f 0.019878 \n", - "62 exponential_2p 0.026723 \n", - "\n", - " parameters chi_square \\\n", - "0 {'alpha': 2.175778100999519, 'beta': 35.644229... False \n", - "1 {'a': 6.273846909315609, 'd': 2.11556522408793... False \n", - "2 {'df': 5.427666780269712, 'loc': 9.68010879032... False \n", - "3 {'alpha': 2.8280016422950003, 'loc': 9.4610083... False \n", - "4 {'xi': 9.370285793984166, 'lambda': 61.3215907... False \n", - ".. ... ... \n", - "58 {'a': 10.40183141, 'b': 32.77400176520185, 'c'... True \n", - "59 {'h': 0.11067981078318657} None \n", - "60 {'df': 2.050230737181933} True \n", - "61 {'df1': 5.793652465881418, 'df2': 33.287919675... True \n", - "62 {'lambda': 0.24340656915041212, 'loc': 10.4027... True \n", - "\n", - " kolmogorov_smirnov anderson_darling \n", - "0 False False \n", - "1 False False \n", - "2 False False \n", - "3 False False \n", - "4 False False \n", - ".. ... ... \n", - "58 True True \n", - "59 True None \n", - "60 True True \n", - "61 True True \n", - "62 True True \n", - "\n", - "[63 rows x 6 columns]" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas\n", - "df = pandas.DataFrame(summarize)\n", - "df.head(-1)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'alpha': 2.175778100999519,\n", - " 'beta': 35.64422972697963,\n", - " 'A': 10.370162708449998,\n", - " 'B': 181.31819264569893}" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.loc[0, \"parameters\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
distributionsseparameterschi_squarekolmogorov_smirnovanderson_darling
0beta0.000052alpha: 2.176, beta: 35.64, A: 10.37, B: 181.3βœ…βœ…βœ…
1generalized_gamma_4p0.000062a: 6.274, d: 2.116, p: 1.173, loc: 10.16βœ…βœ…βœ…
2chi_square_3p0.000063df: 5.428, loc: 9.68, scale: 1.939βœ…βœ…βœ…
3gamma_3p0.000069alpha: 2.828, loc: 9.461, beta: 3.799βœ…βœ…βœ…
4johnson_sb0.000071xi: 9.37, lambda: 61.32, gamma: 2.283, delta: ...βœ…βœ…βœ…
5fatigue_life0.000129gamma: 0.5141, loc: 7.619, scale: 11.12βœ…βœ…βœ…23.6847910.088762False0.0187680.0291570.427542False1.7743082.4923270.122680False
6inverse_gaussian_3p0.000133mu: 16.12, lambda: 102.5, loc: 4.089βœ…βœ…generalized_gamma_4pβœ…0.000062a: 7.687, d: 1.756, p: 1.262, loc: 10.7512.48012822.3620320.488720False0.0070540.0291570.999901FalseNaNNaNNaNNone
7beta_prime_4p0.000095alpha: 2.232, beta: 1.422e+06, loc: 10.71, sca...βœ…βœ…βœ–οΈ0.000095alpha: 2.232, beta: 1.032e+06, loc: 10.71, sca...17.49371322.3620320.177706False0.0168190.0291570.568925FalseNaNNaNNaNNone
8inverse_gamma_3pβœ…0.000231alpha: 7.758, loc: 3.852, beta: 110.8βœ–οΈβœ…βœ…33.48054623.6847910.002455True0.0225740.0291570.218150False2.3169642.4923270.061901False
9generalized_logistic0.000211c: 2271, loc: -21.26, scale: 4.981βœ–οΈβœ…βœ–οΈ
10non_central_f0.000248lambda: 160.8, n1: 8.993, n2: 30.55βœ–οΈβœ…βœ–οΈ
11gumbel_right0.000251mu: 17.33, sigma: 4.981βœ–οΈβœ…βœ–οΈ
12generalized_extreme_value0.000273xi: 0.1055, mu: 17.11, sigma: 4.495βœ–οΈβœ…βœ–οΈ
13frechet0.000273alpha: 9.479, loc: -25.5, scale: 42.61βœ–οΈβœ…βœ–οΈ
14alpha0.000301alpha: 4.49, loc: -5.138, scale: 107.7βœ–οΈβœ…βœ–οΈ
15johnson_su0.000216xi: 0.8139, lambda: 0.5022, gamma: -13.27, del...βœ–οΈβœ–οΈβœ–οΈ
16erlang_3p0.000248k: 3, beta: 3.799, loc: 9.461βœ–οΈβœ–οΈβœ–οΈ
17inverse_gaussian0.000266mu: 20.2, lambda: 202.1βœ–οΈβœ–οΈβœ–οΈ
18lognormal0.000294mu: 2.958, sigma: 0.3087βœ–οΈβœ–οΈβœ–οΈ
19loglogistic0.000306alpha: 18.94, beta: 5.086βœ–οΈβœ–οΈβœ–οΈ0.000211c: 2352, loc: -21.44, scale: 4.98131.01359823.6847910.005519True0.0286780.0291570.056366False3.5406352.4923270.014672True
\n", "
" ], "text/plain": [ - " distribution sse \\\n", - "0 beta 0.000052 \n", - "1 generalized_gamma_4p 0.000062 \n", - "2 chi_square_3p 0.000063 \n", - "3 gamma_3p 0.000069 \n", - "4 johnson_sb 0.000071 \n", - "5 fatigue_life 0.000129 \n", - "6 inverse_gaussian_3p 0.000133 \n", - "7 beta_prime_4p 0.000095 \n", - "8 inverse_gamma_3p 0.000231 \n", - "9 generalized_logistic 0.000211 \n", - "10 non_central_f 0.000248 \n", - "11 gumbel_right 0.000251 \n", - "12 generalized_extreme_value 0.000273 \n", - "13 frechet 0.000273 \n", - "14 alpha 0.000301 \n", - "15 johnson_su 0.000216 \n", - "16 erlang_3p 0.000248 \n", - "17 inverse_gaussian 0.000266 \n", - "18 lognormal 0.000294 \n", - "19 loglogistic 0.000306 \n", + " distribution passed sse \\\n", + " \n", + "0 beta βœ… 0.000052 \n", + "1 chi_square_3p βœ… 0.000063 \n", + "2 gamma_3p βœ… 0.000069 \n", + "3 johnson_sb βœ… 0.000071 \n", + "4 fatigue_life βœ… 0.000129 \n", + "5 inverse_gaussian_3p βœ… 0.000133 \n", + "6 generalized_gamma_4p βœ… 0.000062 \n", + "7 beta_prime_4p βœ… 0.000095 \n", + "8 inverse_gamma_3p βœ… 0.000231 \n", + "9 generalized_logistic βœ… 0.000211 \n", "\n", - " parameters chi_square \\\n", - "0 alpha: 2.176, beta: 35.64, A: 10.37, B: 181.3 βœ… \n", - "1 a: 6.274, d: 2.116, p: 1.173, loc: 10.16 βœ… \n", - "2 df: 5.428, loc: 9.68, scale: 1.939 βœ… \n", - "3 alpha: 2.828, loc: 9.461, beta: 3.799 βœ… \n", - "4 xi: 9.37, lambda: 61.32, gamma: 2.283, delta: ... βœ… \n", - "5 gamma: 0.5141, loc: 7.619, scale: 11.12 βœ… \n", - "6 mu: 16.12, lambda: 102.5, loc: 4.089 βœ… \n", - "7 alpha: 2.232, beta: 1.422e+06, loc: 10.71, sca... βœ… \n", - "8 alpha: 7.758, loc: 3.852, beta: 110.8 βœ–οΈ \n", - "9 c: 2271, loc: -21.26, scale: 4.981 βœ–οΈ \n", - "10 lambda: 160.8, n1: 8.993, n2: 30.55 βœ–οΈ \n", - "11 mu: 17.33, sigma: 4.981 βœ–οΈ \n", - "12 xi: 0.1055, mu: 17.11, sigma: 4.495 βœ–οΈ \n", - "13 alpha: 9.479, loc: -25.5, scale: 42.61 βœ–οΈ \n", - "14 alpha: 4.49, loc: -5.138, scale: 107.7 βœ–οΈ \n", - "15 xi: 0.8139, lambda: 0.5022, gamma: -13.27, del... βœ–οΈ \n", - "16 k: 3, beta: 3.799, loc: 9.461 βœ–οΈ \n", - "17 mu: 20.2, lambda: 202.1 βœ–οΈ \n", - "18 mu: 2.958, sigma: 0.3087 βœ–οΈ \n", - "19 alpha: 18.94, beta: 5.086 βœ–οΈ \n", + " parameters chi_square \\\n", + " test_statistic \n", + "0 alpha: 2.176, beta: 35.64, A: 10.37, B: 181.3 12.777937 \n", + "1 df: 5.428, loc: 9.68, scale: 1.939 14.032328 \n", + "2 alpha: 2.828, loc: 9.461, beta: 3.799 15.040768 \n", + "3 xi: 9.37, lambda: 61.32, gamma: 2.283, delta: ... 16.516062 \n", + "4 gamma: 0.5141, loc: 7.619, scale: 11.12 19.087054 \n", + "5 mu: 16.12, lambda: 102.5, loc: 4.089 21.531715 \n", + "6 a: 7.687, d: 1.756, p: 1.262, loc: 10.75 12.480128 \n", + "7 alpha: 2.232, beta: 1.032e+06, loc: 10.71, sca... 17.493713 \n", + "8 alpha: 7.758, loc: 3.852, beta: 110.8 33.480546 \n", + "9 c: 2352, loc: -21.44, scale: 4.981 31.013598 \n", "\n", - " kolmogorov_smirnov anderson_darling \n", - "0 βœ… βœ… \n", - "1 βœ… βœ… \n", - "2 βœ… βœ… \n", - "3 βœ… βœ… \n", - "4 βœ… βœ… \n", - "5 βœ… βœ… \n", - "6 βœ… βœ… \n", - "7 βœ… βœ–οΈ \n", - "8 βœ… βœ… \n", - "9 βœ… βœ–οΈ \n", - "10 βœ… βœ–οΈ \n", - "11 βœ… βœ–οΈ \n", - "12 βœ… βœ–οΈ \n", - "13 βœ… βœ–οΈ \n", - "14 βœ… βœ–οΈ \n", - "15 βœ–οΈ βœ–οΈ \n", - "16 βœ–οΈ βœ–οΈ \n", - "17 βœ–οΈ βœ–οΈ \n", - "18 βœ–οΈ βœ–οΈ \n", - "19 βœ–οΈ βœ–οΈ " + " kolmogorov_smirnov \\\n", + " critical_value p_value rejected test_statistic critical_value \n", + "0 22.362032 0.465107 False 0.007346 0.029157 \n", + "1 23.684791 0.447305 False 0.011864 0.029157 \n", + "2 23.684791 0.375374 False 0.011760 0.029157 \n", + "3 22.362032 0.222381 False 0.012046 0.029157 \n", + "4 23.684791 0.161649 False 0.017096 0.029157 \n", + "5 23.684791 0.088762 False 0.018768 0.029157 \n", + "6 22.362032 0.488720 False 0.007054 0.029157 \n", + "7 22.362032 0.177706 False 0.016819 0.029157 \n", + "8 23.684791 0.002455 True 0.022574 0.029157 \n", + "9 23.684791 0.005519 True 0.028678 0.029157 \n", + "\n", + " anderson_darling \n", + " p_value rejected test_statistic critical_value p_value rejected \n", + "0 0.999775 False 0.103566 2.492327 0.999958 False \n", + "1 0.918057 False 0.371018 2.492327 0.876913 False \n", + "2 0.922981 False 0.560148 2.492327 0.686423 False \n", + "3 0.909036 False 0.296681 2.492327 0.940625 False \n", + "4 0.547818 False 0.993176 2.492327 0.360878 False \n", + "5 0.427542 False 1.774308 2.492327 0.122680 False \n", + "6 0.999901 False NaN NaN NaN None \n", + "7 0.568925 False NaN NaN NaN None \n", + "8 0.218150 False 2.316964 2.492327 0.061901 False \n", + "9 0.056366 False 3.540635 2.492327 0.014672 True " ] }, - "execution_count": 32, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df.head(20)" + "phi.df_sorted_distributions_sse.head(10)" ] }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'beta': {'chi_square': {'test_statistic': 12.777936935651027,\n", + "{'beta': {'chi_square': {'test_statistic': 12.777936935651505,\n", " 'critical_value': 22.362032494826934,\n", - " 'p_value': 0.4651071732045676,\n", + " 'p_value': 0.4651071732045302,\n", " 'rejected': False},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.007345572461153305,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.00734557246115522,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.9997745331059441,\n", + " 'p_value': 0.999774533105943,\n", " 'rejected': False},\n", " 'anderson_darling': {'test_statistic': 0.10356649008099339,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 0.9999579564557265,\n", " 'rejected': False},\n", - " 'sse': 5.178150848523698e-05,\n", - " 'parameters': {'alpha': 2.175778100999519,\n", - " 'beta': 35.64422972697963,\n", - " 'A': 10.370162708449998,\n", - " 'B': 181.31819264569893},\n", - " 'n_test_passed': 3,\n", - " 'n_test_null': 0},\n", - " 'generalized_gamma_4p': {'chi_square': {'test_statistic': 14.367517511786758,\n", - " 'critical_value': 22.362032494826934,\n", - " 'p_value': 0.34848008833569033,\n", - " 'rejected': False},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.0088100721907024,\n", - " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.9956468057050929,\n", - " 'rejected': False},\n", - " 'anderson_darling': {'test_statistic': 0.2711163654626034,\n", - " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.9581491140545149,\n", - " 'rejected': False},\n", - " 'sse': 6.172469746957357e-05,\n", - " 'parameters': {'a': 6.273846909315609,\n", - " 'd': 2.115565224087939,\n", - " 'p': 1.1729825048594196,\n", - " 'loc': 10.163246718160899},\n", + " 'sse': 5.178150848523465e-05,\n", + " 'parameters': {'alpha': 2.175778100999521,\n", + " 'beta': 35.64422972697983,\n", + " 'A': 10.370162708450033,\n", + " 'B': 181.31819264569944},\n", " 'n_test_passed': 3,\n", " 'n_test_null': 0},\n", - " 'chi_square_3p': {'chi_square': {'test_statistic': 14.032328162319153,\n", + " 'chi_square_3p': {'chi_square': {'test_statistic': 14.032328162319619,\n", " 'critical_value': 23.684791304840576,\n", - " 'p_value': 0.4473053542825338,\n", + " 'p_value': 0.44730535428249896,\n", " 'rejected': False},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.011863899605092681,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.011863899605092543,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.9180573074945443,\n", + " 'p_value': 0.918057307494551,\n", " 'rejected': False},\n", " 'anderson_darling': {'test_statistic': 0.3710177502471197,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 0.8769132003647108,\n", " 'rejected': False},\n", - " 'sse': 6.330895360011506e-05,\n", - " 'parameters': {'df': 5.427666780269712,\n", - " 'loc': 9.680108790326306,\n", - " 'scale': 1.9390767884542448},\n", + " 'sse': 6.330895360011566e-05,\n", + " 'parameters': {'df': 5.427666780269736,\n", + " 'loc': 9.680108790326281,\n", + " 'scale': 1.9390767884542408},\n", " 'n_test_passed': 3,\n", " 'n_test_null': 0},\n", " 'gamma_3p': {'chi_square': {'test_statistic': 15.040767799454457,\n", @@ -3643,23 +2493,42 @@ " 'loc': 4.089126837001704},\n", " 'n_test_passed': 3,\n", " 'n_test_null': 0},\n", - " 'beta_prime_4p': {'chi_square': {'test_statistic': 17.49359220317106,\n", + " 'generalized_gamma_4p': {'chi_square': {'test_statistic': 12.480128411515107,\n", + " 'critical_value': 22.362032494826934,\n", + " 'p_value': 0.48872010444438474,\n", + " 'rejected': False},\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.007053658159405271,\n", + " 'critical_value': 0.02915677208094496,\n", + " 'p_value': 0.9999014588665803,\n", + " 'rejected': False},\n", + " 'anderson_darling': {'test_statistic': None,\n", + " 'critical_value': None,\n", + " 'p_value': None,\n", + " 'rejected': None},\n", + " 'sse': 6.160283895771248e-05,\n", + " 'parameters': {'a': 7.68680056429614,\n", + " 'd': 1.7558512086490556,\n", + " 'p': 1.2618449981466326,\n", + " 'loc': 10.746753057837207},\n", + " 'n_test_passed': 2,\n", + " 'n_test_null': 1},\n", + " 'beta_prime_4p': {'chi_square': {'test_statistic': 17.49371339751891,\n", " 'critical_value': 22.362032494826934,\n", - " 'p_value': 0.1777107726303484,\n", + " 'p_value': 0.17770570608115666,\n", " 'rejected': False},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.016819127945068735,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.016819209669176882,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.5689309795990657,\n", + " 'p_value': 0.5689247127275272,\n", " 'rejected': False},\n", " 'anderson_darling': {'test_statistic': None,\n", " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'sse': 9.515799063987906e-05,\n", - " 'parameters': {'alpha': 2.231611442702672,\n", - " 'beta': 1421691.1596667375,\n", - " 'loc': 10.710662081048575,\n", - " 'scale': 6080108.145993804},\n", + " 'sse': 9.515898908422578e-05,\n", + " 'parameters': {'alpha': 2.2316123115358315,\n", + " 'beta': 1032476.7638728666,\n", + " 'loc': 10.71066455190706,\n", + " 'scale': 4415561.539998108},\n", " 'n_test_passed': 2,\n", " 'n_test_null': 1},\n", " 'inverse_gamma_3p': {'chi_square': {'test_statistic': 33.480546427418616,\n", @@ -3680,56 +2549,56 @@ " 'beta': 110.811390840395},\n", " 'n_test_passed': 2,\n", " 'n_test_null': 0},\n", - " 'generalized_logistic': {'chi_square': {'test_statistic': 31.0328578137447,\n", + " 'generalized_logistic': {'chi_square': {'test_statistic': 31.013597749042056,\n", " 'critical_value': 23.684791304840576,\n", - " 'p_value': 0.005485095406597695,\n", + " 'p_value': 0.005519264183732608,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.028661560535210885,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.02867801945853262,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.056597036243644094,\n", + " 'p_value': 0.05636630947268784,\n", " 'rejected': False},\n", - " 'anderson_darling': {'test_statistic': 3.540180645752116,\n", + " 'anderson_darling': {'test_statistic': 3.540635142542669,\n", " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.014679135745914063,\n", + " 'p_value': 0.014671528489848207,\n", " 'rejected': True},\n", - " 'sse': 0.0002110031552545248,\n", - " 'parameters': {'c': 2270.502647524526,\n", - " 'loc': -21.264798060542663,\n", - " 'scale': 4.980712092015947},\n", + " 'sse': 0.00021077747477441482,\n", + " 'parameters': {'c': 2352.116965135642,\n", + " 'loc': -21.441555452033054,\n", + " 'scale': 4.980735392699375},\n", " 'n_test_passed': 1,\n", " 'n_test_null': 0},\n", - " 'non_central_f': {'chi_square': {'test_statistic': 34.71903784322476,\n", + " 'non_central_f': {'chi_square': {'test_statistic': 34.7190378434076,\n", " 'critical_value': 23.684791304840576,\n", - " 'p_value': 0.0016174314375395626,\n", + " 'p_value': 0.0016174314374390875,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.026752053356717043,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.026752053356747685,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.08947511124772412,\n", + " 'p_value': 0.08947511124708918,\n", " 'rejected': False},\n", - " 'anderson_darling': {'test_statistic': 3.8008579439588175,\n", + " 'anderson_darling': {'test_statistic': 3.8008579439947425,\n", " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.010917573973185823,\n", + " 'p_value': 0.010917573972742067,\n", " 'rejected': True},\n", - " 'sse': 0.00024828028152567086,\n", - " 'parameters': {'lambda': 160.80540815240118,\n", - " 'n1': 8.992506952029206,\n", - " 'n2': 30.552742339730774},\n", + " 'sse': 0.0002482802815268144,\n", + " 'parameters': {'lambda': 160.8054081491822,\n", + " 'n1': 8.992506951845515,\n", + " 'n2': 30.552742339908647},\n", " 'n_test_passed': 1,\n", " 'n_test_null': 0},\n", - " 'gumbel_right': {'chi_square': {'test_statistic': 34.68963043326703,\n", + " 'gumbel_right': {'chi_square': {'test_statistic': 34.68963043327159,\n", " 'critical_value': 24.995790139728616,\n", - " 'p_value': 0.0027218333371575865,\n", + " 'p_value': 0.0027218333371534786,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.02667666797608398,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.026676667976091917,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.0910486034697221,\n", + " 'p_value': 0.09104860346955534,\n", " 'rejected': False},\n", - " 'anderson_darling': {'test_statistic': 3.8194313897638494,\n", + " 'anderson_darling': {'test_statistic': 3.819431389764759,\n", " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.010690646134851378,\n", + " 'p_value': 0.010690646134840387,\n", " 'rejected': True},\n", - " 'sse': 0.0002505579927223056,\n", - " 'parameters': {'mu': 17.329489393985902, 'sigma': 4.981295970066288},\n", + " 'sse': 0.0002505579927223524,\n", + " 'parameters': {'mu': 17.32948939398601, 'sigma': 4.981295970066274},\n", " 'n_test_passed': 1,\n", " 'n_test_null': 0},\n", " 'generalized_extreme_value': {'chi_square': {'test_statistic': 38.192105113750806,\n", @@ -3786,23 +2655,23 @@ " 'scale': 107.6883180758189},\n", " 'n_test_passed': 1,\n", " 'n_test_null': 0},\n", - " 'johnson_su': {'chi_square': {'test_statistic': 34.04719725548736,\n", + " 'johnson_su': {'chi_square': {'test_statistic': 34.047197036547686,\n", " 'critical_value': 22.362032494826934,\n", - " 'p_value': 0.0011838486525883596,\n", + " 'p_value': 0.0011838487432873634,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.0347492797490948,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.03474927962134309,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.010646621417771174,\n", + " 'p_value': 0.01064662182683307,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 4.764748088762644,\n", + " 'anderson_darling': {'test_statistic': 4.764748058618352,\n", " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 0.0037164687879718272,\n", + " 'p_value': 0.0037164689118851513,\n", " 'rejected': True},\n", - " 'sse': 0.00021592108160984098,\n", - " 'parameters': {'xi': 0.8138662217434972,\n", - " 'lambda': 0.5021618907327251,\n", - " 'gamma': -13.267945637211966,\n", - " 'delta': 3.094583710785166},\n", + " 'sse': 0.00021592107965877084,\n", + " 'parameters': {'xi': 0.8138659259283298,\n", + " 'lambda': 0.5021561708094049,\n", + " 'gamma': -13.26798101416236,\n", + " 'delta': 3.0945837319934024},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", " 'erlang_3p': {'chi_square': {'test_statistic': 41.224054124293865,\n", @@ -3885,24 +2754,6 @@ " 'parameters': {'mu': 16.55126817015228, 'sigma': 2.8759525692299546},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'generalized_gamma': {'chi_square': {'test_statistic': 64.19794120965146,\n", - " 'critical_value': 23.684791304840576,\n", - " 'p_value': 2.1260720739491035e-08,\n", - " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.04285222116050472,\n", - " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 0.0007007334017719025,\n", - " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 8.877890273275625,\n", - " 'critical_value': 2.4923268305268924,\n", - " 'p_value': 3.881697215635249e-05,\n", - " 'rejected': True},\n", - " 'sse': 0.0004062919800248942,\n", - " 'parameters': {'a': 0.011399363272113666,\n", - " 'd': 20.301355047176205,\n", - " 'p': 0.497534002382584},\n", - " 'n_test_passed': 0,\n", - " 'n_test_null': 0},\n", " 'chi_square': {'chi_square': {'test_statistic': 107.01213587017764,\n", " 'critical_value': 26.29622760486423,\n", " 'p_value': 1.6653345369377348e-15,\n", @@ -4036,20 +2887,20 @@ " 'parameters': {'alpha': 9.486760490382952, 'loc': 5.066092004789137},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'pert': {'chi_square': {'test_statistic': 277.1692661188242,\n", + " 'pert': {'chi_square': {'test_statistic': 275.45710076503997,\n", " 'critical_value': 23.684791304840576,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.07020788719594862,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.07030162444749499,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 1.076823963330753e-09,\n", + " 'p_value': 1.0171311570772446e-09,\n", " 'rejected': True},\n", " 'anderson_darling': {'test_statistic': None,\n", " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'sse': 0.0009428768998802616,\n", - " 'parameters': {'a': 10.40183141, 'b': 14.714532177253732, 'c': 56.757607},\n", + " 'sse': 0.0009465999424431249,\n", + " 'parameters': {'a': 10.39283141, 'b': 14.71453217725374, 'c': 56.766607},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 1},\n", " 'nakagami': {'chi_square': {'test_statistic': 195.8971625367923,\n", @@ -4086,23 +2937,23 @@ " 'alpha': 7.080044925240214},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'f_4p': {'chi_square': {'test_statistic': 278.6919100336272,\n", + " 'f_4p': {'chi_square': {'test_statistic': 269.86305035433685,\n", " 'critical_value': 22.362032494826934,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.06394372023527455,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.06316528509155693,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p_value': 4.094224226314225e-08,\n", + " 'p_value': 6.283214426527906e-08,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 33.40556918320635,\n", + " 'anderson_darling': {'test_statistic': 32.52470862487644,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 2.7803521773783757e-07,\n", " 'rejected': True},\n", - " 'sse': 0.0015810459296225568,\n", - " 'parameters': {'df1': 169.86955427879388,\n", - " 'df2': 11.75886613123556,\n", - " 'loc': 7.8562580171296945,\n", - " 'scale': 10.157510231696214},\n", + " 'sse': 0.0015515850893428104,\n", + " 'parameters': {'df1': 193.8155293650847,\n", + " 'df2': 11.816652370026668,\n", + " 'loc': 7.769680062619332,\n", + " 'scale': 10.238366153878935},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", " 'rice': {'chi_square': {'test_statistic': 6786.42096833632,\n", @@ -4235,22 +3086,22 @@ " 'parameters': {'mu': 11.74855659737131, 'sigma': 10.598293634772402},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 1},\n", - " 'loglogistic_3p': {'chi_square': {'test_statistic': 341.8738568842825,\n", + " 'loglogistic_3p': {'chi_square': {'test_statistic': 341.8738568848753,\n", " 'critical_value': 23.684791304840576,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.0927501723420926,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.09275017234215138,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 48.82022529646383,\n", + " 'anderson_darling': {'test_statistic': 48.82022529654387,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 2.7803521773783757e-07,\n", " 'rejected': True},\n", - " 'sse': 0.002235826815654466,\n", - " 'parameters': {'loc': 8.927033880874662,\n", - " 'alpha': 10.017078014123767,\n", - " 'beta': 3.7699942759666256},\n", + " 'sse': 0.0022358268156570282,\n", + " 'parameters': {'loc': 8.9270338808787,\n", + " 'alpha': 10.017078014119727,\n", + " 'beta': 3.7699942759657046},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", " 'hyperbolic_secant': {'chi_square': {'test_statistic': 391.5511060112556,\n", @@ -4273,7 +3124,7 @@ " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.12306952127487347,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.1250636578515114,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", @@ -4281,17 +3132,17 @@ " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'sse': 0.00286723714326922,\n", - " 'parameters': {'chi': 0.07368527606078723,\n", - " 'loc': 3.0238074239792145,\n", - " 'scale': 27.72729293676165},\n", + " 'sse': 0.002825221812963957,\n", + " 'parameters': {'chi': 0.08722834477886716,\n", + " 'loc': 2.9553460092932182,\n", + " 'scale': 27.743727182519326},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 2},\n", " 'loggamma': {'chi_square': {'test_statistic': None,\n", " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.12022169842430941,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.12022169834237356,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", @@ -4299,10 +3150,10 @@ " 'critical_value': None,\n", " 'p_value': None,\n", " 'rejected': None},\n", - " 'sse': 0.002977928894167068,\n", - " 'parameters': {'c': 4.956084270890284,\n", - " 'mu': 2.2770841228019e-19,\n", - " 'sigma': 13.513553913434826},\n", + " 'sse': 0.002977928892569286,\n", + " 'parameters': {'c': 4.95608427062564,\n", + " 'mu': 2.38154673530424e-19,\n", + " 'sigma': 13.51355391308331},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 2},\n", " 'laplace': {'chi_square': {'test_statistic': 551.8043905699922,\n", @@ -4387,22 +3238,22 @@ " 'parameters': {'a': 10.402831399999998, 'b': 56.75660701},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'generalized_pareto': {'chi_square': {'test_statistic': 1408.2601113324265,\n", + " 'generalized_pareto': {'chi_square': {'test_statistic': 1408.260109902511,\n", " 'critical_value': 23.684791304840576,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.3484163969771993,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.3484163967675219,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 519.9827045172515,\n", + " 'anderson_darling': {'test_statistic': 519.9827038776352,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 2.7803521773783757e-07,\n", " 'rejected': True},\n", - " 'sse': 0.006362504938162338,\n", - " 'parameters': {'c': -0.6167554068456506,\n", + " 'sse': 0.006362504932753907,\n", + " 'parameters': {'c': -0.6167554064795882,\n", " 'mu': 10.40183141,\n", - " 'sigma': 28.589558488249285},\n", + " 'sigma': 28.589558471280544},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", " 'levy': {'chi_square': {'test_statistic': 1250.8124602320809,\n", @@ -4501,22 +3352,22 @@ " 'parameters': {'c': 87.88192569428135, 'min': 10.40183141, 'max': 56.757607},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", - " 'trapezoidal': {'chi_square': {'test_statistic': 8337.392099696759,\n", + " 'trapezoidal': {'chi_square': {'test_statistic': 8337.387315007247,\n", " 'critical_value': 22.362032494826934,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'kolmogorov_smirnov': {'test_statistic': 0.5969167528555841,\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.5969166406262135,\n", " 'critical_value': 0.02915677208094496,\n", " 'p_value': 0.0,\n", " 'rejected': True},\n", - " 'anderson_darling': {'test_statistic': 2355.167420966969,\n", + " 'anderson_darling': {'test_statistic': 2355.1665379161386,\n", " 'critical_value': 2.4923268305268924,\n", " 'p_value': 2.7803521773783757e-07,\n", " 'rejected': True},\n", - " 'sse': 0.017008226002602114,\n", + " 'sse': 0.017008221525564818,\n", " 'parameters': {'a': 10.40183141,\n", - " 'b': 32.77400176520185,\n", - " 'c': 32.77409503864898,\n", + " 'b': 32.774004228230005,\n", + " 'c': 32.77407120939514,\n", " 'd': 56.757607},\n", " 'n_test_passed': 0,\n", " 'n_test_null': 0},\n", @@ -4599,39 +3450,57 @@ " 'sse': 0.027078663509948635,\n", " 'parameters': {'loc': 15.330952472218815, 'scale': 2.956120645621934},\n", " 'n_test_passed': 0,\n", - " 'n_test_null': 2}}" + " 'n_test_null': 2},\n", + " 'generalized_gamma': {'chi_square': {'test_statistic': 67.02995885479366,\n", + " 'critical_value': 23.684791304840576,\n", + " 'p_value': 6.625780257785152e-09,\n", + " 'rejected': True},\n", + " 'kolmogorov_smirnov': {'test_statistic': 0.043606840576800386,\n", + " 'critical_value': 0.02915677208094496,\n", + " 'p_value': 0.0005283856662181563,\n", + " 'rejected': True},\n", + " 'anderson_darling': {'test_statistic': 9.237392994469701,\n", + " 'critical_value': 2.4923268305268924,\n", + " 'p_value': 2.380666820489541e-05,\n", + " 'rejected': True},\n", + " 'sse': 12.468956912681984,\n", + " 'parameters': {'a': 0.029189792697758087,\n", + " 'd': 18.583491494023377,\n", + " 'p': 0.5423508931200788},\n", + " 'n_test_passed': 0,\n", + " 'n_test_null': 0}}" ] }, - "execution_count": 53, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "phitter_cont.sorted_distributions_sse" + "phi.sorted_distributions_sse" ] }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'test_statistic': 12.777936935651027,\n", + "{'test_statistic': 12.777936935651505,\n", " 'critical_value': 22.362032494826934,\n", - " 'p_value': 0.4651071732045676,\n", + " 'p_value': 0.4651071732045302,\n", " 'rejected': False}" ] }, - "execution_count": 52, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "phitter_cont.get_test_chi_square(\"beta\")" + "phi.get_test_chi_square(\"beta\")" ] } ], @@ -4651,7 +3520,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.12.6" } }, "nbformat": 4, diff --git a/tests/phitter_local/fit/test_fit_discrete.ipynb b/tests/phitter_local/fit/test_fit_discrete.ipynb index f2d98e8..7475df6 100644 --- a/tests/phitter_local/fit/test_fit_discrete.ipynb +++ b/tests/phitter_local/fit/test_fit_discrete.ipynb @@ -40,8 +40,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_disc = phitter.PHITTER(data, fit_type=\"discrete\")\n", - "phitter_disc.fit(n_workers=2)" + "phi = phitter.PHITTER(data, fit_type=\"discrete\")\n", + "phi.fit(n_workers=2)" ] }, { @@ -154,7 +154,7 @@ } ], "source": [ - "phitter_disc.summarize()" + "phi.summarize()" ] }, { @@ -239,7 +239,7 @@ } ], "source": [ - "phitter_disc.df_not_rejected_distributions" + "phi.df_not_rejected_distributions" ] }, { @@ -421,7 +421,7 @@ } ], "source": [ - "phitter_disc.df_sorted_distributions_sse" + "phi.df_sorted_distributions_sse" ] } ], diff --git a/tests/phitter_local/plot/matplotlib/test_matplotlib_continuous.ipynb b/tests/phitter_local/plot/matplotlib/test_matplotlib_continuous.ipynb index 0b79ed9..1a3cbeb 100644 --- a/tests/phitter_local/plot/matplotlib/test_matplotlib_continuous.ipynb +++ b/tests/phitter_local/plot/matplotlib/test_matplotlib_continuous.ipynb @@ -27,8 +27,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont = phitter.PHITTER(data)\n", - "phitter_cont.fit(n_workers=4)" + "phi = phitter.PHITTER(data)\n", + "phi.fit(n_workers=4)" ] }, { @@ -48,7 +48,7 @@ } ], "source": [ - "phitter_cont.plot_histogram(plot_engine=\"matplotlib\")" + "phi.plot_histogram(plot_engine=\"matplotlib\")" ] }, { @@ -68,7 +68,7 @@ } ], "source": [ - "phitter_cont.plot_histogram(plot_engine=\"matplotlib\")" + "phi.plot_histogram(plot_engine=\"matplotlib\")" ] }, { @@ -88,7 +88,7 @@ } ], "source": [ - "phitter_cont.plot_histogram_distributions(plot_engine=\"matplotlib\")" + "phi.plot_histogram_distributions(plot_engine=\"matplotlib\")" ] }, { @@ -108,7 +108,7 @@ } ], "source": [ - "phitter_cont.plot_distribution(\"beta\", plot_engine=\"matplotlib\")" + "phi.plot_distribution(\"beta\", plot_engine=\"matplotlib\")" ] }, { @@ -128,7 +128,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf(plot_engine=\"matplotlib\")" + "phi.plot_ecdf(plot_engine=\"matplotlib\")" ] }, { @@ -148,7 +148,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf_distribution(\"beta\", plot_engine=\"matplotlib\")" + "phi.plot_ecdf_distribution(\"beta\", plot_engine=\"matplotlib\")" ] }, { @@ -168,7 +168,7 @@ } ], "source": [ - "phitter_cont.qq_plot(\"beta\", plot_engine=\"matplotlib\")" + "phi.qq_plot(\"beta\", plot_engine=\"matplotlib\")" ] }, { @@ -188,7 +188,7 @@ } ], "source": [ - "phitter_cont.qq_plot_regression(\"beta\", plot_engine=\"matplotlib\")" + "phi.qq_plot_regression(\"beta\", plot_engine=\"matplotlib\")" ] } ], diff --git a/tests/phitter_local/plot/matplotlib/test_matplotlib_discrete.ipynb b/tests/phitter_local/plot/matplotlib/test_matplotlib_discrete.ipynb index f476e9c..89b08d8 100644 --- a/tests/phitter_local/plot/matplotlib/test_matplotlib_discrete.ipynb +++ b/tests/phitter_local/plot/matplotlib/test_matplotlib_discrete.ipynb @@ -26,8 +26,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_disc = phitter.PHITTER(data, fit_type=\"discrete\")\n", - "phitter_disc.fit(n_workers=1)" + "phi = phitter.PHITTER(data, fit_type=\"discrete\")\n", + "phi.fit(n_workers=1)" ] }, { @@ -47,7 +47,7 @@ } ], "source": [ - "phitter_disc.plot_histogram(plot_engine=\"matplotlib\")" + "phi.plot_histogram(plot_engine=\"matplotlib\")" ] }, { @@ -67,7 +67,7 @@ } ], "source": [ - "phitter_disc.plot_histogram_distributions(plot_engine=\"matplotlib\")" + "phi.plot_histogram_distributions(plot_engine=\"matplotlib\")" ] }, { @@ -87,7 +87,7 @@ } ], "source": [ - "phitter_disc.plot_distribution(\"hypergeometric\", plot_engine=\"matplotlib\")" + "phi.plot_distribution(\"hypergeometric\", plot_engine=\"matplotlib\")" ] }, { @@ -107,7 +107,7 @@ } ], "source": [ - "phitter_disc.plot_ecdf(plot_engine=\"matplotlib\")" + "phi.plot_ecdf(plot_engine=\"matplotlib\")" ] }, { @@ -127,7 +127,7 @@ } ], "source": [ - "phitter_disc.plot_ecdf_distribution(\"hypergeometric\", plot_engine=\"matplotlib\")" + "phi.plot_ecdf_distribution(\"hypergeometric\", plot_engine=\"matplotlib\")" ] }, { @@ -147,7 +147,7 @@ } ], "source": [ - "phitter_disc.qq_plot(\"hypergeometric\", plot_engine=\"matplotlib\")" + "phi.qq_plot(\"hypergeometric\", plot_engine=\"matplotlib\")" ] }, { @@ -167,7 +167,7 @@ } ], "source": [ - "phitter_disc.qq_plot_regression(\"hypergeometric\", plot_engine=\"matplotlib\")" + "phi.qq_plot_regression(\"hypergeometric\", plot_engine=\"matplotlib\")" ] } ], diff --git a/tests/phitter_local/plot/plotly/test_plotly_continuous.ipynb b/tests/phitter_local/plot/plotly/test_plotly_continuous.ipynb index fe51c48..91e6253 100644 --- a/tests/phitter_local/plot/plotly/test_plotly_continuous.ipynb +++ b/tests/phitter_local/plot/plotly/test_plotly_continuous.ipynb @@ -27,8 +27,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_cont = phitter.PHITTER(data)\n", - "phitter_cont.fit(n_workers=4)" + "phi = phitter.PHITTER(data)\n", + "phi.fit(n_workers=4)" ] }, { @@ -693,7 +693,7 @@ } ], "source": [ - "phitter_cont.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -1358,7 +1358,7 @@ } ], "source": [ - "phitter_cont.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -22180,7 +22180,7 @@ } ], "source": [ - "phitter_cont.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] }, { @@ -24874,7 +24874,7 @@ } ], "source": [ - "phitter_cont.plot_distribution(\"beta\")" + "phi.plot_distribution(\"beta\")" ] }, { @@ -65516,7 +65516,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf()" + "phi.plot_ecdf()" ] }, { @@ -108172,7 +108172,7 @@ } ], "source": [ - "phitter_cont.plot_ecdf_distribution(\"beta\")" + "phi.plot_ecdf_distribution(\"beta\")" ] }, { @@ -128814,7 +128814,7 @@ } ], "source": [ - "phitter_cont.qq_plot(\"beta\")" + "phi.qq_plot(\"beta\")" ] }, { @@ -169468,7 +169468,7 @@ } ], "source": [ - "phitter_cont.qq_plot_regression(\"beta\")" + "phi.qq_plot_regression(\"beta\")" ] } ], diff --git a/tests/phitter_local/plot/plotly/test_plotly_discrete.ipynb b/tests/phitter_local/plot/plotly/test_plotly_discrete.ipynb index f6c70e7..de85b2d 100644 --- a/tests/phitter_local/plot/plotly/test_plotly_discrete.ipynb +++ b/tests/phitter_local/plot/plotly/test_plotly_discrete.ipynb @@ -49,8 +49,8 @@ "metadata": {}, "outputs": [], "source": [ - "phitter_disc = phitter.PHITTER(data, fit_type=\"discrete\")\n", - "phitter_disc.fit(n_workers=1)" + "phi = phitter.PHITTER(data, fit_type=\"discrete\")\n", + "phi.fit(n_workers=1)" ] }, { @@ -695,7 +695,7 @@ } ], "source": [ - "phitter_disc.plot_histogram()" + "phi.plot_histogram()" ] }, { @@ -1558,7 +1558,7 @@ } ], "source": [ - "phitter_disc.plot_histogram_distributions()" + "phi.plot_histogram_distributions()" ] }, { @@ -2248,7 +2248,7 @@ } ], "source": [ - "phitter_disc.plot_distribution(\"hypergeometric\")" + "phi.plot_distribution(\"hypergeometric\")" ] }, { @@ -2905,7 +2905,7 @@ } ], "source": [ - "phitter_disc.plot_ecdf()" + "phi.plot_ecdf()" ] }, { @@ -3595,7 +3595,7 @@ } ], "source": [ - "phitter_disc.plot_ecdf_distribution(\"hypergeometric\")" + "phi.plot_ecdf_distribution(\"hypergeometric\")" ] }, { @@ -24233,7 +24233,7 @@ } ], "source": [ - "phitter_disc.qq_plot(\"hypergeometric\")" + "phi.qq_plot(\"hypergeometric\")" ] }, { @@ -64883,7 +64883,7 @@ } ], "source": [ - "phitter_disc.qq_plot_regression(\"hypergeometric\")" + "phi.qq_plot_regression(\"hypergeometric\")" ] } ], diff --git a/tests/phitter_local/statistics_test/all/tets_statistics_test_continuous.ipynb b/tests/phitter_local/statistical_tests/all/test_statistical_tests_continuous.ipynb similarity index 99% rename from tests/phitter_local/statistics_test/all/tets_statistics_test_continuous.ipynb rename to tests/phitter_local/statistical_tests/all/test_statistical_tests_continuous.ipynb index bfce377..b3ad7a6 100644 --- a/tests/phitter_local/statistics_test/all/tets_statistics_test_continuous.ipynb +++ b/tests/phitter_local/statistical_tests/all/test_statistical_tests_continuous.ipynb @@ -7,10 +7,7 @@ "outputs": [], "source": [ "import sys\n", - "import pandas\n", - "\n", - "sys.path.append(\"../../../../\")\n", - "import phitter" + "import pandas" ] }, { @@ -18,6 +15,24 @@ "execution_count": 2, "metadata": {}, "outputs": [], + "source": [ + "sys.path.append(\"../../../../\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import phitter" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], "source": [ "def get_data(path: str) -> list[float | int]:\n", " sample_distribution_file = open(path, \"r\")\n", @@ -28,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -38,7 +53,6 @@ " continuous_measures = phitter.continuous.CONTINUOUS_MEASURES(data)\n", " distribution = distribution_class(continuous_measures=continuous_measures)\n", "\n", - "\n", " test_chi2 = phitter.continuous.evaluate_continuous_test_chi_square(distribution, continuous_measures)\n", " test_ks = phitter.continuous.evaluate_continuous_test_kolmogorov_smirnov(distribution, continuous_measures)\n", " test_ad = phitter.continuous.evaluate_continuous_test_anderson_darling(distribution, continuous_measures)\n", @@ -51,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -181,7 +195,7 @@ "[73 rows x 4 columns]" ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -192,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -233,7 +247,7 @@ "Index: []" ] }, - "execution_count": 5, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -244,7 +258,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -291,7 +305,7 @@ "pert βœ–οΈ βœ… βœ–οΈ 1.0" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -302,7 +316,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -485,7 +499,7 @@ "t_student_3p βœ–οΈ βœ… βœ… 2.0" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -496,7 +510,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -1023,7 +1037,7 @@ "weibull_3p 3.0 " ] }, - "execution_count": 8, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -1049,7 +1063,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.12.6" } }, "nbformat": 4, diff --git a/tests/phitter_local/statistics_test/all/tets_statistics_test_discrete.ipynb b/tests/phitter_local/statistical_tests/all/test_statistical_tests_discrete.ipynb similarity index 100% rename from tests/phitter_local/statistics_test/all/tets_statistics_test_discrete.ipynb rename to tests/phitter_local/statistical_tests/all/test_statistical_tests_discrete.ipynb diff --git a/tests/phitter_local/statistics_test/singular/tets_statistics_test_continuous.ipynb b/tests/phitter_local/statistical_tests/singular/test_statistical_tests_continuous.ipynb similarity index 69% rename from tests/phitter_local/statistics_test/singular/tets_statistics_test_continuous.ipynb rename to tests/phitter_local/statistical_tests/singular/test_statistical_tests_continuous.ipynb index 3ab7c48..a2e3cce 100644 --- a/tests/phitter_local/statistics_test/singular/tets_statistics_test_continuous.ipynb +++ b/tests/phitter_local/statistical_tests/singular/test_statistical_tests_continuous.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -27,17 +27,17 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 34, "metadata": {}, "outputs": [], "source": [ - "path = \"../../../../phitter/continuous/continuous_distributions_sample/sample_pert.txt\"\n", + "path = \"../../../../phitter/continuous/continuous_distributions_sample/sample_normal.txt\"\n", "data = get_data(path)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -46,48 +46,28 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ - "distribution_inst = phitter.continuous.PERT(continuous_measures=continuous_measures)" + "distribution_inst = phitter.continuous.NORMAL(continuous_measures=continuous_measures)" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'a': 64.47870543081576, 'b': 513.5960332646195, 'c': 970.0567361}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "distribution_inst.parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'test_statistic': 20.348784293401287,\n", + "{'test_statistic': 6.276213174197073,\n", " 'critical_value': 19.67513757268249,\n", - " 'p-value': 0.04078063999645698,\n", - " 'rejected': True}" + " 'p-value': 0.8543133833700055,\n", + " 'rejected': False}" ] }, - "execution_count": 7, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -98,19 +78,19 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'test_statistic': 0.024619398699694872,\n", + "{'test_statistic': 0.011097996734446891,\n", " 'critical_value': 0.02915677208094496,\n", - " 'p-value': 0.14374523392186955,\n", + " 'p-value': 0.9504152808717772,\n", " 'rejected': False}" ] }, - "execution_count": 8, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -121,19 +101,19 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'test_statistic': inf,\n", + "{'test_statistic': 0.25200008391038864,\n", " 'critical_value': 2.4923268305268924,\n", - " 'p-value': 2.7803521773783757e-07,\n", - " 'rejected': True}" + " 'p-value': 0.9693255434928831,\n", + " 'rejected': False}" ] }, - "execution_count": 9, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -159,7 +139,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.12.6" } }, "nbformat": 4, diff --git a/tests/phitter_local/statistics_test/singular/tests_statistics_test_discrete.ipynb b/tests/phitter_local/statistical_tests/singular/test_statistical_tests_discrete.ipynb similarity index 100% rename from tests/phitter_local/statistics_test/singular/tests_statistics_test_discrete.ipynb rename to tests/phitter_local/statistical_tests/singular/test_statistical_tests_discrete.ipynb diff --git a/tests/phitter_web/test_phitter_web/test_phitter_web_continuous.py b/tests/phitter_web/test_phitter_web/test_phitter_web_continuous.py index 1dbad18..9a7852d 100644 --- a/tests/phitter_web/test_phitter_web/test_phitter_web_continuous.py +++ b/tests/phitter_web/test_phitter_web/test_phitter_web_continuous.py @@ -11,14 +11,15 @@ def get_data(path: str) -> list[float | int]: return data -path = "../../../datasets_test/continuous/data_1000/data_alpha.txt" -# path = "../datasets_test/discrete/book2.txt" -# path = "../datasets_test/continuous/data_1000/data_beta.txt" +if __name__ == "__main__": + path = "../../../datasets_test/continuous/data_1000/data_alpha.txt" + # path = "../datasets_test/discrete/book2.txt" + # path = "../datasets_test/continuous/data_1000/data_beta.txt" -data = get_data(path) + data = get_data(path) -phitter_continuous = PHITTER_CONTINUOUS(data) -phitter_continuous.fit(n_workers=1) + phi = PHITTER_CONTINUOUS(data) + phi.fit(n_workers=2) -for distribution, results in phitter_continuous.sorted_distributions_sse.items(): - print(f"Distribution: {distribution}, SSE: {results['sse']}, Aprobados: {results['n_test_passed']}") + for distribution, results in phi.sorted_distributions_sse.items(): + print(f"Distribution: {distribution}, SSE: {results['sse']}, Aprobados: {results['n_test_passed']}") diff --git a/tests/phitter_web/test_phitter_web/test_phitter_web_discrete.py b/tests/phitter_web/test_phitter_web/test_phitter_web_discrete.py index e269620..09e49d9 100644 --- a/tests/phitter_web/test_phitter_web/test_phitter_web_discrete.py +++ b/tests/phitter_web/test_phitter_web/test_phitter_web_discrete.py @@ -11,11 +11,12 @@ def get_data(path: str) -> list[int]: return data -path = "../../../datasets_test/discrete/sample_binomial.txt" -data = get_data(path) +if __name__ == "__main__": + path = "../../../datasets_test/discrete/sample_binomial.txt" + data = get_data(path) -phitter_discrete = PHITTER_DISCRETE(data) -phitter_discrete.fit() + phi = PHITTER_DISCRETE(data) + phi.fit() -for distribution, results in phitter_discrete.not_rejected_distributions.items(): - print(f"Distribution: {distribution}, SSE: {results['sse']}, Aprobados: {results['n_test_passed']}") + for distribution, results in phi.not_rejected_distributions.items(): + print(f"Distribution: {distribution}, SSE: {results['sse']}, Aprobados: {results['n_test_passed']}") diff --git a/tests/pytest/test_distribution_measurements.py b/tests/pytest/test_distribution_measurements.py new file mode 100644 index 0000000..f372156 --- /dev/null +++ b/tests/pytest/test_distribution_measurements.py @@ -0,0 +1,51 @@ +import numpy +import pytest + +import phitter + + +def get_data(path: str) -> list[float | int]: + sample_distribution_file = open(path, "r") + data = [float(x.replace(",", ".")) for x in sample_distribution_file.read().splitlines()] + sample_distribution_file.close() + return data + + +@pytest.mark.parametrize("id_distribution", phitter.continuous.CONTINUOUS_DISTRIBUTIONS.keys()) +def test_distribution_methods(id_distribution): + distribution_class = phitter.continuous.CONTINUOUS_DISTRIBUTIONS[id_distribution] + data = get_data(f"./phitter/continuous/continuous_distributions_sample/sample_{id_distribution}.txt") + continuous_measures = phitter.continuous.CONTINUOUS_MEASURES(data) + distribution = distribution_class(continuous_measures=continuous_measures) + + try: + # Basic information + assert isinstance(distribution.name, str) + assert isinstance(distribution.parameters, dict) + + # Test CDF + assert isinstance(distribution.cdf(continuous_measures.mean), float) + assert isinstance(distribution.cdf(numpy.array([continuous_measures.mean, continuous_measures.mean])), numpy.ndarray) + + # Test PDF + assert isinstance(distribution.pdf(continuous_measures.mean), float) + assert isinstance(distribution.pdf(numpy.array([continuous_measures.mean, continuous_measures.mean])), numpy.ndarray) + + # Test PPF + ppf_value = distribution.ppf(0.5) + assert isinstance(ppf_value, float) + assert isinstance(distribution.ppf(numpy.array([0.5, 0.5])), numpy.ndarray) + + # Test sampling + assert len(distribution.sample(5)) == 5 + + # # Test statistics + assert isinstance(distribution.mean, (float, int, type(None))) + assert isinstance(distribution.variance, (float, int, type(None))) + assert isinstance(distribution.skewness, (float, int, type(None))) + assert isinstance(distribution.kurtosis, (float, int, type(None))) + assert isinstance(distribution.median, (float, int, type(None))) + assert isinstance(distribution.mode, (float, int, type(None))) + + except Exception as e: + pytest.fail(f"Error en la distribuciΓ³n {id_distribution}: {str(e)}") diff --git a/tests/pytest/test_phitter_continuous.py b/tests/pytest/test_phitter_continuous.py new file mode 100644 index 0000000..a1f118b --- /dev/null +++ b/tests/pytest/test_phitter_continuous.py @@ -0,0 +1,31 @@ +import os +import random + +import pytest + +import phitter + + +def get_data(path: str) -> list[float | int]: + sample_distribution_file = open(path, "r") + data = [float(x.replace(",", ".")) for x in sample_distribution_file.read().splitlines()] + sample_distribution_file.close() + return data + + +@pytest.fixture +def random_file_path(): + base_path = "./datasets_test/continuous/data_1000/" + files = [f for f in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, f))] + random_file = random.choice(files) + return os.path.join(base_path, random_file) + + +def test_phitter_analysis(random_file_path): + data = get_data(random_file_path) + + ## Fit dataset + phi = phitter.PHITTER(data) + phi.fit(n_workers=2) + + assert len(phi.sorted_distributions_sse) > 0, "sorted_distributions_sse should not be empty" diff --git a/tests/pytest/test_phitter_discrete.py b/tests/pytest/test_phitter_discrete.py new file mode 100644 index 0000000..c78a20e --- /dev/null +++ b/tests/pytest/test_phitter_discrete.py @@ -0,0 +1,31 @@ +import os +import random + +import pytest + +import phitter + + +def get_data(path: str) -> list[float | int]: + sample_distribution_file = open(path, "r") + data = [float(x.replace(",", ".")) for x in sample_distribution_file.read().splitlines()] + sample_distribution_file.close() + return data + + +@pytest.fixture +def random_file_path(): + base_path = "./datasets_test/discrete/" + files = [f for f in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, f))] + random_file = random.choice(files) + return os.path.join(base_path, random_file) + + +def test_phitter_analysis(random_file_path): + data = get_data(random_file_path) + + ## Fit dataset + phi = phitter.PHITTER(data, fit_type="discrete") + phi.fit(n_workers=2) + + assert len(phi.sorted_distributions_sse) > 0, "sorted_distributions_sse should not be empty" diff --git a/tests/pytest/test_phitter_web_continuous.py b/tests/pytest/test_phitter_web_continuous.py new file mode 100644 index 0000000..ba0b9b7 --- /dev/null +++ b/tests/pytest/test_phitter_web_continuous.py @@ -0,0 +1,31 @@ +import os +import random + +import pytest + +from phitter_web.continuous.phitter_web_continuous import PHITTER_CONTINUOUS + + +def get_data(path: str) -> list[float | int]: + sample_distribution_file = open(path, "r") + data = [float(x.replace(",", ".")) for x in sample_distribution_file.read().splitlines()] + sample_distribution_file.close() + return data + + +@pytest.fixture +def random_file_path(): + base_path = "./datasets_test/continuous/data_1000/" + files = [f for f in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, f))] + random_file = random.choice(files) + return os.path.join(base_path, random_file) + + +def test_phitter_analysis(random_file_path): + data = get_data(random_file_path) + + ## Fit dataset + phi = PHITTER_CONTINUOUS(data) + phi.fit(n_workers=2) + + assert len(phi.sorted_distributions_sse) > 0, "sorted_distributions_sse should not be empty" \ No newline at end of file diff --git a/tests/pytest/test_statistical_tests.py b/tests/pytest/test_statistical_tests.py new file mode 100644 index 0000000..954900e --- /dev/null +++ b/tests/pytest/test_statistical_tests.py @@ -0,0 +1,26 @@ +import pytest + +import phitter + + +def get_data(path: str) -> list[float | int]: + sample_distribution_file = open(path, "r") + data = [float(x.replace(",", ".")) for x in sample_distribution_file.read().splitlines()] + sample_distribution_file.close() + return data + + +@pytest.mark.parametrize("id_distribution", phitter.continuous.CONTINUOUS_DISTRIBUTIONS.keys()) +def test_distribution_fit(id_distribution): + distribution_class = phitter.continuous.CONTINUOUS_DISTRIBUTIONS[id_distribution] + data = get_data(f"./phitter/continuous/continuous_distributions_sample/sample_{id_distribution}.txt") + continuous_measures = phitter.continuous.CONTINUOUS_MEASURES(data) + distribution = distribution_class(continuous_measures=continuous_measures) + + test_chi2 = phitter.continuous.evaluate_continuous_test_chi_square(distribution, continuous_measures) + test_ks = phitter.continuous.evaluate_continuous_test_kolmogorov_smirnov(distribution, continuous_measures) + test_ad = phitter.continuous.evaluate_continuous_test_anderson_darling(distribution, continuous_measures) + + n_test_passed = 3 - int(test_chi2["rejected"]) - int(test_ks["rejected"]) - int(test_ad["rejected"]) + + assert n_test_passed > 0, f"La distribuciΓ³n {id_distribution} no pasΓ³ ninguna prueba" diff --git a/tests/pytest/tets_phitter_web_discrete.py b/tests/pytest/tets_phitter_web_discrete.py new file mode 100644 index 0000000..8c61c6b --- /dev/null +++ b/tests/pytest/tets_phitter_web_discrete.py @@ -0,0 +1,31 @@ +import os +import random + +import pytest + +from phitter_web.discrete.phitter_web_discrete import PHITTER_DISCRETE + + +def get_data(path: str) -> list[float | int]: + sample_distribution_file = open(path, "r") + data = [float(x.replace(",", ".")) for x in sample_distribution_file.read().splitlines()] + sample_distribution_file.close() + return data + + +@pytest.fixture +def random_file_path(): + base_path = "./datasets_test/discrete/" + files = [f for f in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, f))] + random_file = random.choice(files) + return os.path.join(base_path, random_file) + + +def test_phitter_analysis(random_file_path): + data = get_data(random_file_path) + + ## Fit dataset + phi = PHITTER_DISCRETE(data) + phi.fit(n_workers=2) + + assert len(phi.sorted_distributions_sse) > 0, "sorted_distributions_sse should not be empty" \ No newline at end of file