More about forecasting in cienciadedatos.net
- ARIMA and SARIMAX models with python
- Time series forecasting with machine learning
- Forecasting time series with gradient boosting: XGBoost, LightGBM and CatBoost
- Forecasting time series with XGBoost
- Probabilistic forecasting
- Forecasting with deep learning
- Forecasting energy demand with machine learning
- Forecasting web traffic with machine learning
- Intermittent demand forecasting
- Modelling time series trend with tree-based models
- Bitcoin price prediction with Python
- Stacking ensemble of machine learning models to improve forecasting
- Interpretable forecasting models
- Mitigating the Impact of Covid on forecasting Models
- Forecasting time series with missing values
Introduction
When faced with scenarios involving the prediction of hundreds or thousands of time series, a crucial decision arises: should one develop individual models for each series, or should one use a unified model to handle them all at once?
In Single-Series Modeling (Local Forecasting Model), a separate predictive model is created for each time series. While this method provides a comprehensive understanding of each series, its scalability can be challenged by the need to create and maintain hundreds or thousands of models.
Multi-Series Modeling (Global Forecasting Model) involves building a single predictive model that considers all time series simultaneously. It attempts to capture the core patterns that govern the series, thereby mitigating the potential noise that each series might introduce. This approach is computationally efficient, easy to maintain, and can yield more robust generalizations across time series, albeit potentially at the cost of sacrificing some individual insights.
This document shows how to forecast more than 1000 time series with a single deep learning model including exogenous features.
💡 Tip
This is part of a series of documents on global forecasting models:- Global Forecasting Models: Modeling multiple time series with machine learning
- Scalable Forecasting: modeling thousand time series with a single global model
- Global Forecasting Models: Comparative Analysis of Single and Multi-Series Forecasting Modeling
- A Step-by-Step Guide to Global Time Series Forecasting Using Kaggle Sticker Sales Data
- The M5 Accuracy competition: the success of global forecasting models
- Clustering Time Series to Improve Forecasting Models
- Forecasting at scale with deep learning models
✏️ Note
This use case has also been examined using a global forecasting model based on gradient boosting (LightGBM) rather than deep learning approaches. In the reported experiments, LightGBM delivered superior performance. However, this outcome may not generalize across all datasets, and readers are encouraged to evaluate both approaches for their specific applications.
Libraries
Libraries used in this document.
import os
os.environ["KERAS_BACKEND"] = "torch" # Options: "tensorflow", "jax", or "torch"
import keras
# Data management
# ==============================================================================
import numpy as np
import pandas as pd
from skforecast.datasets import fetch_dataset
# Plots
# ==============================================================================
import matplotlib.pyplot as plt
from skforecast.plot import set_dark_theme
# Forecasting
# ==============================================================================
import skforecast
from skforecast.deep_learning import ForecasterRnn
from skforecast.deep_learning.utils import create_and_compile_model
from skforecast.model_selection import TimeSeriesFold
from skforecast.model_selection import backtesting_forecaster_multiseries
from feature_engine.datetime import DatetimeFeatures
from feature_engine.creation import CyclicalFeatures
from sklearn.preprocessing import MinMaxScaler
import keras
from keras.optimizers import Adam
from keras.losses import MeanSquaredError
from keras.callbacks import EarlyStopping
import torch
# Configuration
# ==============================================================================
import warnings
warnings.filterwarnings('once')
print('Versi0n skforecast:', skforecast.__version__)
print('Version keras:', keras.__version__)
print('Version torch:', torch.__version__)
Versi0n skforecast: 0.19.0 Version keras: 3.12.0 Version torch: 2.8.0
Data
Data used in this document has been obtained from the The Building Data Genome Project 2 https://github.com/buds-lab/building-data-genome-project-2. The dataset contains information on the energy consumption of more than 1500 buildings. The time range of the times-series data is the two full years (2016 and 2017) and the frequency is hourly measurements of electricity, heating and cooling water, steam, and irrigation meters. Additionally, the dataset includes information of the characteristics of the buildings and the weather conditions. Data has been aggregated to a daily resolution and only the electricity among the different energy sources has been considered.
# Load data
# ==============================================================================
data = fetch_dataset(name='bdg2_daily')
print("Data shape:", data.shape)
data.head(3)
╭─────────────────────────────────── bdg2_daily ───────────────────────────────────╮ │ Description: │ │ Daily energy consumption data from the The Building Data Genome Project 2 with │ │ building metadata and weather data. https://github.com/buds-lab/building-data- │ │ genome-project-2 │ │ │ │ Source: │ │ Miller, C., Kathirgamanathan, A., Picchetti, B. et al. The Building Data Genome │ │ Project 2, energy meter data from the ASHRAE Great Energy Predictor III │ │ competition. Sci Data 7, 368 (2020). https://doi.org/10.1038/s41597-020-00712-x │ │ │ │ URL: │ │ https://drive.google.com/file/d/1KHYopzclKvS1F6Gt6GoJWKnxiuZ2aqen/view?usp=shari │ │ ng │ │ │ │ Shape: 1153518 rows x 17 columns │ ╰──────────────────────────────────────────────────────────────────────────────────╯
Data shape: (1153518, 17)
| building_id | meter_reading | site_id | primaryspaceusage | sub_primaryspaceusage | sqm | lat | lng | timezone | airTemperature | cloudCoverage | dewTemperature | precipDepth1HR | precipDepth6HR | seaLvlPressure | windDirection | windSpeed | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| timestamp | |||||||||||||||||
| 2016-01-01 | Bear_assembly_Angel | 12808.1620 | Bear | Entertainment/public assembly | Entertainment/public assembly | 22117.0 | 37.871903 | -122.260729 | US/Pacific | 6.1750 | 1.666667 | -5.229167 | 0.0 | 0.0 | 1020.891667 | 68.750000 | 3.070833 |
| 2016-01-02 | Bear_assembly_Angel | 9251.0003 | Bear | Entertainment/public assembly | Entertainment/public assembly | 22117.0 | 37.871903 | -122.260729 | US/Pacific | 8.0875 | NaN | -1.404167 | 0.0 | 0.0 | 1017.687500 | 76.666667 | 3.300000 |
| 2016-01-03 | Bear_assembly_Angel | 14071.6500 | Bear | Entertainment/public assembly | Entertainment/public assembly | 22117.0 | 37.871903 | -122.260729 | US/Pacific | 10.1125 | NaN | 1.708333 | -6.0 | -2.0 | 1011.491667 | 91.666667 | 3.120833 |
# Overall range of available dates
# ==============================================================================
print(
f"Rage of dates available : {data.index.min()} --- {data.index.max()} "
f"(n_days={(data.index.max() - data.index.min()).days})"
)
Rage of dates available : 2016-01-01 00:00:00 --- 2017-12-31 00:00:00 (n_days=730)
# Ensure index of all series is complete without intermediate gaps
# ==============================================================================
data = (
data
.groupby('building_id')
.apply(lambda group: group.asfreq('D', fill_value=np.nan), include_groups=False)
.reset_index(level=0, drop=False)
)
print("Data shape:", data.shape)
Data shape: (1153518, 17)
# Range of available dates per building
# ==============================================================================
available_dates_per_series = (
data
.dropna(subset="meter_reading")
.reset_index()
.groupby("building_id")
.agg(
min_index=("timestamp", "min"),
max_index=("timestamp", "max"),
n_values=("timestamp", "nunique")
)
)
display(available_dates_per_series)
print(f"Unique lenght of series: {available_dates_per_series.n_values.unique()}")
| min_index | max_index | n_values | |
|---|---|---|---|
| building_id | |||
| Bear_assembly_Angel | 2016-01-01 | 2017-12-31 | 731 |
| Bear_assembly_Beatrice | 2016-01-01 | 2017-12-31 | 731 |
| Bear_assembly_Danial | 2016-01-01 | 2017-12-31 | 731 |
| Bear_assembly_Diana | 2016-01-01 | 2017-12-31 | 731 |
| Bear_assembly_Genia | 2016-01-01 | 2017-12-31 | 731 |
| ... | ... | ... | ... |
| Wolf_public_Norma | 2016-01-01 | 2017-12-31 | 731 |
| Wolf_retail_Harriett | 2016-01-01 | 2017-12-31 | 731 |
| Wolf_retail_Marcella | 2016-01-01 | 2017-12-31 | 731 |
| Wolf_retail_Toshia | 2016-01-01 | 2017-12-31 | 731 |
| Wolf_science_Alfreda | 2016-01-01 | 2017-12-31 | 731 |
1578 rows × 3 columns
Unique lenght of series: [731]
All time series have the same length, starting from January 1, 2016 and ending on December 31, 2017.
ForecasterRNN requires the input data to be a pandas DataFrame where each column represents a different time series and the index is a pandas DatetimeIndex.
# Reshape data to wide format where each column is a time series
# ==============================================================================
series = data.reset_index().pivot(
index='timestamp',
columns='building_id',
values='meter_reading'
).sort_index()
series = series.asfreq('D', fill_value=np.nan)
series.head(3)
| building_id | Bear_assembly_Angel | Bear_assembly_Beatrice | Bear_assembly_Danial | Bear_assembly_Diana | Bear_assembly_Genia | Bear_assembly_Harry | Bear_assembly_Jose | Bear_assembly_Roxy | Bear_assembly_Ruby | Bear_education_Alfredo | ... | Wolf_office_Emanuel | Wolf_office_Haydee | Wolf_office_Joana | Wolf_office_Nadia | Wolf_office_Rochelle | Wolf_public_Norma | Wolf_retail_Harriett | Wolf_retail_Marcella | Wolf_retail_Toshia | Wolf_science_Alfreda |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| timestamp | |||||||||||||||||||||
| 2016-01-01 | 12808.1620 | 668.45 | 0.0 | 0.0 | 4471.6612 | 0.0 | 3806.00 | 215.25 | 1226.75 | 2.9050 | ... | 290.6925 | 138.5650 | 302.4725 | 1321.8075 | 233.0275 | 2272.2548 | 640.5150 | 292.7250 | 587.0350 | 2165.1975 |
| 2016-01-02 | 9251.0003 | 943.25 | 0.0 | 0.0 | 5408.8898 | 0.0 | 3958.75 | 217.00 | 1228.50 | 2.7700 | ... | 511.1350 | 360.1300 | 486.5300 | 1848.8100 | 506.8900 | 4853.8566 | 1052.4800 | 239.4550 | 2139.7625 | 2387.1925 |
| 2016-01-03 | 14071.6500 | 918.00 | 0.0 | 0.0 | 5345.8867 | 0.0 | 4147.75 | 213.00 | 1391.25 | 2.6725 | ... | 525.9025 | 300.1925 | 456.3225 | 1853.6600 | 520.2800 | 5005.9518 | 1463.5075 | 237.1675 | 2159.5250 | 2414.7525 |
3 rows × 1578 columns
Exogenous variables
Exogenous variables are variables that are external to the time series and can be used as features to improve the forecast. In this case, the exogenous variables used are: the characteristics of the buildings, calendar variables and weather conditions.
⚠️ Warning
Exogenous variables must be known at the time of the forecast. For example, if temperature is used as an exogenous variable, the temperature value for the next day must be known at the time of the forecast. If the temperature value is not known, the forecast will not be possible.
When creating new features in a multi-series dataset, it is important to avoid avoid mixing information of different series. It is recommended to use the groupby and apply methods to create these features.
The current implementation of `ForecasterRNN` does not support the use of diferent exogenous variables for each time series. Therefore, all time series must share the same exogenous values for a given datetime. If this is not the case, it is recommended to use `ForecasterRecursiveMultiSeries` instead.
Calendar features
# Calendar features
# ==============================================================================
calendar_features = series.index.to_frame()
features_to_extract = [
'month',
'week',
'day_of_week',
]
calendar_transformer = DatetimeFeatures(
variables = 'index',
features_to_extract = features_to_extract,
drop_original = False,
)
calendar_features = calendar_transformer.fit_transform(calendar_features)
calendar_features = calendar_features.drop(columns=['timestamp'])
print(f"Data shape: {calendar_features.shape}")
calendar_features.head(3)
Data shape: (731, 3)
| month | week | day_of_week | |
|---|---|---|---|
| timestamp | |||
| 2016-01-01 | 1 | 53 | 4 |
| 2016-01-02 | 1 | 53 | 5 |
| 2016-01-03 | 1 | 53 | 6 |
# Cyclical encoding of calendar features
# ==============================================================================
features_to_encode = [
"month",
"week",
"day_of_week",
]
max_values = {
"month": 12,
"week": 52,
"day_of_week": 6,
}
cyclical_encoder = CyclicalFeatures(
variables = features_to_encode,
max_values = max_values,
drop_original = True
)
calendar_features = cyclical_encoder.fit_transform(calendar_features)
print(f"Data shape: {calendar_features.shape}")
calendar_features.head(3)
Data shape: (731, 6)
| month_sin | month_cos | week_sin | week_cos | day_of_week_sin | day_of_week_cos | |
|---|---|---|---|---|---|---|
| timestamp | ||||||
| 2016-01-01 | 0.5 | 0.866025 | 0.120537 | 0.992709 | -8.660254e-01 | -0.5 |
| 2016-01-02 | 0.5 | 0.866025 | 0.120537 | 0.992709 | -8.660254e-01 | 0.5 |
| 2016-01-03 | 0.5 | 0.866025 | 0.120537 | 0.992709 | -2.449294e-16 | 1.0 |
✎ Note
For more information about calendar features and cyclical encoding visit Calendar features and Cyclical features in time series forecasting.Meteorological features
Meteorological variables are recorded at the site level, meaning that weather data varies by building location, even at the same timestamp. In other words, while the exogenous variables are consistent across all series, their values differ by location.
Since ForecasterRNN does not support different exogenous variables for each time series, we will use the average of the meteorological variables across all buildings as a single feature. This approach assumes that the weather conditions are similar across all buildings, which may not always be the case.
If this assumption does not hold in your use case, it is recommended to use ForecasterRecursiveMultiSeries instead, as shown in the document Forecasting at scale: modeling thousand time series with a single global model.
# Values of meteorological features for a guiven date in each site
# ==============================================================================
meteo_features = (
data
.reset_index()
.drop_duplicates(subset=["timestamp", "building_id"])
.groupby(by="timestamp", observed=True).agg(
{
"airTemperature": "median",
"cloudCoverage": "median",
"dewTemperature": "median",
"precipDepth1HR": "median",
"precipDepth6HR": "median",
"seaLvlPressure": "median",
"windDirection": "median",
"windSpeed": "median",
}
)
)
meteo_features.head(3)
| airTemperature | cloudCoverage | dewTemperature | precipDepth1HR | precipDepth6HR | seaLvlPressure | windDirection | windSpeed | |
|---|---|---|---|---|---|---|---|---|
| timestamp | ||||||||
| 2016-01-01 | 5.633333 | 1.666667 | -2.112500 | 0.0 | 0.0 | 1019.545833 | 150.416667 | 3.816667 |
| 2016-01-02 | 6.933333 | 0.583333 | -1.404167 | 0.0 | 0.0 | 1018.833333 | 187.916667 | 3.762500 |
| 2016-01-03 | 7.012500 | 2.083333 | -0.479167 | 0.0 | 0.0 | 1013.658333 | 216.666667 | 4.158333 |
Modelling and forecasting
# Exogenous features selected for modeling
# ==============================================================================
exog_features = pd.merge(
left=calendar_features,
right=meteo_features,
left_index=True,
right_index=True,
validate="one_to_one"
)
exog_features = exog_features.asfreq('D', fill_value=np.nan)
exog_features.head(3)
| month_sin | month_cos | week_sin | week_cos | day_of_week_sin | day_of_week_cos | airTemperature | cloudCoverage | dewTemperature | precipDepth1HR | precipDepth6HR | seaLvlPressure | windDirection | windSpeed | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| timestamp | ||||||||||||||
| 2016-01-01 | 0.5 | 0.866025 | 0.120537 | 0.992709 | -8.660254e-01 | -0.5 | 5.633333 | 1.666667 | -2.112500 | 0.0 | 0.0 | 1019.545833 | 150.416667 | 3.816667 |
| 2016-01-02 | 0.5 | 0.866025 | 0.120537 | 0.992709 | -8.660254e-01 | 0.5 | 6.933333 | 0.583333 | -1.404167 | 0.0 | 0.0 | 1018.833333 | 187.916667 | 3.762500 |
| 2016-01-03 | 0.5 | 0.866025 | 0.120537 | 0.992709 | -2.449294e-16 | 1.0 | 7.012500 | 2.083333 | -0.479167 | 0.0 | 0.0 | 1013.658333 | 216.666667 | 4.158333 |
# Check that series and exogenous features are aligned
# ==============================================================================
series.index.equals(exog_features.index)
True
To train the models, search for optimal hyperparameters, and evaluate their predictive performance, the data is divided into three separate sets: training, validation, and test.
# Partition data in train and test
# ==============================================================================
end_train = '2017-08-31 23:59:00'
end_validation = '2017-10-31 23:59:00'
series_train = series.loc[: end_train,]
series_val = series.loc[end_train: end_validation,]
series_test = series.loc[end_validation:,]
exog_train = exog_features.loc[: end_train,]
exog_val = exog_features.loc[end_train: end_validation,]
exog_test = exog_features.loc[end_validation:,]
print(
f"Rage of dates available : {series.index.min()} --- {series.index.max()} "
f"(n_days={(series.index.max() - series.index.min()).days})"
)
print(
f" Dates for training : {series.loc[: end_train, :].index.min()} --- {series.loc[: end_train, :].index.max()} "
f"(n_days={(series.loc[: end_train, :].index.max() - series.loc[: end_train, :].index.min()).days})"
)
print(
f" Dates for validation : {series.loc[end_train:end_validation, :].index.min()} --- {series.loc[end_train:end_validation, :].index.max()} "
f"(n_days={(series.loc[end_train:end_validation, :].index.max() - series.loc[end_train:end_validation, :].index.min()).days})"
)
print(
f" Dates for test : {series.loc[end_validation:, :].index.min()} --- {series.loc[end_validation:, :].index.max()} "
f"(n_days={(series.loc[end_validation:, :].index.max() - series.loc[end_validation:, :].index.min()).days})"
)
Rage of dates available : 2016-01-01 00:00:00 --- 2017-12-31 00:00:00 (n_days=730) Dates for training : 2016-01-01 00:00:00 --- 2017-08-31 00:00:00 (n_days=608) Dates for validation : 2017-09-01 00:00:00 --- 2017-10-31 00:00:00 (n_days=60) Dates for test : 2017-11-01 00:00:00 --- 2017-12-31 00:00:00 (n_days=60)
Deep learning model and forecaster
# Create deep learning model
# ==============================================================================
levels = series_train.columns.tolist()
lags = 48
model = create_and_compile_model(
series = series[levels], # DataFrame with all series (predictors)
exog = exog_features, # DataFrame with exogenous features
levels = levels, # List of series to be predicted by the model
lags = lags,
steps = 7,
recurrent_layer = "LSTM",
recurrent_units = [256, 128, 64, 32],
recurrent_layers_kwargs = {"activation": "tanh"},
dense_units = [32],
compile_kwargs = {"optimizer": Adam(learning_rate=0.01), "loss": MeanSquaredError()},
model_name = "global_model_lstm"
)
model.summary()
keras version: 3.12.0 Using backend: torch torch version: 2.8.0
Model: "global_model_lstm"
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ Connected to ┃ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩ │ series_input │ (None, 48, 1578) │ 0 │ - │ │ (InputLayer) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ lstm_1 (LSTM) │ (None, 48, 256) │ 1,879,040 │ series_input[0][… │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ lstm_2 (LSTM) │ (None, 48, 128) │ 197,120 │ lstm_1[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ lstm_3 (LSTM) │ (None, 48, 64) │ 49,408 │ lstm_2[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ lstm_4 (LSTM) │ (None, 32) │ 12,416 │ lstm_3[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ repeat_vector │ (None, 7, 32) │ 0 │ lstm_4[0][0] │ │ (RepeatVector) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ exog_input │ (None, 7, 14) │ 0 │ - │ │ (InputLayer) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ concat_exog │ (None, 7, 46) │ 0 │ repeat_vector[0]… │ │ (Concatenate) │ │ │ exog_input[0][0] │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ dense_td_1 │ (None, 7, 32) │ 1,504 │ concat_exog[0][0] │ │ (TimeDistributed) │ │ │ │ ├─────────────────────┼───────────────────┼────────────┼───────────────────┤ │ output_dense_td_la… │ (None, 7, 1578) │ 52,074 │ dense_td_1[0][0] │ │ (TimeDistributed) │ │ │ │ └─────────────────────┴───────────────────┴────────────┴───────────────────┘
Total params: 2,191,562 (8.36 MB)
Trainable params: 2,191,562 (8.36 MB)
Non-trainable params: 0 (0.00 B)
# Forecaster Creation
# ==============================================================================
forecaster = ForecasterRnn(
estimator=model,
levels=levels,
lags=lags,
transformer_series=MinMaxScaler(),
transformer_exog=MinMaxScaler(),
fit_kwargs={
"epochs": 50,
"batch_size": 128,
"callbacks": [
EarlyStopping(monitor="val_loss", patience=10, restore_best_weights=True)
], # Callback to stop training when it is no longer learning.
"series_val": series_val[levels], # Validation data for model training.
"exog_val": exog_val
}
)
# Fit forecaster
# ==============================================================================
forecaster.fit(series = series_train[levels], exog = exog_train)
forecaster
Using 'torch' backend with device: cuda
Epoch 1/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 5s 942ms/step - loss: 0.2168 - val_loss: 19.0227 Epoch 2/50
5/5 ━━━━━━━━━━━━━━━━━━━━ 4s 756ms/step - loss: 0.0608 - val_loss: 18.9965 Epoch 3/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 687ms/step - loss: 0.0577 - val_loss: 18.9876 Epoch 4/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 673ms/step - loss: 0.0466 - val_loss: 18.9904 Epoch 5/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 4s 775ms/step - loss: 0.0453 - val_loss: 18.9890 Epoch 6/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 4s 688ms/step - loss: 0.0424 - val_loss: 18.9826 Epoch 7/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 672ms/step - loss: 0.0406 - val_loss: 18.9868 Epoch 8/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 670ms/step - loss: 0.0394 - val_loss: 18.9831 Epoch 9/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 4s 766ms/step - loss: 0.0388 - val_loss: 18.9875 Epoch 10/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 678ms/step - loss: 0.0382 - val_loss: 18.9872 Epoch 11/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 678ms/step - loss: 0.0377 - val_loss: 18.9869 Epoch 12/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 684ms/step - loss: 0.0371 - val_loss: 18.9875 Epoch 13/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 706ms/step - loss: 0.0368 - val_loss: 18.9927 Epoch 14/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 4s 736ms/step - loss: 0.0363 - val_loss: 18.9932 Epoch 15/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 5s 1s/step - loss: 0.0361 - val_loss: 18.9926 Epoch 16/50 5/5 ━━━━━━━━━━━━━━━━━━━━ 6s 1s/step - loss: 0.0358 - val_loss: 18.9969
ForecasterRnn
General Information
- Estimator: Functional
- Layers names: ['series_input', 'lstm_1', 'lstm_2', 'lstm_3', 'lstm_4', 'repeat_vector', 'exog_input', 'concat_exog', 'dense_td_1', 'output_dense_td_layer']
- Lags: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48]
- Window size: 48
- Maximum steps to predict: [1 2 3 4 5 6 7]
- Exogenous included: True
- Creation date: 2025-12-01 11:24:39
- Last fit date: 2025-12-01 11:26:20
- Keras backend: torch
- Skforecast version: 0.19.0
- Python version: 3.13.9
- Forecaster id: None
Exogenous Variables
-
month_sin, month_cos, week_sin, week_cos, day_of_week_sin, day_of_week_cos, airTemperature, cloudCoverage, dewTemperature, precipDepth1HR, precipDepth6HR, seaLvlPressure, windDirection, windSpeed
Data Transformations
- Transformer for series: MinMaxScaler()
- Transformer for exog: MinMaxScaler()
Training Information
- Series names: Bear_assembly_Angel, Bear_assembly_Beatrice, Bear_assembly_Danial, Bear_assembly_Diana, Bear_assembly_Genia, Bear_assembly_Harry, Bear_assembly_Jose, Bear_assembly_Roxy, Bear_assembly_Ruby, Bear_education_Alfredo, Bear_education_Alvaro, Bear_education_Arnold, Bear_education_Augusta, Bear_education_Austin, Bear_education_Babara, Bear_education_Benita, Bear_education_Benjamin, Bear_education_Bob, Bear_education_Bonita, Bear_education_Bulah, Bear_education_Carlo, Bear_education_Chad, Bear_education_Chana, Bear_education_Chun, Bear_education_Clint, ..., Wolf_education_Joaquin, Wolf_education_Josefa, Wolf_education_Katie, Wolf_education_Laurinda, Wolf_education_Loren, Wolf_education_Miguel, Wolf_education_Roderick, Wolf_education_Tammie, Wolf_education_Tori, Wolf_education_Ursula, Wolf_education_Vivian, Wolf_office_Bobbie, Wolf_office_Cary, Wolf_office_Darleen, Wolf_office_Elisabeth, Wolf_office_Emanuel, Wolf_office_Haydee, Wolf_office_Joana, Wolf_office_Nadia, Wolf_office_Rochelle, Wolf_public_Norma, Wolf_retail_Harriett, Wolf_retail_Marcella, Wolf_retail_Toshia, Wolf_science_Alfreda
- Target series (levels): ['Bear_assembly_Angel', 'Bear_assembly_Beatrice', 'Bear_assembly_Danial', 'Bear_assembly_Diana', 'Bear_assembly_Genia', 'Bear_assembly_Harry', 'Bear_assembly_Jose', 'Bear_assembly_Roxy', 'Bear_assembly_Ruby', 'Bear_education_Alfredo', 'Bear_education_Alvaro', 'Bear_education_Arnold', 'Bear_education_Augusta', 'Bear_education_Austin', 'Bear_education_Babara', 'Bear_education_Benita', 'Bear_education_Benjamin', 'Bear_education_Bob', 'Bear_education_Bonita', 'Bear_education_Bulah', 'Bear_education_Carlo', 'Bear_education_Chad', 'Bear_education_Chana', 'Bear_education_Chun', 'Bear_education_Clint', 'Bear_education_Curtis', 'Bear_education_Danna', 'Bear_education_Darrell', 'Bear_education_Deborah', 'Bear_education_Deena', 'Bear_education_Derek', 'Bear_education_Destiny', 'Bear_education_Elise', 'Bear_education_Fannie', 'Bear_education_Gavin', 'Bear_education_Herb', 'Bear_education_Herman', 'Bear_education_Holly', 'Bear_education_Irene', 'Bear_education_Iris', 'Bear_education_Katy', 'Bear_education_Lashanda', 'Bear_education_Laurette', 'Bear_education_Leonel', 'Bear_education_Lewis', 'Bear_education_Lidia', 'Bear_education_Lila', 'Bear_education_Liliana', 'Bear_education_Lorie', 'Bear_education_Mara', 'Bear_education_Marie', 'Bear_education_Marsha', 'Bear_education_Marta', 'Bear_education_Maryjane', 'Bear_education_Merrill', 'Bear_education_Millie', 'Bear_education_Nanette', 'Bear_education_Oscar', 'Bear_education_Owen', 'Bear_education_Paola', 'Bear_education_Patricia', 'Bear_education_Pattie', 'Bear_education_Rebecca', 'Bear_education_Sandy', 'Bear_education_Santos', 'Bear_education_Sharon', 'Bear_education_Shelley', 'Bear_education_Tara', 'Bear_education_Thuy', 'Bear_education_Val', 'Bear_education_Wade', 'Bear_education_Wilton', 'Bear_education_Wm', 'Bear_education_Yuri', 'Bear_education_Yvette', 'Bear_education_Zandra', 'Bear_lodging_Dannie', 'Bear_lodging_Erick', 'Bear_lodging_Esperanza', 'Bear_lodging_Evan', 'Bear_parking_Bridget', 'Bear_parking_Bruce', 'Bear_parking_Gordon', 'Bear_public_Arlean', 'Bear_public_Jocelyn', 'Bear_public_Lowell', 'Bear_public_Orville', 'Bear_public_Rayna', 'Bear_public_Valorie', 'Bear_science_Alison', 'Bear_science_Eleanor', 'Bear_utility_Sidney', 'Bobcat_assembly_Adam', 'Bobcat_assembly_Billy', 'Bobcat_assembly_Camilla', 'Bobcat_assembly_Franklin', 'Bobcat_education_Alissa', 'Bobcat_education_Angela', 'Bobcat_education_Barbra', 'Bobcat_education_Coleman', 'Bobcat_education_Dylan', 'Bobcat_education_Emile', 'Bobcat_education_Hollis', 'Bobcat_education_Jayne', 'Bobcat_education_Karin', 'Bobcat_education_Marisha', 'Bobcat_education_Miki', 'Bobcat_education_Monte', 'Bobcat_education_Rodrick', 'Bobcat_education_Rosalva', 'Bobcat_education_Seth', 'Bobcat_education_Toni', 'Bobcat_education_Whitney', 'Bobcat_lodging_Darin', 'Bobcat_lodging_Melaine', 'Bobcat_lodging_Nickolas', 'Bobcat_office_Alma', 'Bobcat_office_Justine', 'Bobcat_office_Kassandra', 'Bobcat_office_Melody', 'Bobcat_office_Nikita', 'Bobcat_other_Howard', 'Bobcat_other_Jovita', 'Bobcat_other_Timothy', 'Bobcat_public_Angie', 'Bobcat_science_Tammy', 'Bobcat_warehouse_Charlie', 'Bull_assembly_Amalia', 'Bull_assembly_Beau', 'Bull_assembly_Brandon', 'Bull_assembly_Daryl', 'Bull_assembly_Dorethea', 'Bull_assembly_Freddie', 'Bull_assembly_Gerri', 'Bull_assembly_Gigi', 'Bull_assembly_Goldie', 'Bull_assembly_Katia', 'Bull_assembly_Lance', 'Bull_assembly_Lesa', 'Bull_assembly_Maren', 'Bull_assembly_Nathanial', 'Bull_assembly_Newton', 'Bull_assembly_Nick', 'Bull_assembly_Vanessa', 'Bull_education_Annette', 'Bull_education_Antonia', 'Bull_education_Arthur', 'Bull_education_Barry', 'Bull_education_Bernice', 'Bull_education_Brady', 'Bull_education_Brain', 'Bull_education_Brandi', 'Bull_education_Brenda', 'Bull_education_Bryon', 'Bull_education_Carl', 'Bull_education_Clarice', 'Bull_education_Clarita', 'Bull_education_Dakota', 'Bull_education_Dan', 'Bull_education_Dania', 'Bull_education_Delia', 'Bull_education_Dora', 'Bull_education_Dottie', 'Bull_education_Elva', 'Bull_education_Fabiola', 'Bull_education_Geneva', 'Bull_education_Genie', 'Bull_education_Gregory', 'Bull_education_Hayley', 'Bull_education_Jae', 'Bull_education_Jeffery', 'Bull_education_Joseph', 'Bull_education_Juan', 'Bull_education_Kendra', 'Bull_education_Krista', 'Bull_education_Kristal', 'Bull_education_Lenny', 'Bull_education_Linnie', 'Bull_education_Luke', 'Bull_education_Lydia', 'Bull_education_Lyn', 'Bull_education_Magaret', 'Bull_education_Mario', 'Bull_education_Matilda', 'Bull_education_Mervin', 'Bull_education_Miquel', 'Bull_education_Miranda', 'Bull_education_Myra', 'Bull_education_Nichole', 'Bull_education_Nina', 'Bull_education_Nolan', 'Bull_education_Olive', 'Bull_education_Pablo', 'Bull_education_Pamela', 'Bull_education_Patrina', 'Bull_education_Racheal', 'Bull_education_Reina', 'Bull_education_Reynaldo', 'Bull_education_Roland', 'Bull_education_Roseann', 'Bull_education_Sebastian', 'Bull_education_Shona', 'Bull_education_Stewart', 'Bull_education_Summer', 'Bull_education_Tracey', 'Bull_education_Venita', 'Bull_education_Violeta', 'Bull_lodging_Abby', 'Bull_lodging_Allen', 'Bull_lodging_Anibal', 'Bull_lodging_Caren', 'Bull_lodging_Carie', 'Bull_lodging_Charlotte', 'Bull_lodging_Danielle', 'Bull_lodging_Dave', 'Bull_lodging_Elena', 'Bull_lodging_Graciela', 'Bull_lodging_Hugo', 'Bull_lodging_Jeremiah', 'Bull_lodging_Leonard', 'Bull_lodging_Lettie', 'Bull_lodging_Melissa', 'Bull_lodging_Perry', 'Bull_lodging_Terence', 'Bull_lodging_Travis', 'Bull_lodging_Xavier', 'Bull_office_Anne', 'Bull_office_Chantel', 'Bull_office_Claudia', 'Bull_office_Debbie', 'Bull_office_Efren', 'Bull_office_Ella', 'Bull_office_Hilton', 'Bull_office_Ivette', 'Bull_office_Lilla', 'Bull_office_Mai', 'Bull_office_Marco', 'Bull_office_Myron', 'Bull_office_Nicolas', 'Bull_office_Rob', 'Bull_office_Sally', 'Bull_office_Trevor', 'Bull_office_Yvonne', 'Bull_public_Hyun', 'Bull_public_Jefferson', 'Bull_services_Jeanmarie', 'Bull_services_Juanita', 'Bull_services_Nadine', 'Bull_services_Rachelle', 'Bull_services_Winford', 'Cockatoo_assembly_Britt', 'Cockatoo_assembly_Doyle', 'Cockatoo_assembly_Ed', 'Cockatoo_assembly_Emilio', 'Cockatoo_assembly_Evelyn', 'Cockatoo_assembly_Fernanda', 'Cockatoo_assembly_Genoveva', 'Cockatoo_assembly_Griselda', 'Cockatoo_assembly_Heath', 'Cockatoo_assembly_Meredith', 'Cockatoo_assembly_Mimi', 'Cockatoo_assembly_Pierre', 'Cockatoo_assembly_Ralph', 'Cockatoo_assembly_Rodger', 'Cockatoo_assembly_Tabitha', 'Cockatoo_assembly_Valencia', 'Cockatoo_education_Amira', 'Cockatoo_education_Arlen', 'Cockatoo_education_Brendan', 'Cockatoo_education_Brigitte', 'Cockatoo_education_Charity', 'Cockatoo_education_Christi', 'Cockatoo_education_Claudine', 'Cockatoo_education_Clifton', 'Cockatoo_education_Collin', 'Cockatoo_education_Deloris', 'Cockatoo_education_Doreen', 'Cockatoo_education_Erik', 'Cockatoo_education_Eunice', 'Cockatoo_education_Evangeline', 'Cockatoo_education_Flora', 'Cockatoo_education_Gussie', 'Cockatoo_education_Helene', 'Cockatoo_education_Jack', 'Cockatoo_education_Janet', 'Cockatoo_education_Joeann', 'Cockatoo_education_Joel', 'Cockatoo_education_Jon', 'Cockatoo_education_Julia', 'Cockatoo_education_Julio', 'Cockatoo_education_June', 'Cockatoo_education_Latrice', 'Cockatoo_education_Laurence', 'Cockatoo_education_Lionel', 'Cockatoo_education_Magdalena', 'Cockatoo_education_Marva', 'Cockatoo_education_Maynard', 'Cockatoo_education_Mayra', 'Cockatoo_education_Melanie', 'Cockatoo_education_Minh', 'Cockatoo_education_Nelda', 'Cockatoo_education_Oliver', 'Cockatoo_education_Orlando', 'Cockatoo_education_Rita', 'Cockatoo_education_Shawn', 'Cockatoo_education_Sheryl', 'Cockatoo_education_Terrence', 'Cockatoo_education_Tyler', 'Cockatoo_education_Victoria', 'Cockatoo_industrial_Nathaniel', 'Cockatoo_industrial_Sarita', 'Cockatoo_lodging_Aimee', 'Cockatoo_lodging_Albert', 'Cockatoo_lodging_Alicia', 'Cockatoo_lodging_Ana', 'Cockatoo_lodging_Carmen', 'Cockatoo_lodging_Cletus', 'Cockatoo_lodging_Elvia', 'Cockatoo_lodging_Emory', 'Cockatoo_lodging_Eric', 'Cockatoo_lodging_Homer', 'Cockatoo_lodging_Jarrod', 'Cockatoo_lodging_Javier', 'Cockatoo_lodging_Jim', 'Cockatoo_lodging_Jimmie', 'Cockatoo_lodging_Johnathan', 'Cockatoo_lodging_Josephine', 'Cockatoo_lodging_Judi', 'Cockatoo_lodging_Katharine', 'Cockatoo_lodging_Kerri', 'Cockatoo_lodging_Kyle', 'Cockatoo_lodging_Lana', 'Cockatoo_lodging_Linwood', 'Cockatoo_lodging_Lynne', 'Cockatoo_lodging_Mandy', 'Cockatoo_lodging_Olga', 'Cockatoo_lodging_Raphael', 'Cockatoo_lodging_Tesha', 'Cockatoo_lodging_Tessie', 'Cockatoo_office_Ada', 'Cockatoo_office_Alton', 'Cockatoo_office_Christy', 'Cockatoo_office_Delores', 'Cockatoo_office_Elbert', 'Cockatoo_office_Gail', 'Cockatoo_office_Georgia', 'Cockatoo_office_Giovanni', 'Cockatoo_office_Jimmy', 'Cockatoo_office_Jodie', 'Cockatoo_office_Kristin', 'Cockatoo_office_Laila', 'Cockatoo_office_Lorraine', 'Cockatoo_office_Margaret', 'Cockatoo_office_Paige', 'Cockatoo_office_Pansy', 'Cockatoo_office_Rodney', 'Cockatoo_office_Roxanna', 'Cockatoo_public_Caleb', 'Cockatoo_public_Chiquita', 'Cockatoo_public_Harland', 'Cockatoo_public_Leah', 'Cockatoo_public_Shad', 'Cockatoo_public_Valerie', 'Cockatoo_religion_Diedre', 'Cockatoo_science_Rex', 'Cockatoo_utility_Kimiko', 'Cockatoo_utility_Sherri', 'Crow_education_Kate', 'Crow_education_Keisha', 'Crow_education_Marlin', 'Crow_education_Omer', 'Crow_education_Winston', 'Eagle_assembly_Benny', 'Eagle_assembly_Candice', 'Eagle_assembly_Estelle', 'Eagle_assembly_Herbert', 'Eagle_assembly_Ian', 'Eagle_assembly_Josie', 'Eagle_assembly_Lacy', 'Eagle_assembly_Latrina', 'Eagle_assembly_Margret', 'Eagle_assembly_Noel', 'Eagle_assembly_Portia', 'Eagle_education_Alberto', 'Eagle_education_April', 'Eagle_education_Brianne', 'Eagle_education_Brooke', 'Eagle_education_Cassie', 'Eagle_education_Edith', 'Eagle_education_Eileen', 'Eagle_education_Jewell', 'Eagle_education_Lino', 'Eagle_education_Luther', 'Eagle_education_Maragret', 'Eagle_education_Norah', 'Eagle_education_Paul', 'Eagle_education_Peter', 'Eagle_education_Petra', 'Eagle_education_Raul', 'Eagle_education_Roman', 'Eagle_education_Samantha', 'Eagle_education_Shana', 'Eagle_education_Shanna', 'Eagle_education_Shante', 'Eagle_education_Sheena', 'Eagle_education_Sherrill', 'Eagle_education_Teresa', 'Eagle_education_Wesley', 'Eagle_education_Will', 'Eagle_food_Jennifer', 'Eagle_food_Kay', 'Eagle_health_Amy', 'Eagle_health_Athena', 'Eagle_health_Gregoria', 'Eagle_health_Jodi', 'Eagle_health_Lucinda', 'Eagle_health_Margo', 'Eagle_health_Reba', 'Eagle_health_Reuben', 'Eagle_health_Trisha', 'Eagle_health_Vincenza', 'Eagle_lodging_Andy', 'Eagle_lodging_Blake', 'Eagle_lodging_Casey', 'Eagle_lodging_Dawn', 'Eagle_lodging_Edgardo', 'Eagle_lodging_Garland', 'Eagle_lodging_Stephanie', 'Eagle_lodging_Terri', 'Eagle_lodging_Tressa', 'Eagle_lodging_Trina', 'Eagle_office_Amanda', 'Eagle_office_Amie', 'Eagle_office_Bridgett', 'Eagle_office_Chantelle', 'Eagle_office_Chauncey', 'Eagle_office_Dallas', 'Eagle_office_Damian', 'Eagle_office_Demetra', 'Eagle_office_Donovan', 'Eagle_office_Efrain', 'Eagle_office_Elia', 'Eagle_office_Elias', 'Eagle_office_Elvis', 'Eagle_office_Flossie', 'Eagle_office_Francis', 'Eagle_office_Freida', 'Eagle_office_Henriette', 'Eagle_office_Isidro', 'Eagle_office_Jackie', 'Eagle_office_Jeff', 'Eagle_office_Joette', 'Eagle_office_Katheleen', 'Eagle_office_Lamont', 'Eagle_office_Lane', 'Eagle_office_Lillian', 'Eagle_office_Mable', 'Eagle_office_Mandi', 'Eagle_office_Marisela', 'Eagle_office_Michele', 'Eagle_office_Nereida', 'Eagle_office_Norbert', 'Eagle_office_Patrice', 'Eagle_office_Phyllis', 'Eagle_office_Randolph', 'Eagle_office_Remedios', 'Eagle_office_Ryan', 'Eagle_office_Sheree', 'Eagle_office_Sonya', 'Eagle_office_Tia', 'Eagle_office_Yadira', 'Eagle_public_Alvin', 'Eagle_public_Henry', 'Eagle_public_Minnie', 'Eagle_public_Missy', 'Eagle_public_Ola', 'Eagle_public_Pearle', 'Eagle_public_Preston', 'Fox_assembly_Adrianne', 'Fox_assembly_Audrey', 'Fox_assembly_Boyce', 'Fox_assembly_Bradley', 'Fox_assembly_Carlos', 'Fox_assembly_Cathy', 'Fox_assembly_Cecelia', 'Fox_assembly_Christie', 'Fox_assembly_Cindy', 'Fox_assembly_Dixie', 'Fox_assembly_Emma', 'Fox_assembly_Gary', 'Fox_assembly_Jerrod', 'Fox_assembly_Johnnie', 'Fox_assembly_Kathie', 'Fox_assembly_Lakeisha', 'Fox_assembly_Leeanne', 'Fox_assembly_Renna', 'Fox_assembly_Sheldon', 'Fox_assembly_Terrell', 'Fox_assembly_Tony', 'Fox_education_Andre', 'Fox_education_Ashli', 'Fox_education_Burton', 'Fox_education_Carleen', 'Fox_education_Charles', 'Fox_education_Claire', 'Fox_education_Claude', 'Fox_education_Cynthia', 'Fox_education_Delma', 'Fox_education_Dewayne', 'Fox_education_Dominique', 'Fox_education_Eddy', 'Fox_education_Eldon', 'Fox_education_Elizabeth', 'Fox_education_Elois', 'Fox_education_Elvira', 'Fox_education_Etta', 'Fox_education_Gayla', 'Fox_education_Geoffrey', 'Fox_education_Gloria', 'Fox_education_Henrietta', 'Fox_education_Heriberto', 'Fox_education_Jaclyn', 'Fox_education_Jacqueline', 'Fox_education_Janina', 'Fox_education_John', 'Fox_education_Kendrick', 'Fox_education_Kim', 'Fox_education_Kris', 'Fox_education_Leona', 'Fox_education_Leota', 'Fox_education_Lesley', 'Fox_education_Lilly', 'Fox_education_Long', 'Fox_education_Louie', 'Fox_education_Marcelina', 'Fox_education_Maris', 'Fox_education_Marlana', 'Fox_education_Maureen', 'Fox_education_Melinda', 'Fox_education_Melvin', 'Fox_education_Miguelina', 'Fox_education_Nilda', 'Fox_education_Ollie', 'Fox_education_Otilia', 'Fox_education_Ray', 'Fox_education_Rosie', 'Fox_education_Rudolph', 'Fox_education_Shaun', 'Fox_education_Shawanda', 'Fox_education_Shirley', 'Fox_education_Stacia', 'Fox_education_Sterling', 'Fox_education_Suzan', 'Fox_education_Tamika', 'Fox_education_Theodore', 'Fox_education_Tonya', 'Fox_education_Vernon', 'Fox_education_Virgil', 'Fox_education_Virginia', 'Fox_education_Wendell', 'Fox_education_Willis', 'Fox_education_Yolande', 'Fox_food_Francesco', 'Fox_food_Scott', 'Fox_health_Lorena', 'Fox_lodging_Alana', 'Fox_lodging_Angla', 'Fox_lodging_Frances', 'Fox_lodging_Helen', 'Fox_lodging_Isabell', 'Fox_lodging_Jina', 'Fox_lodging_Morris', 'Fox_lodging_Stephan', 'Fox_lodging_Stephen', 'Fox_lodging_Wallace', 'Fox_lodging_Warren', 'Fox_lodging_Winifred', 'Fox_office_Alice', 'Fox_office_Bernard', 'Fox_office_Berniece', 'Fox_office_Brandy', 'Fox_office_Carson', 'Fox_office_Clayton', 'Fox_office_Demetrius', 'Fox_office_Easter', 'Fox_office_Edythe', 'Fox_office_Essie', 'Fox_office_Gaylord', 'Fox_office_Israel', 'Fox_office_Joy', 'Fox_office_Juana', 'Fox_office_Karima', 'Fox_office_Margarita', 'Fox_office_Molly', 'Fox_office_Rowena', 'Fox_office_Sheila', 'Fox_office_Susanne', 'Fox_office_Thelma', 'Fox_office_Vicki', 'Fox_office_Yong', 'Fox_office_Zachary', 'Fox_parking_Felipa', 'Fox_parking_Lynelle', 'Fox_parking_Tommie', 'Fox_public_Bart', 'Fox_public_Belle', 'Fox_public_Denny', 'Fox_public_Lauren', 'Fox_public_Martin', 'Fox_public_Rhonda', 'Fox_religion_Maurice', 'Fox_retail_Manie', 'Fox_utility_Marian', 'Fox_warehouse_Lorretta', 'Fox_warehouse_Pearl', 'Gator_assembly_Alexa', 'Gator_assembly_Bailey', 'Gator_assembly_Beryl', 'Gator_assembly_Blanca', 'Gator_assembly_Daisy', 'Gator_assembly_Elliot', 'Gator_assembly_Enid', 'Gator_assembly_Erich', 'Gator_assembly_Gene', 'Gator_assembly_Hue', 'Gator_assembly_Joni', 'Gator_assembly_Kayleigh', 'Gator_assembly_Kimberly', 'Gator_assembly_Lelia', 'Gator_assembly_Lera', 'Gator_assembly_Lilli', 'Gator_assembly_Loyce', 'Gator_assembly_Lucia', 'Gator_assembly_Marjorie', 'Gator_assembly_Maurine', 'Gator_assembly_Milton', 'Gator_assembly_Regina', 'Gator_assembly_Roy', 'Gator_assembly_Selma', 'Gator_assembly_Stacy', 'Gator_assembly_Virgie', 'Gator_office_August', 'Gator_office_Betty', 'Gator_office_Carrie', 'Gator_office_Hunter', 'Gator_office_Julie', 'Gator_office_Lisa', 'Gator_office_Lucy', 'Gator_office_Merle', 'Gator_other_Cassandra', 'Gator_other_Elfriede', 'Gator_other_Gertrude', 'Gator_other_Glen', 'Gator_other_Minda', 'Gator_other_Refugio', 'Gator_other_Reginald', 'Gator_other_Russel', 'Gator_other_Samuel', 'Gator_public_Alexandra', 'Gator_public_Beulah', 'Gator_public_Cheri', 'Gator_public_Clara', 'Gator_public_Dale', 'Gator_public_Dewey', 'Gator_public_Dionna', 'Gator_public_Erika', 'Gator_public_Everette', 'Gator_public_Geraldine', 'Gator_public_Janna', 'Gator_public_Jayme', 'Gator_public_Jolene', 'Gator_public_Kendall', 'Gator_public_Kenny', 'Gator_public_Latasha', 'Gator_public_Leroy', 'Gator_public_Lindsey', 'Gator_public_Lona', 'Gator_public_Marcie', 'Gator_public_Marissa', 'Gator_public_Maude', 'Gator_public_Natasha', 'Gator_public_Nettie', 'Gator_public_Noe', 'Gator_public_Philip', 'Gator_public_Randall', 'Gator_public_Ross', 'Gator_public_Tiffany', 'Gator_warehouse_Constance', 'Gator_warehouse_Stacie', 'Hog_assembly_Annemarie', 'Hog_assembly_Arlie', 'Hog_assembly_Colette', 'Hog_assembly_Dona', 'Hog_assembly_Edward', 'Hog_assembly_Jasmine', 'Hog_assembly_Letha', 'Hog_assembly_Maribel', 'Hog_assembly_Marilynn', 'Hog_assembly_Pedro', 'Hog_assembly_Una', 'Hog_education_Beth', 'Hog_education_Bruno', 'Hog_education_Caridad', 'Hog_education_Casandra', 'Hog_education_Cathleen', 'Hog_education_Darryl', 'Hog_education_Donnie', 'Hog_education_George', 'Hog_education_Hallie', 'Hog_education_Haywood', 'Hog_education_Janell', 'Hog_education_Jared', 'Hog_education_Jewel', 'Hog_education_Jordan', 'Hog_education_Josh', 'Hog_education_Leandro', 'Hog_education_Luvenia', 'Hog_education_Madge', 'Hog_education_Odell', 'Hog_education_Rachael', 'Hog_education_Robert', 'Hog_education_Roberto', 'Hog_education_Sonia', 'Hog_education_Wayne', 'Hog_food_Morgan', 'Hog_health_Hisako', 'Hog_health_Jenny', 'Hog_health_Kesha', 'Hog_industrial_Jay', 'Hog_industrial_Jeremy', 'Hog_industrial_Joanne', 'Hog_industrial_Mariah', 'Hog_industrial_Quentin', 'Hog_lodging_Brian', 'Hog_lodging_Celeste', 'Hog_lodging_Edgar', 'Hog_lodging_Francisco', 'Hog_lodging_Hal', 'Hog_lodging_Mauricio', 'Hog_lodging_Nikki', 'Hog_lodging_Ora', 'Hog_lodging_Retha', 'Hog_lodging_Shanti', 'Hog_lodging_Shonda', 'Hog_office_Alexis', 'Hog_office_Alisha', 'Hog_office_Almeda', 'Hog_office_Bessie', 'Hog_office_Betsy', 'Hog_office_Bill', 'Hog_office_Bryan', 'Hog_office_Buford', 'Hog_office_Byron', 'Hog_office_Candi', 'Hog_office_Carri', 'Hog_office_Catalina', 'Hog_office_Catharine', 'Hog_office_Charla', 'Hog_office_Clemencia', 'Hog_office_Concetta', 'Hog_office_Cordelia', 'Hog_office_Corey', 'Hog_office_Corie', 'Hog_office_Cornell', 'Hog_office_Cortney', 'Hog_office_Darline', 'Hog_office_Denita', 'Hog_office_Elizbeth', 'Hog_office_Elke', 'Hog_office_Elnora', 'Hog_office_Eloise', 'Hog_office_Elsy', 'Hog_office_Emmanuel', 'Hog_office_Garrett', 'Hog_office_Guadalupe', 'Hog_office_Gustavo', 'Hog_office_Joey', 'Hog_office_Josefina', 'Hog_office_Judith', 'Hog_office_Lanell', 'Hog_office_Lavon', 'Hog_office_Leanne', 'Hog_office_Leon', 'Hog_office_Lizzie', 'Hog_office_Mack', 'Hog_office_Man', 'Hog_office_Mari', 'Hog_office_Marilyn', 'Hog_office_Marlena', 'Hog_office_Marlene', 'Hog_office_Mary', 'Hog_office_Merilyn', 'Hog_office_Migdalia', 'Hog_office_Mike', 'Hog_office_Miriam', 'Hog_office_Myles', 'Hog_office_Nancie', 'Hog_office_Napoleon', 'Hog_office_Nia', 'Hog_office_Patrick', 'Hog_office_Randi', 'Hog_office_Richelle', 'Hog_office_Roger', 'Hog_office_Rolando', 'Hog_office_Sarah', 'Hog_office_Shawna', 'Hog_office_Shawnna', 'Hog_office_Sherrie', 'Hog_office_Shon', 'Hog_office_Simon', 'Hog_office_Sonny', 'Hog_office_Sung', 'Hog_office_Sydney', 'Hog_office_Terry', 'Hog_office_Thomas', 'Hog_office_Valda', 'Hog_office_Vera', 'Hog_other_Lynette', 'Hog_other_Noma', 'Hog_other_Tobias', 'Hog_parking_Antoinette', 'Hog_parking_Bernardo', 'Hog_parking_Cliff', 'Hog_parking_Jean', 'Hog_parking_Jeana', 'Hog_parking_Joan', 'Hog_parking_Marcus', 'Hog_parking_Shannon', 'Hog_public_Brad', 'Hog_public_Crystal', 'Hog_public_Gerard', 'Hog_public_Kevin', 'Hog_public_Octavia', 'Hog_science_Max', 'Hog_services_Adrianna', 'Hog_services_Joe', 'Hog_services_Kerrie', 'Hog_services_Marshall', 'Hog_warehouse_Louise', 'Hog_warehouse_Porsha', 'Hog_warehouse_Rosanna', 'Lamb_assembly_Alden', 'Lamb_assembly_Bertie', 'Lamb_assembly_Cesar', 'Lamb_assembly_Cherie', 'Lamb_assembly_Corliss', 'Lamb_assembly_Delilah', 'Lamb_assembly_Dillon', 'Lamb_assembly_Dorathy', 'Lamb_assembly_Dorothy', 'Lamb_assembly_Dudley', 'Lamb_assembly_Elinor', 'Lamb_assembly_Ethel', 'Lamb_assembly_Eugenia', 'Lamb_assembly_Isa', 'Lamb_assembly_Jerry', 'Lamb_assembly_Katelyn', 'Lamb_assembly_Kurt', 'Lamb_assembly_Librada', 'Lamb_assembly_Louis', 'Lamb_assembly_Nicole', 'Lamb_assembly_Ossie', 'Lamb_assembly_Queen', 'Lamb_assembly_Rosa', 'Lamb_assembly_Steven', 'Lamb_assembly_Tasha', 'Lamb_assembly_Tawana', 'Lamb_assembly_Theresa', 'Lamb_assembly_Walter', 'Lamb_assembly_Zita', 'Lamb_education_Aldo', 'Lamb_education_Alina', 'Lamb_education_Antonio', 'Lamb_education_Armando', 'Lamb_education_Augustine', 'Lamb_education_Bert', 'Lamb_education_Bettye', 'Lamb_education_Camille', 'Lamb_education_Carlton', 'Lamb_education_Chet', 'Lamb_education_Daniel', 'Lamb_education_Darrel', 'Lamb_education_Debby', 'Lamb_education_Dolly', 'Lamb_education_Domitila', 'Lamb_education_Dwayne', 'Lamb_education_Ellen', 'Lamb_education_Emery', 'Lamb_education_Emilie', 'Lamb_education_Eula', 'Lamb_education_Faith', 'Lamb_education_Felicia', 'Lamb_education_Felipe', 'Lamb_education_Fred', 'Lamb_education_Freddy', 'Lamb_education_Gabriel', 'Lamb_education_Gabrielle', 'Lamb_education_Garry', 'Lamb_education_Harold', 'Lamb_education_Heidi', 'Lamb_education_Hellen', 'Lamb_education_Hilary', 'Lamb_education_Hillary', 'Lamb_education_Hubert', 'Lamb_education_Hui', 'Lamb_education_Ira', 'Lamb_education_Isabelle', 'Lamb_education_Jane', 'Lamb_education_Junior', 'Lamb_education_Kasha', 'Lamb_education_Kayla', 'Lamb_education_Larissa', 'Lamb_education_Lawrence', 'Lamb_education_Lazaro', 'Lamb_education_Lemuel', 'Lamb_education_Leopoldo', 'Lamb_education_Logan', 'Lamb_education_Lucas', 'Lamb_education_Luz', 'Lamb_education_Mae', 'Lamb_education_Manuel', 'Lamb_education_Marc', 'Lamb_education_Maritza', 'Lamb_education_Marty', 'Lamb_education_Maxwell', 'Lamb_education_Mckenzie', 'Lamb_education_Moses', 'Lamb_education_Nathan', 'Lamb_education_Nichol', 'Lamb_education_Norris', 'Lamb_education_Patsy', 'Lamb_education_Phil', 'Lamb_education_Philomena', 'Lamb_education_Princess', 'Lamb_education_Randal', 'Lamb_education_Renae', 'Lamb_education_Rick', 'Lamb_education_Robin', 'Lamb_education_Rodrigo', 'Lamb_education_Ruben', 'Lamb_education_Sabrina', 'Lamb_education_Salvador', 'Lamb_education_Sara', 'Lamb_education_Stefan', 'Lamb_education_Sunny', 'Lamb_education_Sylvester', 'Lamb_education_Terina', 'Lamb_education_Traci', 'Lamb_education_Vaughn', 'Lamb_education_Wanda', 'Lamb_education_Wilbert', 'Lamb_education_Willetta', 'Lamb_education_Williams', 'Lamb_food_Sylvia', 'Lamb_health_Ken', 'Lamb_industrial_Carla', 'Lamb_industrial_Enrique', 'Lamb_industrial_Venessa', 'Lamb_industrial_Willard', 'Lamb_lodging_Burt', 'Lamb_lodging_Harley', 'Lamb_office_Bertha', 'Lamb_office_Caitlin', 'Lamb_office_Callie', 'Lamb_office_Corine', 'Lamb_office_Donita', 'Lamb_office_Gerardo', 'Lamb_office_Jo', 'Lamb_office_Joanna', 'Lamb_office_Kent', 'Lamb_office_Kerry', 'Lamb_office_Maggie', 'Lamb_office_Peggy', 'Lamb_office_Raymond', 'Lamb_office_Stefani', 'Lamb_office_Vasiliki', 'Lamb_office_Velma', 'Lamb_office_William', 'Lamb_other_Katharina', 'Lamb_other_Minerva', 'Lamb_public_Angeline', 'Lamb_public_Bradly', 'Lamb_public_Grace', 'Lamb_public_Gracie', 'Lamb_public_Nyla', 'Lamb_public_Vania', 'Lamb_warehouse_Allan', 'Moose_education_Abbie', 'Moose_education_Clark', 'Moose_education_Diane', 'Moose_education_Florence', 'Moose_education_Gladys', 'Moose_education_Leland', 'Moose_education_Lori', 'Moose_education_Maria', 'Moose_education_Marina', 'Moose_education_Marlon', 'Moose_education_Rene', 'Moose_education_Ricardo', 'Moose_education_Sasha', 'Mouse_health_Buddy', 'Mouse_health_Estela', 'Mouse_health_Ileana', 'Mouse_health_Justin', 'Mouse_health_Modesto', 'Mouse_lodging_Vicente', 'Mouse_science_Micheal', 'Panther_assembly_Carrol', 'Panther_assembly_David', 'Panther_assembly_Denice', 'Panther_assembly_Gwyneth', 'Panther_assembly_Pamella', 'Panther_education_Alecia', 'Panther_education_Annetta', 'Panther_education_Aurora', 'Panther_education_Cleopatra', 'Panther_education_Diann', 'Panther_education_Edna', 'Panther_education_Emily', 'Panther_education_Enriqueta', 'Panther_education_Genevieve', 'Panther_education_Gina', 'Panther_education_Hugh', 'Panther_education_Ivan', 'Panther_education_Janis', 'Panther_education_Jerome', 'Panther_education_Jonathan', 'Panther_education_Karri', 'Panther_education_Mattie', 'Panther_education_Misty', 'Panther_education_Mohammad', 'Panther_education_Neal', 'Panther_education_Quintin', 'Panther_education_Rosalie', 'Panther_education_Scarlett', 'Panther_education_Shelton', 'Panther_education_Sophia', 'Panther_education_Teofila', 'Panther_education_Tina', 'Panther_education_Vincent', 'Panther_education_Violet', 'Panther_education_Zelda', 'Panther_lodging_Alita', 'Panther_lodging_Anastasia', 'Panther_lodging_Awilda', 'Panther_lodging_Blaine', 'Panther_lodging_Cora', 'Panther_lodging_Cornelia', 'Panther_lodging_Dianna', 'Panther_lodging_Edison', 'Panther_lodging_Edmond', 'Panther_lodging_Else', 'Panther_lodging_Fausto', 'Panther_lodging_Floyd', 'Panther_lodging_Gale', 'Panther_lodging_Hattie', 'Panther_lodging_Jana', 'Panther_lodging_Janice', 'Panther_lodging_Jorge', 'Panther_lodging_Kaitlin', 'Panther_lodging_Kara', 'Panther_lodging_Kirk', 'Panther_lodging_Marisol', 'Panther_lodging_Myrtle', 'Panther_lodging_Russell', 'Panther_lodging_Sonja', 'Panther_lodging_Teresita', 'Panther_lodging_Tracie', 'Panther_lodging_Willa', 'Panther_office_Antonette', 'Panther_office_Brent', 'Panther_office_Catherine', 'Panther_office_Christian', 'Panther_office_Christin', 'Panther_office_Clementine', 'Panther_office_Danica', 'Panther_office_Garth', 'Panther_office_Graham', 'Panther_office_Hannah', 'Panther_office_Jeane', 'Panther_office_Jesus', 'Panther_office_Karla', 'Panther_office_Kristen', 'Panther_office_Larry', 'Panther_office_Lauretta', 'Panther_office_Lavinia', 'Panther_office_Lois', 'Panther_office_Otto', 'Panther_office_Patti', 'Panther_office_Ruthie', 'Panther_office_Shauna', 'Panther_office_Taryn', 'Panther_office_Valarie', 'Panther_other_Bethel', 'Panther_other_Bettie', 'Panther_other_Lucina', 'Panther_other_Lula', 'Panther_other_Tyrone', 'Panther_parking_Adela', 'Panther_parking_Alaina', 'Panther_parking_Asia', 'Panther_parking_Charlene', 'Panther_parking_Jody', 'Panther_parking_Lorriane', 'Panther_parking_Mellissa', 'Panther_parking_Stanley', 'Panther_retail_Felix', 'Panther_retail_Gilbert', 'Panther_retail_Kristina', 'Panther_retail_Lester', 'Panther_retail_Rachel', 'Panther_retail_Romeo', 'Peacock_assembly_Dena', 'Peacock_assembly_Mamie', 'Peacock_assembly_Russ', 'Peacock_assembly_Socorro', 'Peacock_education_Anita', 'Peacock_education_Bianca', 'Peacock_education_Dustin', 'Peacock_education_Forest', 'Peacock_education_Gilberto', 'Peacock_education_Joshua', 'Peacock_education_Karl', 'Peacock_education_Karyn', 'Peacock_education_Lucie', 'Peacock_education_Lyle', 'Peacock_education_Ophelia', 'Peacock_education_Pasquale', 'Peacock_education_Patience', 'Peacock_education_Robbie', 'Peacock_education_Shelly', 'Peacock_education_Weldon', 'Peacock_education_Yolanda', 'Peacock_lodging_Chloe', 'Peacock_lodging_Francesca', 'Peacock_lodging_Jamaal', 'Peacock_lodging_James', 'Peacock_lodging_Lou', 'Peacock_lodging_Mathew', 'Peacock_lodging_Matthew', 'Peacock_lodging_Nova', 'Peacock_lodging_Sergio', 'Peacock_lodging_Terrie', 'Peacock_lodging_Wes', 'Peacock_office_Annie', 'Peacock_office_Burl', 'Peacock_office_Dara', 'Peacock_office_Effie', 'Peacock_office_Elton', 'Peacock_office_Glenn', 'Peacock_office_Jonathon', 'Peacock_office_Julian', 'Peacock_office_Major', 'Peacock_office_Naomi', 'Peacock_office_Norman', 'Peacock_public_Kelvin', 'Peacock_public_Linda', 'Rat_assembly_Adolfo', 'Rat_assembly_Aisha', 'Rat_assembly_Alex', 'Rat_assembly_Archie', 'Rat_assembly_Aubrey', 'Rat_assembly_Cristina', 'Rat_assembly_Damaris', 'Rat_assembly_Deandre', 'Rat_assembly_Don', 'Rat_assembly_Donny', 'Rat_assembly_Dovie', 'Rat_assembly_Erwin', 'Rat_assembly_Ezequiel', 'Rat_assembly_Francine', 'Rat_assembly_Frieda', 'Rat_assembly_Gerald', 'Rat_assembly_Gwen', 'Rat_assembly_Horace', 'Rat_assembly_Ida', 'Rat_assembly_Jamie', 'Rat_assembly_Jannie', 'Rat_assembly_Jennie', 'Rat_assembly_Kaitlyn', 'Rat_assembly_Karen', 'Rat_assembly_Kelley', 'Rat_assembly_Kenya', 'Rat_assembly_Kimberley', 'Rat_assembly_Kristine', 'Rat_assembly_Kristy', 'Rat_assembly_Lillie', 'Rat_assembly_Michel', 'Rat_assembly_Mirta', 'Rat_assembly_Monica', 'Rat_assembly_Myrna', 'Rat_assembly_Pam', 'Rat_assembly_Pauline', 'Rat_assembly_Rolland', 'Rat_assembly_Rosemarie', 'Rat_assembly_Ruth', 'Rat_assembly_Silvia', 'Rat_assembly_Suzanne', 'Rat_assembly_Teddy', 'Rat_assembly_Teodoro', 'Rat_assembly_Trent', 'Rat_assembly_Trudy', 'Rat_assembly_Victorina', 'Rat_assembly_Viola', 'Rat_education_Abigail', 'Rat_education_Adell', 'Rat_education_Adrian', 'Rat_education_Alfonso', 'Rat_education_Alfred', 'Rat_education_Alonzo', 'Rat_education_Alyson', 'Rat_education_Angelica', 'Rat_education_Barbara', 'Rat_education_Barney', 'Rat_education_Beverly', 'Rat_education_Brett', 'Rat_education_Bryant', 'Rat_education_Calvin', 'Rat_education_Candida', 'Rat_education_Carmela', 'Rat_education_Cecil', 'Rat_education_Cedric', 'Rat_education_Chance', 'Rat_education_Cinthia', 'Rat_education_Colin', 'Rat_education_Conrad', 'Rat_education_Dana', 'Rat_education_Dann', 'Rat_education_Davis', 'Rat_education_Deanna', 'Rat_education_Debra', 'Rat_education_Denise', 'Rat_education_Dianne', 'Rat_education_Donnell', 'Rat_education_Dreama', 'Rat_education_Earl', 'Rat_education_Earnest', 'Rat_education_Edmund', 'Rat_education_Eleonora', 'Rat_education_Elisa', 'Rat_education_Elsie', 'Rat_education_Esther', 'Rat_education_Everett', 'Rat_education_Fernando', 'Rat_education_Francisca', 'Rat_education_Gricelda', 'Rat_education_Guillermo', 'Rat_education_Humberto', 'Rat_education_Imelda', 'Rat_education_Irma', 'Rat_education_Jacob', 'Rat_education_Jame', 'Rat_education_Jeanne', 'Rat_education_Jena', 'Rat_education_Jesse', 'Rat_education_Kandice', 'Rat_education_Kathryn', 'Rat_education_Keith', 'Rat_education_Kelsey', 'Rat_education_Kristie', 'Rat_education_Lee', 'Rat_education_Leonardo', 'Rat_education_Lincoln', 'Rat_education_Liz', 'Rat_education_Lonnie', 'Rat_education_Lynn', 'Rat_education_Mac', 'Rat_education_Marcos', 'Rat_education_Marianna', 'Rat_education_Maricela', 'Rat_education_Marvin', 'Rat_education_Matt', 'Rat_education_Mavis', 'Rat_education_Meghan', 'Rat_education_Milagros', 'Rat_education_Moises', 'Rat_education_Mona', 'Rat_education_Morton', 'Rat_education_Mose', 'Rat_education_Nellie', 'Rat_education_Nona', 'Rat_education_Nydia', 'Rat_education_Pat', 'Rat_education_Patty', 'Rat_education_Paula', 'Rat_education_Penny', 'Rat_education_Renee', 'Rat_education_Robyn', 'Rat_education_Rogelio', 'Rat_education_Romana', 'Rat_education_Rosalyn', 'Rat_education_Roxanne', 'Rat_education_Royal', 'Rat_education_Salvatore', 'Rat_education_Shellie', 'Rat_education_Sherwood', 'Rat_education_Sina', 'Rat_education_Stuart', 'Rat_education_Susana', 'Rat_education_Tania', 'Rat_education_Terese', 'Rat_education_Theo', 'Rat_education_Tim', 'Rat_education_Tristan', 'Rat_education_Ulrike', 'Rat_education_Verna', 'Rat_education_Veronica', 'Rat_education_Vicky', 'Rat_education_Willie', 'Rat_education_Willy', 'Rat_education_Wilmer', 'Rat_education_Winnie', 'Rat_education_Yu', 'Rat_education_Zina', 'Rat_education_Zoe', 'Rat_health_Ann', 'Rat_health_Gaye', 'Rat_health_Guy', 'Rat_health_Mildred', 'Rat_health_Rosaria', 'Rat_health_Shane', 'Rat_health_Tanya', 'Rat_lodging_Ardell', 'Rat_lodging_Ben', 'Rat_lodging_Christine', 'Rat_lodging_Dwight', 'Rat_lodging_Jeannette', 'Rat_lodging_Lakisha', 'Rat_lodging_Lorenzo', 'Rat_lodging_Lucille', 'Rat_lodging_Marguerite', 'Rat_lodging_Marion', 'Rat_lodging_Ted', 'Rat_office_Adele', 'Rat_office_Annis', 'Rat_office_Arron', 'Rat_office_Ashlee', 'Rat_office_Avis', 'Rat_office_Chris', 'Rat_office_Colby', 'Rat_office_Craig', 'Rat_office_Jacinta', 'Rat_office_Jamal', 'Rat_office_Jeannie', 'Rat_office_Jessica', 'Rat_office_Jill', 'Rat_office_Kasey', 'Rat_office_Lora', 'Rat_office_Loyd', 'Rat_office_Mei', 'Rat_office_Olivia', 'Rat_office_Ramiro', 'Rat_office_Randy', 'Rat_office_Ronald', 'Rat_office_Rosemary', 'Rat_office_Sammy', 'Rat_office_Tracy', 'Rat_other_Al', 'Rat_other_Daphne', 'Rat_other_Hazel', 'Rat_other_Lan', 'Rat_parking_Ronnie', 'Rat_public_Alanna', 'Rat_public_Alexander', 'Rat_public_Allie', 'Rat_public_Allyson', 'Rat_public_Amber', 'Rat_public_Andrea', 'Rat_public_Angelina', 'Rat_public_Angle', 'Rat_public_Becky', 'Rat_public_Berry', 'Rat_public_Bronwyn', 'Rat_public_Carole', 'Rat_public_Caroline', 'Rat_public_Chrissy', 'Rat_public_Clyde', 'Rat_public_Corinne', 'Rat_public_Courtney', 'Rat_public_Dalia', 'Rat_public_Damon', 'Rat_public_Darren', 'Rat_public_Deidre', 'Rat_public_Desiree', 'Rat_public_Dexter', 'Rat_public_Duane', 'Rat_public_Elmira', 'Rat_public_Emilee', 'Rat_public_Faye', 'Rat_public_Fern', 'Rat_public_Frank', 'Rat_public_Frederick', 'Rat_public_Fredrick', 'Rat_public_Grover', 'Rat_public_Helena', 'Rat_public_Hortencia', 'Rat_public_Isabel', 'Rat_public_Jason', 'Rat_public_Joann', 'Rat_public_Johnna', 'Rat_public_Johnny', 'Rat_public_Josiah', 'Rat_public_Julieann', 'Rat_public_Kathleen', 'Rat_public_Kelle', 'Rat_public_Kelly', 'Rat_public_Kermit', 'Rat_public_Kimber', 'Rat_public_Laura', 'Rat_public_Laurie', 'Rat_public_Laverne', 'Rat_public_Lea', 'Rat_public_Leo', 'Rat_public_Leta', 'Rat_public_Lloyd', 'Rat_public_Loretta', 'Rat_public_Lynda', 'Rat_public_Mabel', 'Rat_public_Marcellus', 'Rat_public_Margart', 'Rat_public_Mark', 'Rat_public_Maxine', 'Rat_public_Michael', 'Rat_public_Michelle', 'Rat_public_Muriel', 'Rat_public_Nancy', 'Rat_public_Neil', 'Rat_public_Nell', 'Rat_public_Nelson', 'Rat_public_Norene', 'Rat_public_Percy', 'Rat_public_Ramon', 'Rat_public_Ramona', 'Rat_public_Roberta', 'Rat_public_Roma', 'Rat_public_Sade', 'Rat_public_Sana', 'Rat_public_Sean', 'Rat_public_Shanta', 'Rat_public_Sharonda', 'Rat_public_Sharron', 'Rat_public_Stacey', 'Rat_public_Stella', 'Rat_public_Sue', 'Rat_public_Tammara', 'Rat_public_Tamra', 'Rat_public_Tommy', 'Rat_public_Toya', 'Rat_public_Tricia', 'Rat_public_Ulysses', 'Rat_public_Vickie', 'Rat_public_Wilbur', 'Rat_public_Wilma', 'Rat_public_Yessenia', 'Rat_public_Yetta', 'Rat_religion_Kathy', 'Rat_retail_Jeffrey', 'Rat_warehouse_Breanna', 'Rat_warehouse_Doretta', 'Rat_warehouse_Eloisa', 'Rat_warehouse_Maegan', 'Rat_warehouse_Shari', 'Robin_assembly_Colleen', 'Robin_education_Audrea', 'Robin_education_Billi', 'Robin_education_Cecilia', 'Robin_education_Della', 'Robin_education_Derick', 'Robin_education_Derrick', 'Robin_education_Jasper', 'Robin_education_Julius', 'Robin_education_Karyl', 'Robin_education_Kiera', 'Robin_education_Kristopher', 'Robin_education_Lashandra', 'Robin_education_Leslie', 'Robin_education_Lizbeth', 'Robin_education_Madeline', 'Robin_education_Margarito', 'Robin_education_Megan', 'Robin_education_Mercedes', 'Robin_education_So', 'Robin_education_Takako', 'Robin_education_Terrance', 'Robin_education_Zenia', 'Robin_lodging_Armand', 'Robin_lodging_Celia', 'Robin_lodging_Donna', 'Robin_lodging_Dorthy', 'Robin_lodging_Elmer', 'Robin_lodging_Janie', 'Robin_lodging_Oliva', 'Robin_lodging_Phillip', 'Robin_lodging_Pricilla', 'Robin_lodging_Renea', 'Robin_office_Addie', 'Robin_office_Adolph', 'Robin_office_Antonina', 'Robin_office_Dina', 'Robin_office_Donald', 'Robin_office_Erma', 'Robin_office_Gayle', 'Robin_office_Lindsay', 'Robin_office_Maryann', 'Robin_office_Sammie', 'Robin_office_Saul', 'Robin_office_Serena', 'Robin_office_Shirlene', 'Robin_office_Soledad', 'Robin_office_Victor', 'Robin_office_Wai', 'Robin_office_Zelma', 'Robin_public_Cami', 'Robin_public_Carolina', 'Shrew_office_Doris', 'Shrew_office_Doug', 'Shrew_office_Ila', 'Shrew_office_Katherine', 'Shrew_office_Kenneth', 'Shrew_office_Lin', 'Shrew_office_Nora', 'Shrew_office_Rose', 'Shrew_office_Sherill', 'Swan_unknown_Allison', 'Swan_unknown_Andres', 'Swan_unknown_Bette', 'Swan_unknown_Christoper', 'Swan_unknown_Douglas', 'Swan_unknown_Esteban', 'Swan_unknown_Fabian', 'Swan_unknown_Ike', 'Swan_unknown_Isaiah', 'Swan_unknown_Jan', 'Swan_unknown_Jerold', 'Swan_unknown_Noelia', 'Swan_unknown_Raquel', 'Swan_unknown_Reyna', 'Swan_unknown_Rocco', 'Swan_unknown_Rudy', 'Swan_unknown_Tom', 'Swan_unknown_Valeria', 'Swan_unknown_Wendy', 'Wolf_assembly_Elaine', 'Wolf_assembly_Sallie', 'Wolf_education_Anisa', 'Wolf_education_Arnulfo', 'Wolf_education_Bobby', 'Wolf_education_Cheryl', 'Wolf_education_Clarissa', 'Wolf_education_Cody', 'Wolf_education_Dolores', 'Wolf_education_Dorris', 'Wolf_education_Eulalia', 'Wolf_education_Joaquin', 'Wolf_education_Josefa', 'Wolf_education_Katie', 'Wolf_education_Laurinda', 'Wolf_education_Loren', 'Wolf_education_Miguel', 'Wolf_education_Roderick', 'Wolf_education_Tammie', 'Wolf_education_Tori', 'Wolf_education_Ursula', 'Wolf_education_Vivian', 'Wolf_office_Bobbie', 'Wolf_office_Cary', 'Wolf_office_Darleen', 'Wolf_office_Elisabeth', 'Wolf_office_Emanuel', 'Wolf_office_Haydee', 'Wolf_office_Joana', 'Wolf_office_Nadia', 'Wolf_office_Rochelle', 'Wolf_public_Norma', 'Wolf_retail_Harriett', 'Wolf_retail_Marcella', 'Wolf_retail_Toshia', 'Wolf_science_Alfreda']
- Training range: [Timestamp('2016-01-01 00:00:00'), Timestamp('2017-08-31 00:00:00')]
- Training index type: DatetimeIndex
- Training index frequency:
Estimator Parameters
-
{'name': 'global_model_lstm', 'trainable': True, 'layers': [{'module': 'keras.layers', 'class_name': 'InputLayer', 'config': {'batch_shape': (None, 48, 1578), 'dtype': 'float32', 'sparse': False, 'ragged': False, 'name': 'series_input'}, 'registered_name': None, 'name': 'series_input', 'inbound_nodes': []}, {'module': 'keras.layers', 'class_name': 'LSTM', 'config': {'name': 'lstm_1', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'return_sequences': True, 'return_state': False, 'go_backwards': False, 'stateful': False, 'unroll': False, 'zero_output_for_mask': False, 'units': 256, 'activation': 'tanh', 'recurrent_activation': 'sigmoid', 'use_bias': True, 'kernel_initializer': {'module': 'keras.initializers', 'class_name': 'GlorotUniform', 'config': {'seed': None}, 'registered_name': None}, 'recurrent_initializer': {'module': 'keras.initializers', 'class_name': 'Orthogonal', 'config': {'seed': None, 'gain': 1.0}, 'registered_name': None}, 'bias_initializer': {'module': 'keras.initializers', 'class_name': 'Zeros', 'config': {}, 'registered_name': None}, 'unit_forget_bias': True, 'kernel_regularizer': None, 'recurrent_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'recurrent_constraint': None, 'bias_constraint': None, 'dropout': 0.0, 'recurrent_dropout': 0.0, 'seed': None}, 'registered_name': None, 'build_config': {'input_shape': [None, 48, 1578]}, 'name': 'lstm_1', 'inbound_nodes': [{'args': ({'class_name': '__keras_tensor__', 'config': {'shape': (None, 48, 1578), 'dtype': 'float32', 'keras_history': ['series_input', 0, 0]}},), 'kwargs': {'training': False, 'mask': None}}]}, {'module': 'keras.layers', 'class_name': 'LSTM', 'config': {'name': 'lstm_2', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'return_sequences': True, 'return_state': False, 'go_backwards': False, 'stateful': False, 'unroll': False, 'zero_output_for_mask': False, 'units': 128, 'activation': 'tanh', 'recurrent_activation': 'sigmoid', 'use_bias': True, 'kernel_initializer': {'module': 'keras.initializers', 'class_name': 'GlorotUniform', 'config': {'seed': None}, 'registered_name': None}, 'recurrent_initializer': {'module': 'keras.initializers', 'class_name': 'Orthogonal', 'config': {'seed': None, 'gain': 1.0}, 'registered_name': None}, 'bias_initializer': {'module': 'keras.initializers', 'class_name': 'Zeros', 'config': {}, 'registered_name': None}, 'unit_forget_bias': True, 'kernel_regularizer': None, 'recurrent_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'recurrent_constraint': None, 'bias_constraint': None, 'dropout': 0.0, 'recurrent_dropout': 0.0, 'seed': None}, 'registered_name': None, 'build_config': {'input_shape': [None, 48, 256]}, 'name': 'lstm_2', 'inbound_nodes': [{'args': ({'class_name': '__keras_tensor__', 'config': {'shape': (None, 48, 256), 'dtype': 'float32', 'keras_history': ['lstm_1', 0, 0]}},), 'kwargs': {'training': False, 'mask': None}}]}, {'module': 'keras.layers', 'class_name': 'LSTM', 'config': {'name': 'lstm_3', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'return_sequences': True, 'return_state': False, 'go_backwards': False, 'stateful': False, 'unroll': False, 'zero_output_for_mask': False, 'units': 64, 'activation': 'tanh', 'recurrent_activation': 'sigmoid', 'use_bias': True, 'kernel_initializer': {'module': 'keras.initializers', 'class_name': 'GlorotUniform', 'config': {'seed': None}, 'registered_name': None}, 'recurrent_initializer': {'module': 'keras.initializers', 'class_name': 'Orthogonal', 'config': {'seed': None, 'gain': 1.0}, 'registered_name': None}, 'bias_initializer': {'module': 'keras.initializers', 'class_name': 'Zeros', 'config': {}, 'registered_name': None}, 'unit_forget_bias': True, 'kernel_regularizer': None, 'recurrent_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'recurrent_constraint': None, 'bias_constraint': None, 'dropout': 0.0, 'recurrent_dropout': 0.0, 'seed': None}, 'registered_name': None, 'build_config': {'input_shape': [None, 48, 128]}, 'name': 'lstm_3', 'inbound_nodes': [{'args': ({'class_name': '__keras_tensor__', 'config': {'shape': (None, 48, 128), 'dtype': 'float32', 'keras_history': ['lstm_2', 0, 0]}},), 'kwargs': {'training': False, 'mask': None}}]}, {'module': 'keras.layers', 'class_name': 'LSTM', 'config': {'name': 'lstm_4', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'return_sequences': False, 'return_state': False, 'go_backwards': False, 'stateful': False, 'unroll': False, 'zero_output_for_mask': False, 'units': 32, 'activation': 'tanh', 'recurrent_activation': 'sigmoid', 'use_bias': True, 'kernel_initializer': {'module': 'keras.initializers', 'class_name': 'GlorotUniform', 'config': {'seed': None}, 'registered_name': None}, 'recurrent_initializer': {'module': 'keras.initializers', 'class_name': 'Orthogonal', 'config': {'seed': None, 'gain': 1.0}, 'registered_name': None}, 'bias_initializer': {'module': 'keras.initializers', 'class_name': 'Zeros', 'config': {}, 'registered_name': None}, 'unit_forget_bias': True, 'kernel_regularizer': None, 'recurrent_regularizer': None, 'bias_regularizer': None, 'activity_regularizer': None, 'kernel_constraint': None, 'recurrent_constraint': None, 'bias_constraint': None, 'dropout': 0.0, 'recurrent_dropout': 0.0, 'seed': None}, 'registered_name': None, 'build_config': {'input_shape': [None, 48, 64]}, 'name': 'lstm_4', 'inbound_nodes': [{'args': ({'class_name': '__keras_tensor__', 'config': {'shape': (None, 48, 64), 'dtype': 'float32', 'keras_history': ['lstm_3', 0, 0]}},), 'kwargs': {'training': False, 'mask': None}}]}, {'module': 'keras.layers', 'class_name': 'RepeatVector', 'config': {'name': 'repeat_vector', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'n': 7}, 'registered_name': None, 'build_config': {'input_shape': [None, 32]}, 'name': 'repeat_vector', 'inbound_nodes': [{'args': ({'class_name': '__keras_tensor__', 'config': {'shape': (None, 32), 'dtype': 'float32', 'keras_history': ['lstm_4', 0, 0]}},), 'kwargs': {}}]}, {'module': 'keras.layers', 'class_name': 'InputLayer', 'config': {'batch_shape': (None, 7, 14), 'dtype': 'float32', 'sparse': False, 'ragged': False, 'name': 'exog_input'}, 'registered_name': None, 'name': 'exog_input', 'inbound_nodes': []}, {'module': 'keras.layers', 'class_name': 'Concatenate', 'config': {'name': 'concat_exog', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'axis': -1}, 'registered_name': None, 'build_config': {'input_shape': [[None, 7, 32], [None, 7, 14]]}, 'name': 'concat_exog', 'inbound_nodes': [{'args': ([{'class_name': '__keras_tensor__', 'config': {'shape': (None, 7, 32), 'dtype': 'float32', 'keras_history': ['repeat_vector', 0, 0]}}, {'class_name': '__keras_tensor__', 'config': {'shape': (None, 7, 14), 'dtype': 'float32', 'keras_history': ['exog_input', 0, 0]}}],), 'kwargs': {}}]}, {'module': 'keras.layers', 'class_name': 'TimeDistributed', 'config': {'name': 'dense_td_1', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'layer': {'module': 'keras.layers', 'class_name': 'Dense', 'config': {'name': 'dense', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'units': 32, 'activation': 'relu', 'use_bias': True, 'kernel_initializer': {'module': 'keras.initializers', 'class_name': 'GlorotUniform', 'config': {'seed': None}, 'registered_name': None}, 'bias_initializer': {'module': 'keras.initializers', 'class_name': 'Zeros', 'config': {}, 'registered_name': None}, 'kernel_regularizer': None, 'bias_regularizer': None, 'kernel_constraint': None, 'bias_constraint': None}, 'registered_name': None, 'build_config': {'input_shape': [None, 46]}}}, 'registered_name': None, 'build_config': {'input_shape': [None, 7, 46]}, 'name': 'dense_td_1', 'inbound_nodes': [{'args': ({'class_name': '__keras_tensor__', 'config': {'shape': (None, 7, 46), 'dtype': 'float32', 'keras_history': ['concat_exog', 0, 0]}},), 'kwargs': {'mask': None}}]}, {'module': 'keras.layers', 'class_name': 'TimeDistributed', 'config': {'name': 'output_dense_td_layer', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'layer': {'module': 'keras.layers', 'class_name': 'Dense', 'config': {'name': 'dense_1', 'trainable': True, 'dtype': {'module': 'keras', 'class_name': 'DTypePolicy', 'config': {'name': 'float32'}, 'registered_name': None}, 'units': 1578, 'activation': 'linear', 'use_bias': True, 'kernel_initializer': {'module': 'keras.initializers', 'class_name': 'GlorotUniform', 'config': {'seed': None}, 'registered_name': None}, 'bias_initializer': {'module': 'keras.initializers', 'class_name': 'Zeros', 'config': {}, 'registered_name': None}, 'kernel_regularizer': None, 'bias_regularizer': None, 'kernel_constraint': None, 'bias_constraint': None}, 'registered_name': None, 'build_config': {'input_shape': [None, 32]}}}, 'registered_name': None, 'build_config': {'input_shape': [None, 7, 32]}, 'name': 'output_dense_td_layer', 'inbound_nodes': [{'args': ({'class_name': '__keras_tensor__', 'config': {'shape': (None, 7, 32), 'dtype': 'float32', 'keras_history': ['dense_td_1', 0, 0]}},), 'kwargs': {'mask': None}}]}], 'input_layers': [['series_input', 0, 0], ['exog_input', 0, 0]], 'output_layers': ['output_dense_td_layer', 0, 0]}
Compile Parameters
-
{'optimizer': {'module': 'keras.src.backend.torch.optimizers.torch_adam', 'class_name': 'Adam', 'config': {'name': 'adam', 'learning_rate': 0.009999999776482582, 'weight_decay': None, 'clipnorm': None, 'global_clipnorm': None, 'clipvalue': None, 'use_ema': False, 'ema_momentum': 0.99, 'ema_overwrite_frequency': None, 'loss_scale_factor': None, 'gradient_accumulation_steps': None, 'beta_1': 0.9, 'beta_2': 0.999, 'epsilon': 1e-07, 'amsgrad': False}, 'registered_name': 'Adam'}, 'loss': {'module': 'keras.losses', 'class_name': 'MeanSquaredError', 'config': {'name': 'mean_squared_error', 'reduction': 'sum_over_batch_size'}, 'registered_name': None}, 'loss_weights': None, 'metrics': None, 'weighted_metrics': None, 'run_eagerly': False, 'steps_per_execution': 1, 'jit_compile': False}
Fit Kwargs
-
{'epochs': 50, 'batch_size': 128, 'callbacks': [
When the magnitude of the loss is very different between training and validation, it is recommended to plot the training and validation loss using different y-axes. This approach allows for a clearer visualization of the loss trends, making it easier to identify overfitting or underfitting issues in the model.
# Track training and overfitting (different axes for loss and val_loss)
# ==============================================================================
set_dark_theme()
fig, ax = plt.subplots(figsize=(7, 3))
epochs = np.arange(len(forecaster.history_['loss']))
p1, = ax.plot(epochs, forecaster.history_['loss'], color='tab:blue', label='loss')
ax.set_ylabel('loss', color='tab:blue')
ax.tick_params(axis='y', labelcolor='tab:blue')
ax2 = ax.twinx()
p2, = ax2.plot(epochs, forecaster.history_['val_loss'], color='tab:orange', label='val_loss')
ax2.set_ylabel('val_loss', color='tab:orange')
ax2.tick_params(axis='y', labelcolor='tab:orange')
ax.legend(handles=[p1, p2], loc='upper right')
ax.set_title('Training and Validation Loss over Epochs')
plt.show()
Backtesting on test data
# Backtesting on test set
# ==============================================================================
cv = TimeSeriesFold(
initial_train_size = end_validation,
steps = 7,
refit = False
)
# The validation partition is now used as part of the initial fit
# Epocs is set to the value idenfied in the previous training with early stopping
forecaster.set_fit_kwargs({"epochs": 10, "batch_size": 128})
metrics, predictions = backtesting_forecaster_multiseries(
forecaster = forecaster,
series = series[levels],
exog = exog_features,
cv = cv,
levels = levels,
metric = 'mean_absolute_error',
suppress_warnings = False,
)
display(predictions.head())
display(metrics)
Using 'torch' backend with device: cuda
Epoch 1/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 4s 689ms/step - loss: 0.0408 Epoch 2/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 4s 709ms/step - loss: 0.0390 Epoch 3/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 645ms/step - loss: 0.0383 Epoch 4/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 4s 739ms/step - loss: 0.0374 Epoch 5/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 608ms/step - loss: 0.0367 Epoch 6/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 597ms/step - loss: 0.0362 Epoch 7/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 647ms/step - loss: 0.0359 Epoch 8/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 578ms/step - loss: 0.0354 Epoch 9/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 728ms/step - loss: 0.0353 Epoch 10/10 5/5 ━━━━━━━━━━━━━━━━━━━━ 3s 638ms/step - loss: 0.0351
0%| | 0/9 [00:00<?, ?it/s]
| level | fold | pred | |
|---|---|---|---|
| 2017-11-01 | Bear_assembly_Angel | 0 | 11125.125000 |
| 2017-11-01 | Bear_assembly_Beatrice | 0 | 1167.434937 |
| 2017-11-01 | Bear_assembly_Danial | 0 | 4185.719727 |
| 2017-11-01 | Bear_assembly_Diana | 0 | 21.667469 |
| 2017-11-01 | Bear_assembly_Genia | 0 | 7306.183594 |
| levels | mean_absolute_error | |
|---|---|---|
| 0 | Bear_assembly_Angel | 2298.842119 |
| 1 | Bear_assembly_Beatrice | 240.443625 |
| 2 | Bear_assembly_Danial | 266.329818 |
| 3 | Bear_assembly_Diana | 3.012067 |
| 4 | Bear_assembly_Genia | 977.934755 |
| ... | ... | ... |
| 1576 | Wolf_retail_Toshia | 597.476953 |
| 1577 | Wolf_science_Alfreda | 178.361659 |
| 1578 | average | 730.008229 |
| 1579 | weighted_average | 730.008229 |
| 1580 | pooling | 730.008229 |
1581 rows × 2 columns
# Aggregated metric for all buildings
# ==============================================================================
average_metric_all_buildings = metrics.query("levels == 'average'")["mean_absolute_error"].item()
errors_all_buildings = pd.merge(
left = data[['building_id', 'meter_reading']].reset_index(),
right = predictions.rename_axis("timestamp").reset_index(),
left_on = ['timestamp', 'building_id'],
right_on = ['timestamp', 'level'],
how = 'inner',
validate = "1:1"
).assign(error=lambda df: df['meter_reading'] - df['pred'])
sum_abs_errors_all_buildings = errors_all_buildings['error'].abs().sum().sum()
sum_bias_all_buildings = errors_all_buildings['error'].sum().sum()
print(f"Average mean absolute error for all buildings: {average_metric_all_buildings:.0f}")
print(f"Sum of absolute errors for all buildings (x 10,000): {sum_abs_errors_all_buildings / 10000:.0f}")
print(f"Bias (x 10,000): {sum_bias_all_buildings / 10000:.0f}")
Average mean absolute error for all buildings: 730 Sum of absolute errors for all buildings (x 10,000): 7027 Bias (x 10,000): -589
# Predictions
# ==============================================================================
predictions
| level | fold | pred | |
|---|---|---|---|
| 2017-11-01 | Bear_assembly_Angel | 0 | 11125.125000 |
| 2017-11-01 | Bear_assembly_Beatrice | 0 | 1167.434937 |
| 2017-11-01 | Bear_assembly_Danial | 0 | 4185.719727 |
| 2017-11-01 | Bear_assembly_Diana | 0 | 21.667469 |
| 2017-11-01 | Bear_assembly_Genia | 0 | 7306.183594 |
| ... | ... | ... | ... |
| 2017-12-31 | Wolf_public_Norma | 8 | 3569.308350 |
| 2017-12-31 | Wolf_retail_Harriett | 8 | 1090.071655 |
| 2017-12-31 | Wolf_retail_Marcella | 8 | 172.959381 |
| 2017-12-31 | Wolf_retail_Toshia | 8 | 1497.184204 |
| 2017-12-31 | Wolf_science_Alfreda | 8 | 2020.813843 |
96258 rows × 3 columns
# Plot predictions vs real value for 2 random buildings
# ==============================================================================
set_dark_theme()
rng = np.random.default_rng(14793)
n_buildings = 5
selected_buildings = rng.choice(predictions['level'].unique(), size=n_buildings, replace=False)
fig, axs = plt.subplots(n_buildings, 1, figsize=(7, 9), sharex=True)
axs = axs.flatten()
for i, building in enumerate(selected_buildings):
series.loc[predictions.index, building].plot(ax=axs[i], label='test')
predictions.query("level == @building")['pred'].plot(ax=axs[i], label='predictions')
axs[i].set_title(f"Building {building}", fontsize=10)
axs[i].set_xlabel("")
axs[i].legend()
fig.tight_layout()
plt.show();
Session information
import session_info
session_info.show(html=False)
----- feature_engine 1.9.3 keras 3.12.0 matplotlib 3.10.8 numpy 2.3.4 pandas 2.3.3 session_info v1.0.1 skforecast 0.19.0 sklearn 1.7.2 torch 2.8.0 ----- IPython 9.7.0 jupyter_client 8.6.3 jupyter_core 5.9.1 ----- Python 3.13.9 | packaged by conda-forge | (main, Oct 22 2025, 23:12:41) [MSC v.1944 64 bit (AMD64)] Windows-11-10.0.26100-SP0 ----- Session information updated at 2025-12-01 11:28
Citation
How to cite this document
If you use this document or any part of it, please acknowledge the source, thank you!
Forecasting at scale with deep learning by Joaquín Amat Rodrigo, Javier Escobar Ortiz and Fernando Carazo, available under a CC BY-NC-SA 4.0 at https://www.cienciadedatos.net/documentos/py68-forecasting-at-scale-deep-learning.html
How to cite skforecast
If you use skforecast for a publication, we would appreciate it if you cite the published software.
Zenodo:
Amat Rodrigo, Joaquin, & Escobar Ortiz, Javier. (2025). skforecast (v0.19.0). Zenodo. https://doi.org/10.5281/zenodo.8382788
APA:
Amat Rodrigo, J., & Escobar Ortiz, J. (2025). skforecast (Version 0.19.0) [Computer software]. https://doi.org/10.5281/zenodo.8382788
BibTeX:
@software{skforecast, author = {Amat Rodrigo, Joaquin and Escobar Ortiz, Javier}, title = {skforecast}, version = {0.19.0}, month = {11}, year = {2025}, license = {BSD-3-Clause}, url = {https://skforecast.org/}, doi = {10.5281/zenodo.8382788} }
Did you like the article? Your support is important
Your contribution will help me to continue generating free educational content. Many thanks! 😊
This work by Joaquín Amat Rodrigo and Javier Escobar Ortiz is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International.
Allowed:
-
Share: copy and redistribute the material in any medium or format.
-
Adapt: remix, transform, and build upon the material.
Under the following terms:
-
Attribution: You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
-
NonCommercial: You may not use the material for commercial purposes.
-
ShareAlike: If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
