Técnicas de Forecast Con Python
Técnicas de Forecast Con Python
Contacto:
Linkedin
Github
Caso:
Una tienda de productos tecnológicos necesita generar una proyección de demanda
para cada uno de sus productos con el fin de optimizar el inventario y las estrategias de
venta. Esto implica analizar datos históricos de ventas, incluyendo factores como las
tendencias de compra, estacionalidad, promociones, precios y comportamientos de los
consumidores. Utilizando estos datos, la tienda puede aplicar modelos de predicción
(como regresión, series temporales o machine learning) para prever la demanda futura
de cada producto. Con esta proyección, se pueden ajustar los niveles de inventario y
mejorar la planificación de compras y marketing.
Paquetes
In [ ]: import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from statsmodels.tsa.statespace.sarimax import SARIMAX
from prophet import Prophet
Data
In [ ]: link = "https://raw.githubusercontent.com/SergioDP94/Talleres/refs/heads/main/Fo
data = pd.read_csv(link,parse_dates=['Fecha'])
data.head()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 49164 entries, 0 to 49163
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Fecha 49164 non-null datetime64[ns]
1 Producto 49164 non-null object
2 Medio_pago 49164 non-null object
3 Sucursal 49164 non-null object
4 Factura 49164 non-null object
dtypes: datetime64[ns](1), object(4)
memory usage: 1.9+ MB
In [ ]: data.pivot_table(index='Fecha',values='Factura',aggfunc='count').plot()
In [ ]: data.pivot_table(index='Fecha',values='Factura',columns='Producto',aggfunc='coun
Out[ ]: Producto Auriculares_inalambricos Camaras_digitales Laptops Reloj_inteligente Tablet
Fecha
2024-01-
84 19 51 30 30
01
2024-01-
83 20 49 29 3
02
2024-01-
83 21 52 32 28
03
2024-01-
88 19 55 36 2
04
2024-01-
87 19 50 31 30
05
2024-05-
119 43 81 66 4
20
2024-05-
117 45 85 61 4
21
2024-05-
122 45 75 63 4
22
2024-05-
125 46 82 68 4
23
2024-05-
128 49 82 67 4
24
In [ ]: tabla = data.pivot_table(index='Fecha',columns='Producto',values='Factura',aggfu
tabla.plot(ylim=(0),figsize=(12,6))
Out[ ]: Laptops
Fecha
2024-05-20 81
2024-05-21 85
2024-05-22 75
2024-05-23 82
2024-05-24 82
dtype: int64
In [ ]: # Descomponer la serie
decomposition = seasonal_decompose(serie, model='additive', period=7)
plt.figure(figsize=(16, 8))
In [ ]: # Holt-Winters
holt_winters_model = ExponentialSmoothing(serie, trend='add', seasonal='add', se
holt_winters_fit = holt_winters_model.fit()
/usr/local/lib/python3.10/dist-packages/statsmodels/tsa/base/tsa_model.py:473: Va
lueWarning: No frequency information was provided, so inferred frequency D will b
e used.
self._init_dates(dates, freq)
In [ ]: holt_winters_fit.forecast(7).plot()
Modelo Sarimax
In [ ]: # SARIMA Model
sarima_model = SARIMAX(serie, order=(1, 1, 1), seasonal_order=(1, 1, 1, 7))
sarima_fit = sarima_model.fit()
/usr/local/lib/python3.10/dist-packages/statsmodels/tsa/base/tsa_model.py:473: Va
lueWarning: No frequency information was provided, so inferred frequency D will b
e used.
self._init_dates(dates, freq)
/usr/local/lib/python3.10/dist-packages/statsmodels/tsa/base/tsa_model.py:473: Va
lueWarning: No frequency information was provided, so inferred frequency D will b
e used.
self._init_dates(dates, freq)
Prophet
In [ ]: df = serie.reset_index()
df.columns = ['ds', 'y'] # 'ds' es la fecha y 'y' es el valor
df.head()
Out[ ]: ds y
0 2024-01-01 51
1 2024-01-02 49
2 2024-01-03 52
3 2024-01-04 55
4 2024-01-05 50
In [ ]: # Realizar la predicción
forecast = prophet_model.predict(future)
prophet_model.plot(forecast)
plt.legend()
plt.title('Proyección de Vuelos (Prophet)')
plt.show()
In [ ]: prohet_forecast = pd.Series(forecast.yhat[-n_step:].to_list(),index=sarima_forec
plt.legend()
plt.title('Proyección de Ventas (Holt-Winters vs SARIMA vs Prohet)')
plt.show()
Automatizacion
In [ ]: def get_forecast(serie,n_step,type='hw'):
if type == 'hw':
holt_winters_model = ExponentialSmoothing(serie, trend='add', seasonal='add'
holt_winters_fit = holt_winters_model.fit()
holt_winters_forecast = holt_winters_fit.forecast(steps=n_step)
return holt_winters_forecast
elif type == 'sarima':
sarima_model = SARIMAX(serie, order=(1, 1, 1), seasonal_order=(1, 1, 1, 7))
sarima_fit = sarima_model.fit()
sarima_forecast = sarima_fit.forecast(steps=n_step)
return sarima_forecast
elif type == 'prophet':
df = serie.reset_index()
df.columns = ['ds', 'y']
prophet_model = Prophet(
daily_seasonality=False,
seasonality_mode='multiplicative',
yearly_seasonality=False,
weekly_seasonality=True)
prophet_model.fit(df)
future = prophet_model.make_future_dataframe(periods=n_step, freq='D')
forecast = prophet_model.predict(future)
index = pd.date_range(serie.index[-1], periods=(n_step + 1), freq='D')[1:]
prohet_forecast = pd.Series(forecast.yhat[-n_step:].to_list(),index=index)
return prohet_forecast
In [ ]: get_forecast(serie,n_step,type='hw').plot()
/usr/local/lib/python3.10/dist-packages/statsmodels/tsa/base/tsa_model.py:473: Va
lueWarning: No frequency information was provided, so inferred frequency D will b
e used.
self._init_dates(dates, freq)
Out[ ]: <Axes: >
In [ ]: get_forecast(serie,n_step,type='sarima').plot()
/usr/local/lib/python3.10/dist-packages/statsmodels/tsa/base/tsa_model.py:473: Va
lueWarning: No frequency information was provided, so inferred frequency D will b
e used.
self._init_dates(dates, freq)
/usr/local/lib/python3.10/dist-packages/statsmodels/tsa/base/tsa_model.py:473: Va
lueWarning: No frequency information was provided, so inferred frequency D will b
e used.
self._init_dates(dates, freq)
Out[ ]: <Axes: >
In [ ]: get_forecast(serie,n_step,type='prophet').plot()