Pronóstico de series temporales con statsmodels y Prophet

Pronóstico de series temporales con statsmodels y Prophet

Nodo de origen: 1996963
Pronóstico de series temporales con statsmodels y Prophet
Imagen de jcomp on Freepik
 

La serie temporal es un conjunto de datos único dentro del campo de la ciencia de datos. Los datos se registran en tiempo-frecuencia (por ejemplo, diariamente, semanalmente, mensualmente, etc.) y cada observación está relacionada con la otra. Los datos de series temporales son valiosos cuando desea analizar lo que sucede con sus datos a lo largo del tiempo y crear predicciones futuras. 

La previsión de series temporales es un método para crear predicciones futuras basadas en datos históricos de series temporales. Hay muchos métodos estadísticos para el pronóstico de series de tiempo, tales como ARIMA or Suavizado exponencial.

La previsión de series de tiempo se encuentra a menudo en el negocio, por lo que es beneficioso para el científico de datos saber cómo desarrollar un modelo de serie de tiempo. En este artículo, aprenderemos cómo pronosticar series de tiempo utilizando dos paquetes populares de pronósticos de Python; modelos estadísticos y profeta. Entremos en ello.

El modelos estadisticos El paquete Python es un paquete de código abierto que ofrece varios modelos estadísticos, incluido el modelo de pronóstico de series temporales. Probemos el paquete con un conjunto de datos de ejemplo. Este artículo utilizará el Serie temporal de moneda digital datos de Kaggle (CC0: dominio público). 

Limpiemos los datos y echemos un vistazo al conjunto de datos que tenemos.

import pandas as pd df = pd.read_csv('dc.csv') df = df.rename(columns = {'Unnamed: 0' : 'Time'})
df['Time'] = pd.to_datetime(df['Time'])
df = df.iloc[::-1].set_index('Time') df.head()

 

Pronóstico de series temporales con statsmodels y Prophet
 

Para nuestro ejemplo, digamos que queremos pronosticar la variable 'close_USD'. Veamos cómo se comportan los datos a lo largo del tiempo.

import matplotlib.pyplot as plt plt.plot(df['close_USD'])
plt.show()

 

Pronóstico de series temporales con statsmodels y Prophet
 

Construyamos el modelo de pronóstico basado en nuestros datos anteriores. Antes de modelar, dividamos los datos en datos de entrenamiento y prueba.

# Split the data
train = df.iloc[:-200] test = df.iloc[-200:]

 

No dividimos los datos al azar porque son datos de series de tiempo y necesitamos preservar el orden. En cambio, tratamos de tener los datos del tren de antes y los datos de prueba de los datos más recientes.

Usemos statsmodels para crear un modelo de pronóstico. El modelo de estadísticas proporciona muchas API de modelos de series temporales, pero utilizaríamos el modelo ARIMA como ejemplo.

from statsmodels.tsa.arima.model import ARIMA #sample parameters
model = ARIMA(train, order=(2, 1, 0)) results = model.fit() # Make predictions for the test set
forecast = results.forecast(steps=200)
forecast

 

Pronóstico de series temporales con statsmodels y Prophet
 

En nuestro ejemplo anterior, usamos el modelo ARIMA de statsmodels como modelo de pronóstico e intentamos predecir los próximos 200 días.

¿Es bueno el resultado del modelo? Tratemos de evaluarlos. La evaluación del modelo de serie temporal suele utilizar un gráfico de visualización para comparar el valor real y la predicción con métricas de regresión como el error absoluto medio (MAE), el error cuadrático medio (RMSE) y MAPE (error porcentual absoluto medio).

from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np #mean absolute error
mae = mean_absolute_error(test, forecast) #root mean square error
mse = mean_squared_error(test, forecast)
rmse = np.sqrt(mse) #mean absolute percentage error
mape = (forecast - test).abs().div(test).mean() print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAPE: {mape:.2f}%")

 

MAE: 7956.23 RMSE: 11705.11 MAPE: 0.35%

 

La partitura de arriba se ve bien, pero veamos cómo es cuando los visualizamos.

plt.plot(train.index, train, label='Train')
plt.plot(test.index, test, label='Test')
plt.plot(forecast.index, forecast, label='Forecast')
plt.legend()
plt.show()

 

Pronóstico de series temporales con statsmodels y Prophet
 

Como podemos ver, el pronóstico fue peor ya que nuestro modelo no puede pronosticar la tendencia creciente. El modelo ARIMA que usamos parece demasiado simple para hacer pronósticos.

Tal vez sea mejor si intentamos usar otro modelo fuera de statsmodels. Probemos el famoso paquete profeta de Facebook.

Profeta es un paquete de modelos de pronóstico de series temporales que funciona mejor con datos con efectos estacionales. Prophet también se consideró un modelo de pronóstico robusto porque podía manejar los datos faltantes y los valores atípicos.

Probemos el paquete Prophet. Primero, necesitamos instalar el paquete.

pip install prophet

 

Después de eso, debemos preparar nuestro conjunto de datos para el entrenamiento del modelo de pronóstico. Prophet tiene un requisito específico: la columna de tiempo debe nombrarse como 'ds' y el valor como 'y'.

df_p = df.reset_index()[["Time", "close_USD"]].rename( columns={"Time": "ds", "close_USD": "y"}
)

 

Con nuestros datos listos, intentemos crear una predicción de pronóstico basada en los datos.

import pandas as pd
from prophet import Prophet model = Prophet() # Fit the model
model.fit(df_p) # create date to predict
future_dates = model.make_future_dataframe(periods=365) # Make predictions
predictions = model.predict(future_dates) predictions.head()

 

Pronóstico de series temporales con statsmodels y Prophet
 

Lo bueno del Profeta fue que cada punto de datos de pronóstico se detalló para que los usuarios lo entendiéramos. Sin embargo, es difícil entender el resultado solo a partir de los datos. Entonces, podríamos intentar visualizarlos usando Prophet.

model.plot(predictions)

 

Pronóstico de series temporales con statsmodels y Prophet
 

La función de gráfico de predicciones del modelo nos proporcionaría la confianza de las predicciones. Del gráfico anterior, podemos ver que la predicción tiene una tendencia ascendente pero con mayor incertidumbre cuanto más largas son las predicciones.

También es posible examinar los componentes de pronóstico con la siguiente función.

model.plot_components(predictions)

 

Pronóstico de series temporales con statsmodels y Prophet
 

Por defecto obtendríamos la tendencia de los datos con estacionalidad anual y semanal. Es una buena manera de explicar lo que sucede con nuestros datos.

¿Sería posible evaluar también el modelo Prophet? Absolutamente. Prophet incluye una medida de diagnóstico que podemos utilizar: validación cruzada de series de tiempo. El método utiliza parte de los datos históricos y ajusta el modelo cada vez utilizando datos hasta el punto de corte. Entonces el Profeta compararía las predicciones con las reales. Intentemos usar el código.

from prophet.diagnostics import cross_validation, performance_metrics # Perform cross-validation with initial 365 days for the first training data and the cut-off for every 180 days. df_cv = cross_validation(model, initial='365 days', period='180 days', horizon = '365 days') # Calculate evaluation metrics
res = performance_metrics(df_cv) res

 

Pronóstico de series temporales con statsmodels y Prophet
 

En el resultado anterior, adquirimos el resultado de la evaluación del resultado real en comparación con el pronóstico en cada día de pronóstico. También es posible visualizar el resultado con el siguiente código.

from prophet.plot import plot_cross_validation_metric
#choose between 'mse', 'rmse', 'mae', 'mape', 'coverage' plot_cross_validation_metric(df_cv, metric= 'mape')

 

Pronóstico de series temporales con statsmodels y Prophet
 

Si vemos el gráfico anterior, podemos ver que el error de predicción varió según los días, y podría alcanzar el 50 % de error en algunos puntos. De esta manera, es posible que queramos modificar aún más el modelo para corregir el error. Puedes comprobar el documentación para una mayor exploración.

El pronóstico es uno de los casos comunes que ocurren en el negocio. Una manera fácil de desarrollar un modelo de pronóstico es usar los paquetes statsforecast y Prophet Python. En este artículo, aprendemos cómo crear un modelo de pronóstico y evaluarlo con statsforecast y Prophet.
 
 
Cornelio Yudha Wijaya es subgerente de ciencia de datos y escritor de datos. Mientras trabaja a tiempo completo en Allianz Indonesia, le encanta compartir consejos sobre Python y datos a través de las redes sociales y los medios de escritura.
 

Sello de tiempo:

Mas de nuggets