manager.demo_metrics.calculate_metrics

manager.demo_metrics.calculate_metrics(actual, predicted)

Calculate MAE and MSE for numeric evaluation.

Computes Mean Absolute Error (MAE) and Mean Squared Error (MSE) between actual and predicted values. These metrics are essential for evaluating forecasting model performance in safety-critical applications.

Parameters

Name Type Description Default
actual pd.Series Series of actual observed values. required
predicted pd.Series Series of predicted values (must have same length as actual). required

Returns

Name Type Description
Dict[str, float] Dict[str, float]: Dictionary containing: - ‘MAE’: Mean Absolute Error - ‘MSE’: Mean Squared Error

Raises

Name Type Description
ValueError If series have different lengths or contain NaN values.

Examples

import pandas as pd
from spotforecast2_safe.manager.demo_metrics import calculate_metrics

# Perfect predictions: both MAE and MSE should be zero
actual = pd.Series([1.0, 2.0, 3.0, 4.0, 5.0])
predicted = pd.Series([1.0, 2.0, 3.0, 4.0, 5.0])
metrics = calculate_metrics(actual, predicted)
print(f"MAE: {metrics['MAE']:.4f}")
print(f"MSE: {metrics['MSE']:.4f}")
assert metrics["MAE"] == 0.0
assert metrics["MSE"] == 0.0
MAE: 0.0000
MSE: 0.0000
import pandas as pd
from spotforecast2_safe.manager.demo_metrics import calculate_metrics

# Small symmetric errors: MAE == MSE == 1.0
actual = pd.Series([10.0, 20.0, 30.0, 40.0])
predicted = pd.Series([11.0, 19.0, 31.0, 39.0])
metrics = calculate_metrics(actual, predicted)
print(f"MAE: {metrics['MAE']:.4f}")
print(f"MSE: {metrics['MSE']:.4f}")
assert metrics["MAE"] == 1.0
assert metrics["MSE"] == 1.0
MAE: 1.0000
MSE: 1.0000
import pandas as pd
from spotforecast2_safe.manager.demo_metrics import calculate_metrics

# Larger asymmetric errors
actual = pd.Series([100.0, 200.0, 300.0])
predicted = pd.Series([95.0, 210.0, 290.0])
metrics = calculate_metrics(actual, predicted)
print(f"MAE: {metrics['MAE']:.4f}")
print(f"MSE: {metrics['MSE']:.4f}")
assert abs(metrics["MAE"] - 25 / 3) < 1e-9
assert abs(metrics["MSE"] - 75.0) < 1e-9
MAE: 8.3333
MSE: 75.0000
import pandas as pd
from spotforecast2_safe.manager.demo_metrics import calculate_metrics

# Safety-critical: validate metrics stay within acceptable bounds
actual = pd.Series([50.0, 55.0, 60.0, 65.0, 70.0])
predicted = pd.Series([51.0, 54.0, 61.0, 64.0, 71.0])
metrics = calculate_metrics(actual, predicted)
assert metrics["MAE"] < 2.0, "MAE exceeds safety threshold"
assert metrics["MSE"] < 5.0, "MSE exceeds safety threshold"
print("Safety validation passed")
Safety validation passed
import pandas as pd
from spotforecast2_safe.manager.demo_metrics import calculate_metrics

# Time series with a datetime index
dates = pd.date_range("2024-01-01", periods=5, freq="D")
actual = pd.Series([10.5, 11.2, 10.8, 11.5, 12.0], index=dates)
predicted = pd.Series([10.3, 11.4, 10.9, 11.3, 12.1], index=dates)
metrics = calculate_metrics(actual, predicted)
print(f"MAE: {metrics['MAE']:.4f}")
print(f"MSE: {metrics['MSE']:.4f}")
assert abs(metrics["MAE"] - 0.16) < 1e-9
assert abs(metrics["MSE"] - 0.028) < 1e-9
MAE: 0.1600
MSE: 0.0280
import pandas as pd
from spotforecast2_safe.manager.demo_metrics import calculate_metrics

# Compare two models: lower MAE wins
actual = pd.Series([1.0, 2.0, 3.0, 4.0, 5.0])
pred_model_a = pd.Series([1.1, 2.1, 2.9, 4.2, 4.8])
pred_model_b = pd.Series([1.5, 2.5, 3.5, 4.5, 5.5])
metrics_a = calculate_metrics(actual, pred_model_a)
metrics_b = calculate_metrics(actual, pred_model_b)
winner = "A" if metrics_a["MAE"] < metrics_b["MAE"] else "B"
print(f"Model A MAE: {metrics_a['MAE']:.4f}")
print(f"Model B MAE: {metrics_b['MAE']:.4f}")
print(f"Model {winner} has better MAE")
assert winner == "A"
Model A MAE: 0.1400
Model B MAE: 0.5000
Model A has better MAE