TimeSmith for ML models
Project description
TimeSmith
TimeSmith is a time series machine learning library with strict layer boundaries and a clean architecture.
Architecture
TimeSmith uses a four-layer architecture with strict boundaries:
Layer 1: Typing (timesmith/typing)
Scientific types and runtime validators for time series data structures:
SeriesLike: pandas Series or single-column DataFrame with datetime/int indexPanelLike: DataFrame with entity key plus time indexTableLike: DataFrame with row index aligned to timeForecastLike: Forecast results with predictions and optional intervals
Layer 2: Core (timesmith/core)
Base classes, parameter handling, tags, and input validation:
BaseObject: Parameter management (get_params,set_params,clone)BaseEstimator: Base class withfitcapabilityBaseTransformer: Transformers withtransformand optionalinverse_transformBaseForecaster: Forecasters withpredictand optionalpredict_intervalBaseDetector: Anomaly detectors withscoreandpredictBaseFeaturizer: Transformers that outputTableLikedata
Layer 3: Compose (timesmith/compose)
Pipeline and adapter objects for composition:
Pipeline: Chains transformer steps with scitype change supportForecasterPipeline: Transformer(s) then forecasterAdapter: Converts between scitypes (Series ↔ Table)FeatureUnion: Runs multiple featurizers and concatenates results
Layer 4: Tasks & Eval (timesmith/tasks, timesmith/eval)
Task objects and evaluation tools:
ForecastTask: Binds data, horizon, and target semanticsDetectTask: Anomaly detection task definitionExpandingWindowSplit,SlidingWindowSplit: Cross-validation splittersbacktest_forecaster: Run backtests with metricssummarize_backtest: Aggregate and per-fold metrics
Quick Example
import pandas as pd
from timesmith import ForecastTask, backtest_forecaster, make_forecaster_pipeline
from timesmith.examples import NaiveForecaster, LogTransformer
# Load data
y = pd.Series([...], index=pd.date_range("2020-01-01", periods=100))
# Create forecast task
task = ForecastTask(y=y, fh=5, frequency="D")
# Build pipeline
transformer = LogTransformer(offset=1.0)
forecaster = NaiveForecaster()
pipeline = make_forecaster_pipeline(transformer, forecaster=forecaster)
# Run backtest
result = backtest_forecaster(pipeline, task)
# Summarize results
summary = summarize_backtest(result)
print(f"Mean MAE: {summary['aggregate_metrics']['mean_mae']:.4f}")
Running the Example
python examples/basic_forecast.py
This will:
- Load/generate example data
- Create a forecast task
- Build a pipeline with transformer and forecaster
- Run backtest
- Print summary metrics
Installation
pip install timesmith
Development
# Install in development mode
pip install -e ".[dev]"
# Run tests
pytest tests/
# Format code
black timesmith tests
# Run linting
flake8 timesmith tests
Features
- Model Serialization: Save and load fitted models
- Comprehensive Error Handling: Custom exceptions with context
- Logging Configuration: Centralized logging with environment variable support
- Data Validation: Edge case handling and data quality checks
- Pipeline Composition: Flexible transformer and forecaster pipelines
- Backtesting: Time series cross-validation with multiple metrics
- Network Analysis: Graph-based time series analysis
- Multiple Forecasters: ARIMA, Prophet, LSTM, Bayesian, and more
Model Serialization
from timesmith import SimpleMovingAverageForecaster, save_model, load_model
# Fit and save
forecaster = SimpleMovingAverageForecaster(window=5)
forecaster.fit(y)
save_model(forecaster, "model.pkl")
# Load later
loaded = load_model("model.pkl")
forecast = loaded.predict(fh=10)
Error Handling
TimeSmith provides custom exceptions for better error handling:
from timesmith import NotFittedError, DataError, ValidationError
try:
forecaster.predict(fh=5)
except NotFittedError as e:
print(f"Error: {e}")
print(f"Context: {e.context}")
Logging
Configure logging via environment variables:
export TIMESMITH_LOG_LEVEL=DEBUG
export TIMESMITH_LOG_FORMAT=detailed
Or programmatically:
from timesmith.logging_config import configure_logging
configure_logging(level="INFO")
Design Principles
- Strict Layer Boundaries: Core cannot import eval. Typing cannot import anything.
- Validation at Boundaries: Validate once at public API boundaries only.
- Task Semantics: Tasks hold semantics. Estimators only store params and fitted state.
- Composition: Use pipelines and adapters for flexible workflows.
- Type Safety: Scientific types with runtime validators for data structures.
Requirements
Core dependencies (minimal):
- Python 3.12 or higher
- pandas >= 1.5.0
- numpy >= 1.20.0
Optional dependencies:
scipy- For filters, changepoint detection, distances (install:pip install timesmith[scipy])networkx- For network analysis features (install:pip install timesmith[network])- See
pyproject.tomlfor all optional dependency groups - networkx >= 3.0
See pyproject.toml for optional dependencies for specific forecasters.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file timesmith-0.1.2.tar.gz.
File metadata
- Download URL: timesmith-0.1.2.tar.gz
- Upload date:
- Size: 121.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1719a93bf1b39a7a0a0884868396c0d044ead3603303dd5de18117629dbee17
|
|
| MD5 |
819a1a18edffd41eb5131a479aadfa42
|
|
| BLAKE2b-256 |
ce0a7dc97e9f12946514a7514cc1efefb6fe8dc552181acbfcb241e9d3438fd0
|
Provenance
The following attestation bundles were made for timesmith-0.1.2.tar.gz:
Publisher:
release.yml on kylejones200/timesmith
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
timesmith-0.1.2.tar.gz -
Subject digest:
a1719a93bf1b39a7a0a0884868396c0d044ead3603303dd5de18117629dbee17 - Sigstore transparency entry: 814957550
- Sigstore integration time:
-
Permalink:
kylejones200/timesmith@c929db889558796821c249d786c181e67430f7e2 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/kylejones200
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c929db889558796821c249d786c181e67430f7e2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file timesmith-0.1.2-py3-none-any.whl.
File metadata
- Download URL: timesmith-0.1.2-py3-none-any.whl
- Upload date:
- Size: 168.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
acb79bb7d231459cbc71009ff631a9c8c7e42ea8e541ff78470ce981c284cc09
|
|
| MD5 |
82c56f8e7a3d6a844abbacd3701c0796
|
|
| BLAKE2b-256 |
5e06835282008384c6748d16eab4d2074aa18a20e4d6d254190c7855893725e2
|
Provenance
The following attestation bundles were made for timesmith-0.1.2-py3-none-any.whl:
Publisher:
release.yml on kylejones200/timesmith
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
timesmith-0.1.2-py3-none-any.whl -
Subject digest:
acb79bb7d231459cbc71009ff631a9c8c7e42ea8e541ff78470ce981c284cc09 - Sigstore transparency entry: 814957561
- Sigstore integration time:
-
Permalink:
kylejones200/timesmith@c929db889558796821c249d786c181e67430f7e2 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/kylejones200
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c929db889558796821c249d786c181e67430f7e2 -
Trigger Event:
push
-
Statement type: