Skip to main content

Python package for high-precision circadian melatonin profile analysis

Project description

melafit

Python package for high-precision circadian melatonin profile analysis. Features a variety of baseline cosine functions for curve fitting (Van Someren & Nagtegaal, 2007) and a robust cost function for superior convergence, even with sparse data (Gabel et al., 2017).

Overview

melafit is a Python package designed for high-precision modeling of 24-hour melatonin secretion. While standard cosinor or harmonic analyses fail to capture the physiological nuances of the melatonin "wave," melafit implements several baseline cosine functions including bimodal, skewed and bimodal-skewed modifications. This approach accounts for the characteristic baseline, asymmetry and dual peaks often seen in high-resolution circadian melatonin data.

Furthermore, the library utilizes a specialized cost function developed to overcome common optimization hurdles (trivial all-zero solutions), ensuring stable convergence even when working with sparse or incomplete time series.

Key Features

  • Bimodal Waveform Fitting: Implementation of the Van Someren & Nagtegaal (2007) model for superior physiological accuracy.
  • Optimized Convergence: Leverages the robust cost function described in Gabel et al. (2017) to ensure reliable fits across diverse datasets.
  • Sparse Data Support: Capable of reconstructing full profiles and estimating circadian phase from limited data points, as well as determining dim light melatonin onset (DLMO) with partial data.
  • Research-Ready: Direct derivation of Amplitude, DLMOn, DLMOff, Midpoint, Area and COG markers from continuous, fitted waveforms.

Installation

melafit is available on PyPI and can be installed with pip. However, installing directly into your system Python environment without a virtual environment is strongly discouraged, as it may cause conflicts with other packages. The recommended approach is to use Miniconda as the package and environment manager to create a dedicated virtual environment, as described below.

Standard installation

Download file melafit.yml to a directory of your choice (<YOUR-DIRECTORY>). Navigate to the directory, create and activate the conda environment:

cd <YOUR-DIRECTORY>
conda env create -f melafit.yml
conda activate melafit

The environment configuration file melafit.yml uses conda-forge as the sole package channel, ensuring reproducibility and avoiding potential conflicts between packages from different channels. melafit itself is installed from PyPI via pip as part of the environment setup. This will create a fully functional analysis environment, including all supporting packages (numpy, scipy, pandas, openpyxl and matplotlib).

Developer installation

If you intend to follow the development closely or contribute to the package, clone the repository first to a dedicated directory <YOUR-DIRECTORY>. Navigate to it and clone the repository as follows:

cd <YOUR-DIRECTORY>
git clone https://github.com/vitaliy-ch25/melafit.git
cd melafit

Then create and activate the conda environment using the developer configuration file melafit-dev.yml, which installs melafit directly from the cloned directory in editable mode:

conda env create -f melafit-dev.yml
conda activate melafit

With an editable install, any changes to the source code in the cloned directory take effect immediately without reinstalling the package.

Updating

Standard update

Download the latest melafit.yml to <YOUR-DIRECTORY>. Navigate to it and run the update command as follows:

cd <YOUR-DIRECTORY>
conda env update -f melafit.yml --prune

This updates both the dependencies and melafit itself to the latest released version.

Developer update

Navigate to the cloned repository directory and pull the latest version from the main branch:

cd <YOUR-DIRECTORY>/melafit
git pull

The editable install picks up the changes immediately. If dependencies in melafit-dev.yml have changed, also run:

conda env update -f melafit-dev.yml --prune

This updates both the dependencies and the melafit package itself to the latest version.

Getting Started

Code example and some dummy data demonstrating melatonin profile curve fitting with this package are included in ./examples/ and ./data/. Copy sample scripts and datasets to your working directory and start from there. If you have performed the steps above as described, your script will 'see' all the required packages from any location. Simply make sure to use the virtual environment melafit you created.

Data preparation

Follow the Excel table format and column naming conventions as in ./data/:

  • Participant for study participant ID
  • Date for dates of the respective samples
  • Time for sample timestamps
  • Mel for melatonin level values

Scientific Foundations

If you use melafit in your research, please cite the following foundational publications:

Human-Readable

  1. Van Someren, E. J., & Nagtegaal, E. (2007). Improving melatonin circadian phase estimates. Sleep Medicine, 8(6), 590-601.
  2. Gabel, V., et al. (2017). Differential impact in young and older individuals of blue-enriched white light on circadian physiology and alertness during sustained wakefulness. Scientific Reports, 7, 7620.

BibTeX

@article{vansomeren2007,
  title={Improving melatonin circadian phase estimates},
  author={Van Someren, Eus JW and Nagtegaal, Elsbeth},
  journal={Sleep Medicine},
  volume={8},
  number={6},
  pages={590--601},
  year={2007},
  publisher={Elsevier}
}

@article{gabel2017,
  title={Differential impact in young and older individuals of
         blue-enriched white light on circadian physiology and alertness
         during sustained wakefulness},
  author={Gabel, Virginie and Reichert, Carolin F and Maire, Micheline
          and Schmidt, Christina and Schlangen, Luc JM
          and Kolodyazhniy, Vitaliy and Garbazza, Corrado
          and Cajochen, Christian and Viola, Antoine U},
  journal={Scientific Reports},
  volume={7},
  pages={7620},
  year={2017},
  publisher={Nature Publishing Group}
}

If there is no associated publication on melafit yet, please cite the package directly using the following reference:

Kolodyazhniy, V., Cajochen, C. (2026). melafit: High-precision circadian 
melatonin profile analysis (Version x.y.z). [Computer software]. 
Available at [https://github.com/vitaliy-ch25/melafit](https://github.com/vitaliy-ch25/melafit) 
(Accessed: dd mm yyyy).

Authors

  • Vitaliy Kolodyazhniy – Lead Developer
  • Christian Cajochen – Scientific Lead

Revision History

v0.3.0 - Cleaner API

  • AnalysisResult renamed to AnalysisRecord
  • AnalysisInfo renamed to SessionInfo; describes the data acquisition session only (participant, start, end); func and r2 removed
  • SessionInfo constructor simplified: accepts a single p_data DataFrame (as returned by prepare_part_data()); participant, start and end are derived automatically
  • FitResult.to_dict() now includes func (waveform function name) and r2 (R² goodness of fit), both computed automatically at the end of fit()
  • r2 is no longer a field of SessionInfo; fit() computes and stores it in FitResult directly
  • compute_wave() eliminated; replaced by the gen_time_range() + waveform-function pattern: gen_time_range() accepts a Timestamp series or explicit tmin/tmax bounds and a pandas offset string for step, and returns a time axis as float days since the Unix UTC epoch, which is then passed directly to the waveform function (e.g. bsbcf(t=gen_time_range(series, step="1min"), p=fit_result))
  • New helper to_days() converts timestamps to float days since the Unix UTC epoch; timezone-naive input is treated as UTC, timezone-aware input is converted to UTC first
  • New helper from_days() is the inverse of to_days(); returns a UTC-aware pd.DatetimeIndex
  • day_profile(), midpoint() and area_cog() now accept a float days array (as returned by gen_time_range()) in addition to pd.DatetimeIndex
  • fit() now accepts a datetime64 array or pandas Timestamp Series for time_fit; conversion via to_days() is automatic
  • prepare_part_data() no longer adds a Timedays column to the returned DataFrame; time handling is done internally via to_days()
  • prepare_part_data() returns an independent copy of the participant's data; mutations to the returned DataFrame do not affect the original; redundant Date and Time columns are dropped (both are combined in Timestamp)

v0.2.0 - Simplified API

  • New module results.py with classes: AnalysisResult (abstract base), AnalysisInfo, AmplitudeResult, MidpointResult, AreaCogResult, FitResult and ResultsCollector for result management
  • FitResult wraps scipy.optimize.OptimizeResult in its result field; fit() now returns FitResult
  • FitResult can be passed directly to waveform functions and compute_wave
  • amplitude(), midpoint() and area_cog() now return their respective result classes instead of tuples/floats
  • to_dict() on all result classes: timing fields returned as HH:MM strings, other fields as native types
  • AnalysisInfo.r2 defaults to NaN for convenience in DLMO workflows
  • New string_to_phase() utility function in utils.py (inverse of phase_to_string)
  • day_profile() accepts separate times and values parameters
  • PARAM_NAMES renamed to BUILTIN_PARAM_NAMES
  • Example scripts simplified via ResultsCollector and result classes
  • Unit tests for all new classes and methods

v0.1.3

  • Improved documentation
  • Developer installation option

v0.1.2

  • Improved documentation

v0.1.1 - First PyPI release

  • Enhanced function fit() to support custom waveform functions with user-defined initial parameters and bounds
  • Changed named parameter order in fit(): cost_f and cost_p are now the last two parameters
  • Fixed returned type hints in func_defaults()
  • Additional unit tests for new functionality
  • Improved README
  • Package registered in Python Package Index PyPI

v0.1.0 - First public release

  • Dictionary support for waveform function parameters throughout the package: all functions accept both dict and np.ndarray for parameter input
  • Named parameter constants: BCF_PARAM_NAMES, SBCF_PARAM_NAMES, BBCF_PARAM_NAMES, BSBCF_PARAM_NAMES and PARAM_NAMES lookup
  • New utility functions params_to_array() and array_to_params() for conversion between array and named dictionary representations
  • fit() now returns named parameter dictionary as res.p in addition to the standard scipy res.x array
  • fit() now accepts cost_p dictionary for passing parameters to the cost function (e.g. {"eps": 1e-6})
  • New utility function params_to_string() for human-readable parameter output
  • Fixed area_cog(): baseline subtraction and bin size normalization
  • Unit tests for all public functions in fitting, markers and utils

Initial revisions (v0.0.1 – v0.0.9)

  • Full implementation of melatonin profile analysis as described in Gabel et al. (2017)
  • Waveform functions: bcf, sbcf, bbcf, bsbcf
  • Markers: amplitude, midpoint, DLMOn, DLMOff, area, cog
  • Utilities: read_data, prepare_part_data, compute_wave, day_profile, abs_threshold, time_to_phase, phase_to_string, phase_diff
  • Example scripts: example_dlmo.py (DLMO from partial data) and example_full_profile.py (full profile analysis)
  • MIT license, packaging metadata and README

License

This project is licensed under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

melafit-0.3.0.tar.gz (32.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

melafit-0.3.0-py3-none-any.whl (21.8 kB view details)

Uploaded Python 3

File details

Details for the file melafit-0.3.0.tar.gz.

File metadata

  • Download URL: melafit-0.3.0.tar.gz
  • Upload date:
  • Size: 32.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for melafit-0.3.0.tar.gz
Algorithm Hash digest
SHA256 7d87beb735194ed6dfefbeed3fe80cfc2cc19299abe215d5496cb91ee7fab331
MD5 e8d43a758c88f2a15d9fb81b147fbf0d
BLAKE2b-256 e0823f8e841b9ae613a11de48bab4a2799aa2b032d424f1803621c1cb06d0e18

See more details on using hashes here.

Provenance

The following attestation bundles were made for melafit-0.3.0.tar.gz:

Publisher: python-publish.yml on vitaliy-ch25/melafit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file melafit-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: melafit-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 21.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for melafit-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3c51ad8796bdbce84eef251d049cd3b7eab2c00be0ef973a73896d8db41421d9
MD5 5f5fc3befbe8be6227beef54228c58bd
BLAKE2b-256 c647e2efb61e0bc9f44e2dd6ec7c90f50f76e7c95b45e18a42a4e240c417950c

See more details on using hashes here.

Provenance

The following attestation bundles were made for melafit-0.3.0-py3-none-any.whl:

Publisher: python-publish.yml on vitaliy-ch25/melafit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page