Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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]]
    })
Ejemplo n.º 4
0
    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="")
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0

# ***************************************************************************************************************************************************************************************************************************************************************
# *                              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