Forecasting¶
InĀ [1]:
from sktime.datasets import load_airline
import matplotlib.pyplot as plt
import numpy as np
from sktime.performance_metrics.forecasting import MeanSquaredError
mse = MeanSquaredError()
Load data¶
InĀ [2]:
y = load_airline()
InĀ [3]:
y.plot()
plt.show()
Split data¶
InĀ [4]:
from sktime.split import temporal_train_test_split
InĀ [5]:
y_train, y_test = temporal_train_test_split(y)
InĀ [6]:
y_train.plot(label='train')
y_test.plot(label='test')
plt.legend()
plt.show()
InĀ [7]:
fh = np.arange(1, len(y_test) + 1)
Naive forecasting¶
InĀ [8]:
from sktime.forecasting.naive import NaiveForecaster
Mean¶
InĀ [9]:
forecaster = NaiveForecaster(strategy="mean")
InĀ [10]:
forecaster.fit(y_train)
Out[10]:
NaiveForecaster(strategy='mean')Please rerun this cell to show the HTML repr or trust the notebook.
NaiveForecaster(strategy='mean')
InĀ [11]:
y_pred = forecaster.predict(fh)
InĀ [12]:
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [13]:
mse(y_pred, y_test)
Out[13]:
45164.797410836756
Last¶
InĀ [14]:
forecaster = NaiveForecaster(strategy="last")
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [15]:
mse(y_pred, y_test)
Out[15]:
14674.555555555555
Drift¶
InĀ [16]:
forecaster = NaiveForecaster(strategy="drift")
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [17]:
mse(y_pred, y_test)
Out[17]:
7695.698285148631
Time series cross-validation¶
InĀ [18]:
from sktime.performance_metrics.forecasting import MeanSquaredError, MeanAbsoluteError, MeanAbsolutePercentageError
from sktime.forecasting.model_evaluation import evaluate
from sktime.split import ExpandingWindowSplitter
InĀ [19]:
cv = ExpandingWindowSplitter(fh, initial_window=12, step_length=12)
InĀ [20]:
# how many splits?
splitted = list(cv.split(y_train))
len(splitted)
Out[20]:
6
InĀ [21]:
fig, axs = plt.subplots(2, 3, figsize=(15, 7), sharex=True, sharey=True)
for i, (train, test) in enumerate(splitted):
axs[i // 3, i % 3].set_title(f"Split {i}")
y_train.iloc[train].plot(ax=axs[i // 3, i % 3], label='train')
y_train.iloc[test].plot(ax=axs[i // 3, i % 3], label='validation')
plt.legend()
plt.show()
InĀ [22]:
# metrics
mse = MeanSquaredError()
mae = MeanAbsoluteError()
mape = MeanAbsolutePercentageError(symmetric=True)
InĀ [23]:
scores_df = evaluate(NaiveForecaster(strategy="mean"), cv=cv, y=y_train, scoring=[mse, mae, mape])
scores_df
Out[23]:
| test_MeanSquaredError | test_MeanAbsoluteError | test_MeanAbsolutePercentageError | fit_time | pred_time | len_train_window | cutoff | |
|---|---|---|---|---|---|---|---|
| 0 | 2712.185185 | 43.759259 | 0.280092 | 0.004609 | 0.002498 | 12 | 1949-12 |
| 1 | 5138.342593 | 64.222222 | 0.373987 | 0.003998 | 0.002217 | 24 | 1950-12 |
| 2 | 6681.194444 | 74.805556 | 0.396476 | 0.004169 | 0.002128 | 36 | 1951-12 |
| 3 | 10065.411458 | 90.930556 | 0.430038 | 0.004132 | 0.002137 | 48 | 1952-12 |
| 4 | 15494.345556 | 112.022222 | 0.471093 | 0.003951 | 0.002071 | 60 | 1953-12 |
| 5 | 24187.210069 | 143.986111 | 0.546547 | 0.004148 | 0.002072 | 72 | 1954-12 |
Exponential smoothing¶
SES¶
InĀ [24]:
from sktime.forecasting.theta import ThetaForecaster
InĀ [25]:
forecaster = ThetaForecaster(sp=12)
InĀ [26]:
forecaster.fit(y_train)
Out[26]:
ThetaForecaster(sp=12)Please rerun this cell to show the HTML repr or trust the notebook.
ThetaForecaster(sp=12)
InĀ [27]:
y_pred = forecaster.predict(fh)
InĀ [28]:
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [29]:
mse(y_pred, y_test)
Out[29]:
2470.2427803531837
Holt-Winters¶
InĀ [30]:
from sktime.forecasting.exp_smoothing import ExponentialSmoothing
InĀ [31]:
forecaster = ExponentialSmoothing(trend="add", seasonal="multiplicative", sp=12)
InĀ [32]:
forecaster.fit(y_train)
Out[32]:
ExponentialSmoothing(seasonal='multiplicative', sp=12, trend='add')Please rerun this cell to show the HTML repr or trust the notebook.
ExponentialSmoothing(seasonal='multiplicative', sp=12, trend='add')
InĀ [33]:
y_pred = forecaster.predict(fh)
InĀ [34]:
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [35]:
mse(y_pred, y_test)
Out[35]:
711.5349712418024
ARIMA¶
InĀ [36]:
from sktime.forecasting.arima import ARIMA
White noise¶
InĀ [37]:
forecaster = ARIMA(order=(0, 0, 0))
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
Random walk¶
InĀ [38]:
forecaster = ARIMA(order=(0, 1, 0), with_intercept=False)
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
Random walk with drift¶
InĀ [39]:
forecaster = ARIMA(order=(0, 1, 0), with_intercept=True)
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
Autoregression¶
InĀ [40]:
forecaster = ARIMA(order=(1, 0, 0))
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
Moving average¶
InĀ [41]:
forecaster = ARIMA(order=(0, 0, 1))
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
ARMA¶
InĀ [42]:
forecaster = ARIMA(order=(1, 0, 1))
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
ARIMA¶
InĀ [43]:
forecaster = ARIMA(order=(1, 1, 1))
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
SARIMA¶
InĀ [44]:
forecaster = ARIMA(
order=(1, 1, 1),
seasonal_order=(0, 1, 0, 12))
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
InĀ [45]:
mse(y_pred, y_test)
Out[45]:
434.0854489936248
AutoARIMA¶
InĀ [46]:
from sktime.forecasting.arima import AutoARIMA
InĀ [47]:
forecaster = AutoARIMA()
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
warnings.warn("Maximum Likelihood optimization failed to "
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/tsa/statespace/sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
warn('Non-invertible starting MA parameters found.'
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
warnings.warn("Maximum Likelihood optimization failed to "
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
warnings.warn("Maximum Likelihood optimization failed to "
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
warnings.warn("Maximum Likelihood optimization failed to "
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
InĀ [48]:
forecaster.get_fitted_params()
Out[48]:
{'intercept': 0.6708152323703931,
'ar.L1': 1.6405377113621231,
'ar.L2': -0.9086371656749326,
'ma.L1': -1.8337769969868813,
'ma.L2': 0.9289388175973289,
'sigma2': 393.31814242074717,
'order': (2, 1, 2),
'seasonal_order': (0, 0, 0, 0),
'aic': 959.2179634717929,
'aicc': 960.057963471793,
'bic': 975.2549364785643,
'hqic': 965.7191390849304} InĀ [49]:
mse(y_pred, y_test)
Out[49]:
3505.3658590759765
InĀ [50]:
forecaster = AutoARIMA(sp=12)
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/base/model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
warnings.warn("Maximum Likelihood optimization failed to "
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/tsa/statespace/sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
warn('Non-stationary starting autoregressive parameters'
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/tsa/statespace/sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
warn('Non-invertible starting MA parameters found.'
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/tsa/statespace/sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
warn('Non-stationary starting autoregressive parameters'
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/statsmodels/tsa/statespace/sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
warn('Non-invertible starting MA parameters found.'
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8.
warnings.warn(
InĀ [51]:
mse(y_pred, y_test)
Out[51]:
489.8359031230193
InĀ [52]:
forecaster.get_fitted_params()
Out[52]:
{'ar.L1': -0.24111777454982325,
'sigma2': 92.74985716210796,
'order': (1, 1, 0),
'seasonal_order': (0, 1, 0, 12),
'aic': 704.0011679026005,
'aicc': 704.1316026852093,
'bic': 709.1089216858016,
'hqic': 706.065083639602} Prophet¶
InĀ [53]:
# !pip install prophet
InĀ [54]:
from sktime.forecasting.fbprophet import Prophet
InĀ [55]:
forecaster = Prophet(
seasonality_mode='multiplicative',
n_changepoints=int(len(y_train) / 12),
yearly_seasonality=True)
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
17:32:14 - cmdstanpy - INFO - Chain [1] start processing 17:32:15 - cmdstanpy - INFO - Chain [1] done processing
Out[55]:
<matplotlib.legend.Legend at 0x179c92b70>
InĀ [56]:
mse(y_pred, y_test)
Out[56]:
1048.9923236405227
Forecasting via Reduction¶
InĀ [57]:
from sktime.forecasting.compose import make_reduction
Decision tree¶
InĀ [58]:
from sklearn.tree import DecisionTreeRegressor
from sktime.transformations.series.difference import Differencer
Local¶
InĀ [59]:
pipe = make_reduction(
DecisionTreeRegressor(random_state=1),
window_length=24
)
pipe.fit(y_train)
y_pred = pipe.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [60]:
pipe = Differencer() * make_reduction(
DecisionTreeRegressor(random_state=1),
window_length=24
)
InĀ [61]:
pipe.fit(y_train)
y_pred = pipe.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [62]:
mse(y_pred, y_test)
Out[62]:
2020.611111111111
Global (in this case has no effect, as we only have one time series)¶
InĀ [78]:
pipe = Differencer() * make_reduction(
DecisionTreeRegressor(random_state=1),
window_length=24,
pooling="global"
)
InĀ [79]:
pipe.fit(y_train)
y_pred = pipe.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [80]:
mse(y_pred, y_test)
Out[80]:
2171.8055555555557
Fine-tuning¶
InĀ [63]:
from sktime.transformations.series.difference import Differencer
from sktime.forecasting.compose import TransformedTargetForecaster
from sktime.transformations.compose import OptionalPassthrough
from sktime.forecasting.model_selection import ForecastingGridSearchCV
from sktime.transformations.series.boxcox import LogTransformer
InĀ [65]:
pipe = TransformedTargetForecaster(steps=[
("log", OptionalPassthrough(LogTransformer())),
Differencer(),
("dt", make_reduction(
DecisionTreeRegressor(random_state=1),
))
]
)
param_grid = {
"log__passthrough": [True, False],
"dt__window_length": [6, 12, 24, 48, 96]
}
gscv = ForecastingGridSearchCV(
pipe, cv=cv, param_grid=param_grid, scoring=mse
)
pipe
Out[65]:
TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1)))])Please rerun this cell to show the HTML repr or trust the notebook.TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1)))])OptionalPassthrough(transformer=LogTransformer())
LogTransformer()
LogTransformer()
Differencer()
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1))
DecisionTreeRegressor(random_state=1)
DecisionTreeRegressor(random_state=1)
InĀ [66]:
%%time
gscv.fit(y_train)
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 0-th data split, on training data y_train with
cutoff NaT, and len(y_train)=12.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=48))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 0-th data split, on training data y_train with
cutoff NaT, and len(y_train)=12.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=24))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 0-th data split, on training data y_train with
cutoff NaT, and len(y_train)=12.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=24))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 0-th data split, on training data y_train with
cutoff NaT, and len(y_train)=12.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=12))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 1-th data split, on training data y_train with
cutoff NaT, and len(y_train)=24.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=48))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 0-th data split, on training data y_train with
cutoff NaT, and len(y_train)=12.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=12))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 1-th data split, on training data y_train with
cutoff NaT, and len(y_train)=24.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=24))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 1-th data split, on training data y_train with
cutoff NaT, and len(y_train)=24.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=24))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 2-th data split, on training data y_train with
cutoff NaT, and len(y_train)=36.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=48))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 0-th data split, on training data y_train with
cutoff NaT, and len(y_train)=12.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=48))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 3-th data split, on training data y_train with
cutoff NaT, and len(y_train)=48.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=48))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 1-th data split, on training data y_train with
cutoff NaT, and len(y_train)=24.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=48))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 2-th data split, on training data y_train with
cutoff NaT, and len(y_train)=36.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=48))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 3-th data split, on training data y_train with
cutoff NaT, and len(y_train)=48.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=48))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 0-th data split, on training data y_train with
cutoff NaT, and len(y_train)=12.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 1-th data split, on training data y_train with
cutoff NaT, and len(y_train)=24.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 0-th data split, on training data y_train with
cutoff NaT, and len(y_train)=12.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 2-th data split, on training data y_train with
cutoff NaT, and len(y_train)=36.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 1-th data split, on training data y_train with
cutoff NaT, and len(y_train)=24.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 3-th data split, on training data y_train with
cutoff NaT, and len(y_train)=48.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 2-th data split, on training data y_train with
cutoff NaT, and len(y_train)=36.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 4-th data split, on training data y_train with
cutoff NaT, and len(y_train)=60.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 3-th data split, on training data y_train with
cutoff NaT, and len(y_train)=48.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 5-th data split, on training data y_train with
cutoff NaT, and len(y_train)=72.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(passthrough=True,
transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 4-th data split, on training data y_train with
cutoff NaT, and len(y_train)=60.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sktime/utils/parallel.py:107: FitFailedWarning:
In evaluate, fitting of forecaster TransformedTargetForecaster failed,
you can set error_score='raise' in evaluate to see
the exception message.
Fit failed for the 5-th data split, on training data y_train with
cutoff NaT, and len(y_train)=72.
The score will be set to nan.
Failed forecaster with parameters: TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1),
window_length=96))]).
ret = [fun(x, meta=meta) for x in iter]
CPU times: user 117 ms, sys: 103 ms, total: 220 ms Wall time: 4.87 s
Out[66]:
ForecastingGridSearchCV(cv=ExpandingWindowSplitter(fh=array([ 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]),
initial_window=12,
step_length=12),
forecaster=TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1)))]),
param_grid={'dt__window_length': [6, 12, 24, 48, 96],
'log__passthrough': [True, False]},
scoring=MeanSquaredError())Please rerun this cell to show the HTML repr or trust the notebook.ForecastingGridSearchCV(cv=ExpandingWindowSplitter(fh=array([ 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]),
initial_window=12,
step_length=12),
forecaster=TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1)))]),
param_grid={'dt__window_length': [6, 12, 24, 48, 96],
'log__passthrough': [True, False]},
scoring=MeanSquaredError())TransformedTargetForecaster(steps=[('log',
OptionalPassthrough(transformer=LogTransformer())),
Differencer(),
('dt',
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1)))])OptionalPassthrough(transformer=LogTransformer())
LogTransformer()
LogTransformer()
Differencer()
RecursiveTabularRegressionForecaster(estimator=DecisionTreeRegressor(random_state=1))
DecisionTreeRegressor(random_state=1)
DecisionTreeRegressor(random_state=1)
InĀ [67]:
y_pred = gscv.predict(fh)
InĀ [68]:
gscv.best_params_
Out[68]:
{'dt__window_length': 12, 'log__passthrough': True} InĀ [69]:
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [70]:
mse(y_pred, y_test)
Out[70]:
470.3333333333333
Rocket¶
InĀ [81]:
from sktime.regression.kernel_based import RocketRegressor
InĀ [83]:
pipe = make_reduction(
RocketRegressor(random_state=1, rocket_transform="minirocket", num_kernels=500),
window_length=12
)
pipe
Out[83]:
RecursiveTimeSeriesRegressionForecaster(estimator=RocketRegressor(num_kernels=500,
random_state=1,
rocket_transform='minirocket'),
window_length=12)Please rerun this cell to show the HTML repr or trust the notebook.RecursiveTimeSeriesRegressionForecaster(estimator=RocketRegressor(num_kernels=500,
random_state=1,
rocket_transform='minirocket'),
window_length=12)RocketRegressor(num_kernels=500, random_state=1, rocket_transform='minirocket')
RocketRegressor(num_kernels=500, random_state=1, rocket_transform='minirocket')
InĀ [84]:
pipe.fit(y_train)
y_pred = pipe.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [85]:
mse(y_pred, y_test)
Out[85]:
2858.7144286803036
InĀ [86]:
from sktime.transformations.series.difference import Differencer
from sktime.transformations.series.detrend import Detrender
from sktime.transformations.series.detrend import Deseasonalizer
from sktime.transformations.series.boxcox import LogTransformer
InĀ [93]:
pipe = LogTransformer() * Detrender() * Deseasonalizer() * Differencer() * make_reduction(
RocketRegressor(random_state=1, rocket_transform="minirocket", num_kernels=10000),
window_length=12
)
InĀ [95]:
pipe.fit(y_train)
y_pred = pipe.predict(fh)
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
InĀ [96]:
mse(y_pred, y_test)
Out[96]:
435.1335377098871
Deep learning¶
TFT¶
InĀ [Ā ]:
import pandas as pd
from neuralforecast import NeuralForecast
from neuralforecast.models import TFT
InĀ [162]:
y_train_nixla = pd.DataFrame({'ds': y_train.index, 'y': y_train.values, 'unique_id': '1'})
y_test_nixla = pd.DataFrame({'ds': y_test.index, 'y': y_test.values, 'unique_id': '1'})
y_train_nixla["ds"] = np.arange(len(y_train_nixla))
y_test_nixla["ds"] = np.arange(len(y_test_nixla)) + len(y_train_nixla)
InĀ [163]:
nf = NeuralForecast(
models=[TFT(h=len(fh),
input_size=48,
hidden_size=20,
learning_rate=0.005,
max_steps=50,
scaler_type='robust',
enable_progress_bar=True,
accelerator="cpu"
),
],
freq=1
)
nf.fit(df=y_train_nixla)
y_pred = nf.predict(y_train_nixla)
y_pred = pd.Series(y_pred.TFT.values, index=y_test.index)
Seed set to 1 /Users/francesco/miniforge3/envs/2025_phd_ts_course/lib/python3.12/site-packages/neuralforecast/common/_base_model.py:535: UserWarning: val_check_steps is greater than max_steps, setting val_check_steps to max_steps. warnings.warn( GPU available: True (mps), used: False TPU available: False, using: 0 TPU cores HPU available: False, using: 0 HPUs | Name | Type | Params | Mode ----------------------------------------------------------------------------- 0 | loss | MAE | 0 | train 1 | padder_train | ConstantPad1d | 0 | train 2 | scaler | TemporalNorm | 0 | train 3 | embedding | TFTEmbedding | 80 | train 4 | temporal_encoder | TemporalCovariateEncoder | 15.9 K | train 5 | temporal_fusion_decoder | TemporalFusionDecoder | 6.6 K | train 6 | output_adapter | Linear | 21 | train ----------------------------------------------------------------------------- 22.6 K Trainable params 0 Non-trainable params 22.6 K Total params 0.090 Total estimated model params size (MB) 88 Modules in train mode 0 Modules in eval mode
Sanity Checking: | | 0/? [00:00<?, ?it/s]
Training: | | 0/? [00:00<?, ?it/s]
Validation: | | 0/? [00:00<?, ?it/s]
`Trainer.fit` stopped: `max_steps=50` reached. GPU available: True (mps), used: False TPU available: False, using: 0 TPU cores HPU available: False, using: 0 HPUs
Predicting: | | 0/? [00:00<?, ?it/s]
InĀ [164]:
import matplotlib.pyplot as plt
import seaborn as sns
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
Probabilistic forecasting¶
InĀ [98]:
from sktime.performance_metrics.forecasting.probabilistic import PinballLoss
metrics: interval vs quantile metrics Interval and quantile metrics can be used interchangeably:
internally, these are easily convertible to each other $\text{lower/upper interval} = \text{quantiles at } 0.5\pm 0.5 \times \text{coverage}$
E.g. For a 95% confidence interval:
- Coverage is 0.95.
- The lower bound is the quantile at (0.5 - 0.5 \times 0.95 = 0.025).
- The upper bound is the quantile at (0.5 + 0.5 \times 0.95 = 0.975).
So, a 95% confidence interval corresponds to the 2.5th and 97.5th percentiles.
InĀ [166]:
# from sktime.registry import all_estimators
#
# all_estimators(
# "forecaster", filter_tags={"capability:pred_int": True}, as_dataframe=True
# )
ARIMA¶
InĀ [99]:
from sktime.forecasting.arima import ARIMA
InĀ [100]:
forecaster = ARIMA(order=(1, 1, 1), seasonal_order=(0, 1, 0, 12))
forecaster.fit(y_train)
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
Out[100]:
ARIMA(order=(1, 1, 1), seasonal_order=(0, 1, 0, 12))Please rerun this cell to show the HTML repr or trust the notebook.
ARIMA(order=(1, 1, 1), seasonal_order=(0, 1, 0, 12))
Point forecasts¶
InĀ [101]:
y_pred = forecaster.predict(fh)
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
InĀ [102]:
y_train.plot(label='train')
y_test.plot(label='test')
y_pred.plot(label='forecast')
plt.legend()
plt.show()
Prediction intervals¶
InĀ [103]:
coverage = 0.9
y_pred_ints = forecaster.predict_interval(fh=fh, coverage=coverage)
y_pred_ints
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
Out[103]:
| Number of airline passengers | ||
|---|---|---|
| 0.9 | ||
| lower | upper | |
| 1958-01 | 329.877206 | 361.384878 |
| 1958-02 | 311.646623 | 351.751174 |
| 1958-03 | 362.398927 | 411.818523 |
| 1958-04 | 351.294236 | 407.327575 |
| 1958-05 | 355.339836 | 417.938504 |
| 1958-06 | 419.804672 | 487.977078 |
| 1958-07 | 460.424587 | 533.953547 |
| 1958-08 | 460.257117 | 538.660947 |
| 1958-09 | 395.216191 | 478.276084 |
| 1958-10 | 336.307960 | 423.737710 |
| 1958-11 | 292.498964 | 384.112739 |
| 1958-12 | 321.784114 | 417.385949 |
| 1959-01 | 323.363383 | 435.631783 |
| 1959-02 | 303.951363 | 427.739707 |
| 1959-03 | 353.557254 | 489.515376 |
| 1959-04 | 340.920527 | 487.117329 |
| 1959-05 | 343.483529 | 499.772354 |
| 1959-06 | 406.427363 | 571.893044 |
| 1959-07 | 445.572409 | 619.905729 |
| 1959-08 | 443.954403 | 626.624871 |
| 1959-09 | 377.506425 | 568.208350 |
| 1959-10 | 317.227534 | 515.601875 |
| 1959-11 | 272.087918 | 477.868796 |
| 1959-12 | 300.079064 | 512.997261 |
| 1960-01 | 301.878316 | 531.584376 |
| 1960-02 | 281.824534 | 524.895317 |
| 1960-03 | 330.814299 | 587.848373 |
| 1960-04 | 317.333561 | 586.855595 |
| 1960-05 | 319.037677 | 600.930765 |
| 1960-06 | 381.052945 | 674.541280 |
| 1960-07 | 419.260814 | 724.052402 |
| 1960-08 | 416.686345 | 732.289264 |
| 1960-09 | 349.282517 | 675.389853 |
| 1960-10 | 288.047368 | 624.300895 |
| 1960-11 | 241.958287 | 588.078540 |
| 1960-12 | 269.007421 | 624.710275 |
InĀ [104]:
y_train.plot(label='train')
y_test.plot(label='test')
# y_pred.plot(label='forecast')
plt.fill_between(y_pred_ints.index, y_pred_ints.iloc[:, 0], y_pred_ints.iloc[:, 1], alpha=0.25, color='C2', label=f'{coverage:.0%} prediction interval')
plt.legend()
plt.show()
InĀ [105]:
loss = PinballLoss()
loss(y_true=y_test, y_pred=y_pred_ints)
Out[105]:
4.482899785123706
InĀ [106]:
coverage = 0.1
y_pred_ints = forecaster.predict_interval(fh=fh, coverage=coverage)
y_train.plot(label='train')
y_test.plot(label='test')
plt.fill_between(y_pred_ints.index, y_pred_ints.iloc[:, 0], y_pred_ints.iloc[:, 1], alpha=0.25, color='C2', label=f'{coverage:.0%} prediction interval')
plt.legend()
plt.show()
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
Quantile forecasts¶
InĀ [107]:
y_pred_quantiles = forecaster.predict_quantiles(fh=fh, alpha=[0.1, 0.9])
y_pred_quantiles
/Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn( /Users/francesco/miniforge3/envs/timeseries_dl/lib/python3.12/site-packages/sklearn/utils/deprecation.py:151: FutureWarning: 'force_all_finite' was renamed to 'ensure_all_finite' in 1.6 and will be removed in 1.8. warnings.warn(
Out[107]:
| Number of airline passengers | ||
|---|---|---|
| 0.1 | 0.9 | |
| 1958-01 | 333.356786 | 357.905297 |
| 1958-02 | 316.075609 | 347.322189 |
| 1958-03 | 367.856628 | 406.360821 |
| 1958-04 | 357.482333 | 401.139478 |
| 1958-05 | 362.252981 | 411.025358 |
| 1958-06 | 427.333359 | 480.448391 |
| 1958-07 | 468.544830 | 525.833304 |
| 1958-08 | 468.915722 | 530.002343 |
| 1958-09 | 404.388992 | 469.103282 |
| 1958-10 | 345.963350 | 414.082319 |
| 1958-11 | 302.616422 | 373.995282 |
| 1958-12 | 332.341997 | 406.828066 |
| 1959-01 | 335.761855 | 423.233312 |
| 1959-02 | 317.622051 | 414.069019 |
| 1959-03 | 368.571924 | 474.500707 |
| 1959-04 | 357.065915 | 470.971941 |
| 1959-05 | 360.743439 | 482.512443 |
| 1959-06 | 424.700729 | 553.619678 |
| 1959-07 | 464.825081 | 600.653057 |
| 1959-08 | 464.127796 | 606.451478 |
| 1959-09 | 398.566780 | 547.147995 |
| 1959-10 | 339.135200 | 493.694209 |
| 1959-11 | 294.813532 | 455.143182 |
| 1959-12 | 323.592895 | 489.483430 |
| 1960-01 | 327.246131 | 506.216561 |
| 1960-02 | 308.668296 | 498.051556 |
| 1960-03 | 359.200110 | 559.462562 |
| 1960-04 | 347.098492 | 557.090664 |
| 1960-05 | 350.168818 | 569.799624 |
| 1960-06 | 413.464618 | 642.129607 |
| 1960-07 | 452.920773 | 690.392443 |
| 1960-08 | 451.540265 | 697.435345 |
| 1960-09 | 385.296502 | 639.375868 |
| 1960-10 | 325.181857 | 587.166406 |
| 1960-11 | 280.182418 | 549.854409 |
| 1960-12 | 308.289816 | 585.427880 |
InĀ [108]:
y_train.plot(label='train')
y_test.plot(label='test')
for column in y_pred_quantiles.columns:
alpha = column[1]
y_pred_quantiles[column].plot(label=f'{alpha:.0%} quantile forecast', c='C2', linestyle='--', alpha=0.5)
plt.legend()
plt.show()
InĀ [109]:
loss = PinballLoss(score_average=False)
loss(y_true=y_test, y_pred=y_pred_quantiles)
Out[109]:
0.1 6.492681 0.9 7.755360 Name: 0, dtype: float64