{"id":32175865,"url":"https://github.com/chasmani/piecewise-regression","last_synced_at":"2025-10-21T19:50:30.187Z","repository":{"id":37771112,"uuid":"373776107","full_name":"chasmani/piecewise-regression","owner":"chasmani","description":"piecewise-regression (aka segmented regression) in python. For fitting straight line models to data with one or more breakpoints where the gradient changes. ","archived":false,"fork":false,"pushed_at":"2024-06-09T09:00:49.000Z","size":23432,"stargazers_count":119,"open_issues_count":9,"forks_count":25,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-10-10T17:41:30.927Z","etag":null,"topics":["data-analysis","linear-regression","model-fitting","piecewise-regression","python3","regression","segmented-regression","statistics"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chasmani.png","metadata":{"files":{"readme":"docs/README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-06-04T08:37:40.000Z","updated_at":"2025-09-14T23:59:24.000Z","dependencies_parsed_at":"2025-04-14T15:33:42.969Z","dependency_job_id":null,"html_url":"https://github.com/chasmani/piecewise-regression","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/chasmani/piecewise-regression","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chasmani%2Fpiecewise-regression","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chasmani%2Fpiecewise-regression/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chasmani%2Fpiecewise-regression/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chasmani%2Fpiecewise-regression/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chasmani","download_url":"https://codeload.github.com/chasmani/piecewise-regression/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chasmani%2Fpiecewise-regression/sbom","scorecard":{"id":274853,"data":{"date":"2025-08-11","repo":{"name":"github.com/chasmani/piecewise-regression","commit":"1f58fc331f7a6e4460f8ba6da4a86aae8755d90b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/codecov.yml:1","Warn: no topLevel permission defined: .github/workflows/python-package.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":8,"reason":"binaries present in source code","details":["Warn: binary detected: tests/__pycache__/__init__.cpython-38.pyc:1","Warn: binary detected: tests/__pycache__/test_1_breakpoint.cpython-38.pyc:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codecov.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/chasmani/piecewise-regression/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codecov.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/chasmani/piecewise-regression/codecov.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/codecov.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/chasmani/piecewise-regression/codecov.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/chasmani/piecewise-regression/python-package.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/chasmani/piecewise-regression/python-package.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:23","Warn: pipCommand not pinned by hash: .github/workflows/codecov.yml:24","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:29","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:31","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   6 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"10 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2019-156 / GHSA-xp76-357g-9wqq","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T14:10:57.994Z","repository_id":37771112,"created_at":"2025-08-17T14:10:57.994Z","updated_at":"2025-08-17T14:10:57.994Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279018708,"owners_count":26086606,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-analysis","linear-regression","model-fitting","piecewise-regression","python3","regression","segmented-regression","statistics"],"created_at":"2025-10-21T19:50:28.750Z","updated_at":"2025-10-21T19:50:30.182Z","avatar_url":"https://github.com/chasmani.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"==========================================================\npiecewise-regression (aka segmented regression) in python\n==========================================================\n:piecewise-regression: fitting straight line models with breakpoints\n:Author: Charlie Pilgrim\n:Version: 1.5.0\n:Github: https://github.com/chasmani/piecewise-regression\n:Documentation: https://piecewise-regression.readthedocs.io/en/master/index.html\n:Paper: https://joss.theoj.org/papers/10.21105/joss.03859\n\n.. image:: https://github.com/chasmani/piecewise-regression/actions/workflows/python-package.yml/badge.svg\n   :target: https://github.com/chasmani/piecewise-regression/actions/workflows/python-package.yml\n   :alt: Build Status\n.. image:: https://codecov.io/gh/chasmani/piecewise-regression/branch/master/graph/badge.svg\n   :target: https://codecov.io/gh/chasmani/piecewise-regression\n   :alt: Test Coverage Status\n.. image:: https://readthedocs.org/projects/piecewise-regression/badge/?version=latest\n   :target: https://piecewise-regression.readthedocs.io/en/latest/?badge=latest\n   :alt: Documentation Status\n.. image:: https://badge.fury.io/py/piecewise-regression.svg\n   :target: https://badge.fury.io/py/piecewise-regression\n   :alt: PyPi location\n.. image:: https://joss.theoj.org/papers/b64e5e7d746efc5d91462a51b3fc5bf8/status.svg\n   :target: https://joss.theoj.org/papers/b64e5e7d746efc5d91462a51b3fc5bf8\n   :alt: Review Status\n.. image:: https://img.shields.io/badge/license-MIT-blue.svg\n   :target: https://github.com/chasmani/piecewise-regresssion/blob/master/LICENSE\n   :alt: License information\n\n|\n\nEasy-to-use piecewise regression (aka segmented regression) in Python. For fitting straight lines to data where there are one or more changes in gradient (known as breakpoints). Based on Muggeo's paper \"Estimating regression models with unknown break-points\" (2003). \n\nWhen using the package, please cite the `accompanying paper \u003chttps://joss.theoj.org/papers/10.21105/joss.03859\u003e`_.\n\nExample:\n\n.. image:: https://raw.githubusercontent.com/chasmani/piecewise-regression/master/paper/example.png\n    :alt: basic-example-plot-github\n\nCode examples below, and more in this `Google Colab Jupyter Notebook \u003chttps://colab.research.google.com/drive/1Pwv6LqwZU8Zbl0VZH6cwOTwoRzm3CPPC#offline=true\u0026sandboxMode=true/\u003e`_.\n\nInstallation\n========================\n\nYou can install piecewise-regression using python's `pip package index \u003chttps://pypi.org/project/piecewise-regression/\u003e`_ ::\n\n    pip install piecewise-regression\n\nThe package is tested on Python 3.7, 3.8, 3.9 and 3.10.\n\nGetting started\n========================\n\nThe package requires some x and y data to fit. You need to specify either a) some initial breakpoint guesses as `start_values` or b) how many breakpoints you want to fit as `n_breakpoints` (or both). Here is an elementary example, assuming we already have some data `x` and `y`: ::\n\n\timport piecewise_regression\n\tpw_fit = piecewise_regression.Fit(x, y, n_breakpoints=2)\n\tpw_fit.summary()\n\nExample\n========================\n*For demonstration purposes, substitute with your own data to fit.*\n\n1. Start-off generating some data with a breakpoint: ::\n\n\timport piecewise_regression\n\timport numpy as np\n\n\talpha_1 = -4    \n\talpha_2 = -2\n\tconstant = 100\n\tbreakpoint_1 = 7\n\tn_points = 200\n\tnp.random.seed(0)\n\txx = np.linspace(0, 20, n_points)\n\tyy = constant + alpha_1*xx + (alpha_2-alpha_1) * np.maximum(xx - breakpoint_1, 0) + np.random.normal(size=n_points)\n\n\n2. Fit the model: ::\n\n    # Given some data, fit the model\n    pw_fit = piecewise_regression.Fit(xx, yy, start_values=[5], n_breakpoints=1)\n\n    # Print a summary of the fit\n    pw_fit.summary()\n\nExample output: ::\n\n\t                    Breakpoint Regression Results                     \n\t====================================================================================================\n\tNo. Observations                      200\n\tNo. Model Parameters                    4\n\tDegrees of Freedom                    196\n\tRes. Sum of Squares               193.264\n\tTotal Sum of Squares              46201.8\n\tR Squared                        0.995817\n\tAdjusted R Squared               0.995731\n\tConverged:                           True\n\t====================================================================================================\n\t====================================================================================================\n\t                    Estimate      Std Err            t        P\u003e|t|       [0.025       0.975]\n\t----------------------------------------------------------------------------------------------------\n\tconst                100.726        0.244       413.63     3.1e-290       100.25       101.21\n\talpha1              -4.21998       0.0653      -64.605    4.37e-134      -4.3488      -4.0912\n\tbeta1                2.18914       0.0689       31.788            -       2.0533        2.325\n\tbreakpoint1          6.48706        0.137            -            -       6.2168       6.7573\n\t----------------------------------------------------------------------------------------------------\n\tThese alphas(gradients of segments) are estimated from betas(change in gradient)\n\t----------------------------------------------------------------------------------------------------\n\talpha2              -2.03084       0.0218      -93.068    3.66e-164      -2.0739      -1.9878\n\t====================================================================================================\n\tDavies test for existence of at least 1 breakpoint: p=5.13032e-295 (e.g. p\u003c0.05 means reject null hypothesis of no breakpoints at 5% significance)\n\nThis includes estimates for all the model variables, along with confidence intervals. The Davies test is a hypothesis test for the existence of at least one breakpoint, against the null hypothesis of no breakpoints. Following Muggeo (\"segmented: An R Package to Fit Regression Models with Broken-Line Relationships\" 2008), this uses the Davies test with the Wald statistic on the breakpoint change in gradient. \n\n3. Optional: Plotting the data and model results: ::\n\n\timport matplotlib.pyplot as plt\n\n\t# Plot the data, fit, breakpoints and confidence intervals\n\tpw_fit.plot_data(color=\"grey\", s=20)\n\t# Pass in standard matplotlib keywords to control any of the plots\n\tpw_fit.plot_fit(color=\"red\", linewidth=4) \n\tpw_fit.plot_breakpoints()\n\tpw_fit.plot_breakpoint_confidence_intervals()\n\tplt.xlabel(\"x\")\n\tplt.ylabel(\"y\")\n\tplt.show()\n\tplt.close()\n\n.. image:: https://raw.githubusercontent.com/chasmani/piecewise-regression/master/paper/example2.png\n    :alt: fit-example-plot-github\n\n\nYou can extract data as well: ::\n\n\t# Get the key results of the fit \n\tpw_results = pw_fit.get_results()\n\tpw_estimates = pw_results[\"estimates\"]\n\n\nHow It Works\n======================\n\nThe package implements Muggeo's iterative algorithm (Muggeo \"Estimating regression models with unknown break-points\" (2003)) to find breakpoints quickly. This method simultaneously fits breakpoint positions and the linear models for the different fit segments, and it gives confidence intervals for all the model estimates. See the accompanying paper for more details.\n\nMuggeo's method doesn't always converge on the best solution - sometimes, it finds a locally optimal solution or doesn't converge at all. For this reason, the Fit method also implements a process called bootstrap restarting which involves taking a bootstrapped resample of the data to try to find a better solution. The number of times this process runs can be controlled with n_boot. To run the Fit without bootstrap restarting, set ``n_boot=0``.\n\nIf you do not have (or do not want to use) initial guesses for the number of breakpoints, you can set it to ``n_breakpoints=3``, and the algorithm will randomly generate start_values. With a 50% chance, the bootstrap restarting algorithm will either use the best currently converged breakpoints or randomly generate new ``start_values``, escaping the local optima in two ways in order to find better global optima. \n\nAs is often the case with fitting non-linear models, even with these measures, the algorithm is not guaranteed to converge to a global optimum. However, increasing ``n_boot`` raises the probability of global convergence at the cost of computation time.\n\n\nModel Selection\n==========================\n\nIn addition to the main Fit tool, the package also offers a ModelSelection option based on the Bayesian Information Criterion (BIC). This additional tool is opinionated in it's choices (e.g. using the BIC) and not as thorough as the main Fit function. In particular, the models are generated with random start_values, which can influence the model fit and give different values for the BIC. The tool can help explore other possible models but we recommend that caution and domain knowledge are used when interpreting the results.  ::\n\n\tms = piecewise_regression.ModelSelection(x, y, max_breakpoints=6)\n\nExample output: ::\n\n\t                 Breakpoint Model Comparision Results                 \n\t====================================================================================================\n\tn_breakpoints            BIC    converged          RSS \n\t----------------------------------------------------------------------------------------------------\n\t0                     421.09         True       1557.4 \n\t1                     14.342         True       193.26 \n\t2                     22.825         True       191.23 \n\t3                     24.169         True       182.59 \n\t4                     29.374         True       177.73 \n\t5                                   False              \n\t6                                   False              \n\n\tMinimum BIC (Bayesian Information Criterion) suggests the best model \n\nThe data of the model fits can be accessed in ::\n\n    ms.models \n\nFor a robust comparision, you could run the ModelSelection tools many times and take the lowest BIC for each model. \n\n\nTesting\n============\n\nThe package includes comprehensive tests.\n\nTo run all tests, from the main directory run (requires the pytest library): ::\n\t\n\tpytest\n\nTo get code coverage, run (requires pytest and pytest-cov libraries): ::\n\n\tpytest --cov=./\n\nThere are also a series of simulation tests that check the estimates have realistic confidence intervals, and the Davies test gives realistic p-values. These can be found in the folder \"tests-manual\". \n\nRequirements\n=============\n\nSee requirements.txt for specific version numbers. Required packages, and their uses are:\n\n- matplotlib for plotting.\n- numpy for simple data handling and data transformations.  \n- scipy for statistical tests including using t-distributions and Gaussians. \n- statsmodels for performing ordinary least squares.\n\nCommunity Guidelines and Contributing\n===================================================\n\nWe welcome community participation!\n\nSourced from `Open Source Guide: How to contribute. \u003chttps://opensource.guide/how-to-contribute/\u003e`_\n\n**Open an issue in the following situations:**\n\n- Report an error you can’t solve yourself\n- Discuss a high-level topic or idea (for example, community, vision or policies)\n- Propose a new feature or other project ideas\n\n**Tips for communicating on issues:**\n\n- If you see an open issue that you want to tackle, comment on the issue to let people know you’re on it. That way, people are less likely to duplicate your work.\n- If an issue was opened a while ago, it’s possible that it’s being addressed somewhere else, or has already been resolved, so comment to ask for confirmation before starting work.\n- If you opened an issue, but figured out the answer later on your own, comment on the issue to let people know, then close the issue. Even documenting that outcome is a contribution to the project.\n\n**Open a pull request in the following situations:**\n\n- Submit trivial fixes (for example, a typo, a broken link or an obvious error)\n- Start work on a contribution that was already asked for, or that you’ve already discussed, in an issue\n\n**Tips for submitting PRs:** \n\n- Reference any relevant issues or supporting documentation in your PR (for example, “Closes #37.”)\n- Include screenshots of the before and after if your changes include differences in HTML/CSS. Drag and drop the images into the body of your pull request.\n- Test your changes by running them against any existing tests if they exist and create new ones when needed. Whether tests exist or not, make sure your changes don’t break the existing project.\n- Contribute in the style of the project to the best of your abilities.\n\nInstalling From Source\n===========================\n\nTo install from source: ::\n\n\tgit clone https://github.com/chasmani/piecewise-regression\n\tcd piecewise_regression\n\tpython3 setup.py install --user\n\n\nDocumentation\n==============\n`Full docs, including an API reference. \u003chttps://piecewise-regression.readthedocs.io/en/latest/\u003e`_\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchasmani%2Fpiecewise-regression","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchasmani%2Fpiecewise-regression","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchasmani%2Fpiecewise-regression/lists"}