AI Time Series Forecasting for Business: Demand, Revenue, and Inventory Prediction
Practical machine learning approaches for accurate business forecasting
AI Time Series Forecasting for Business: Demand, Revenue, and Inventory Prediction
Why Traditional Forecasting Falls Short
Most businesses still rely on Excel trend lines, moving averages, or simple exponential smoothing. These methods fail when:
AI forecasting handles all these challenges while dramatically improving accuracy.
Modern Forecasting Approaches
Neural Prophet (Facebook Prophet + Neural Networks)
python
from neuralprophet import NeuralProphet
import pandas as pdLoad business data
df = pd.read_csv('daily_sales.csv')
df.columns = ['ds', 'y'] # NeuralProphet formatConfigure model
model = NeuralProphet(
# Seasonal components
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False,
# Trend modeling
trend_reg=0.1, # Regularization
# Neural network component
n_lags=30, # Use last 30 days as input
n_forecasts=14, # Predict 14 days ahead
# Training
batch_size=64,
epochs=50
)Add holidays and events
model.add_country_holidays(country_name='US')Add custom events (product launches, promotions)
events_df = pd.DataFrame({
'event': 'black_friday',
'ds': ['2023-11-24', '2024-11-29']
})
model.add_events(['black_friday'])Train
metrics = model.fit(df, freq='D', events_df=events_df)Forecast
future = model.make_future_dataframe(df, n_historic_predictions=True, periods=30)
forecast = model.predict(future)print(f"MAPE: {metrics['MAE'].mean():.2f}")
N-BEATS and N-HiTS (State-of-Art Deep Learning)
python
from neuralforecast import NeuralForecast
from neuralforecast.models import NHITS, NBEATS, PatchTSTDefine models
models = [
NHITS(
h=14, # Forecast horizon
input_size=60, # Context window
max_steps=1000,
scaler_type='standard'
),
NBEATS(
h=14,
input_size=60,
max_steps=1000
),
PatchTST(
h=14,
input_size=512, # Long context window
patch_len=16,
max_steps=1000
)
]nf = NeuralForecast(models=models, freq='D')
nf.fit(df)
Ensemble prediction (better than any single model)
predictions = nf.predict()
Demand Forecasting at Scale
Hierarchical Forecasting
python
from hierarchicalforecast.core import HierarchicalReconciliation
from hierarchicalforecast.methods import MinTraceForecast at all levels simultaneously:
Total → Region → State → City → Store → Product
def hierarchical_demand_forecast(df, hierarchy_spec, h=30):
"""
Ensures top-down consistency: sum of store forecasts = regional forecast
"""
# Generate base forecasts at each level
base_forecasts = {}
for level in hierarchy_spec:
level_data = df.groupby([level, 'ds'])['y'].sum().reset_index()
model = NeuralProphet(n_forecasts=h)
model.fit(level_data)
base_forecasts[level] = model.predict(...)
# Reconcile using MinTrace (optimal reconciliation)
hrec = HierarchicalReconciliation(reconcilers=[MinTrace(method='mint_shrink')])
reconciled = hrec.reconcile(base_forecasts, hierarchy_spec)
return reconciled
Result: Forecasts at every level that sum correctly
Probabilistic Forecasting
python
from statsforecast import StatsForecast
from statsforecast.models import AutoARIMA, AutoETS, AutoCESdef probabilistic_forecast(df, h=30, confidence_levels=[80, 95]):
"""
Returns prediction intervals, not just point forecasts
Essential for inventory planning (need safety stock at given confidence)
"""
models = [
AutoARIMA(season_length=7),
AutoETS(season_length=7),
AutoCES(season_length=7)
]
sf = StatsForecast(models=models, freq='D', n_jobs=-1)
sf.fit(df)
forecast_df = sf.predict(h=h, level=confidence_levels)
# Output includes:
# 'AutoARIMA', 'AutoARIMA-lo-80', 'AutoARIMA-hi-80'
# 'AutoARIMA-lo-95', 'AutoARIMA-hi-95'
return forecast_df
Revenue Forecasting
Multi-Variable Revenue Model
python
import xgboost as xgb
from sklearn.preprocessing import LabelEncoderdef build_revenue_forecast_model(df: pd.DataFrame) -> dict:
"""
Gradient boosting model incorporating multiple business signals
"""
# Feature engineering
df['month'] = df['date'].dt.month
df['quarter'] = df['date'].dt.quarter
df['day_of_week'] = df['date'].dt.dayofweek
df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
# Lag features
for lag in [7, 14, 30, 90]:
df[f'revenue_lag_{lag}'] = df['revenue'].shift(lag)
# Rolling features
for window in [7, 30, 90]:
df[f'revenue_rolling_mean_{window}'] = df['revenue'].rolling(window).mean()
df[f'revenue_rolling_std_{window}'] = df['revenue'].rolling(window).std()
# External variables
features = [
'month', 'quarter', 'day_of_week', 'is_weekend',
'marketing_spend', 'num_new_customers', 'avg_order_value',
'customer_churn_rate', 'nps_score',
*[f'revenue_lag_{l}' for l in [7, 14, 30, 90]],
*[f'revenue_rolling_mean_{w}' for w in [7, 30, 90]],
*[f'revenue_rolling_std_{w}' for w in [7, 30, 90]]
]
model = xgb.XGBRegressor(
n_estimators=500,
learning_rate=0.05,
max_depth=6,
subsample=0.8
)
model.fit(
df[features].dropna(),
df['revenue'].iloc[len(df) - len(df[features].dropna()):]
)
return {'model': model, 'features': features, 'importance': model.feature_importances_}
Anomaly Detection in Time Series
python
from merlion.models.anomaly import IsolationForest
from merlion.post_process.threshold import AggregateAlertsdef detect_metric_anomalies(time_series: pd.DataFrame) -> list:
"""
Detect anomalies in business metrics
Use cases: Revenue drops, traffic spikes, inventory shortages
"""
model = IsolationForest(IsolationForestConfig(
n_estimators=100,
n_past=100 # Context window
))
model.train(time_series)
anomaly_score = model.get_anomaly_score(time_series)
# Apply threshold to get binary anomaly labels
threshold = AggregateAlerts(AggregateAlertsConfig(count=3, lookback=5))
anomaly_labels = threshold(anomaly_score)
# Return anomaly timestamps with severity
return [
{'timestamp': ts, 'severity': score}
for ts, score in zip(anomaly_labels.index, anomaly_labels.values)
if score > 0
]
Tools and Frameworks
Key Takeaways
Also available in 中文.