Python client for the Synthefy API forecasting service
Project description
Synthefy Python Client
A Python client for the Synthefy API forecasting service. This package provides an easy-to-use interface for making time series forecasting requests with both synchronous and asynchronous support.
Features
- Sync & Async Support: Separate clients for synchronous and asynchronous operations
- Professional Error Handling: Comprehensive exception hierarchy with detailed error messages
- Retry Logic: Built-in exponential backoff for transient errors (rate limits, server errors)
- Context Managers: Automatic resource cleanup with
withandasync withstatements - Pandas Integration: Built-in support for pandas DataFrames
- Type Safety: Full type hints and Pydantic validation
Installation
pip install synthefy
Quick Start
Basic Usage
from synthefy import SynthefyAPIClient, SynthefyAsyncAPIClient
import pandas as pd
# Synchronous client
with SynthefyAPIClient(api_key="your_api_key_here") as client:
# Make requests...
pass
# Asynchronous client
async with SynthefyAsyncAPIClient() as client: # Uses SYNTHEFY_API_KEY env var
# Make async requests...
pass
Making a Forecast Request
from synthefy import SynthefyAPIClient
import pandas as pd
import numpy as np
# Create sample data with numeric metadata
history_data = {
'date': pd.date_range('2024-01-01', periods=100, freq='D'),
'sales': np.random.normal(100, 10, 100),
'store_id': 1,
'category_id': 101,
'promotion_active': 0
}
target_data = {
'date': pd.date_range('2024-04-11', periods=30, freq='D'),
'sales': np.nan, # Values to forecast
'store_id': 1,
'category_id': 101,
'promotion_active': 1 # Promotion active in forecast period
}
history_df = pd.DataFrame(history_data)
target_df = pd.DataFrame(target_data)
# Synchronous forecast
with SynthefyAPIClient() as client:
forecast_dfs = client.forecast_dfs(
history_dfs=[history_df],
target_dfs=[target_df],
target_col='sales',
timestamp_col='date',
metadata_cols=['store_id', 'category_id', 'promotion_active'],
leak_cols=[],
model='sfm_moe'
)
# Result is a list of DataFrames with forecasts
forecast_df = forecast_dfs[0]
print(forecast_df[['timestamps', 'sales']].head())
Asynchronous Usage
import asyncio
from synthefy import SynthefyAsyncAPIClient
async def main():
async with SynthefyAsyncAPIClient() as client:
# Single async forecast
forecast_dfs = await client.forecast_dfs(
history_dfs=[history_df],
target_dfs=[target_df],
target_col='sales',
timestamp_col='date',
metadata_cols=['store_id', 'category_id', 'promotion_active'],
leak_cols=[],
model='sfm_moe'
)
# Concurrent forecasts for multiple datasets
tasks = []
for i in range(3):
# Create variations of your data
modified_history = history_df.copy()
modified_target = target_df.copy()
modified_history['store_id'] = i + 1
modified_target['store_id'] = i + 1
task = client.forecast_dfs(
history_dfs=[modified_history],
target_dfs=[modified_target],
target_col='sales',
timestamp_col='date',
metadata_cols=['store_id', 'category_id', 'promotion_active'],
leak_cols=[],
model='sfm_moe'
)
tasks.append(task)
# Execute all forecasts concurrently
results = await asyncio.gather(*tasks)
for i, forecast_dfs in enumerate(results):
print(f"Forecast for store {i+1}: {len(forecast_dfs[0])} predictions")
# Run the async function
asyncio.run(main())
Advanced Configuration
from synthefy import SynthefyAPIClient
from synthefy.api_client import BadRequestError, RateLimitError
# Client with custom configuration
with SynthefyAPIClient(
api_key="your_key",
timeout=600.0, # 10 minutes
max_retries=3,
organization="your_org_id",
base_url="https://custom.synthefy.com" # For enterprise customers
) as client:
try:
# Per-request configuration
forecast_dfs = client.forecast_dfs(
history_dfs=[history_df],
target_dfs=[target_df],
target_col='sales',
timestamp_col='date',
metadata_cols=['store_id'],
leak_cols=[],
model='sfm_moe',
timeout=120.0, # Override client timeout for this request
idempotency_key="unique-request-id", # Prevent duplicate processing
extra_headers={"X-Custom-Header": "value"}
)
except BadRequestError as e:
print(f"Invalid request: {e}")
print(f"Status code: {e.status_code}")
print(f"Request ID: {e.request_id}")
except RateLimitError as e:
print(f"Rate limited: {e}")
# Client automatically retries with exponential backoff
except Exception as e:
print(f"Unexpected error: {e}")
API Reference
SynthefyAPIClient (Synchronous)
The synchronous client class for interacting with the Synthefy API.
Constructor Parameters
api_key: Your Synthefy API key (can also be set viaSYNTHEFY_API_KEYenvironment variable)timeout: Request timeout in seconds (default: 300.0 / 5 minutes)max_retries: Number of retries for transient errors (default: 2)base_url: API base URL (default: "https://prod.synthefy.com")organization: Optional organization ID for multi-tenant setupsuser_agent: Custom user agent string
Methods
forecast(request, *, timeout=None, idempotency_key=None, extra_headers=None) -> ForecastV2Response- Make a direct forecast request with a
ForecastV2Requestobject
- Make a direct forecast request with a
forecast_dfs(history_dfs, target_dfs, target_col, timestamp_col, metadata_cols, leak_cols, model) -> List[pd.DataFrame]- Convenience method for working directly with pandas DataFrames
close(): Manually close the HTTP client- Context manager support: Use with
with SynthefyAPIClient() as client:
SynthefyAsyncAPIClient (Asynchronous)
The asynchronous client class for non-blocking operations and concurrent requests.
Constructor Parameters
Same as SynthefyAPIClient.
Methods
async forecast(request, *, timeout=None, idempotency_key=None, extra_headers=None) -> ForecastV2Response- Async version of forecast method
async forecast_dfs(history_dfs, target_dfs, target_col, timestamp_col, metadata_cols, leak_cols, model) -> List[pd.DataFrame]- Async version of forecast_dfs method
async aclose(): Manually close the async HTTP client- Async context manager support: Use with
async with SynthefyAsyncAPIClient() as client:
Exception Hierarchy
All exceptions inherit from SynthefyError:
APITimeoutError: Request timed outAPIConnectionError: Network/connection issuesAPIStatusError: Base class for HTTP status errorsBadRequestError(400, 422): Invalid request dataAuthenticationError(401): Invalid API keyPermissionDeniedError(403): Access deniedNotFoundError(404): Resource not foundRateLimitError(429): Rate limit exceededInternalServerError(5xx): Server errors
Each status error includes:
status_code: HTTP status coderequest_id: Request ID for debugging (if available)error_code: API-specific error code (if available)response_body: Raw response body
Configuration
Environment Variables
SYNTHEFY_API_KEY: Your Synthefy API key
Support
For support and questions:
- Email: contact@synthefy.com
License
MIT License - see LICENSE file for details.
Project details
Release history Release notifications | RSS feed
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 synthefy-2.0.1.tar.gz.
File metadata
- Download URL: synthefy-2.0.1.tar.gz
- Upload date:
- Size: 9.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eef0d262def1ad1018dde03837d8c813cb82451178cf551b255f26a1bd5b1e6e
|
|
| MD5 |
8c6d275b211f3b7825a406ae15d5856e
|
|
| BLAKE2b-256 |
5a0a4cb74b514d191ea2cda39c557295f0ad9111a55c166db054f92de1d7d2a8
|
File details
Details for the file synthefy-2.0.1-py3-none-any.whl.
File metadata
- Download URL: synthefy-2.0.1-py3-none-any.whl
- Upload date:
- Size: 9.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73b317f8b19661bfd8fbf3ccf0ffe375d0dbaf05929bdf19fb2d3e0f0379d4ed
|
|
| MD5 |
d592f552b6d1cf6fd8a621831314df8e
|
|
| BLAKE2b-256 |
278b16c730dd1139e93fb817cdab8811b5eaa362faaef55cf604bb8030325a60
|