<jupyter_start><jupyter_text>Prophet - predição de vendas no varejo.   Facebook PROPHET A ferramenta visa contribuir para problemas de geração de previsões e cenários futuros para séries temporais. Veja as características do Prophet (em que ele brilha, segundo o site):* Observações horárias, diárias ou semanais com pelo menos alguns meses (preferivelmente um ano) de histórico.* Feriados importantes que ocorrem em intervalos irregulares que são conhecidos antecipadamente (por exemplo, o Super Bowl).* Um número razoável de observações ausentes ou grandes outliers,* mudanças históricas de tendência, por exemplo, devido a lançamentos de produtos ou alterações no registro.* Tendências que são curvas de crescimento não lineares, em que uma tendência atinge um limite natural ou satura.A ideia de oferecer uma ferramenta para forecast com menor esforço está tornando o Prophet largamente investigado. Nesse projeto vamos testa a eficácia dele, usaremos um dataset simples para tal:<jupyter_code>import pandas as pd
import numpy as np
from fbprophet import Prophet
import matplotlib.pyplot as plt
pd.plotting.register_matplotlib_converters()
 
%matplotlib inline
 
plt.rcParams['figure.figsize']=(20,10)
plt.style.use('ggplot')
%time sales_df = pd.read_csv('C:/Users/skite/OneDrive/Documentos/GitHub/Projeto_TimeSires_Phophet/example_retail_sales.csv', sep = ',', encoding  = 'ISO-8859-1',  index_col='Date', parse_dates=True)
sales_df.head()
sales_df.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 293 entries, 1992-01-01 to 2016-05-01
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   Sales   293 non-null    int64
dtypes: int64(1)
memory usage: 4.6 KB<jupyter_text>**Esse dataset e bem pequeno e foi ajustado propositalmente testas modelos preditores que usem séries temporais.**  Preparação dos dados para o Prophet<jupyter_code>df = sales_df.reset_index()
df.head()<jupyter_output><empty_output><jupyter_text>*Vamos renomear as colunas.* *O Prophet exige que os dados estajão organizados como 'ds' (datas) e 'y' (valor).*<jupyter_code>df=df.rename(columns={'Date':'ds', 'Sales':'y'})
df.head()<jupyter_output><empty_output><jupyter_text>*Plot dos dados*<jupyter_code>df.set_index('ds').y.plot()<jupyter_output><empty_output><jupyter_text>*Transformação dos dados aplicando a função log do numpy*<jupyter_code>df['y'] = np.log(df['y'])
df.tail()
df.set_index('ds').y.plot()<jupyter_output><empty_output><jupyter_text>Execução do Prophet *A ferramenta automaticamente seleciona uma sazonalidade adequada*<jupyter_code>model = Prophet()
model.fit(df);<jupyter_output>INFO:numexpr.utils:NumExpr defaulting to 4 threads.
INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.<jupyter_text>*Montagem do dataframe que irá receber os dados das predições.*<jupyter_code>future = model.make_future_dataframe(periods=24, freq = 'm')
future.head()
future.tail()<jupyter_output><empty_output><jupyter_text>*Execução da predição do modelo instanciado.*<jupyter_code>forecast = model.predict(future)<jupyter_output><empty_output><jupyter_text>*Resultado da execução:*<jupyter_code>forecast.tail()<jupyter_output><empty_output><jupyter_text>*Seleção dos dados específicos das predições da série temporal:*<jupyter_code>forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head()
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()<jupyter_output><empty_output><jupyter_text>Plot dos resultados *Prophet tem uma função embarcada que já faz o desenho do gráfico - plot.*<jupyter_code>model.plot(forecast);<jupyter_output><empty_output><jupyter_text>*Sazonalidade do dados.*  Montando a visualização no formato original dos dados *Equalização dos índices para```ds```*<jupyter_code>df.set_index('ds', inplace=True)
forecast.set_index('ds', inplace=True)<jupyter_output><empty_output><jupyter_text>*Junção dos dados originais e do forecast*<jupyter_code>viz_df = sales_df.join(forecast[['yhat', 'yhat_lower','yhat_upper']], how = 'outer')<jupyter_output><empty_output><jupyter_text>*Observação: os dados da predição ainda estão em valores relativos à transformação logarítimica que realizamos.*<jupyter_code>viz_df.head()<jupyter_output><empty_output><jupyter_text>*retornando os dados de log para a escala original*<jupyter_code>viz_df['yhat_rescaled'] = np.exp(viz_df['yhat'])
viz_df.head()<jupyter_output><empty_output><jupyter_text>*Visualização dos dados das vendas e do yhat restaurado ao valor original*<jupyter_code>viz_df[['Sales', 'yhat_rescaled']].plot()<jupyter_output><empty_output><jupyter_text>*Vamos utilizar a data como índice:*<jupyter_code>sales_df.index = pd.to_datetime(sales_df.index)<jupyter_output><empty_output><jupyter_text>*Seleciona a penúltima data:*<jupyter_code>connect_date = sales_df.index[-2]<jupyter_output><empty_output><jupyter_text>*Critério com os índices maiores que a penúltima:*<jupyter_code>mask = (forecast.index > connect_date)<jupyter_output><empty_output><jupyter_text>*Seleção dos dados:*<jupyter_code>predict_df = forecast.loc[mask]<jupyter_output><empty_output><jupyter_text>*O predict_df terá somente os valores abaixo que forem True:*<jupyter_code>mask
predict_df<jupyter_output><empty_output><jupyter_text>*Construção do DataFrame para a visualização.*<jupyter_code>viz_df = sales_df.join(predict_df[['yhat', 'yhat_lower','yhat_upper']], how = 'outer')
viz_df<jupyter_output><empty_output><jupyter_text>*Adição da coluna com o yhat original:*<jupyter_code>viz_df['yhat_scaled']=np.exp(viz_df['yhat'])<jupyter_output><empty_output><jupyter_text>Visualizaçao Final<jupyter_code>fig, ax1 = plt.subplots()
ax1.plot(viz_df.Sales)
ax1.plot(viz_df.yhat_scaled, color='black', linestyle=':')
ax1.fill_between(viz_df.index, np.exp(viz_df['yhat_upper']), np.exp(viz_df['yhat_lower']), alpha=0.5, color='darkgray')
ax1.set_title('Vendas (Laranja) vs Previsão de vendas (Preto)')
ax1.set_ylabel('Vendas em Dólares')
ax1.set_xlabel('Data')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12100977198697069, 'fraction_numerical': 0.008631921824104235, 'mean_word_length': 8.34703196347032, 'pattern_counts': {'":': 0, '<': 96, '<?xml version=': 0, '>': 97, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '24', 'dir': 'jupyter-structured-clean-dedup', 'id': '144363', 'license': 'Apache-2.0', 'n_tokens_mistral': 2358, 'n_tokens_neox': 2279, 'n_words': 471, 'path': 'projeto-prophet_prevendo_vendas_no_varejo.ipynb', 'repo_name': 'wagner-skiter/Projeto-Prophet_prevendo_vendas_no_varejo', 'size': '6140'}