pyFitting is a modular curve-fitting framework for scientific Python workflows.
It provides a clean pipeline around:
- data containers and masking
- reusable model classes
- interchangeable loss functions
- local/global optimizers
- fit-quality metrics and result export
The package is built around composable interfaces so you can start with built-ins and add your own models/losses/optimizers when needed.
# from this repository
pip install -e .
# with developer dependencies (tests + plotting)
pip install -e .[dev]import numpy as np
from pyFitting import Fitter, ArrayData, GaussianModel
# synthetic data
rng = np.random.default_rng(0)
x = np.linspace(0.0, 10.0, 120)
y = 2.5 * np.exp(-0.5 * ((x - 5.0) / 1.2) ** 2) + 0.3
y += rng.normal(0.0, 0.05, size=x.shape)
# fit
data = ArrayData(x, y)
result = Fitter(data, GaussianModel()).fit()
print(result.success)
print(result.parameters.values)
print(result.metrics["r2"])- Wrap data in
ArrayData - Pick a model (
GaussianModel,ExponentialModel, customBaseModelsubclass) - Optional: configure loss and optimizer
- Fit with
Fitter(...).fit() - Inspect
FitResultmetrics/parameters/residuals
ArrayDataDataSmoother,quick_smooth(inpyFitting.data)
GaussianModelExponentialModelLinearModelPowerLawModelPolynomialModel
MSELossChi2LossCorrelationLossHybridLossOverlapLoss
LocalOptimizermethods:SLSQP,L-BFGS-B,TNC,trust-constr,Powell,Nelder-Mead,COBYLAGlobalOptimizerHybridOptimizerMultiStartOptimizer
StandardEvaluatorwith common metrics (r2,r2_log,chi2_reduced,rmse,mae, correlations, overlap, etc.)
model = GaussianModel()
model.set_bounds(A=(0.0, 10.0), mu=(0.0, 10.0), sigma=(0.1, 3.0), c=(-1.0, 1.0))
result = Fitter(data, model).fit()model = GaussianModel()
model.fix_parameter("mu", value=5.0)
result = Fitter(data, model).fit() # fits A, sigma, c onlyweights = np.ones_like(x)
weights[(x > 4.0) & (x < 6.0)] = 5.0
data_weighted = ArrayData(x, y, weights=weights)
result = Fitter(data_weighted, GaussianModel()).fit()from pyFitting import CorrelationLoss, LocalOptimizer
loss = CorrelationLoss(use_log=True)
optimizer = LocalOptimizer("trust-constr")
result = Fitter(data, GaussianModel(), loss=loss, optimizer=optimizer).fit()FitResult stores:
parameters(values, bounds, fixed/free flags)metricsy_fit- optimizer metadata (
success,message,nfev,nit)
Useful helpers:
result.summary()
residuals = result.get_residuals()
relative_residuals = result.get_relative_residuals_percent()
result_dict = result.to_dict()
result_df = result.to_dataframe()Visualization is optional (matplotlib).
from pyFitting import plot_fit, plot_fit_with_residuals
plot_fit(result)
plot_fit_with_residuals(result)python examples/simple_examples.py
python examples/advance_examples.pypytest -qSee docs/TESTING.md for test coverage details.
Quick_Guide.md: practical quickstartdocs/API_REFERENCE.md: API by componentdocs/TESTING.md: test strategy and coverageTUTORIAL.md: extended walkthrough and examples
pyFitting/
core/ # interfaces, types, result container
data/ # ArrayData + smoothing utilities
models/ # built-in models + BaseModel
loss/ # objective/loss functions
optimizers/ # local/global/hybrid optimization
evaluation/ # fit metrics
workflow/ # Fitter orchestration
visualization/ # optional plotting helpers
examples/
simple_examples.py
advance_examples.py
tests/
pytest suite