eyetrajectoriespy
Functional analysis of continuous and sparse eye-tracking trajectories in Python.
Instead of immediately reducing gaze to fixation counts, dwell summaries, or symbolic scanpaths, eyetrajectoriespy treats gaze as a time-indexed functional process
$$ \mathbf G_i(t)= \begin{bmatrix} x_i(t)\ y_i(t) \end{bmatrix}. $$
Stable: 1.0.0 · Published 1.1 release candidate: 1.1.0rc1 · Python: 3.11–3.13
pip install eyetrajectoriespy
# exact reproducible stable release
pip install eyetrajectoriespy==1.0.0
# exact published 1.1 prerelease
pip install eyetrajectoriespy==1.1.0rc1
Documentation · Quick start · Choose a workflow · Mathematics · Visual gallery · Validation
Current stable release:
1.0.0
1.0.0freezes the evidence-backed 1.0 compatibility boundary over the production-observed1.0.0rc1scientific/API surface without adding a new estimator or changing scientific behavior. Release qualification, immutable hashes, OIDC/attestation evidence, and publication chronology are retained in the 1.0.0 release notes and validation records rather than repeated on this landing page.Published 1.1 release candidate:
1.1.0rc1
The post-1.0 sparse/irregular scientific programme (#158) and integration/readiness programme (#183) are complete through R5.1.1.0rc1is published on GitHub and production PyPI from exact protected-main commitf4405897e2a7a2392c03523cc7fa18e43df00e5e; the frozen1.0.0root compatibility boundary remains unchanged, and the 1.1 additions remain supported module-scoped APIs.1.0.0remains the stable/default release while the RC undergoes production-installed observation before any final1.1.0promotion decision.
What can it model?
| Scientific object | Main route | Status |
|---|---|---|
| Dense/common-grid continuous x/y gaze | fit_mfpca() |
stable 1.0 |
| Sparse/irregular single-coordinate gaze | fit_sparse_fpca() + PACE |
stable 1.0 |
| Sparse/irregular paired planar x/y gaze | fit_sparse_mfpca() + joint PACE |
stable 1.0 |
| Repeated participant/trial functions | functional mixed effects / multilevel FPCA | stable 1.0 |
| Conditional uncertainty for sparse PACE and joint PACE scores | sparse_score_uncertainty / sparse_multivariate_score_uncertainty |
supported 1.1 RC module API |
| Audited sparse smoothing-bandwidth selection | sparse_bandwidth_selection / sparse_multivariate_bandwidth_selection |
supported 1.1 RC module API |
| Candidate-sample observation-process diagnostics | observation_process |
supported 1.1 RC module API |
| Sparse participant/trial hierarchical decomposition | sparse_multilevel |
supported 1.1 RC module API |
| Coordinate-specific asynchronous sparse planar gaze | sparse_multivariate_async |
supported 1.1 RC module API |
| Future/partially observed sparse trajectory prediction and participant-aware conformal bands | sparse_partial_prediction / sparse_partial_conformal |
supported 1.1 RC module API |
The post-1.0 module-scoped APIs are documented in the 1.1 module API and integration audit. They are intentionally not root re-exports and should not be interpreted as stable 1.1.0 functionality until final promotion is separately qualified.
Which workflow do I need?
| Scientific question | Start here |
|---|---|
| What are the dominant modes of continuous gaze variation? | Continuous gaze exploration + FPCA |
| How does an experimental predictor change a continuous functional response? | Experimental functional regression |
| How do repeated participant trials affect functional inference? | Repeated-trial functional mixed effects |
| How do predictors change repeated binary or count functional responses? | Generalized binary/count responses |
| Is recurrence or nonlinear temporal organization the scientific target? | Nonlinear/recurrence analysis |
Minimal dense/common-grid example
from eyetrajectoriespy import fit_mfpca, simulate_planar_trajectories
gaze = simulate_planar_trajectories(
n_participants=20,
trials_per_participant=6,
random_state=7,
)
fit = fit_mfpca(gaze, n_components=0.95, scaling="dimension_sd")
print(fit.explained_variance_ratio)
Minimal sparse paired-planar example
import numpy as np
from eyetrajectoriespy import fit_sparse_mfpca
fit = fit_sparse_mfpca(
irregular,
dimensions=("x", "y"),
n_components=2,
evaluation_grid=np.linspace(0.0, 1.0, 41),
mean_bandwidth=0.20,
covariance_bandwidth=0.30,
measurement_error="diagonal",
measurement_error_variance=(0.0025, 0.0025),
psd_action="project",
score_failure_action="retain_nan",
)
The sparse estimator uses native paired observations to estimate a joint population mean/covariance model. Evaluating fitted population functions at native times for PACE is not raw-trajectory interpolation.
What eyetrajectoriespy refuses to hide
Consequential choices stay explicit: missingness, interpolation, smoothing, registration, time/coordinate normalization, analysis support, measurement-error assumptions, PSD policy, family/model selection, resampling unit, denominator/exposure semantics, and failure/status codes.
Scope
eyetrajectoriespy starts once gaze has a scientifically interpretable time and coordinate representation. Event detection, general gaze QC, survival analysis, AOI perturbation robustness, and symbolic sequence models belong upstream or in specialist packages.
The package deliberately separates stable public methods, advanced diagnostics, external-backend interoperability, and experimental methods. Scientific product qualification matters more than estimator count.
Where is the full advanced API?
The README is intentionally a compact entry point rather than the exhaustive function catalogue.
- Capability inventory
- Public API
- 1.1 module-scoped API
- 1.1 integration audit
- API stability and hierarchy
- Mathematical reference
- Capability status and roadmap
- Reference validation & performance envelope
Release lineage and reproducibility
The stable pre-1.0 sequence remains explicit: 0.10.0 introduced the native sparse univariate FPCA/PACE line, the immutable 0.11.0rc1 prerelease preceded final 0.11 known-truth recovery infrastructure, and 0.12.0 added the native sparse planar MFPCA/joint-PACE line. 1.0.0 closes that stabilization programme as the frozen stable compatibility baseline. Published tags and distributions remain immutable historical records. The completed A1–C1 and R1–R5 1.1 work is published as immutable prerelease 1.1.0rc1; production-installed observation now precedes any separately qualified final 1.1.0 promotion.
Documentation and reproducibility
- Sparse planar MFPCA / joint PACE guide
- Implementation-matched mathematical reference
- Function → equation index
- Mathematical contracts
- Workflow atlas
- Current validation ledger
- 1.0.0 release notes
- 1.1.0rc1 release notes
Development checks:
python -m pytest --cov=eyetrajectoriespy
python -m compileall -q src
python scripts/generate_function_equation_index.py --check
python scripts/generate_docs_gallery.py
python scripts/generate_sparse_mfpca_docs_figure.py
python scripts/validate_docs_contracts.py
mkdocs build --strict
Citation and license
See CITATION.cff for citation metadata. MIT © 2026 Stefanos Balaskas.
Metadata
Release files for eyetrajectoriespy 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| eyetrajectoriespy-1.1.0.tar.gz | 540.9 kB | With provenance | Details for eyetrajectoriespy-1.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| eyetrajectoriespy-1.1.0-py3-none-any.whl | Python 3 | none | any | Details for eyetrajectoriespy-1.1.0-py3-none-any.whl |
Total release size: 977.6 kB
Release files / eyetrajectoriespy-1.1.0.tar.gz
| Download URL | eyetrajectoriespy-1.1.0.tar.gz |
|---|---|
| Size | 540.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
446a42532f3812b0aae8df24e0a95a40355a0669e822e4b27cd31350f57cf87b
|
|
BLAKE2b-256 checksum How to use checksums |
e03dc808a7951b19ab1730917ad2dae0d7378e20076cdb508cf6c11bf6061d04
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / eyetrajectoriespy-1.1.0-py3-none-any.whl
| Download URL | eyetrajectoriespy-1.1.0-py3-none-any.whl |
|---|---|
| Size | 436.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bb869c7a1dd3ecd03135d1615d2977f4d0e07c8cfa4fdef10cddc83f826dbf5b
|
|
BLAKE2b-256 checksum How to use checksums |
286d759f53e8d875aba8745ee9c3445572d7cd3696ee28b59bac546fc1b1de68
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logSecurity for eyetrajectoriespy 1.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for eyetrajectoriespy-1.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.