def fit_expsmooth(ts_train, ts_test, trend="additive", seasonal="multiplicative", s=None, alpha=0.94, figsize=(15, 10)): ## checks check_seasonality = "Seasonal parameters: No Seasonality" if ( seasonal is None) & (s is None) else "Seasonal parameters: " + str( seasonal) + " Seasonality every " + str(s) + " observations" print(check_seasonality) ## train #alpha = alpha if s is None else 2/(s+1) model = smt.ExponentialSmoothing( ts_train, trend=trend, seasonal=seasonal, seasonal_periods=s).fit(smoothing_level=alpha) dtf_train = ts_train.to_frame(name="ts") dtf_train["model"] = model.fittedvalues ## test dtf_test = ts_test.to_frame(name="ts") dtf_test["forecast"] = model.predict(start=len(ts_train), end=len(ts_train) + len(ts_test) - 1) ## evaluate dtf = dtf_train.append(dtf_test) dtf = utils_evaluate_forecast(dtf, figsize=figsize, title="Holt-Winters (" + str(alpha) + ")") return dtf, model
def time_series_udf(data): data.set_index('Date',inplace = True) time_series_data = data['Weekly_Sales'] ##the model model_monthly = sm.ExponentialSmoothing(np.asarray(time_series_data),trend='add').fit() ##forecast values forecast_values = pd.Series(model_monthly.forecast(13),name = 'fitted_values') #forecast_values.show() return pd.DataFrame({'Store': [str(data.Store.iloc[0])],'category': [str(data.category.iloc[0])] ,'weekly_forecast_1': [forecast_values[0]], 'weekly_forecast_2':[forecast_values[1]],'weekly_forecast_3': [forecast_values[2]],'weekly_forecast_4': [forecast_values[3]],'weekly_forecast_5': [forecast_values[4]],'weekly_forecast_6': [forecast_values[5]],'weekly_forecast_7': [forecast_values[6]],'weekly_forecast_8': [forecast_values[7]],'weekly_forecast_9': [forecast_values[8]],'weekly_forecast_10': [forecast_values[9]],'weekly_forecast_11': [forecast_values[10]],'weekly_forecast_12': [forecast_values[11]],'weekly_forecast_13': [forecast_values[12]] })
def holt_winters_time_series_udf(data): data.set_index('Date', inplace=True) time_series_data = data['Weekly_Sales'] ##the model model_monthly = sm.ExponentialSmoothing(np.asarray(time_series_data), trend='add').fit() ##forecast values forecast_values = pd.Series(model_monthly.forecast(2), name='fitted_values') return pd.DataFrame({ 'Store': [str(data.Store.iloc[0])], 'Dept': [str(data.Dept.iloc[0])], 'weekly_forecast_1': [forecast_values[0]], 'weekly_forecast_2': [forecast_values[1]] })
print("No standard input provided to Holt-Winters algorithm, exiting", file=sys.stderr) sys.exit(1) try: algorithm_input = AlgorithmInput.from_json(stdin) except JSONDecodeError as ex: print("Invalid JSON provided: {0}, exiting".format(str(ex)), file=sys.stderr) sys.exit(1) except KeyError as ex: print("Invalid JSON provided: missing {0}, exiting".format(str(ex)), file=sys.stderr) sys.exit(1) if len(algorithm_input.series) < 10 + 2 * (algorithm_input.seasonal_periods // 2): print("Invalid data provided, must be at least 10 + 2 * (seasonal_periods // 2) observations, exiting", file=sys.stderr) sys.exit(1) model = sm.ExponentialSmoothing(algorithm_input.series, trend=algorithm_input.trend, seasonal=algorithm_input.seasonal, seasonal_periods=algorithm_input.seasonal_periods, initialization_method=algorithm_input.initialization_method, damped_trend=algorithm_input.damped_trend, initial_level=algorithm_input.initial_level, initial_trend=algorithm_input.initial_trend, initial_seasonal=algorithm_input.initial_seasonal) fitted_model = model.fit(smoothing_level=algorithm_input.alpha, smoothing_trend=algorithm_input.beta, smoothing_seasonal=algorithm_input.gamma) # Predict the value one ahead print(math.ceil(fitted_model.forecast(steps=1)[0]), end="")
import statsmodels.api as sm import statsmodels.tsa.api as smt import matplotlib.pyplot as plt # dataset target = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY'] + 10 target.plot(marker='o', color='black', legend=True, figsize=(12, 5)) # Holt-Winter's TS(A,A) model = smt.ExponentialSmoothing(target, seasonal_periods=24, trend='add', seasonal='add', damped_trend=False).fit(use_boxcox=True) model.fittedvalues.plot(style='--', color='blue', label=r'$\alpha=%s$' % model.model.params['smoothing_level']) forecast = model.forecast(24).rename(r'$\alpha=%s$' % model.model.params['smoothing_level']) forecast.plot(marker='o', color='blue') plt.legend() plt.show() # [smt.ExponentialSmoothing] # trend :(str) “add”, “mul”, “additive”, “multiplicative”, None # damped_trend :(bool) # seasonal :(str) “add”, “mul”, “additive”, “multiplicative”, None # initialization_method :(str) None, ‘estimated’, ‘heuristic’, ‘legacy-heuristic’, ‘known’ # initial_level :(float)
# *************************************************************************************************************************************************************************************************************************************************************** # * Tópico - Separação Treino e Validação * # *************************************************************************************************************************************************************************************************************************************************************** # Separação em conjuntos treino e validação treino = historico.drop(historico.tail(120).index, inplace=False) validacao = historico.tail(120) # *************************************************************************************************************************************************************************************************************************************************************** # * Tópico - ETS * # *************************************************************************************************************************************************************************************************************************************************************** ets_pesos = smt.ExponentialSmoothing(endog=treino['adj close'], seasonal_periods=5, trend='mul', seasonal='add', damped=True).fit(use_brute=True) ets_previsao = pd.Series([x for x in ets_pesos.forecast(120)], index=validacao.index) # *************************************************************************************************************************************************************************************************************************************************************** # * Tópico - * # *************************************************************************************************************************************************************************************************************************************************************** arima_pesos = smt.arima.ARIMA(endog=treino['adj close'], order=(1, 1, 1)).fit() temp = arima_pesos.forecast(120) forecast_previsao = pd.Series([x for x in arima_pesos.forecast(120)], index=validacao.index) # [0]= predições