Hybrid time series forecasting library combining Prophet with gradient boosting models
Project description
HybridTS
Hybrid Time Series Forecasting Made Simple
A Python library that combines the power of Prophet's trend detection with gradient boosting algorithms (XGBoost and LightGBM) for accurate time series forecasting.
Why HybridTS?
Time series forecasting is hard. While Prophet excels at capturing trends and seasonality, it often misses complex patterns in the residuals. Gradient boosting models like XGBoost are great at capturing these patterns but struggle with long-term trends.
HybridTS combines both approaches:
- Prophet captures trend, seasonality, and holiday effects
- XGBoost/LightGBM models the residuals to capture remaining patterns
- Final forecast = Prophet baseline + ML corrections
This hybrid approach typically achieves 15-30% better accuracy than using either model alone.
What Makes It Different
- 🎯 Pre-configured hybrid models - No need to manually orchestrate Prophet + ML
- 🔧 Automated feature engineering - Holidays, paydays, temporal patterns built-in
- 📊 Temporal cross-validation - Proper time series validation out-of-the-box
- 🌍 Flexible holidays - Support for any country via the
holidayslibrary - 📈 MLflow integration - Track experiments and version models automatically
- 🚀 Production-ready - Designed for real-world forecasting workflows
Installation
pip install hybridts
Requirements: Python 3.8+
Quick Start
Installation
pip install hybridts
Simplest Example (5 lines)
import pandas as pd
from hybridts import HybridForecaster
# Load your data (must have 'ds' and 'y' columns)
df = pd.read_csv("your_data.csv", parse_dates=["ds"])
# Train and predict with defaults
forecaster = HybridForecaster()
forecaster.fit(df, model="xgboost")
forecast = forecaster.predict(horizon=30)
print(forecast[['ds', 'yhat']].head())
That's it! The library handles Prophet training, residual modeling, cross-validation, and hybrid forecasting automatically.
With Custom Configuration
from hybridts import HybridForecaster
config = {
'test_size': 30,
'models': {
'xgboost': {
'param_grid': {
'window_length': [21],
'estimator__max_depth': [5],
'estimator__learning_rate': [0.05]
}
}
}
}
forecaster = HybridForecaster(config=config)
forecaster.fit(df, model="xgboost")
forecast = forecaster.predict(horizon=30)
For more configuration options, see Configuration Modes below.
Data Format
Your data must be a pandas DataFrame with two columns:
| Column | Type | Description |
|---|---|---|
ds |
datetime | Date of observation |
y |
float | Value to forecast (revenue, demand, etc.) |
Example:
import pandas as pd
import numpy as np
# Generate sample data
dates = pd.date_range('2023-01-01', periods=365, freq='D')
values = np.random.uniform(10000, 20000, 365)
df = pd.DataFrame({'ds': dates, 'y': values})
Configuration Modes
HybridTS supports three ways to configure models, from simplest to most flexible:
Mode 1: Default Configuration (Quickest) ⚡
Best for: Quick experiments, prototyping, first-time users
from hybridts import HybridForecaster
# Everything configured with sensible defaults
forecaster = HybridForecaster()
forecaster.fit(df, model="xgboost")
forecast = forecaster.predict(horizon=30)
What's included by default:
- Test size: 30 days
- Prophet with multiplicative seasonality
- XGBoost/LightGBM with optimized hyperparameters
- Expanding window cross-validation
Mode 2: Programmatic Configuration (Flexible) 🔧
Best for: Custom experiments, parameter tuning, notebooks
from hybridts import HybridForecaster
config = {
'test_size': 30,
'cv_params': {
'initial_window': 300,
'step_length': 30
},
'models': {
'prophet': {
'param_grid': {
'changepoint_prior_scale': [0.05, 0.1],
'seasonality_prior_scale': [5.0, 10.0],
'seasonality_mode': ['multiplicative']
}
},
'xgboost': {
'param_grid': {
'window_length': [21, 28],
'estimator__max_depth': [5, 7],
'estimator__learning_rate': [0.05, 0.1]
}
}
}
}
forecaster = HybridForecaster(config=config)
forecaster.fit(df, model="xgboost")
Mode 3: YAML Configuration (Production) 📋
Best for: Production pipelines, reproducible experiments, team collaboration
settings.yaml:
test_size: 30
cv_params:
initial_window: 300
step_length: 30
models:
prophet:
param_grid:
changepoint_prior_scale: [0.05, 0.1, 0.5]
seasonality_prior_scale: [5.0, 10.0]
seasonality_mode: ['multiplicative']
cv_params:
initial: '350 days'
period: '30 days'
horizon: '30 days'
parallel: 'threads'
xgboost:
param_grid:
window_length: [21, 28]
estimator__max_depth: [5, 7]
estimator__learning_rate: [0.05, 0.1]
static:
n_estimators: 200
max_depth: 5
learning_rate: 0.05
Python:
from hybridts import HybridForecaster
from hybridts.config import load_config
config = load_config("settings.yaml")
forecaster = HybridForecaster(config=config)
forecaster.fit(df, model="xgboost")
Benefits:
- ✅ Version control your configurations
- ✅ Share configurations across team
- ✅ Easy A/B testing (swap config files)
- ✅ Separate code from parameters
Key Features
1. Hybrid Models
Combine Prophet with gradient boosting for superior accuracy:
from hybridts import HybridForecaster, TimeSeriesProcessor
processor = TimeSeriesProcessor()
forecaster = HybridForecaster(config=config, processor=processor)
# Choose your ML model
forecaster.fit(df, escolha_modelo="xgboost") # Prophet + XGBoost
forecaster.fit(df, escolha_modelo="lightgbm") # Prophet + LightGBM
forecaster.fit(df, escolha_modelo="sxgboost") # Prophet + XGBoost (fast mode)
2. Automated Feature Engineering
Built-in features for common time series patterns:
from hybridts import create_features, get_brazilian_paydays
# Generate payday dates
paydays = get_brazilian_paydays(2023, 2025, country="BR", state="SP")
# Create features automatically
X = create_features(
df_dates=df[['ds']],
paydays_set=paydays,
min_year=2023,
max_year=2025,
holidays_country="BR",
holidays_state="SP"
)
# Features created:
# - is_weekend, is_month_start, is_month_end
# - day_of_week, day_of_month
# - is_payday, is_adiantamento (salary advance)
# - is_holiday, is_holiday_eve, is_post_holiday
# - dias_desde_pagamento (days since last payday)
3. Custom Holidays
Support for any country and custom events:
from hybridts import create_holidays_prophet
# Brazilian holidays (default)
holidays_br = create_holidays_prophet(
years=[2023, 2024, 2025],
country="BR",
state="SP"
)
# US holidays with custom events
holidays_us = create_holidays_prophet(
years=[2023, 2024, 2025],
country="US",
state=None,
custom_events=[
{'holiday': 'Black_Friday', 'ds': '2023-11-24', 'lower_window': -2, 'upper_window': 2},
{'holiday': 'Cyber_Monday', 'ds': '2023-11-27', 'lower_window': 0, 'upper_window': 2}
]
)
4. Model Validation
Proper time series validation with temporal cross-validation:
# Split data
df_train = df.iloc[:-30]
df_test = df.iloc[-30:]
# Train
forecaster.fit(df_train, escolha_modelo="xgboost")
# Validate
metrics = forecaster.validate(df_train, df_test)
print(f"MAPE: {metrics['mape']:.2%}")
print(f"RMSE: {metrics['rmse']:.2f}")
print(f"MAE: {metrics['mae']:.2f}")
5. MLflow Integration
Track experiments and version models:
# Train and save
forecaster.fit(df, escolha_modelo="xgboost")
metrics = forecaster.validate(df, df_test)
run_id = forecaster.save_to_mlflow(
target="Revenue",
metrics=metrics,
experiment_path="my_forecasting_project",
registry_path="./models/latest_model.json"
)
# Load later
from hybridts import HybridForecaster, TimeSeriesProcessor
forecaster, metadata = HybridForecaster.load_from_mlflow(
config=config,
processor=processor,
registry_path="./models/latest_model.json"
)
print(f"Model trained on: {metadata['trained_at']}")
print(f"MAPE: {metadata['mape']:.2%}")
Configuration
HybridTS uses YAML for configuration. Create a config.yaml file:
# Temporal cross-validation settings
cv_params:
initial_window: 365
step_length: 30
# Model hyperparameters
models:
prophet:
param_grid:
changepoint_prior_scale: [0.01, 0.1]
seasonality_prior_scale: [1.0, 10.0]
seasonality_mode: ['multiplicative']
cv_params:
initial: '365 days'
period: '30 days'
horizon: '30 days'
parallel: 'threads'
xgboost:
param_grid:
window_length: [14, 28]
estimator__max_depth: [5, 6]
estimator__learning_rate: [0.05, 0.1]
estimator__n_estimators: [200]
# Test set size
test_size: 30
Or configure programmatically:
config = {
'test_size': 30,
'models': {
'prophet': {
'param_grid': {
'changepoint_prior_scale': [0.05],
'seasonality_mode': ['multiplicative']
}
},
'xgboost': {
'param_grid': {
'window_length': [14],
'estimator__max_depth': [5]
}
}
}
}
forecaster = HybridForecaster(config=config, processor=processor)
Examples
Check out the examples/ directory for complete examples:
- quickstart.py - Basic usage and configuration
- notebooks/ - Jupyter notebooks with detailed workflows
Use Cases
HybridTS works well for:
- 📈 Revenue forecasting - Predict future revenue with trend and seasonality
- 🛒 Demand forecasting - Forecast product demand for inventory planning
- 💰 Financial metrics - TPV, transaction volume, user growth
- 📊 Business KPIs - Any metric with temporal patterns
Not recommended for:
- High-frequency data (sub-hourly) - Prophet is designed for daily+ granularity
- Very short time series (<6 months) - Not enough data for reliable patterns
- Non-stationary processes - Requires preprocessing/differencing
Performance Tips
Speed Up Training
Grid search can be slow. For faster iterations:
# Use static parameters (no grid search)
forecaster.fit(df, escolha_modelo="sxgboost") # 's' prefix = static/fast mode
Reduce Memory Usage
For large datasets:
# Use smaller cross-validation windows
config['cv_params']['initial_window'] = 180 # Instead of 365
config['cv_params']['step_length'] = 60 # Instead of 30
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Citation
If you use HybridTS in your research or project, please cite:
@software{hybridts2026,
author = {Franco, Davi},
title = {HybridTS: Hybrid Time Series Forecasting},
year = {2026},
url = {https://github.com/davifrancamaciel/hybridts}
}
Acknowledgments
Built on top of excellent open-source projects:
Contact
Davi Franco
📧 alcanfordavi@gmail.com
🐙 @DaviAlcanfor
Made with ❤️ for the time series forecasting community
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 hybridts-0.1.0.tar.gz.
File metadata
- Download URL: hybridts-0.1.0.tar.gz
- Upload date:
- Size: 46.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80f2c85896f1c83b3cb686d031820a3494a5bd0cd93fb68590eae69c6bf4b6b7
|
|
| MD5 |
583c83ea11b9ef8ead5d1ea507e1040c
|
|
| BLAKE2b-256 |
b7a8fb6569c1786321bbf8a77d58f786f2ae35652374ca13daf2f4d674d0904f
|
File details
Details for the file hybridts-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hybridts-0.1.0-py3-none-any.whl
- Upload date:
- Size: 26.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c7ea7ceb3242499ac647d8a8541f46b3d61954d544265800f22f02dc79be193
|
|
| MD5 |
1c2d15ef98720eb398eca243d8b5b15e
|
|
| BLAKE2b-256 |
9ac5825a3d4a4856f6966e42e9c0c875cd4c561ae45c172f670f821bb9883d2b
|