The content discusses the use of a partial Fourier sum algorithm to estimate periodic effects in time series data. It explains that the algorithm automatically fits yearly, weekly, and daily seasonality based on the length of the time series. The number of Fourier terms determines how quickly the seasonality can change, with default values of 10 for yearly seasonality and 3 for weekly seasonality. The content also mentions that users can add other seasonalities, such as monthly or quarterly, using a parameter called SEASONALITY. This parameter accepts a string in JSON format that specifies the name, period, Fourier order, and optional elements for the seasonality.
------

SET SCHEMA DM_PAL;

DROP TABLE PAL_ADDITIVE_MODEL_ANALYSIS_DATA_TBL;
CREATE COLUMN TABLE PAL_ADDITIVE_MODEL_ANALYSIS_DATA_TBL("ts" DATE, "y" double);
INSERT INTO PAL_ADDITIVE_MODEL_ANALYSIS_DATA_TBL VALUES('2007-12-10',9.590761139);
INSERT INTO PAL_ADDITIVE_MODEL_ANALYSIS_DATA_TBL VALUES('2007-12-11',8.519590316);
INSERT INTO PAL_ADDITIVE_MODEL_ANALYSIS_DATA_TBL VALUES('2007-12-12',8.183676583);
INSERT INTO PAL_ADDITIVE_MODEL_ANALYSIS_DATA_TBL VALUES('2007-12-13',8.072467369);
INSERT INTO PAL_ADDITIVE_MODEL_ANALYSIS_DATA_TBL VALUES('2007-12-14',7.893572074);
INSERT INTO PAL_ADDITIVE_MODEL_ANALYSIS_DATA_TBL VALUES('2007-12-15',7.783640596);

DROP TABLE PAL_ADDITIVE_MODEL_ANALYSIS_HOLIDAY;
CREATE COLUMN TABLE PAL_ADDITIVE_MODEL_ANALYSIS_HOLIDAY ("ts" timestamp, "holiday" NVARCHAR(50));

DROP TABLE PAL_ADDITIVE_MODEL_ANALYSIS_PARAMETER_TBL;
CREATE COLUMN TABLE PAL_ADDITIVE_MODEL_ANALYSIS_PARAMETER_TBL ("NAME" VARCHAR (50), "INT_VALUE" INTEGER, "DOUBLE_VALUE" DOUBLE, "STRING_VALUE" VARCHAR (100));
INSERT INTO PAL_ADDITIVE_MODEL_ANALYSIS_PARAMETER_TBL VALUES ('GROWTH', NULL, NULL, 'linear');
INSERT INTO PAL_ADDITIVE_MODEL_ANALYSIS_PARAMETER_TBL VALUES ('WEEKLY_SEASONALITY', 0, NULL, NULL);
INSERT INTO PAL_ADDITIVE_MODEL_ANALYSIS_PARAMETER_TBL VALUES ('SEASONALITY', NULL, NULL, '{ "NAME": "MONTHLY", "PERIOD":30, "FOURIER_ORDER":5 }');

DROP TABLE PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL;
CREATE COLUMN TABLE PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL("ts" DATE, "y" DOUBLE);
INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL VALUES('2008-03-09', 0);
INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL VALUES('2008-03-10', 0);
INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL VALUES('2008-03-11', 0);
INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL VALUES('2008-03-12', 0);
INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL VALUES('2008-03-13', 0);
INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL VALUES('2008-03-14', 0);
INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL VALUES('2008-03-15', 0);

DROP TABLE PAL_ADDITIVE_MODEL_PREDICT_PARAMETER_TBL;
CREATE COLUMN TABLE PAL_ADDITIVE_MODEL_PREDICT_PARAMETER_TBL("NAME" VARCHAR (50), "INT_VALUE" INTEGER, "DOUBLE_VALUE" DOUBLE, "STRING_VALUE" VARCHAR (100));
INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_PARAMETER_TBL VALUES ('EXPLAIN_SEASONALITY', 1, NULL, NULL);
INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_PARAMETER_TBL VALUES ('EXPLAIN_HOLIDAY', 1, NULL, NULL);

DROP TABLE PAL_ADDITIVE_MODEL_PREDICT_DECOMP;
CREATE COLUMN TABLE PAL_ADDITIVE_MODEL_PREDICT_DECOMP ("ts" DATE, "trend" DOUBLE, "seasonal" NCLOB, "holiday" NCLOB, "exogenous" NCLOB);

DO BEGIN
  lt_data = SELECT * FROM PAL_ADDITIVE_MODEL_ANALYSIS_DATA_TBL;
  lt_holiday = SELECT * FROM PAL_ADDITIVE_MODEL_ANALYSIS_HOLIDAY;
  lt_param = SELECT * FROM PAL_ADDITIVE_MODEL_ANALYSIS_PARAMETER_TBL;
  CALL _SYS_AFL.PAL_ADDITIVE_MODEL_ANALYSIS (:lt_data, :lt_holiday, :lt_param, lt_model);
  lt_pdata = SELECT * FROM PAL_ADDITIVE_MODEL_PREDICT_DATA_TBL;
  lt_pparam = SELECT * FROM PAL_ADDITIVE_MODEL_PREDICT_PARAMETER_TBL;
  CALL _SYS_AFL.PAL_ADDITIVE_MODEL_EXPLAIN(:lt_pdata, :lt_model, :lt_pparam, lt_result, lt_decomp);
  INSERT INTO PAL_ADDITIVE_MODEL_PREDICT_DECOMP SELECT * FROM :lt_decomp;
END;

SELECT * FROM PAL_ADDITIVE_MODEL_PREDICT_DECOMP;
