diff --git a/.github/workflows/test-code.yml b/.github/workflows/test-code.yml index f049178..bb23f1c 100644 --- a/.github/workflows/test-code.yml +++ b/.github/workflows/test-code.yml @@ -9,21 +9,29 @@ on: branches: - main - dev + workflow_dispatch: jobs: test: - runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.9' + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + - name: Install dependencies run: | python -m pip install --upgrade pip @@ -32,10 +40,16 @@ jobs: - name: Run tests run: | - pytest ./tests + pytest --cov=iowa_forecast --cov-report=xml --cov-report=html tests/ - name: Upload coverage report - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: coverage-report path: ./htmlcov/ + + - name: Upload coverage report XML + uses: actions/upload-artifact@v4 + with: + name: coverage-report-xml + path: coverage.xml diff --git a/.gitignore b/.gitignore index fb10d73..c4fa90d 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,4 @@ cython_debug/ #.idea/ *.json /.idea +*.lock diff --git a/Dockerfile b/Dockerfile index 63239ea..ce7cee6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,7 @@ EXPOSE 8080 # Define environment variables # Project ID where the tables and models will be saved to inside BigQuery -ENV PROJECT_ID "iowa-liquor-sales-forecast-v2" +ENV PROJECT_ID "iowa-liquor-sales-forecast-v4" # Dataset name where the tables and models will be stored to ENV DATASET_NAME "bqmlforecast" @@ -35,4 +35,4 @@ ENV GOOGLE_APPLICATION_CREDENTIALS="/gcloud/application_default_credentials.json # Run app.py when the container launches -ENTRYPOINT ["python", "pipelines/execute_load_data.py"] +ENTRYPOINT ["python", "pipelines/train_model_and_forecast_sales.py"] diff --git a/docs/api_reference/index.rst b/docs/api_reference/index.rst index 6cca042..ee4296a 100644 --- a/docs/api_reference/index.rst +++ b/docs/api_reference/index.rst @@ -1,5 +1,5 @@ API Reference -============== +============= This page gives an overview of all public pandas objects, functions and methods. All functions exposed in `iowa_forecast.*` namespace are public. @@ -12,14 +12,17 @@ The `iowa_forecast` package contains the following modules: * `iowa_forecast.ml_train`: BigQuery Model Training and Execution Module. +* `iowa_forecast.models_configs`: Classes for managing and validating + configuration parameters + * `iowa_forecast.plots`: Time Series Plotting and Date Handling Module. * `iowa_forecast.utils`: General utility functions Module. iowa\_forecast -------------- +-------------- .. toctree:: :maxdepth: 2 - iowa_forecast/index \ No newline at end of file + iowa_forecast/index diff --git a/docs/api_reference/iowa_forecast/index.rst b/docs/api_reference/iowa_forecast/index.rst index f2f95cc..ac3eae2 100644 --- a/docs/api_reference/iowa_forecast/index.rst +++ b/docs/api_reference/iowa_forecast/index.rst @@ -8,5 +8,6 @@ iowa\_forecast load_data ml_eval ml_train + models_configs plots utils diff --git a/docs/api_reference/iowa_forecast/models_configs.rst b/docs/api_reference/iowa_forecast/models_configs.rst new file mode 100644 index 0000000..872049d --- /dev/null +++ b/docs/api_reference/iowa_forecast/models_configs.rst @@ -0,0 +1,7 @@ +models\_configs +--------------- + +.. automodule:: iowa_forecast.models_configs + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/docs/doctrees/api_reference/index.doctree b/docs/docs/doctrees/api_reference/index.doctree index 93e3c80..cf9979c 100644 Binary files a/docs/docs/doctrees/api_reference/index.doctree and b/docs/docs/doctrees/api_reference/index.doctree differ diff --git a/docs/docs/doctrees/api_reference/iowa_forecast/index.doctree b/docs/docs/doctrees/api_reference/iowa_forecast/index.doctree index 9efd4ef..e59b791 100644 Binary files a/docs/docs/doctrees/api_reference/iowa_forecast/index.doctree and b/docs/docs/doctrees/api_reference/iowa_forecast/index.doctree differ diff --git a/docs/docs/doctrees/api_reference/iowa_forecast/models_configs.doctree b/docs/docs/doctrees/api_reference/iowa_forecast/models_configs.doctree new file mode 100644 index 0000000..adb93a2 Binary files /dev/null and b/docs/docs/doctrees/api_reference/iowa_forecast/models_configs.doctree differ diff --git a/docs/docs/doctrees/environment.pickle b/docs/docs/doctrees/environment.pickle index 4cff561..c2d61da 100644 Binary files a/docs/docs/doctrees/environment.pickle and b/docs/docs/doctrees/environment.pickle differ diff --git a/docs/docs/doctrees/installation.doctree b/docs/docs/doctrees/installation.doctree index d7056a6..32e5b21 100644 Binary files a/docs/docs/doctrees/installation.doctree and b/docs/docs/doctrees/installation.doctree differ diff --git a/docs/docs/html/_modules/index.html b/docs/docs/html/_modules/index.html index 287f4a8..647a89b 100644 --- a/docs/docs/html/_modules/index.html +++ b/docs/docs/html/_modules/index.html @@ -208,6 +208,7 @@
+"""
+This module provides classes for managing and validating configuration parameters
+for various machine learning models, specifically focusing on ARIMA-based models.
+The module includes a base class that standardizes the process of handling model
+configuration, ensuring that all derived classes follow a consistent pattern for
+validating and setting parameters.
+
+Classes
+-------
+AbstractBaseModelConfig : ABC
+ An abstract base class for the `BaseModelConfig` class.
+
+BaseModelConfig : AbstractBaseModelConfig
+ A base class that provides common functionality for model
+ configuration, including parameter validation, default value handling, and
+ error checking. Subclasses are required to define a `SUPPORTED_PARAMETERS`
+ dictionary that specifies the expected parameter types, default values,
+ and any valid choices.
+
+ARIMAConfig : BaseModelConfig
+ A configuration class for ARIMA model parameters. Inherits from `BaseModelConfig`
+ and defines specific parameters used by ARIMA and ARIMA_PLUS models. This class
+ ensures that the parameters adhere to the expected types and valid choices.
+
+ARIMA_PLUS_XREG_Config : BaseModelConfig
+ A configuration class for ARIMA_PLUS_XREG model parameters. This class extends
+ `BaseModelConfig` and includes additional parameters for handling exogenous
+ variables (`xreg_features`) and other settings specific to the `ARIMA_PLUS_XREG` model.
+
+Usage
+-----
+These configuration classes are intended to be used in the setup and validation of
+model parameters before they are passed to machine learning model training functions.
+By leveraging these classes, developers can ensure that all configuration parameters
+are correctly typed, fall within valid ranges, and adhere to expected choices, reducing
+the likelihood of runtime errors.
+
+Example
+-------
+>>> config = ARIMAConfig(model_type="ARIMA")
+>>> print(config.model_type)
+'ARIMA'
+
+>>> xreg_config = ARIMA_PLUS_XREG_Config(
+... model_type="ARIMA_PLUS_XREG",
+... xreg_features=["feature1", "feature2"],
+... non_negative_forecast=True
+... )
+>>> print(xreg_config.xreg_features)
+['feature1', 'feature2']
+"""
+from abc import ABC, abstractmethod
+from typing import Any, Dict, Tuple, List
+
+
+[docs]class AbstractBaseModelConfig(ABC): # pylint: disable=too-few-public-methods
+ """Abstract base class for `BaseModelConfig` configuration class."""
+
+ @property
+ @abstractmethod
+ def SUPPORTED_PARAMETERS(self) -> Dict[ # pylint: disable=invalid-name
+ str, Tuple[Any, Any, List[Any]]
+ ]:
+ """
+ This abstract property must be implemented by subclasses.
+ It should return a dictionary where the keys are parameter names,
+ and the values are tuples containing the expected type, default value,
+ and a list of valid choices (if any).
+ """
+
+
+[docs]class BaseModelConfig(AbstractBaseModelConfig):
+ """
+ Base class for model configuration parameters.
+
+ This class provides common functionality for handling configuration parameters
+ passed via kwargs, including unpacking, validation, and setting default values.
+
+ Subclasses must define the `SUPPORTED_PARAMETERS` dictionary, which specifies
+ the expected parameter types, default values, and any restricted choices.
+ """
+
+ @property
+ def SUPPORTED_PARAMETERS(self) -> Dict[str, Tuple[Any, Any, List[Any]]]:
+ return {}
+
+ def __init__(self, **kwargs):
+ self._params = {}
+ self._validate_and_set_parameters(kwargs)
+
+ def _validate_and_set_parameters(self, kwargs: Dict[str, Any]):
+ for key, (expected_type, default_value, choices) in self.SUPPORTED_PARAMETERS.items():
+ if key in kwargs:
+ value = kwargs[key]
+ if not isinstance(value, expected_type):
+ raise ValueError(
+ f"Invalid value for parameter '{key}': expected {expected_type.__name__}, "
+ f"but got {type(value).__name__}."
+ )
+ if choices and value not in choices:
+ raise ValueError(
+ f"Invalid value for parameter '{key}': got '{value}', "
+ f"but expected one of {choices}."
+ )
+ self._params[key] = value
+ else:
+ self._params[key] = default_value
+
+ # Identify unsupported parameters
+ unsupported_params = set(kwargs) - set(self.SUPPORTED_PARAMETERS)
+ if unsupported_params:
+ raise ValueError(
+ f"Unsupported parameters provided: {', '.join(unsupported_params)}. "
+ "Please check your input."
+ )
+
+ def __getattr__(self, name: str) -> Any:
+ if name in self._params:
+ return self._params[name]
+ raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
+
+
+[docs]class ARIMAConfig(BaseModelConfig): # pylint: disable=too-few-public-methods
+ """
+ Configuration class for `'ARIMA'` model parameters.
+
+ Inherits common functionality from `BaseModelConfig` and defines specific
+ parameters for `'ARIMA'` models, including validation of choices for some
+ parameters.
+ """
+
+ @property
+ def SUPPORTED_PARAMETERS(self) -> Dict[str, Tuple[Any, Any, List[Any]]]:
+ return {
+ "model_type": (str, "ARIMA_PLUS", ["ARIMA_PLUS", "ARIMA"]),
+ "auto_arima": (bool, True, []),
+ "forecast_limit_lower_bound": (int, 0, []),
+ "clean_spikes_and_dips": (bool, True, []),
+ "decompose_time_series": (bool, True, []),
+ "holiday_region": (str, "US", []),
+ "data_frequency": (str, "AUTO_FREQUENCY",
+ ["AUTO_FREQUENCY", "DAILY", "WEEKLY", "MONTHLY"]),
+ "adjust_step_changes": (bool, True, []),
+ }
+
+
+[docs]class ARIMA_PLUS_XREG_Config(BaseModelConfig): # pylint: disable=invalid-name, too-few-public-methods
+ """
+ Configuration class for `'ARIMA_PLUS_XREG'` model parameters.
+
+ Inherits common functionality from `BaseModelConfig` and defines specific
+ parameters for `'ARIMA_PLUS_XREG'` models, including validation of choices for
+ some parameters.
+ """
+
+ @property
+ def SUPPORTED_PARAMETERS(self) -> Dict[str, Tuple[Any, Any, List[Any]]]:
+ return {
+ "model_type": (str, "ARIMA_PLUS_XREG", ["ARIMA_PLUS_XREG"]),
+ "auto_arima": (bool, True, []),
+ "clean_spikes_and_dips": (bool, True, []),
+ "holiday_region": (str, "US", []),
+ "data_frequency": (str, "AUTO_FREQUENCY",
+ ["AUTO_FREQUENCY", "DAILY", "WEEKLY", "MONTHLY"]),
+ "adjust_step_changes": (bool, True, []),
+ "non_negative_forecast": (bool, False, []),
+ }
+
iowa_forecast.ml_eval
: BigQuery Model Evaluation and Forecasting Module.
iowa_forecast.ml_train
: BigQuery Model Training and Execution Module.
iowa_forecast.models_configs
: Classes for managing and validating
+configuration parameters
iowa_forecast.plots
: Time Series Plotting and Date Handling Module.
iowa_forecast.utils
: General utility functions Module.
This module provides classes for managing and validating configuration parameters +for various machine learning models, specifically focusing on ARIMA-based models. +The module includes a base class that standardizes the process of handling model +configuration, ensuring that all derived classes follow a consistent pattern for +validating and setting parameters.
+An abstract base class for the BaseModelConfig
class.
A base class that provides common functionality for model
+configuration, including parameter validation, default value handling, and
+error checking. Subclasses are required to define a SUPPORTED_PARAMETERS
+dictionary that specifies the expected parameter types, default values,
+and any valid choices.
A configuration class for ARIMA model parameters. Inherits from BaseModelConfig
+and defines specific parameters used by ARIMA and ARIMA_PLUS models. This class
+ensures that the parameters adhere to the expected types and valid choices.
A configuration class for ARIMA_PLUS_XREG model parameters. This class extends
+BaseModelConfig
and includes additional parameters for handling exogenous
+variables (xreg_features
) and other settings specific to the ARIMA_PLUS_XREG
model.
These configuration classes are intended to be used in the setup and validation of +model parameters before they are passed to machine learning model training functions. +By leveraging these classes, developers can ensure that all configuration parameters +are correctly typed, fall within valid ranges, and adhere to expected choices, reducing +the likelihood of runtime errors.
+Example
+>>> config = ARIMAConfig(model_type="ARIMA")
+>>> print(config.model_type)
+'ARIMA'
+
>>> xreg_config = ARIMA_PLUS_XREG_Config(
+... model_type="ARIMA_PLUS_XREG",
+... xreg_features=["feature1", "feature2"],
+... non_negative_forecast=True
+... )
+>>> print(xreg_config.xreg_features)
+['feature1', 'feature2']
+
Bases: ABC
Abstract base class for BaseModelConfig
configuration class.
SUPPORTED_PARAMETERS
This abstract property must be implemented by subclasses.
+This abstract property must be implemented by subclasses. +It should return a dictionary where the keys are parameter names, +and the values are tuples containing the expected type, default value, +and a list of valid choices (if any).
+Bases: AbstractBaseModelConfig
Base class for model configuration parameters.
+This class provides common functionality for handling configuration parameters +passed via kwargs, including unpacking, validation, and setting default values.
+Subclasses must define the SUPPORTED_PARAMETERS
dictionary, which specifies
+the expected parameter types, default values, and any restricted choices.
SUPPORTED_PARAMETERS
This abstract property must be implemented by subclasses.
+This abstract property must be implemented by subclasses. +It should return a dictionary where the keys are parameter names, +and the values are tuples containing the expected type, default value, +and a list of valid choices (if any).
+Bases: BaseModelConfig
Configuration class for 'ARIMA'
model parameters.
Inherits common functionality from BaseModelConfig
and defines specific
+parameters for 'ARIMA'
models, including validation of choices for some
+parameters.
SUPPORTED_PARAMETERS
This abstract property must be implemented by subclasses.
+This abstract property must be implemented by subclasses. +It should return a dictionary where the keys are parameter names, +and the values are tuples containing the expected type, default value, +and a list of valid choices (if any).
+Bases: BaseModelConfig
Configuration class for 'ARIMA_PLUS_XREG'
model parameters.
Inherits common functionality from BaseModelConfig
and defines specific
+parameters for 'ARIMA_PLUS_XREG'
models, including validation of choices for
+some parameters.
SUPPORTED_PARAMETERS
This abstract property must be implemented by subclasses.
+This abstract property must be implemented by subclasses. +It should return a dictionary where the keys are parameter names, +and the values are tuples containing the expected type, default value, +and a list of valid choices (if any).
++ | + |
+ |
@@ -403,7 +430,7 @@ |
Before you begin, ensure you have the following installed:
[Python 3.9](https://www.python.org/downloads/release/python-390/) or higher
[Google Cloud SDK (gcloud)](https://cloud.google.com/sdk/docs/install) installed and configured
[Docker](https://www.docker.com/) (for containerized environments)
[Git](https://git-scm.com/) (for cloning the repository)
Python 3.9 or higher
Google Cloud SDK (gcloud) installed and configured
Docker (for containerized environments)
Git (for cloning the repository)
Go to the [Google Cloud Console](https://console.cloud.google.com/).
Go to the Google Cloud Console.
Create a new project or select an existing one.
Navigate to [BigQuery API](https://console.cloud.google.com/bigquery) and enable it for your project.
Navigate to BigQuery API and enable it for your project.
Navigate to [IAM Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts) +
Navigate to IAM Service Accounts and create a service account in your project.
In the projects service accounts page, click on the service account you’ve created and then navigate to the “Keys” tab.
`bash
-export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-file.json"
-`
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-file.json"
+
Build the Docker Image:
In the root directory of the project, run:
-+
`bash -docker build -t iowa-liquor-sales-forecast . -`
+docker build -t iowa-liquor-sales-forecast . +
Run the Docker Container:
@@ -357,19 +358,19 @@Start the container with:
-+
`bash -docker run -it --rm -e GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-file.json" \ --v $(pwd):/app iowa-liquor-sales-forecast -`
+docker run -it --rm -e GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-file.json" \ +-v $(pwd):/app iowa-liquor-sales-forecast +Replace
/path/to/your/service-account-file.json
with the actual path to your credentials file. The-v $(pwd):/app
option mounts the current directory inside the container.
git clone https://github.com/erik-ingwersen-ey/iowa-liquor-sales-forecast.git
+cd iowa-liquor-sales-forecast
+
Run the Pipeline Script:
Execute the
-train_model_and_forecast_sales.py
script to train the models and start generating forecasts:+
`bash -python pipelines/train_model_and_forecast_sales.py -`
+python pipelines/train_model_and_forecast_sales.py +
Attention
Make sure your environment variables are set correctly before running the script.
@@ -404,7 +405,7 @@Troubleshootingdocumentation. diff --git a/docs/docs/html/objects.inv b/docs/docs/html/objects.inv index 32296f2..419434d 100644 Binary files a/docs/docs/html/objects.inv and b/docs/docs/html/objects.inv differ diff --git a/docs/docs/html/py-modindex.html b/docs/docs/html/py-modindex.html index b222ee2..412dcbc 100644 --- a/docs/docs/html/py-modindex.html +++ b/docs/docs/html/py-modindex.html @@ -207,6 +207,7 @@
load_data ml_eval ml_train +models_configs plots utils @@ -262,37 +263,13 @@Python Module Index
- iowa_forecast
+ iowa_forecast
- - iowa_forecast.load_data
- -- -- - iowa_forecast.ml_eval
- -- -- - iowa_forecast.ml_train
- -- -- - iowa_forecast.plots
- -- diff --git a/docs/docs/html/search.html b/docs/docs/html/search.html index 565af1c..7b7f7a9 100644 --- a/docs/docs/html/search.html +++ b/docs/docs/html/search.html @@ -209,6 +209,7 @@- - iowa_forecast.utils
+ iowa_forecast.models_configs
load_data ml_eval ml_train +models_configs plots utils diff --git a/docs/docs/html/searchindex.js b/docs/docs/html/searchindex.js index 8e7a658..d3adb1c 100644 --- a/docs/docs/html/searchindex.js +++ b/docs/docs/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["api_reference/index", "api_reference/iowa_forecast/index", "api_reference/iowa_forecast/load_data", "api_reference/iowa_forecast/ml_eval", "api_reference/iowa_forecast/ml_train", "api_reference/iowa_forecast/plots", "api_reference/iowa_forecast/utils", "docs/html/_static/scripts/furo.js.LICENSE", "index", "installation", "iowa_forecast", "modules"], "filenames": ["api_reference/index.rst", "api_reference/iowa_forecast/index.rst", "api_reference/iowa_forecast/load_data.rst", "api_reference/iowa_forecast/ml_eval.rst", "api_reference/iowa_forecast/ml_train.rst", "api_reference/iowa_forecast/plots.rst", "api_reference/iowa_forecast/utils.rst", "docs/html/_static/scripts/furo.js.LICENSE.txt", "index.rst", "installation.rst", "iowa_forecast.rst", "modules.rst"], "titles": ["API Reference", "iowa_forecast", "load_data", "ml_eval", "ml_train", "plots", "utils", "<no title>", "Iowa Liquor Sales Forecast", "Installation", "API reference", "iowa_forecast"], "terms": {"thi": [0, 2, 3, 4, 5, 6, 9, 10], "page": [0, 8, 9, 10], "give": [0, 10], "an": [0, 2, 3, 4, 9, 10], "overview": [0, 10], "all": [0, 4, 5, 6, 9, 10], "public": [0, 2, 10], "panda": [0, 2, 3, 5, 6, 10], "object": [0, 2, 10], "function": [0, 5, 6, 11], "method": [0, 10], "expos": [0, 10], "namespac": [0, 10], "ar": [0, 2, 3, 4, 6, 9, 10], "The": [0, 2, 3, 4, 5, 6, 9, 10], "packag": [0, 9, 10], "contain": [0, 2, 3, 4, 5, 6, 9, 10], "follow": [0, 2, 3, 9, 10], "modul": [0, 2, 3, 4, 6, 11], "load_data": [0, 1, 11], "bigqueri": [0, 2, 3, 4, 6, 9, 10], "data": [0, 2, 3, 4, 5, 9, 10], "load": [0, 2, 6, 10], "featur": [0, 2, 4, 10], "engin": [0, 2, 5, 10], "ml_eval": [0, 1, 11], "model": [0, 2, 3, 4, 6, 9, 10], "evalu": [0, 3, 4, 10], "forecast": [0, 2, 3, 4, 5, 9, 10], "ml_train": [0, 1, 11], "train": [0, 2, 3, 4, 9, 10], "execut": [0, 3, 4, 9, 10], "plot": [0, 1, 11], "time": [0, 2, 3, 4, 5, 10], "seri": [0, 2, 3, 4, 5, 10], "date": [0, 2, 3, 4, 5, 10], "handl": [0, 2, 4, 10], "util": [0, 1, 2, 3, 9, 11], "gener": [0, 2, 3, 4, 5, 6, 9, 10], "provid": [2, 3, 4, 5, 6, 9, 10], "process": [2, 4, 10], "prepar": [2, 10], "us": [2, 3, 4, 5, 6, 9, 10], "googl": [2, 3, 4, 10], "includ": [2, 3, 4, 5, 10], "creat": [2, 3, 4, 6, 9, 10], "dataset": [2, 4, 6, 9, 10], "offset": [2, 10], "item": [2, 3, 4, 6, 10], "filter": [2, 3, 5, 6, 10], "date_offset": [2, 10, 11], "dateoffset": [2, 10], "base": [2, 3, 4, 6, 10], "given": [2, 4, 6, 10], "frequenc": [2, 10], "valu": [2, 3, 4, 5, 6, 10], "get_item_names_filt": [2, 10, 11], "where": [2, 3, 4, 6, 9, 10], "claus": [2, 10], "compon": [2, 3, 6, 10], "from": [2, 3, 4, 6, 10], "column": [2, 3, 4, 5, 10], "item_nam": [2, 3, 4, 6, 10], "get_min_datapoints_filt": [2, 10, 11], "have": [2, 5, 9, 10], "least": [2, 10], "min_siz": [2, 10], "observ": [2, 10], "get_training_data": [2, 10, 11], "retriev": [2, 3, 6, 9, 10], "view": [2, 10], "get_year_weather_queri": [2, 10, 11], "sql": [2, 3, 4, 10], "queri": [2, 3, 4, 10], "weather": [2, 10], "specif": [2, 6, 10], "year": [2, 10], "state": [2, 10], "get_weather_queri": [2, 10, 11], "rang": [2, 3, 10], "create_forecast_features_queri": [2, 10, 11], "join": [2, 10], "tabl": [2, 3, 4, 6, 10], "create_future_data": [2, 10, 11], "futur": [2, 4, 10], "test": [2, 3, 4, 10], "create_future_feature_t": [2, 10, 11], "save": [2, 10], "result": [2, 3, 10], "multipl": [2, 3, 10], "i": [2, 3, 4, 5, 6, 9, 10], "design": [2, 3, 4, 10], "work": [2, 3, 4, 10], "requir": [2, 3, 4, 5, 10], "valid": [2, 3, 4, 9, 10], "client": [2, 3, 4, 6, 10], "instanc": [2, 3, 4, 10], "focu": [2, 10], "variou": [2, 3, 10], "busi": [2, 3, 10], "context": [2, 3, 10], "iowa_forecast": [2, 3, 4, 5, 6, 8], "n": [2, 10], "int": [2, 3, 4, 10], "freq": [2, 10], "str": [2, 3, 4, 5, 6, 10], "sourc": [2, 3, 4, 5, 6, 10], "paramet": [2, 3, 4, 5, 6, 10], "number": [2, 3, 4, 10], "unit": [2, 10], "dai": [2, 3, 4, 10], "week": [2, 10], "month": [2, 10], "type": [2, 3, 4, 5, 6, 9, 10], "option": [2, 3, 4, 5, 6, 10], "return": [2, 3, 4, 5, 6, 10], "pd": [2, 3, 5, 6, 10], "A": [2, 3, 4, 6, 7, 10], "specifi": [2, 3, 4, 5, 6, 10], "rais": [2, 4, 5, 6, 10], "valueerror": [2, 5, 10], "If": [2, 3, 4, 5, 6, 9, 10], "one": [2, 3, 6, 9, 10], "items_list": [2, 3, 4, 10], "list": [2, 3, 4, 6, 9, 10], "name": [2, 3, 4, 5, 6, 10], "add": [2, 9, 10], "can": [2, 3, 9, 10], "print": [2, 6, 10], "five": [2, 10], "o": [2, 10], "clock": [2, 10], "vodka": [2, 6, 10], "firebal": [2, 10], "cinnamon": [2, 10], "whiskei": [2, 10], "black": [2, 10], "velvet": [2, 10], "OR": [2, 10], "minimum": [2, 10], "table_nam": [2, 3, 6, 10], "bqmlforecast": [2, 3, 4, 6, 10], "training_data": [2, 3, 4, 10], "start_dat": [2, 5, 10], "none": [2, 3, 4, 5, 6, 10], "end_dat": [2, 3, 10], "min_datapoints_r": [2, 10], "float": [2, 3, 4, 10], "0": [2, 3, 4, 10], "75": [2, 10], "base_t": [2, 10], "iowa_liquor_sal": [2, 10], "sale": [2, 4, 9, 10], "datafram": [2, 3, 5, 6, 10], "construct": [2, 4, 6, 10], "condit": [2, 10], "default": [2, 3, 4, 5, 6, 10], "store": [2, 4, 9, 10], "start": [2, 5, 9, 10], "yyyi": [2, 10], "mm": [2, 10], "dd": [2, 10], "format": [2, 10], "determin": [2, 10], "wai": [2, 10], "end": [2, 3, 10], "equal": [2, 4, 10], "todai": [2, 10], "": [2, 3, 6, 9, 10], "calcul": [2, 10], "fraction": [2, 10], "between": [2, 4, 10], "each": [2, 3, 4, 6, 10], "should": [2, 3, 4, 10], "point": [2, 9, 10], "consid": [2, 10], "singl": [2, 10], "extract": [2, 6, 10], "ia": [2, 10], "which": [2, 3, 4, 5, 10], "code": [2, 4, 10], "string": [2, 3, 4, 10], "dataset_id": [2, 6, 10], "forecast_tables_pattern": [2, 10], "forecast_": [2, 10], "connect": [2, 6, 10], "servic": [2, 6, 9, 10], "id": [2, 6, 10], "locat": [2, 6, 10], "pattern": [2, 6, 10], "match": [2, 6, 10], "select": [2, 3, 4, 9, 10], "cast": [2, 10], "t1": [2, 10], "forecast_timestamp": [2, 10], "AS": [2, 10], "total_amount_sold": [2, 4, 10], "t2": [2, 10], "forecast_valu": [2, 10], "temp": [2, 10], "t3": [2, 10], "rainfal": [2, 10], "t4": [2, 10], "snowfal": [2, 10], "fw": [2, 10], "temperatur": [2, 10], "forecast_temp": [2, 10], "inner": [2, 10], "forecast_rainfal": [2, 10], "ON": [2, 10], "AND": [2, 10], "forecast_snowfal": [2, 10], "left": [2, 10], "future_weather_data": [2, 10], "comprehens": [2, 10], "train_table_nam": [2, 3, 4, 10], "test_table_nam": [2, 4, 10], "test_data": [2, 3, 4, 10], "forecast_table_nam": [2, 3, 10], "forecast_data": [2, 3, 10], "horizon": [2, 3, 4, 10], "7": [2, 3, 4, 10], "It": [2, 3, 5, 10], "inform": [2, 4, 6, 10], "lag": [2, 10], "model_nam": [2, 4, 10], "confidence_level": [2, 3, 4, 5, 10], "9": [2, 4, 9, 10], "confid": [2, 3, 4, 10], "level": [2, 3, 4, 10], "arima_model": [2, 4, 10], "table_base_nam": [2, 10], "set": [3, 9, 10], "explain": [3, 10], "well": [3, 10], "aggreg": [3, 10], "across": [3, 10], "evaluate_model": [3, 10, 11], "arima_plus_xreg": [3, 4, 10], "perform": [3, 4, 10], "metric": [3, 4, 10], "get_data": [3, 10, 11], "create_queri": [3, 10, 11], "get_train_data": [3, 10, 11], "get_actual_data": [3, 10, 11], "actual": [3, 5, 9, 10], "get_predict": [3, 10, 11], "predict": [3, 10], "evaluate_predict": [3, 10, 11], "against": [3, 6, 10], "comparison": [3, 10], "multi_evaluate_predict": [3, 10, 11], "dictionari": [3, 5, 10], "explain_model": [3, 10, 11], "explan": [3, 10], "primarili": [3, 10], "intend": [3, 4, 10], "perform_aggreg": [3, 10], "bool": [3, 4, 5, 10], "true": [3, 4, 5, 10], "arima_plus_xreg_model": [3, 4, 10], "actual_table_nam": [3, 10], "period": [3, 10], "maximum": [3, 4, 10], "step": [3, 4, 9, 10], "ahead": [3, 10], "whether": [3, 4, 5, 10], "date_filt": [3, 10], "order_bi": [3, 10], "databas": [3, 10], "order": [3, 10], "For": [3, 9, 10], "exampl": 3, "you": [3, 4, 5, 9, 10], "want": [3, 5, 10], "sort": [3, 10], "8": [3, 10], "tupl": [3, 6, 10], "compar": [3, 5, 10], "two": [3, 10], "dict": [3, 5, 10], "kei": [3, 5, 9, 10], "sub": [3, 10], "train_df": [3, 10], "eval_df": [3, 10], "ml": [3, 10], "explain_forecast": [3, 10], "http": [3, 7, 9, 10], "cloud": [3, 4, 10], "com": [3, 7, 9, 10], "doc": [3, 9, 10], "refer": [3, 8, 9, 11], "standard": [3, 10], "bigqueryml": [3, 10], "syntax": [3, 10], "manag": [4, 10], "retri": [4, 10], "create_model_queri": [4, 10, 11], "its": [4, 10], "associ": [4, 10], "execute_query_with_retri": [4, 10, 11], "logic": [4, 10], "case": [4, 6, 10], "failur": [4, 10], "create_models_for_item": [4, 10, 11], "train_arima_model": [4, 10, 11], "arima": [4, 6, 10], "correspond": [4, 10], "holidai": [4, 10], "effect": [4, 10], "chang": [4, 10], "clean": [4, 10], "timestamp_col": [4, 10], "time_series_data_col": [4, 10], "holiday_region": [4, 10], "u": [4, 6, 10], "auto_arima": [4, 10], "adjust_step_chang": [4, 10], "clean_spikes_and_dip": [4, 10], "tailor": [4, 9, 10], "repres": [4, 10], "timestamp": [4, 5, 10], "region": [4, 10], "enabl": [4, 9, 10], "adjust": [4, 10], "spike": [4, 10], "dip": [4, 10], "max_retri": [4, 10], "3": [4, 9, 10], "fail": [4, 6, 10], "automat": [4, 10], "up": [4, 9, 10], "increas": [4, 10], "delai": [4, 10], "attempt": [4, 10], "except": [4, 6, 10], "linearli": [4, 10], "120": [4, 10], "second": [4, 10], "multipli": [4, 10], "current": [4, 9, 10], "my_dataset": [4, 6, 10], "my_tabl": [4, 6, 10], "max_item": [4, 10], "see": [4, 5, 10], "section": [4, 5, 10], "more": [4, 10], "Not": [4, 10], "account": [4, 9, 10], "bill": [4, 10], "re": [4, 10], "limit": [4, 10], "smaller": [4, 10], "than": [4, 6, 10], "4": [4, 10], "run": [4, 10], "might": [4, 10], "incur": [4, 10], "charg": [4, 10], "model_metrics_table_nam": [4, 10], "arima_model_metr": [4, 10], "time_series_timestamp_col": [4, 10], "time_series_id_col": [4, 10], "These": [4, 9, 10], "liquor": [4, 9, 10], "identifi": [4, 10], "convert_to_datetim": [5, 10, 11], "df": [5, 10], "col": [5, 10], "filter_by_d": [5, 10, 11], "datetim": [5, 10], "done": [5, 10], "origin": [5, 10], "appli": [5, 10], "plot_historical_and_forecast": [5, 10, 11], "input_timeseri": [5, 10], "timestamp_col_nam": [5, 10], "data_col_nam": [5, 10], "forecast_output": [5, 10], "forecast_col_nam": [5, 10], "actual_col_nam": [5, 10], "titl": [5, 10], "plot_start_d": [5, 10], "show_peak": [5, 10], "matplotlib": [5, 10], "plot_kwarg": [5, 10], "histor": [5, 10], "visual": [5, 10], "peak": [5, 10], "highlight": [5, 10], "support": [5, 10], "both": [5, 10], "plotli": [5, 10], "line": [5, 10], "differ": [5, 6, 10], "color": [5, 10], "map": [5, 10], "lower_bound": [5, 10], "upper_bound": [5, 10], "ad": [5, 10], "avail": [5, 10], "either": [5, 10], "addit": [5, 10], "detail": [5, 10], "keyword": [5, 10], "argument": [5, 10], "custom": [5, 10], "neither": [5, 10], "nor": [5, 10], "allow": [5, 10], "librari": [5, 10], "get": [5, 6, 10], "prettier": [5, 10], "howev": [5, 10], "instal": [5, 8, 10], "By": [5, 10], "also": [5, 10], "project": [5, 6, 10], "txt": [5, 9, 10], "file": [5, 9, 10], "2023": [5, 10], "01": [5, 10], "02": [5, 10], "10": [5, 10], "15": [5, 10], "sampl": [5, 9, 10], "normalize_item_nam": [6, 10, 11], "convert": [6, 10], "lower": [6, 10], "replac": [6, 9, 10], "space": [6, 10], "underscor": [6, 10], "normal": [6, 10], "tito": [6, 10], "handmad": [6, 10], "titos_handmade_vodka": [6, 10], "uniqu": [6, 10], "split_table_name_info": [6, 10, 11], "ani": [6, 9, 10], "insid": [6, 9, 10], "thei": [6, 10], "my_project": [6, 10], "create_bigquery_table_from_panda": [6, 10, 11], "table_id": [6, 10], "if_exist": [6, 10], "append": [6, 10], "behavior": [6, 10], "when": [6, 10], "alreadi": [6, 9, 10], "exist": [6, 9, 10], "column1": [6, 10], "1": [6, 7, 10], "2": [6, 7, 10], "column2": [6, 10], "b": [6, 10], "create_dataset_if_not_found": [6, 10, 11], "project_id": [6, 10], "dataset_nam": [6, 10], "doe": [6, 10], "infer": [6, 10], "attibut": [6, 10], "other": [6, 10], "error": [6, 9, 10], "new_dataset": [6, 10], "check": [6, 10], "list_tables_with_pattern": [6, 10, 11], "table_pattern": [6, 10], "fulli": [6, 10], "qualifi": [6, 10], "them": [6, 10], "interact": [6, 10], "fnmatch": [6, 10], "ensur": [6, 9, 10], "compat": [6, 10], "sales_": [6, 10], "sales_2021": [6, 10], "sales_2022": [6, 10], "gumshoej": 7, "v5": 7, "patch": 7, "pradyunsg": 7, "simpl": 7, "framework": 7, "agnost": 7, "scrollspi": 7, "script": [7, 9], "2019": 7, "chri": 7, "ferdinandi": 7, "mit": 7, "licens": 7, "github": [7, 9], "cferdinandi": 7, "gumsho": 7, "api": [8, 9, 11], "index": [8, 9], "search": 8, "here": 9, "rst": 9, "your": 9, "iowa": 9, "guid": 9, "instruct": 9, "how": 9, "befor": 9, "begin": 9, "www": 9, "org": 9, "download": 9, "releas": 9, "390": 9, "higher": 9, "sdk": 9, "gcloud": 9, "configur": 9, "container": 9, "environ": 9, "git": 9, "scm": 9, "clone": 9, "repositori": 9, "sever": 9, "To": 9, "pip": 9, "bash": 9, "r": 9, "storag": 9, "go": 9, "consol": 9, "new": 9, "navig": 9, "authent": 9, "iam": 9, "admin": 9, "serviceaccount": 9, "In": 9, "click": 9, "ve": 9, "tab": 9, "choos": 9, "json": 9, "button": 9, "google_application_credenti": 9, "variabl": 9, "path": 9, "export": 9, "prefer": 9, "consist": 9, "build": 9, "imag": 9, "root": 9, "directori": 9, "t": 9, "rm": 9, "e": 9, "v": 9, "pwd": 9, "app": 9, "credenti": 9, "mount": 9, "onc": 9, "haven": 9, "yourusernam": 9, "cd": 9, "pipelin": 9, "train_model_and_forecast_sal": 9, "py": 9, "make": 9, "sure": 9, "correctli": 9, "encount": 9, "issu": 9, "dure": 9, "some": 9, "common": 9, "solut": 9, "miss": 9, "via": 9, "verifi": 9, "system": 9, "ha": 9, "enough": 9, "resourc": 9, "alloc": 9, "further": 9, "assist": 9, "document": 9, "html": 9, "content": 11}, "objects": {"": [[10, 0, 0, "-", "iowa_forecast"]], "iowa_forecast": [[10, 0, 0, "-", "load_data"], [10, 0, 0, "-", "ml_eval"], [10, 0, 0, "-", "ml_train"], [10, 0, 0, "-", "plots"], [10, 0, 0, "-", "utils"]], "iowa_forecast.load_data": [[10, 1, 1, "", "create_forecast_features_query"], [10, 1, 1, "", "create_future_data"], [10, 1, 1, "", "create_future_feature_table"], [10, 1, 1, "", "create_future_feature_tables"], [10, 1, 1, "", "date_offset"], [10, 1, 1, "", "get_item_names_filter"], [10, 1, 1, "", "get_min_datapoints_filter"], [10, 1, 1, "", "get_training_data"], [10, 1, 1, "", "get_weather_query"], [10, 1, 1, "", "get_year_weather_query"]], "iowa_forecast.ml_eval": [[10, 1, 1, "", "create_query"], [10, 1, 1, "", "evaluate_models"], [10, 1, 1, "", "evaluate_predictions"], [10, 1, 1, "", "explain_model"], [10, 1, 1, "", "get_actual_data"], [10, 1, 1, "", "get_data"], [10, 1, 1, "", "get_predictions"], [10, 1, 1, "", "get_train_data"], [10, 1, 1, "", "multi_evaluate_predictions"]], "iowa_forecast.ml_train": [[10, 1, 1, "", "create_model_query"], [10, 1, 1, "", "create_models_for_items"], [10, 1, 1, "", "execute_query_with_retries"], [10, 1, 1, "", "train_arima_models"]], "iowa_forecast.plots": [[10, 1, 1, "", "convert_to_datetime"], [10, 1, 1, "", "filter_by_date"], [10, 1, 1, "", "plot_historical_and_forecast"]], "iowa_forecast.utils": [[10, 1, 1, "", "create_bigquery_table_from_pandas"], [10, 1, 1, "", "create_dataset_if_not_found"], [10, 1, 1, "", "list_tables_with_pattern"], [10, 1, 1, "", "normalize_item_name"], [10, 1, 1, "", "split_table_name_info"]]}, "objtypes": {"0": "py:module", "1": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"]}, "titleterms": {"api": [0, 10], "refer": [0, 10], "iowa_forecast": [0, 1, 10, 11], "load_data": [2, 10], "function": [2, 3, 4, 10], "note": [2, 3, 4, 5, 6, 10], "exampl": [2, 4, 5, 6, 10], "ml_eval": [3, 10], "ml_train": [4, 10], "plot": [5, 10], "util": [6, 10], "iowa": 8, "liquor": 8, "sale": 8, "forecast": 8, "modul": [8, 10], "content": [8, 10], "indic": 8, "tabl": 8, "instal": 9, "requir": 9, "python": 9, "depend": 9, "googl": 9, "cloud": 9, "setup": 9, "docker": 9, "option": 9, "run": 9, "project": 9, "troubleshoot": 9}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx.ext.intersphinx": 1, "sphinx": 58}, "alltitles": {"API Reference": [[0, "api-reference"]], "iowa_forecast": [[0, "iowa-forecast"], [1, "iowa-forecast"], [11, "iowa-forecast"]], "load_data": [[2, "module-iowa_forecast.load_data"]], "Functions": [[2, "functions"], [3, "functions"], [4, "functions"], [10, "functions"], [10, "id3"], [10, "id4"]], "Notes": [[2, null], [2, null], [3, null], [4, null], [4, null], [4, null], [5, null], [6, null], [6, null], [6, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null]], "Examples": [[2, null], [2, null], [4, null], [5, null], [6, null], [6, null], [6, null], [6, null], [6, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null]], "ml_eval": [[3, "module-iowa_forecast.ml_eval"]], "ml_train": [[4, "module-iowa_forecast.ml_train"]], "plots": [[5, "module-iowa_forecast.plots"]], "utils": [[6, "module-iowa_forecast.utils"]], "Iowa Liquor Sales Forecast": [[8, "iowa-liquor-sales-forecast"]], "Modules": [[8, "modules"]], "Contents:": [[8, null]], "Indices and tables": [[8, "indices-and-tables"]], "Installation": [[9, "installation"]], "Requirements": [[9, "requirements"]], "Python Dependencies": [[9, "python-dependencies"]], "Google Cloud Setup": [[9, "google-cloud-setup"]], "Docker Setup (Optional)": [[9, "docker-setup-optional"]], "Running the Project": [[9, "running-the-project"]], "Troubleshooting": [[9, "troubleshooting"]], "API reference": [[10, "api-reference"]], "iowa_forecast.load_data": [[10, "module-iowa_forecast.load_data"]], "iowa_forecast.ml_eval": [[10, "module-iowa_forecast.ml_eval"]], "iowa_forecast.ml_train": [[10, "module-iowa_forecast.ml_train"]], "iowa_forecast.plots": [[10, "module-iowa_forecast.plots"]], "iowa_forecast.utils": [[10, "module-iowa_forecast.utils"]], "Module contents": [[10, "module-iowa_forecast"]]}, "indexentries": {"create_forecast_features_query() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.create_forecast_features_query"], [10, "iowa_forecast.load_data.create_forecast_features_query"]], "create_future_data() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.create_future_data"], [10, "iowa_forecast.load_data.create_future_data"]], "create_future_feature_table() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.create_future_feature_table"], [10, "iowa_forecast.load_data.create_future_feature_table"]], "create_future_feature_tables() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.create_future_feature_tables"], [10, "iowa_forecast.load_data.create_future_feature_tables"]], "date_offset() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.date_offset"], [10, "iowa_forecast.load_data.date_offset"]], "get_item_names_filter() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.get_item_names_filter"], [10, "iowa_forecast.load_data.get_item_names_filter"]], "get_min_datapoints_filter() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.get_min_datapoints_filter"], [10, "iowa_forecast.load_data.get_min_datapoints_filter"]], "get_training_data() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.get_training_data"], [10, "iowa_forecast.load_data.get_training_data"]], "get_weather_query() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.get_weather_query"], [10, "iowa_forecast.load_data.get_weather_query"]], "get_year_weather_query() (in module iowa_forecast.load_data)": [[2, "iowa_forecast.load_data.get_year_weather_query"], [10, "iowa_forecast.load_data.get_year_weather_query"]], "iowa_forecast.load_data": [[2, "module-iowa_forecast.load_data"], [10, "module-iowa_forecast.load_data"]], "module": [[2, "module-iowa_forecast.load_data"], [3, "module-iowa_forecast.ml_eval"], [4, "module-iowa_forecast.ml_train"], [5, "module-iowa_forecast.plots"], [6, "module-iowa_forecast.utils"], [10, "module-iowa_forecast"], [10, "module-iowa_forecast.load_data"], [10, "module-iowa_forecast.ml_eval"], [10, "module-iowa_forecast.ml_train"], [10, "module-iowa_forecast.plots"], [10, "module-iowa_forecast.utils"]], "create_query() (in module iowa_forecast.ml_eval)": [[3, "iowa_forecast.ml_eval.create_query"], [10, "iowa_forecast.ml_eval.create_query"]], "evaluate_models() (in module iowa_forecast.ml_eval)": [[3, "iowa_forecast.ml_eval.evaluate_models"], [10, "iowa_forecast.ml_eval.evaluate_models"]], "evaluate_predictions() (in module iowa_forecast.ml_eval)": [[3, "iowa_forecast.ml_eval.evaluate_predictions"], [10, "iowa_forecast.ml_eval.evaluate_predictions"]], "explain_model() (in module iowa_forecast.ml_eval)": [[3, "iowa_forecast.ml_eval.explain_model"], [10, "iowa_forecast.ml_eval.explain_model"]], "get_actual_data() (in module iowa_forecast.ml_eval)": [[3, "iowa_forecast.ml_eval.get_actual_data"], [10, "iowa_forecast.ml_eval.get_actual_data"]], "get_data() (in module iowa_forecast.ml_eval)": [[3, "iowa_forecast.ml_eval.get_data"], [10, "iowa_forecast.ml_eval.get_data"]], "get_predictions() (in module iowa_forecast.ml_eval)": [[3, "iowa_forecast.ml_eval.get_predictions"], [10, "iowa_forecast.ml_eval.get_predictions"]], "get_train_data() (in module iowa_forecast.ml_eval)": [[3, "iowa_forecast.ml_eval.get_train_data"], [10, "iowa_forecast.ml_eval.get_train_data"]], "iowa_forecast.ml_eval": [[3, "module-iowa_forecast.ml_eval"], [10, "module-iowa_forecast.ml_eval"]], "multi_evaluate_predictions() (in module iowa_forecast.ml_eval)": [[3, "iowa_forecast.ml_eval.multi_evaluate_predictions"], [10, "iowa_forecast.ml_eval.multi_evaluate_predictions"]], "create_model_query() (in module iowa_forecast.ml_train)": [[4, "iowa_forecast.ml_train.create_model_query"], [10, "iowa_forecast.ml_train.create_model_query"]], "create_models_for_items() (in module iowa_forecast.ml_train)": [[4, "iowa_forecast.ml_train.create_models_for_items"], [10, "iowa_forecast.ml_train.create_models_for_items"]], "execute_query_with_retries() (in module iowa_forecast.ml_train)": [[4, "iowa_forecast.ml_train.execute_query_with_retries"], [10, "iowa_forecast.ml_train.execute_query_with_retries"]], "iowa_forecast.ml_train": [[4, "module-iowa_forecast.ml_train"], [10, "module-iowa_forecast.ml_train"]], "train_arima_models() (in module iowa_forecast.ml_train)": [[4, "iowa_forecast.ml_train.train_arima_models"], [10, "iowa_forecast.ml_train.train_arima_models"]], "convert_to_datetime() (in module iowa_forecast.plots)": [[5, "iowa_forecast.plots.convert_to_datetime"], [10, "iowa_forecast.plots.convert_to_datetime"]], "filter_by_date() (in module iowa_forecast.plots)": [[5, "iowa_forecast.plots.filter_by_date"], [10, "iowa_forecast.plots.filter_by_date"]], "iowa_forecast.plots": [[5, "module-iowa_forecast.plots"], [10, "module-iowa_forecast.plots"]], "plot_historical_and_forecast() (in module iowa_forecast.plots)": [[5, "iowa_forecast.plots.plot_historical_and_forecast"], [10, "iowa_forecast.plots.plot_historical_and_forecast"]], "create_bigquery_table_from_pandas() (in module iowa_forecast.utils)": [[6, "iowa_forecast.utils.create_bigquery_table_from_pandas"], [10, "iowa_forecast.utils.create_bigquery_table_from_pandas"]], "create_dataset_if_not_found() (in module iowa_forecast.utils)": [[6, "iowa_forecast.utils.create_dataset_if_not_found"], [10, "iowa_forecast.utils.create_dataset_if_not_found"]], "iowa_forecast.utils": [[6, "module-iowa_forecast.utils"], [10, "module-iowa_forecast.utils"]], "list_tables_with_pattern() (in module iowa_forecast.utils)": [[6, "iowa_forecast.utils.list_tables_with_pattern"], [10, "iowa_forecast.utils.list_tables_with_pattern"]], "normalize_item_name() (in module iowa_forecast.utils)": [[6, "iowa_forecast.utils.normalize_item_name"], [10, "iowa_forecast.utils.normalize_item_name"]], "split_table_name_info() (in module iowa_forecast.utils)": [[6, "iowa_forecast.utils.split_table_name_info"], [10, "iowa_forecast.utils.split_table_name_info"]], "iowa_forecast": [[10, "module-iowa_forecast"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["api_reference/index", "api_reference/iowa_forecast/index", "api_reference/iowa_forecast/load_data", "api_reference/iowa_forecast/ml_eval", "api_reference/iowa_forecast/ml_train", "api_reference/iowa_forecast/models_configs", "api_reference/iowa_forecast/plots", "api_reference/iowa_forecast/utils", "docs/html/_static/scripts/furo.js.LICENSE", "index", "installation"], "filenames": ["api_reference/index.rst", "api_reference/iowa_forecast/index.rst", "api_reference/iowa_forecast/load_data.rst", "api_reference/iowa_forecast/ml_eval.rst", "api_reference/iowa_forecast/ml_train.rst", "api_reference/iowa_forecast/models_configs.rst", "api_reference/iowa_forecast/plots.rst", "api_reference/iowa_forecast/utils.rst", "docs/html/_static/scripts/furo.js.LICENSE.txt", "index.rst", "installation.rst"], "titles": ["API Reference", "iowa_forecast", "load_data", "ml_eval", "ml_train", "models_configs", "plots", "utils", "<no title>", "Iowa Liquor Sales Forecast", "Installation"], "terms": {"thi": [0, 2, 3, 4, 5, 6, 7, 10], "page": [0, 9, 10], "give": 0, "an": [0, 2, 3, 4, 5, 10], "overview": 0, "all": [0, 4, 5, 6, 7, 10], "public": [0, 2], "panda": [0, 2, 3, 6, 7], "object": [0, 2], "function": [0, 5, 6, 7], "method": 0, "expos": 0, "namespac": 0, "ar": [0, 2, 3, 4, 5, 7, 10], "The": [0, 2, 3, 4, 5, 6, 7, 10], "packag": [0, 10], "contain": [0, 2, 3, 4, 5, 6, 7, 10], "follow": [0, 2, 3, 5, 10], "modul": [0, 2, 3, 4, 5, 7], "load_data": [0, 1], "bigqueri": [0, 2, 3, 4, 7, 10], "data": [0, 2, 3, 4, 6, 10], "load": [0, 2, 7], "featur": [0, 2, 4], "engin": [0, 2, 6], "ml_eval": [0, 1], "model": [0, 2, 3, 4, 5, 7, 10], "evalu": [0, 3, 4], "forecast": [0, 2, 3, 4, 6, 10], "ml_train": [0, 1], "train": [0, 2, 3, 4, 5, 10], "execut": [0, 3, 4, 10], "plot": [0, 1], "time": [0, 2, 3, 4, 6], "seri": [0, 2, 3, 4, 6], "date": [0, 2, 3, 4, 6], "handl": [0, 2, 4, 5], "util": [0, 1, 2, 3, 10], "gener": [0, 2, 3, 4, 6, 7, 10], "provid": [2, 3, 4, 5, 6, 7, 10], "process": [2, 4, 5], "prepar": 2, "us": [2, 3, 4, 5, 6, 7, 10], "googl": [2, 3, 4], "includ": [2, 3, 4, 5, 6], "creat": [2, 3, 4, 7, 10], "dataset": [2, 4, 7, 10], "offset": 2, "item": [2, 3, 4, 7], "filter": [2, 3, 6, 7], "date_offset": 2, "dateoffset": 2, "base": [2, 3, 4, 5, 7], "given": [2, 4, 7], "frequenc": 2, "valu": [2, 3, 4, 5, 6, 7], "get_item_names_filt": 2, "where": [2, 3, 4, 5, 7, 10], "claus": 2, "compon": [2, 3, 7], "from": [2, 3, 4, 5, 7], "column": [2, 3, 4, 6], "item_nam": [2, 3, 4, 7], "get_min_datapoints_filt": 2, "have": [2, 6, 10], "least": 2, "min_siz": 2, "observ": 2, "get_training_data": 2, "retriev": [2, 3, 7, 10], "view": 2, "get_year_weather_queri": 2, "sql": [2, 3, 4], "queri": [2, 3, 4], "weather": 2, "specif": [2, 5, 7], "year": 2, "state": 2, "get_weather_queri": 2, "rang": [2, 3, 5], "create_forecast_features_queri": 2, "join": 2, "tabl": [2, 3, 4, 7], "create_future_data": 2, "futur": [2, 4], "test": [2, 3, 4], "create_future_feature_t": 2, "save": 2, "result": [2, 3], "multipl": [2, 3], "i": [2, 3, 4, 6, 7, 10], "design": [2, 3, 4], "work": [2, 3, 4], "requir": [2, 3, 4, 5, 6], "valid": [0, 2, 3, 4, 5, 10], "client": [2, 3, 4, 7], "instanc": [2, 3, 4], "focu": 2, "variou": [2, 3, 5], "busi": [2, 3], "context": [2, 3], "iowa_forecast": [2, 3, 4, 5, 6, 7, 9], "n": 2, "int": [2, 3, 4], "freq": 2, "str": [2, 3, 4, 5, 6, 7], "sourc": [2, 3, 4, 5, 6, 7], "paramet": [0, 2, 3, 4, 5, 6, 7], "number": [2, 3, 4], "unit": 2, "dai": [2, 3, 4], "week": 2, "month": 2, "type": [2, 3, 4, 5, 6, 7, 10], "option": [2, 3, 4, 6, 7], "return": [2, 3, 4, 5, 6, 7], "pd": [2, 3, 6, 7], "A": [2, 3, 4, 5, 7, 8], "specifi": [2, 3, 4, 5, 6, 7], "rais": [2, 4, 6, 7], "valueerror": [2, 6], "If": [2, 3, 4, 6, 7, 10], "one": [2, 3, 7, 10], "items_list": [2, 3, 4], "list": [2, 3, 4, 5, 7, 10], "name": [2, 3, 4, 5, 6, 7], "add": [2, 10], "can": [2, 3, 5, 10], "print": [2, 5, 7], "five": 2, "o": 2, "clock": 2, "vodka": [2, 7], "firebal": 2, "cinnamon": 2, "whiskei": 2, "black": 2, "velvet": 2, "OR": 2, "minimum": 2, "table_nam": [2, 3, 7], "bqmlforecast": [2, 3, 4, 7], "training_data": [2, 3, 4], "start_dat": [2, 6], "none": [2, 3, 4, 6, 7], "end_dat": [2, 3], "min_datapoints_r": 2, "float": [2, 3, 4], "0": [2, 3, 4], "75": 2, "base_t": 2, "iowa_liquor_sal": 2, "sale": [2, 4, 10], "datafram": [2, 3, 6, 7], "construct": [2, 4, 7], "condit": 2, "default": [2, 3, 4, 5, 6, 7], "store": [2, 4, 10], "start": [2, 6, 10], "yyyi": 2, "mm": 2, "dd": 2, "format": 2, "determin": 2, "wai": 2, "end": [2, 3], "equal": [2, 4], "todai": 2, "": [2, 3, 7, 10], "calcul": 2, "fraction": 2, "between": [2, 4], "each": [2, 3, 4, 7], "should": [2, 3, 4, 5], "point": [2, 10], "consid": 2, "singl": 2, "extract": [2, 7], "ia": 2, "which": [2, 3, 4, 5, 6], "code": [2, 4], "string": [2, 3, 4], "dataset_id": [2, 7], "forecast_tables_pattern": 2, "forecast_": 2, "connect": [2, 7], "servic": [2, 7, 10], "id": [2, 7], "locat": [2, 7], "pattern": [2, 5, 7], "match": [2, 7], "select": [2, 3, 4, 10], "cast": 2, "t1": 2, "forecast_timestamp": 2, "AS": 2, "total_amount_sold": [2, 4], "t2": 2, "forecast_valu": 2, "temp": 2, "t3": 2, "rainfal": 2, "t4": 2, "snowfal": 2, "fw": 2, "temperatur": 2, "forecast_temp": 2, "inner": 2, "forecast_rainfal": 2, "ON": 2, "AND": 2, "forecast_snowfal": 2, "left": 2, "future_weather_data": 2, "comprehens": 2, "train_table_nam": [2, 3, 4], "test_table_nam": [2, 4], "test_data": [2, 3, 4], "forecast_table_nam": [2, 3], "forecast_data": [2, 3], "horizon": [2, 3, 4], "7": [2, 3, 4], "It": [2, 3, 5, 6], "inform": [2, 4, 7], "lag": 2, "model_nam": [2, 4], "confidence_level": [2, 3, 4, 6], "9": [2, 4, 10], "confid": [2, 3, 4], "level": [2, 3, 4], "arima_model": [2, 4], "table_base_nam": 2, "set": [3, 5, 10], "explain": 3, "well": 3, "aggreg": 3, "across": 3, "evaluate_model": 3, "arima_plus_xreg": [3, 4, 5], "perform": [3, 4], "metric": [3, 4], "get_data": 3, "create_queri": 3, "get_train_data": 3, "get_actual_data": 3, "actual": [3, 6, 10], "get_predict": 3, "predict": 3, "evaluate_predict": 3, "against": [3, 7], "comparison": 3, "multi_evaluate_predict": 3, "dictionari": [3, 5, 6], "explain_model": 3, "explan": 3, "primarili": 3, "intend": [3, 4, 5], "perform_aggreg": 3, "bool": [3, 4, 6], "true": [3, 4, 5, 6], "arima_plus_xreg_model": [3, 4], "actual_table_nam": 3, "period": 3, "maximum": [3, 4], "step": [3, 4, 10], "ahead": 3, "whether": [3, 4, 6], "date_filt": 3, "order_bi": 3, "databas": 3, "order": 3, "For": [3, 10], "exampl": 3, "you": [3, 4, 6, 10], "want": [3, 6], "sort": 3, "8": 3, "tupl": [3, 5, 7], "compar": [3, 6], "two": 3, "dict": [3, 5, 6], "kei": [3, 5, 6, 10], "sub": 3, "train_df": 3, "eval_df": 3, "ml": 3, "explain_forecast": 3, "http": [3, 8, 10], "cloud": [3, 4], "com": [3, 8, 10], "doc": 3, "refer": [3, 9, 10], "standard": [3, 5], "bigqueryml": 3, "syntax": 3, "manag": [0, 4, 5], "retri": 4, "create_model_queri": 4, "its": 4, "associ": 4, "execute_query_with_retri": 4, "logic": 4, "case": [4, 7], "failur": 4, "create_models_for_item": 4, "train_arima_model": 4, "arima": [4, 5, 7], "correspond": 4, "holidai": 4, "effect": 4, "chang": 4, "clean": 4, "timestamp_col": 4, "time_series_data_col": 4, "holiday_region": 4, "u": [4, 7], "auto_arima": 4, "adjust_step_chang": 4, "clean_spikes_and_dip": 4, "tailor": [4, 10], "repres": 4, "timestamp": [4, 6], "region": 4, "enabl": [4, 10], "adjust": 4, "spike": 4, "dip": 4, "max_retri": 4, "3": [4, 10], "fail": [4, 7], "automat": 4, "up": [4, 10], "increas": 4, "delai": 4, "attempt": 4, "except": [4, 7], "linearli": 4, "120": 4, "second": 4, "multipli": 4, "current": [4, 10], "my_dataset": [4, 7], "my_tabl": [4, 7], "max_item": 4, "see": [4, 6], "section": [4, 6], "more": 4, "Not": 4, "account": [4, 10], "bill": 4, "re": 4, "limit": 4, "smaller": 4, "than": [4, 7], "4": 4, "run": 4, "might": 4, "incur": 4, "charg": 4, "model_metrics_table_nam": 4, "arima_model_metr": 4, "time_series_timestamp_col": 4, "time_series_id_col": 4, "These": [4, 5, 10], "liquor": [4, 10], "identifi": 4, "convert_to_datetim": 6, "df": 6, "col": 6, "filter_by_d": 6, "datetim": 6, "done": 6, "origin": 6, "appli": 6, "plot_historical_and_forecast": 6, "input_timeseri": 6, "timestamp_col_nam": 6, "data_col_nam": 6, "forecast_output": 6, "forecast_col_nam": 6, "actual_col_nam": 6, "titl": 6, "plot_start_d": 6, "show_peak": 6, "matplotlib": 6, "plot_kwarg": 6, "histor": 6, "visual": 6, "peak": 6, "highlight": 6, "support": 6, "both": 6, "plotli": 6, "line": 6, "differ": [6, 7], "color": 6, "map": 6, "lower_bound": 6, "upper_bound": 6, "ad": 6, "avail": 6, "either": 6, "addit": [5, 6], "detail": 6, "keyword": 6, "argument": 6, "custom": 6, "neither": 6, "nor": 6, "allow": 6, "librari": 6, "get": [6, 7], "prettier": 6, "howev": 6, "instal": [6, 9], "By": [5, 6], "also": 6, "project": [6, 7], "txt": [6, 10], "file": [6, 10], "2023": 6, "01": 6, "02": 6, "10": 6, "15": 6, "sampl": [6, 10], "normalize_item_nam": 7, "convert": 7, "lower": 7, "replac": [7, 10], "space": 7, "underscor": 7, "normal": 7, "tito": 7, "handmad": 7, "titos_handmade_vodka": 7, "uniqu": 7, "split_table_name_info": 7, "ani": [5, 7, 10], "insid": [7, 10], "thei": [5, 7], "my_project": 7, "create_bigquery_table_from_panda": 7, "table_id": 7, "if_exist": 7, "append": 7, "behavior": 7, "when": 7, "alreadi": [7, 10], "exist": [7, 10], "column1": 7, "1": [7, 8], "2": [7, 8], "column2": 7, "b": 7, "create_dataset_if_not_found": 7, "project_id": 7, "dataset_nam": 7, "doe": 7, "infer": 7, "attibut": 7, "other": [5, 7], "error": [5, 7, 10], "new_dataset": 7, "check": [5, 7], "list_tables_with_pattern": 7, "table_pattern": 7, "fulli": 7, "qualifi": 7, "them": 7, "interact": 7, "fnmatch": 7, "ensur": [5, 7, 10], "compat": 7, "sales_": 7, "sales_2021": 7, "sales_2022": 7, "gumshoej": 8, "v5": 8, "patch": 8, "pradyunsg": 8, "simpl": 8, "framework": 8, "agnost": 8, "scrollspi": 8, "script": [8, 10], "2019": 8, "chri": 8, "ferdinandi": 8, "mit": 8, "licens": 8, "github": [8, 10], "cferdinandi": 8, "gumsho": 8, "api": [9, 10], "index": 9, "search": 9, "here": 10, "rst": 10, "your": 10, "iowa": 10, "guid": 10, "instruct": 10, "how": 10, "befor": [5, 10], "begin": 10, "www": [], "org": [], "download": 10, "releas": [], "390": [], "higher": 10, "sdk": 10, "gcloud": 10, "configur": [0, 5, 10], "container": 10, "environ": 10, "git": 10, "scm": [], "clone": 10, "repositori": 10, "sever": 10, "To": 10, "pip": 10, "bash": 10, "r": 10, "storag": 10, "go": 10, "consol": 10, "new": 10, "navig": 10, "authent": 10, "iam": 10, "admin": [], "serviceaccount": [], "In": 10, "click": 10, "ve": 10, "tab": 10, "choos": 10, "json": 10, "button": 10, "google_application_credenti": 10, "variabl": [5, 10], "path": 10, "export": 10, "prefer": 10, "consist": [5, 10], "build": 10, "imag": 10, "root": 10, "directori": 10, "t": 10, "rm": 10, "e": 10, "v": 10, "pwd": 10, "app": 10, "credenti": 10, "mount": 10, "onc": 10, "haven": 10, "yourusernam": [], "cd": 10, "pipelin": 10, "train_model_and_forecast_sal": 10, "py": 10, "make": 10, "sure": 10, "correctli": [5, 10], "encount": 10, "issu": 10, "dure": 10, "some": [5, 10], "common": [5, 10], "solut": 10, "miss": 10, "via": [5, 10], "verifi": 10, "system": 10, "ha": 10, "enough": 10, "resourc": 10, "alloc": 10, "further": 10, "assist": 10, "document": 10, "html": [], "content": [], "models_config": [0, 1], "class": 0, "machin": 5, "learn": 5, "focus": 5, "deriv": 5, "abstractbasemodelconfig": 5, "abc": 5, "abstract": 5, "basemodelconfig": 5, "subclass": 5, "defin": 5, "supported_paramet": 5, "expect": 5, "choic": 5, "arimaconfig": 5, "inherit": 5, "arima_plu": 5, "adher": 5, "arima_plus_xreg_config": 5, "extend": 5, "exogen": 5, "xreg_featur": 5, "setup": 5, "pass": 5, "leverag": 5, "develop": 5, "fall": 5, "within": 5, "reduc": 5, "likelihood": 5, "runtim": 5, "config": 5, "model_typ": 5, "xreg_config": 5, "feature1": 5, "feature2": 5, "non_negative_forecast": 5, "attribut": 5, "properti": 5, "must": 5, "implement": 5, "kwarg": 5, "unpack": 5, "restrict": 5, "erik": 10, "ingwersen": 10, "ei": 10}, "objects": {"iowa_forecast": [[5, 0, 0, "-", "models_configs"]], "iowa_forecast.models_configs": [[5, 1, 1, "", "ARIMAConfig"], [5, 1, 1, "", "ARIMA_PLUS_XREG_Config"], [5, 1, 1, "", "AbstractBaseModelConfig"], [5, 1, 1, "", "BaseModelConfig"]], "iowa_forecast.models_configs.ARIMAConfig": [[5, 2, 1, "", "SUPPORTED_PARAMETERS"]], "iowa_forecast.models_configs.ARIMA_PLUS_XREG_Config": [[5, 2, 1, "", "SUPPORTED_PARAMETERS"]], "iowa_forecast.models_configs.AbstractBaseModelConfig": [[5, 2, 1, "", "SUPPORTED_PARAMETERS"]], "iowa_forecast.models_configs.BaseModelConfig": [[5, 2, 1, "", "SUPPORTED_PARAMETERS"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "property", "Python property"]}, "titleterms": {"api": 0, "refer": 0, "iowa_forecast": [0, 1], "load_data": 2, "function": [2, 3, 4], "note": [2, 3, 4, 6, 7], "exampl": [2, 4, 5, 6, 7], "ml_eval": 3, "ml_train": 4, "plot": 6, "util": 7, "iowa": 9, "liquor": 9, "sale": 9, "forecast": 9, "modul": 9, "content": 9, "indic": 9, "tabl": 9, "instal": 10, "requir": 10, "python": 10, "depend": 10, "googl": 10, "cloud": 10, "setup": 10, "docker": 10, "option": 10, "run": 10, "project": 10, "troubleshoot": 10, "models_config": 5, "class": 5, "usag": 5}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx.ext.intersphinx": 1, "sphinx": 58}, "alltitles": {"load_data": [[2, "module-iowa_forecast.load_data"]], "Functions": [[2, "functions"], [3, "functions"], [4, "functions"]], "Notes": [[2, null], [2, null], [3, null], [4, null], [4, null], [4, null], [6, null], [7, null], [7, null], [7, null]], "Examples": [[2, null], [2, null], [4, null], [6, null], [7, null], [7, null], [7, null], [7, null], [7, null]], "ml_eval": [[3, "module-iowa_forecast.ml_eval"]], "ml_train": [[4, "module-iowa_forecast.ml_train"]], "plots": [[6, "module-iowa_forecast.plots"]], "utils": [[7, "module-iowa_forecast.utils"]], "Iowa Liquor Sales Forecast": [[9, "iowa-liquor-sales-forecast"]], "Modules": [[9, "modules"]], "Contents:": [[9, null]], "Indices and tables": [[9, "indices-and-tables"]], "iowa_forecast": [[1, "iowa-forecast"], [0, "iowa-forecast"]], "models_configs": [[5, "module-iowa_forecast.models_configs"]], "Classes": [[5, "classes"]], "Usage": [[5, "usage"]], "Example": [[5, null]], "Installation": [[10, "installation"]], "Requirements": [[10, "requirements"]], "Python Dependencies": [[10, "python-dependencies"]], "Google Cloud Setup": [[10, "google-cloud-setup"]], "Docker Setup (Optional)": [[10, "docker-setup-optional"]], "Running the Project": [[10, "running-the-project"]], "Troubleshooting": [[10, "troubleshooting"]], "API Reference": [[0, "api-reference"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/docs/iowa_forecast.rst b/docs/iowa_forecast.rst deleted file mode 100644 index 257e497..0000000 --- a/docs/iowa_forecast.rst +++ /dev/null @@ -1,66 +0,0 @@ -API reference -============= - -This page gives an overview of all public pandas objects, functions and methods. -All functions exposed in `iowa_forecast.*` namespace are public. - -The `iowa_forecast` package contains the following modules: - -* `iowa_forecast.load_data`: BigQuery Data Loading and Feature Engineering Module. - -* `iowa_forecast.ml_eval`: BigQuery Model Evaluation and Forecasting Module. - -* `iowa_forecast.ml_train`: BigQuery Model Training and Execution Module. - -* `iowa_forecast.plots`: Time Series Plotting and Date Handling Module. - -* `iowa_forecast.utils`: General utility functions Module. - - -`iowa\_forecast.load\_data` ---------------------------- - -.. automodule:: iowa_forecast.load_data - :members: - :undoc-members: - :show-inheritance: - -`iowa\_forecast.ml\_eval` -------------------------- - -.. automodule:: iowa_forecast.ml_eval - :members: - :undoc-members: - :show-inheritance: - -`iowa\_forecast.ml\_train` --------------------------- - -.. automodule:: iowa_forecast.ml_train - :members: - :undoc-members: - :show-inheritance: - -`iowa\_forecast.plots` ----------------------- - -.. automodule:: iowa_forecast.plots - :members: - :undoc-members: - :show-inheritance: - -`iowa\_forecast.utils` ----------------------- - -.. automodule:: iowa_forecast.utils - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: iowa_forecast - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/modules.rst b/docs/modules.rst deleted file mode 100644 index 0d00599..0000000 --- a/docs/modules.rst +++ /dev/null @@ -1,7 +0,0 @@ -iowa_forecast -============= - -.. toctree:: - :maxdepth: 4 - - iowa_forecast diff --git a/iowa_forecast/load_data.py b/iowa_forecast/load_data.py index 9ce507a..be34a8e 100644 --- a/iowa_forecast/load_data.py +++ b/iowa_forecast/load_data.py @@ -56,54 +56,22 @@ from google.cloud import bigquery from rich.progress import track -from iowa_forecast.utils import list_tables_with_pattern - - -def date_offset(n: int, freq: str) -> pd.DateOffset: - """Generate a pandas DateOffset based on the given frequency and value. - - Parameters - ---------- - n : int - The number of time units for the offset. - freq : str {'days', 'weeks', 'months', 'years'} - The frequency type. Valid options are 'days', 'weeks', 'months', 'years'. - - Returns - ------- - pd.DateOffset - A DateOffset object for the specified frequency and value. - - Raises - ------ - ValueError - If `freq` is not one of the valid options. - """ - if freq == "days": - return pd.DateOffset(days=n) - if freq == "weeks": - return pd.DateOffset(weeks=n) - if freq == "months": - return pd.DateOffset(months=n) - if freq == "years": - return pd.DateOffset(years=n) - raise ValueError( - f"The specified `freq` {freq} is not a valid frequency. " - "Valid frequencies are: 'days', 'weeks', 'months', 'years'." - ) +from iowa_forecast.utils import list_tables_with_pattern, date_offset def get_item_names_filter(items_list: List[str] | str) -> str: """ - Generate a "WHERE" clause component to filter values from column `"item_name"`. + Generate a `"WHERE"` clause component to filter values from column `"item_name"`. + Parameters + ---------- items_list : List[str] | str - Item name or names to add to the "WHERE" clause component. + Item name or names to add to the `"WHERE"` clause component. Returns ------- str - The "WHERE" clause component that can be used to filter values from column `"item_name"`. + The `"WHERE"` clause component that can be used to filter values from column `"item_name"`. Examples -------- @@ -121,15 +89,17 @@ def get_item_names_filter(items_list: List[str] | str) -> str: def get_min_datapoints_filter(min_size: int) -> str: """ - Generate a "WHERE" clause to filter items that have at least `min_size` observations. + Generate a `"WHERE"` clause to filter items that have at least `min_size` observations. + Parameters + ---------- min_size : int - Minimum number of observations to use as value for the "WHERE" clause. + Minimum number of observations to use as value for the `"WHERE"` clause. Returns ------- str - The "WHERE" clause component. + The `"WHERE"` clause component. """ return f""" WHERE diff --git a/iowa_forecast/ml_train.py b/iowa_forecast/ml_train.py index 8a63e17..75a08f5 100644 --- a/iowa_forecast/ml_train.py +++ b/iowa_forecast/ml_train.py @@ -39,6 +39,7 @@ from google.cloud import bigquery # pylint: disable=no-name-in-module from rich.progress import track +from iowa_forecast.models_configs import ARIMA_PLUS_XREG_Config, ARIMAConfig from iowa_forecast.utils import normalize_item_name @@ -49,10 +50,7 @@ def create_model_query( # pylint: disable=too-many-arguments model_name: str = "bqmlforecast.arima_plus_xreg_model", train_table_name: str = "bqmlforecast.training_data", test_table_name: str = "bqmlforecast.test_data", - holiday_region: str = "US", - auto_arima: bool = True, - adjust_step_changes: bool = True, - clean_spikes_and_dips: bool = True, + **kwargs, ) -> str: """ Generate a BigQuery 'CREATE MODEL' query for a specified item. @@ -73,33 +71,39 @@ def create_model_query( # pylint: disable=too-many-arguments The base name for the model. train_table_name : str, default="bqmlforecast.training_data" The name of the table containing training data. - test_table_name : str, default="bqmlforecast.test_data" + test_table_name : str | None, default="bqmlforecast.test_data" The name of the table containing test data. - holiday_region : str, default="US" - The holiday region to be used by the model. - auto_arima : bool, default=True - Whether to enable AUTO_ARIMA. - adjust_step_changes : bool, default=True - Whether to adjust for step changes in the data. - clean_spikes_and_dips : bool, default=True - Whether to clean spikes and dips in the data. + **kwargs : Any + Additional keyword arguments such as: + + holiday_region : str, default="US" + The holiday region to be used by the model. + auto_arima : bool, default=True + Whether to enable AUTO_ARIMA. + adjust_step_changes : bool, default=True + Whether to adjust for step changes in the data. + clean_spikes_and_dips : bool, default=True + Whether to clean spikes and dips in the data. Returns ------- str A SQL query string for creating the specified model. """ + configs = ARIMA_PLUS_XREG_Config(**kwargs) item_name_norm = normalize_item_name(item_name) + test_table_query = include_test_on_model_train(item_name, timestamp_col, + train_table_name, test_table_name) return f""" CREATE OR REPLACE MODEL `{model_name}_{item_name_norm}` OPTIONS( MODEL_TYPE='ARIMA_PLUS_XREG', TIME_SERIES_TIMESTAMP_COL='{timestamp_col}', TIME_SERIES_DATA_COL='{time_series_data_col}', - HOLIDAY_REGION='{holiday_region}', - AUTO_ARIMA={auto_arima}, - ADJUST_STEP_CHANGES={adjust_step_changes}, - CLEAN_SPIKES_AND_DIPS={clean_spikes_and_dips} + HOLIDAY_REGION='{configs.holiday_region}', + AUTO_ARIMA={configs.auto_arima}, + ADJUST_STEP_CHANGES={configs.adjust_step_changes}, + CLEAN_SPIKES_AND_DIPS={configs.clean_spikes_and_dips} ) AS SELECT * @@ -107,6 +111,44 @@ def create_model_query( # pylint: disable=too-many-arguments `{train_table_name}` WHERE item_name = "{item_name}" + {test_table_query} + ORDER BY + date + """ + + +def include_test_on_model_train( + item_name: str, + timestamp_col: str, + train_table_name: str, + test_table_name: str | None = None, +) -> str: + """ + Include test data in the model training process. + + This function generates an SQL query component to union test data with + training data if a test table is specified. + + Parameters + ---------- + item_name : str + The name of the item being modeled. + timestamp_col : str + The column name representing the timestamp in the dataset. + train_table_name : str + The name of the table containing training data. + test_table_name : str or None, optional + The name of the table containing test data. If None, no test data + is included. + + Returns + ------- + str + An SQL query string component to include test data. + """ + if not isinstance(test_table_name, str): + return "" + return f""" UNION ALL ( SELECT @@ -133,8 +175,71 @@ def create_model_query( # pylint: disable=too-many-arguments AND t2.item_name = "{item_name}" ) ) - ORDER BY - date + """ + + +def include_test_on_arima_model_train( + column: str, + time_series_timestamp_col: str, + time_series_id_col: str, + train_table_name: str, + test_table_name: str | None = None, +) -> str: + """ + Include test data in the uni-variate ARIMA model training process. + + This function generates an SQL query component to union test data with + training data if a test table is specified. + + Parameters + ---------- + column : str + The name of the feature being modeled. + time_series_timestamp_col : str + The column name representing the timestamp in the dataset. + time_series_id_col : str + The column name representing the identifier. + train_table_name : str + The name of the table containing training data. + test_table_name : str or None, optional + The name of the table containing test data. If None, no test data + is included. + + Returns + ------- + str + An SQL query string component to include test data. + """ + if not isinstance(test_table_name, str): + return "" + return f""" + UNION ALL + ( + SELECT + * + FROM ( + SELECT + t2.{time_series_timestamp_col}, + t2.{column}, + t2.{time_series_id_col} + FROM + `{test_table_name}` AS t2 + JOIN + ( + SELECT + {time_series_id_col}, + MAX({time_series_timestamp_col}) AS max_date + FROM + `{train_table_name}` + GROUP BY + {time_series_id_col} + ) AS md + ON + t2.{time_series_id_col} = md.{time_series_id_col} + WHERE + t2.{time_series_timestamp_col} > md.max_date + ) + ) """ @@ -200,16 +305,13 @@ def create_models_for_items( # pylint: disable=too-many-arguments time_series_data_col: str = "total_amount_sold", model_name: str = "bqmlforecast.arima_plus_xreg_model", train_table_name: str = "bqmlforecast.training_data", - test_table_name: str = "bqmlforecast.test_data", - holiday_region: str = "US", - auto_arima: bool = True, - adjust_step_changes: bool = True, - clean_spikes_and_dips: bool = True, + test_table_name: str | None = "bqmlforecast.test_data", + **kwargs, ) -> None: """ - Create ARIMA_PLUS_XREG models for a list of items. + Create `'ARIMA_PLUS_XREG'` models for a list of items. - This function generates and executes a CREATE MODEL query + This function generates and executes a `'CREATE MODEL'` query for each item in the provided list. The models are created using the specified training and test tables in BigQuery. @@ -230,16 +332,21 @@ def create_models_for_items( # pylint: disable=too-many-arguments The base name for the models. train_table_name : str, default="bqmlforecast.training_data" The name of the table containing training data. - test_table_name : str, default="bqmlforecast.test_data" + test_table_name : str | None, default="bqmlforecast.test_data" The name of the table containing test data. - holiday_region : str, default="US" - The holiday region to be used by the models. - auto_arima : bool, default=True - Whether to enable AUTO_ARIMA. - adjust_step_changes : bool, default=True - Whether to adjust for step changes in the data. - clean_spikes_and_dips : bool, default=True - Whether to clean spikes and dips in the data. + If `None`, then only the data from `train_table_name` is used for + training the model. See the 'Notes' section for more information. + **kwargs : Any + Additional keyword arguments such as: + + holiday_region : str, default="US" + The holiday region to be used by the models. + auto_arima : bool, default=True + Whether to enable `'AUTO_ARIMA'`. + adjust_step_changes : bool, default=True + Whether to adjust for step changes in the data. + clean_spikes_and_dips : bool, default=True + Whether to clean spikes and dips in the data. Notes ----- @@ -252,6 +359,13 @@ def create_models_for_items( # pylint: disable=too-many-arguments If using a Google Cloud account with billing enabled, running this code might incur charges. + + If you are evaluating the model, you shouldn't use all available data + to train the model. Therefore, if you're evaluating the model, consider + setting the parameter `test_table_name` to `None`. Doing so will cause + the model to be trained using only the specified data from the + `train_table_name` which in turn will allow you to use the data from + `test_table_name` for evaluation. """ _items_list = ( items_list if not isinstance(max_items, int) else items_list[:max_items] @@ -264,10 +378,7 @@ def create_models_for_items( # pylint: disable=too-many-arguments model_name, train_table_name, test_table_name, - holiday_region, - auto_arima, - adjust_step_changes, - clean_spikes_and_dips, + **kwargs, ) execute_query_with_retries(client, query) @@ -277,17 +388,19 @@ def train_arima_models( # pylint: disable=too-many-locals, too-many-arguments columns: List[str], model: str = "bqmlforecast.arima_model", train_table_name: str = "bqmlforecast.training_data", - test_table_name: str = "bqmlforecast.test_data", + test_table_name: str | None = "bqmlforecast.test_data", model_metrics_table_name: str | None = "bqmlforecast.arima_model_metrics", time_series_timestamp_col: str = "date", time_series_id_col: str = "item_name", - confidence_level=0.9, - horizon=7, + confidence_level: float = 0.9, + horizon: int = 7, + use_test_data_on_train: bool = True, + **kwargs, ): """ Train ARIMA models for a list of columns and store their metrics. - This function generates and executes 'CREATE MODEL' queries for ARIMA + This function generates and executes `'CREATE MODEL'` queries for ARIMA models using the specified columns, and evaluates their performance by creating tables of model metrics. @@ -304,7 +417,7 @@ def train_arima_models( # pylint: disable=too-many-locals, too-many-arguments The base name for the ARIMA models. train_table_name : str, default="bqmlforecast.training_data" The name of the table containing training data. - test_table_name : str, default="bqmlforecast.test_data" + test_table_name : str | None, default="bqmlforecast.test_data" The name of the table containing test data. model_metrics_table_name : str or None, default="bqmlforecast.arima_model_metrics" The base name for the tables where model metrics will be stored. @@ -316,25 +429,37 @@ def train_arima_models( # pylint: disable=too-many-locals, too-many-arguments The confidence level used in the model evaluation. horizon : int, default=7 The number of time steps (days) to forecast. - + use_test_data_on_train : bool, default=True + Whether to use test data during model training. """ + config = ARIMAConfig(**kwargs) + for column in track(columns, description="Creating ARIMA models..."): model_name = f"{model}_{column}" + test_data_query = "" + if use_test_data_on_train: + test_data_query = include_test_on_arima_model_train( + column, + time_series_timestamp_col, + time_series_id_col, + train_table_name, + test_table_name, + ) train_arima_query = f""" CREATE OR REPLACE MODEL `{model_name}` OPTIONS( - MODEL_TYPE = 'ARIMA_PLUS', - AUTO_ARIMA = TRUE, + MODEL_TYPE = '{config.model_type}', + AUTO_ARIMA = {config.auto_arima}, HORIZON = {horizon}, TIME_SERIES_TIMESTAMP_COL = '{time_series_timestamp_col}', TIME_SERIES_DATA_COL = '{column}', TIME_SERIES_ID_COL = '{time_series_id_col}', - FORECAST_LIMIT_LOWER_BOUND = 0, - DECOMPOSE_TIME_SERIES = TRUE, - HOLIDAY_REGION = 'US', - DATA_FREQUENCY = 'AUTO_FREQUENCY', - ADJUST_STEP_CHANGES = TRUE, - CLEAN_SPIKES_AND_DIPS = TRUE + FORECAST_LIMIT_LOWER_BOUND = {config.forecast_limit_lower_bound}, + DECOMPOSE_TIME_SERIES = {config.decompose_time_series}, + HOLIDAY_REGION = '{config.holiday_region}', + DATA_FREQUENCY = '{config.data_frequency}', + ADJUST_STEP_CHANGES = {config.adjust_step_changes}, + CLEAN_SPIKES_AND_DIPS = {config.clean_spikes_and_dips} ) AS SELECT {time_series_timestamp_col}, @@ -342,33 +467,7 @@ def train_arima_models( # pylint: disable=too-many-locals, too-many-arguments {time_series_id_col} FROM `{train_table_name}` - UNION ALL - ( - SELECT - * - FROM ( - SELECT - t2.{time_series_timestamp_col}, - t2.{column}, - t2.{time_series_id_col} - FROM - `{test_table_name}` AS t2 - JOIN - ( - SELECT - {time_series_id_col}, - MAX({time_series_timestamp_col}) AS max_date - FROM - `{train_table_name}` - GROUP BY - {time_series_id_col} - ) AS md - ON - t2.{time_series_id_col} = md.{time_series_id_col} - WHERE - t2.{time_series_timestamp_col} > md.max_date - ) - ) + {test_data_query} """ train_arima_job = client.query(train_arima_query) train_arima_job.result() diff --git a/iowa_forecast/models_configs.py b/iowa_forecast/models_configs.py new file mode 100644 index 0000000..e46b153 --- /dev/null +++ b/iowa_forecast/models_configs.py @@ -0,0 +1,167 @@ +""" +This module provides classes for managing and validating configuration parameters +for various machine learning models, specifically focusing on ARIMA-based models. +The module includes a base class that standardizes the process of handling model +configuration, ensuring that all derived classes follow a consistent pattern for +validating and setting parameters. + +Classes +------- +AbstractBaseModelConfig : ABC + An abstract base class for the `BaseModelConfig` class. + +BaseModelConfig : AbstractBaseModelConfig + A base class that provides common functionality for model + configuration, including parameter validation, default value handling, and + error checking. Subclasses are required to define a `SUPPORTED_PARAMETERS` + dictionary that specifies the expected parameter types, default values, + and any valid choices. + +ARIMAConfig : BaseModelConfig + A configuration class for ARIMA model parameters. Inherits from `BaseModelConfig` + and defines specific parameters used by ARIMA and ARIMA_PLUS models. This class + ensures that the parameters adhere to the expected types and valid choices. + +ARIMA_PLUS_XREG_Config : BaseModelConfig + A configuration class for ARIMA_PLUS_XREG model parameters. This class extends + `BaseModelConfig` and includes additional parameters for handling exogenous + variables (`xreg_features`) and other settings specific to the `ARIMA_PLUS_XREG` model. + +Usage +----- +These configuration classes are intended to be used in the setup and validation of +model parameters before they are passed to machine learning model training functions. +By leveraging these classes, developers can ensure that all configuration parameters +are correctly typed, fall within valid ranges, and adhere to expected choices, reducing +the likelihood of runtime errors. + +Example +------- +>>> config = ARIMAConfig(model_type="ARIMA") +>>> print(config.model_type) +'ARIMA' + +>>> xreg_config = ARIMA_PLUS_XREG_Config( +... model_type="ARIMA_PLUS_XREG", +... xreg_features=["feature1", "feature2"], +... non_negative_forecast=True +... ) +>>> print(xreg_config.xreg_features) +['feature1', 'feature2'] +""" +from abc import ABC, abstractmethod +from typing import Any, Dict, Tuple, List + + +class AbstractBaseModelConfig(ABC): # pylint: disable=too-few-public-methods + """Abstract base class for `BaseModelConfig` configuration class.""" + + @property + @abstractmethod + def SUPPORTED_PARAMETERS(self) -> Dict[ # pylint: disable=invalid-name + str, Tuple[Any, Any, List[Any]] + ]: + """ + This abstract property must be implemented by subclasses. + It should return a dictionary where the keys are parameter names, + and the values are tuples containing the expected type, default value, + and a list of valid choices (if any). + """ + + +class BaseModelConfig(AbstractBaseModelConfig): + """ + Base class for model configuration parameters. + + This class provides common functionality for handling configuration parameters + passed via kwargs, including unpacking, validation, and setting default values. + + Subclasses must define the `SUPPORTED_PARAMETERS` dictionary, which specifies + the expected parameter types, default values, and any restricted choices. + """ + + @property + def SUPPORTED_PARAMETERS(self) -> Dict[str, Tuple[Any, Any, List[Any]]]: + return {} + + def __init__(self, **kwargs): + self._params = {} + self._validate_and_set_parameters(kwargs) + + def _validate_and_set_parameters(self, kwargs: Dict[str, Any]): + for key, (expected_type, default_value, choices) in self.SUPPORTED_PARAMETERS.items(): + if key in kwargs: + value = kwargs[key] + if not isinstance(value, expected_type): + raise ValueError( + f"Invalid value for parameter '{key}': expected {expected_type.__name__}, " + f"but got {type(value).__name__}." + ) + if choices and value not in choices: + raise ValueError( + f"Invalid value for parameter '{key}': got '{value}', " + f"but expected one of {choices}." + ) + self._params[key] = value + else: + self._params[key] = default_value + + # Identify unsupported parameters + unsupported_params = set(kwargs) - set(self.SUPPORTED_PARAMETERS) + if unsupported_params: + raise ValueError( + f"Unsupported parameters provided: {', '.join(unsupported_params)}. " + "Please check your input." + ) + + def __getattr__(self, name: str) -> Any: + if name in self._params: + return self._params[name] + raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") + + +class ARIMAConfig(BaseModelConfig): # pylint: disable=too-few-public-methods + """ + Configuration class for `'ARIMA'` model parameters. + + Inherits common functionality from `BaseModelConfig` and defines specific + parameters for `'ARIMA'` models, including validation of choices for some + parameters. + """ + + @property + def SUPPORTED_PARAMETERS(self) -> Dict[str, Tuple[Any, Any, List[Any]]]: + return { + "model_type": (str, "ARIMA_PLUS", ["ARIMA_PLUS", "ARIMA"]), + "auto_arima": (bool, True, []), + "forecast_limit_lower_bound": (int, 0, []), + "clean_spikes_and_dips": (bool, True, []), + "decompose_time_series": (bool, True, []), + "holiday_region": (str, "US", []), + "data_frequency": (str, "AUTO_FREQUENCY", + ["AUTO_FREQUENCY", "DAILY", "WEEKLY", "MONTHLY"]), + "adjust_step_changes": (bool, True, []), + } + + +class ARIMA_PLUS_XREG_Config(BaseModelConfig): # pylint: disable=invalid-name, too-few-public-methods + """ + Configuration class for `'ARIMA_PLUS_XREG'` model parameters. + + Inherits common functionality from `BaseModelConfig` and defines specific + parameters for `'ARIMA_PLUS_XREG'` models, including validation of choices for + some parameters. + """ + + @property + def SUPPORTED_PARAMETERS(self) -> Dict[str, Tuple[Any, Any, List[Any]]]: + return { + "model_type": (str, "ARIMA_PLUS_XREG", ["ARIMA_PLUS_XREG"]), + "auto_arima": (bool, True, []), + "clean_spikes_and_dips": (bool, True, []), + "holiday_region": (str, "US", []), + "data_frequency": (str, "AUTO_FREQUENCY", + ["AUTO_FREQUENCY", "DAILY", "WEEKLY", "MONTHLY"]), + "adjust_step_changes": (bool, True, []), + "non_negative_forecast": (bool, False, []), + } diff --git a/iowa_forecast/utils.py b/iowa_forecast/utils.py index 4072152..9d1291e 100644 --- a/iowa_forecast/utils.py +++ b/iowa_forecast/utils.py @@ -4,6 +4,7 @@ from __future__ import annotations from typing import List, Tuple +import re import pandas as pd import fnmatch @@ -251,3 +252,102 @@ def list_tables_with_pattern( ] return matching_tables + + +def parse_combined_string(combined: str) -> dict: + """Parse a combined offset string into its components. + + Parameters + ---------- + combined : str + A combined string specifying the offset, e.g., `'2Y3M2W1D'`. + + Returns + ------- + dict + A dictionary with keys `'years'`, `'months'`, `'weeks'`, `'days'` + and their corresponding values. + + Raises + ------ + ValueError + If the combined string is invalid. + """ + pattern = re.compile( + r'(?P\d+Y)?(?P \d+M)?(?P \d+W)?(?P \d+D)?', + re.IGNORECASE + ) + match = pattern.fullmatch(combined) + if not match: + raise ValueError(f"The specified `combined` string {combined} is not valid.") + + return {k: int(v[:-1]) if v else 0 for k, v in match.groupdict().items()} + + +def create_date_offset_from_parts(years=0, months=0, weeks=0, days=0) -> pd.DateOffset: + """Create a `pandas.DateOffset` object from individual time components. + + Parameters + ---------- + years : int, default=0 + Number of years for the offset. + months : int, default=0 + Number of months for the offset. + weeks : int, default=0 + Number of weeks for the offset. + days : int, default=0 + Number of days for the offset. + + Returns + ------- + pd.DateOffset + A `pandas.DateOffset` object for the specified time components. + """ + return pd.DateOffset(years=years, months=months, weeks=weeks, days=days) + + +def date_offset(*args: Union[int, str], freq: str = None) -> pd.DateOffset: + """ + Generate a `pandas.DateOffset` based on the given frequency and value or a combined string. + + Parameters + ---------- + args : int or str + * If one argument is provided, it should be a combined string specifying + the offset, e.g., `'2Y3M2W1D'`. + * If two arguments are provided, they should be `n` (int) and `freq` (str). + freq : str {'days', 'weeks', 'months', 'years'}, optional + The frequency type. Valid options are `'days'`, `'weeks'`, `'months'`, `'years'`. + Ignored if `combined` is provided. + + Returns + ------- + pd.DateOffset + A `pandas.DateOffset` object for the specified frequency and value. + + Raises + ------ + ValueError + If `freq` is not one of the valid options or if the combined string is invalid. + """ + if len(args) == 1 and isinstance(args[0], str): + combined = args[0] + offset_parts = parse_combined_string(combined) + return create_date_offset_from_parts(**offset_parts) + + if len(args) == 2 and isinstance(args[0], int) and isinstance(args[1], str): + n, freq = args + freq = freq.lower() + valid_freqs = {"d": "days", "day": "days", "days": "days", + "w": "weeks", "week": "weeks", "weeks": "weeks", + "m": "months", "month": "months", "months": "months", + "y": "years", "year": "years", "years": "years"} + + if freq not in valid_freqs: + raise ValueError(f"The specified `freq` {freq} is not a valid frequency. " + "Valid frequencies are: 'days', 'weeks', 'months', 'years'.") + + return create_date_offset_from_parts(**{valid_freqs[freq]: n}) + + raise ValueError( + "Either provide a single combined string or both `n` and `freq` as arguments.") diff --git a/notebooks/Walkthrough.ipynb b/notebooks/Walkthrough.ipynb index 1df40f3..294494d 100644 --- a/notebooks/Walkthrough.ipynb +++ b/notebooks/Walkthrough.ipynb @@ -13,14 +13,16 @@ "## Before You Begin\n", "\n", "To run this notebook, please make sure you have installed on your Python environment\n", - "the `iowa_forecast` package. To install the `iowa_forecast` package, execute the\n", - "following command from the project root directory (`\"iowa_sales_forecast\"`):\n", + "the iowa_forecast package.\n", + "To install the iowa_forecast package, execute the\n", + "following command from the project root directory\n", + "(\"iowa_forecast\"):\n", "\n", "```console\n", "pip install -e .\n", "```\n", "\n", - "The above command will install the `iowa_forecast` package in development \n", + "The above command will install the iowa_forecast
package in development \n", "mode and the necessary dependencies defined inside the files\n", "[pyproject.toml](../pyproject.toml) and [requirements.txt](../requirements.txt).\n", "\n", @@ -39,7 +41,7 @@ { "metadata": {}, "cell_type": "markdown", - "source": "## Import Necessary Libraries", + "source": "## Import the Necessary Libraries", "id": "77e6dd67488554df" }, { @@ -54,8 +56,8 @@ "shell.execute_reply.started": "2024-08-07T23:09:36.472135Z" }, "ExecuteTime": { - "end_time": "2024-08-09T13:19:32.450374Z", - "start_time": "2024-08-09T13:19:32.444370Z" + "end_time": "2024-08-12T22:26:52.897002Z", + "start_time": "2024-08-12T22:26:52.312869Z" } }, "source": [ @@ -67,18 +69,18 @@ "import pandas as pd\n", "import seaborn as sns\n", "from google.cloud.bigquery import Client\n", + "\n", "from iowa_forecast.load_data import (create_future_data,\n", " create_future_feature_tables,\n", " get_training_data)\n", - "from iowa_forecast.ml_eval import (explain_model,\n", - " multi_evaluate_predictions)\n", + "from iowa_forecast.ml_eval import multi_evaluate_predictions\n", "from iowa_forecast.ml_train import create_models_for_items, train_arima_models\n", "from iowa_forecast.plots import plot_historical_and_forecast\n", "from iowa_forecast.utils import (create_bigquery_table_from_pandas,\n", " create_dataset_if_not_found)" ], "outputs": [], - "execution_count": 18 + "execution_count": 1 }, { "metadata": {}, @@ -98,24 +100,15 @@ "shell.execute_reply.started": "2024-08-07T17:41:32.102135Z" }, "ExecuteTime": { - "end_time": "2024-08-09T13:10:45.013294Z", - "start_time": "2024-08-09T13:10:45.009480Z" + "end_time": "2024-08-12T22:26:54.103244Z", + "start_time": "2024-08-12T22:26:54.074691Z" } }, "source": [ "%load_ext google.cloud.bigquery" ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The google.cloud.bigquery extension is already loaded. To reload it, use:\n", - " %reload_ext google.cloud.bigquery\n" - ] - } - ], - "execution_count": 9 + "outputs": [], + "execution_count": 2 }, { "metadata": {}, @@ -135,8 +128,8 @@ "shell.execute_reply.started": "2024-08-07T23:09:41.154486Z" }, "ExecuteTime": { - "end_time": "2024-08-09T13:10:46.114951Z", - "start_time": "2024-08-09T13:10:46.109758Z" + "end_time": "2024-08-12T22:26:54.583602Z", + "start_time": "2024-08-12T22:26:54.580188Z" } }, "source": [ @@ -145,7 +138,7 @@ "sns.set_theme()" ], "outputs": [], - "execution_count": 10 + "execution_count": 3 }, { "metadata": {}, @@ -170,8 +163,8 @@ "shell.execute_reply.started": "2024-08-07T23:12:29.834745Z" }, "ExecuteTime": { - "end_time": "2024-08-09T13:18:04.941860Z", - "start_time": "2024-08-09T13:18:04.885037Z" + "end_time": "2024-08-12T22:26:55.460792Z", + "start_time": "2024-08-12T22:26:55.399717Z" } }, "source": [ @@ -195,8 +188,8 @@ ")\n", "\n", "PROJECT_ID = os.environ.get(\"PROJECT_ID\")\n", - "DATASET_NAME = os.environ.get(\"DATASET_NAME\", \"bqmlforecast\")\n", "GOOGLE_APPLICATION_CREDENTIALS = os.environ.get(\"GOOGLE_APPLICATION_CREDENTIALS\")\n", + "DATASET_NAME = os.environ.get(\"DATASET_NAME\", \"bqmlforecast\")\n", "\n", "if not any([PROJECT_ID, GOOGLE_APPLICATION_CREDENTIALS]):\n", " raise EnvironmentError(\n", @@ -219,6 +212,7 @@ "client_kwargs = {}\n", "if isinstance(PROJECT_ID, str):\n", " client_kwargs[\"project\"] = PROJECT_ID\n", + "\n", "if isinstance(GOOGLE_APPLICATION_CREDENTIALS, str):\n", " if not Path(GOOGLE_APPLICATION_CREDENTIALS).is_file():\n", " raise FileNotFoundError(\n", @@ -242,10 +236,11 @@ "END_DATE = END_DATE.strftime(\"%Y-%m-%d\")\n", "START_DATE = START_DATE.strftime(\"%Y-%m-%d\")\n", "TEST_START_DATE = TEST_START_DATE.strftime(\"%Y-%m-%d\")\n", - "HORIZON = 30" + "HORIZON = 30\n", + "MAX_ITEMS = 4" ], "outputs": [], - "execution_count": 16 + "execution_count": 4 }, { "metadata": {}, @@ -261,8 +256,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2024-08-09T13:12:51.670618Z", - "start_time": "2024-08-09T13:12:50.397387Z" + "end_time": "2024-08-12T22:26:57.735735Z", + "start_time": "2024-08-12T22:26:56.748797Z" } }, "cell_type": "code", @@ -273,11 +268,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "Created dataset 'bqmlforecast'.\n" + "Dataset 'bqmlforecast' already exists.\n" ] } ], - "execution_count": 14 + "execution_count": 5 }, { "metadata": {}, @@ -288,10 +283,10 @@ "Next, we'll create the train and test tables using the `get_training_data`\n", "function.\n", "\n", - "The `get_training_data` function allows us to specify the starting and ending \n", - "dates to use when the dataset. Therefore, by specifying these parameters,\n", - "we can create the training and test tables using the same function.\n", - "Additionally, this function creates or updates the created tables to BigQuery.\n", + "The `get_training_data` function allows us to specify the starting and ending\n", + "dates to use when creating the dataset. Therefore, by specifying these\n", + "parameters, we can create the training and test tables using the same function.\n", + "Additionally, this function creates or updates the tables to BigQuery.\n", "\n", "> **Note:** when creating the test dataset, we specify the list of items that\n", "> exist in the training data so that both dataframes include information\n", @@ -312,8 +307,8 @@ }, "scrolled": true, "ExecuteTime": { - "end_time": "2024-08-09T13:13:26.484286Z", - "start_time": "2024-08-09T13:13:00.009814Z" + "end_time": "2024-08-12T22:27:30.146968Z", + "start_time": "2024-08-12T22:26:58.077748Z" } }, "source": [ @@ -324,18 +319,34 @@ " end_date=END_DATE,\n", ")\n", "\n", - "items_list = df_train.groupby(\"item_name\")[\"total_amount_sold\"].sum().sort_values(ascending=False).index.to_list()\n", + "items_list = (\n", + " df_train\n", + " .groupby(\"item_name\")[\"total_amount_sold\"].sum()\n", + " .sort_values(ascending=False).index.to_list()\n", + ")[:MAX_ITEMS]\n", + "\n", + "df_train = get_training_data(\n", + " client,\n", + " table_name=f\"{DATASET_NAME}.training_data\",\n", + " start_date=START_DATE,\n", + " end_date=END_DATE,\n", + " items_list=items_list,\n", + ")\n", "\n", "# When `end_date` is not specified, the function uses today's date as the\n", "# default value for the parameter.\n", - "df_test = get_training_data(client, start_date=TEST_START_DATE, table_name=\"bqmlforecast.test_data\", items_list=items_list)" + "df_test = get_training_data(\n", + " client, start_date=TEST_START_DATE,\n", + " table_name=f\"{DATASET_NAME}.test_data\",\n", + " items_list=items_list,\n", + ")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n" + " \n" ] }, { @@ -343,25 +354,39 @@ "output_type": "stream", "text": [ "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n", - "I0000 00:00:1723209193.141396 1314006 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n" + "I0000 00:00:1723501631.121924 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "I0000 00:00:1723501641.558284 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - " \n" + " \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "I0000 00:00:1723209205.081498 1314006 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n" + "I0000 00:00:1723501648.304233 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n" ] } ], - "execution_count": 15 + "execution_count": 6 }, { "metadata": {}, @@ -412,33 +437,33 @@ " using the `YEAR` function.\n", "\n", "* **`ma3_total_volume_sold_liters`:** \n", - " * **Description:** The 3-day moving average of the total volume of the\n", + " * **Description:** The 3-day moving average of the total volume from the\n", " item sold in liters. This is calculated as the average of the\n", " `total_volume_sold_liters` over the current and preceding two days.\n", "\n", "* **`ma3_avg_bottle_price`:** \n", " * **Description:** The 3-day moving average of the average retail price\n", - " of a bottle for the item. This is calculated as the average of the\n", + " from a bottle for the item. This is calculated as the average of the\n", " `avg_bottle_price` over the current and preceding two days.\n", "\n", "* **`ma7_total_volume_sold_liters`:** \n", - " * **Description:** The 7-day moving average of the total volume of the\n", + " * **Description:** The 7-day moving average of the total volume from the\n", " item sold in liters. This is calculated as the average of the\n", " `total_volume_sold_liters` over the current and preceding six days.\n", "\n", "* **`ma7_avg_bottle_price`:** \n", " * **Description:** The 7-day moving average of the average retail price\n", - " of a bottle for the item. This is calculated as the average of the\n", + " from a bottle for the item. This is calculated as the average of the\n", " `avg_bottle_price` over the current and preceding six days.\n", "\n", "* **`ma30_total_volume_sold_liters`:** \n", - " * **Description:** The 30-day moving average of the total volume of the\n", + " * **Description:** The 30-day moving average of the total volume from the\n", " item sold in liters. This is calculated as the average of the\n", " `total_volume_sold_liters` over the current and preceding 29 days.\n", "\n", "* **`ma30_avg_bottle_price`:** \n", " * **Description:** The 30-day moving average of the average retail price\n", - " of a bottle for the item. This is calculated as the average of the\n", + " from a bottle for the item. This is calculated as the average of the\n", " `avg_bottle_price` over the current and preceding 29 days.\n", "\n", "* **`temperature`:** \n", @@ -476,26 +501,25 @@ "\n", "Since we don't have our model's features values during forecast, we need to \n", "somehow estimate their values and use these estimates to predict future sales.\n", - "The following code trains univariate ARIMA models and creates tables with\n", + "The following code trains uni-variate ARIMA models and creates tables with\n", "predicted values for each of our \"base\" features.\n", "\n", - "> **Note:** Our final model contains additional features but they are all\n", - "> subproducts of these three columns defined inside the `columns` list." + "> **Note:** Our final model contains additional features, but they are all\n", + "> byproducts of these three columns defined inside the `columns` list." ], "id": "a91d2fc906f5a1ca" }, { "metadata": { - "jupyter": { - "is_executing": true - }, "ExecuteTime": { - "start_time": "2024-08-09T13:19:39.911914Z" + "end_time": "2024-08-12T22:28:40.490099Z", + "start_time": "2024-08-12T22:27:30.149096Z" } }, "cell_type": "code", "source": [ "columns = [\"avg_bottle_price\", \"avg_bottle_cost\", \"total_volume_sold_liters\"]\n", + "\n", "train_arima_models(\n", " client,\n", " columns,\n", @@ -507,7 +531,9 @@ " time_series_id_col=\"item_name\",\n", " confidence_level=0.9,\n", " horizon=HORIZON,\n", + " use_test_data_on_train=False,\n", ")\n", + "\n", "create_future_feature_tables(\n", " client,\n", " columns=columns,\n", @@ -527,31 +553,94 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "c1d4af047a894722a4897bb16ab17e1f" + "model_id": "264fc41fd0e545d1b409248f6caf8cc2" + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [], + "text/html": [ + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + " \n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Output()" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "81071aafedc649589090e1fbc8d04ff3" } }, "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [], + "text/html": [ + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], - "execution_count": null + "execution_count": 7 }, { "metadata": {}, "cell_type": "markdown", "source": [ - "## Create Table for Future Sales Predictions\n", + "## Create a Table for Future Sales Predictions\n", "\n", - "Next we'll create/update a table inside BigQuery with future dates and the \n", + "Next, we'll create/update a table inside BigQuery with future dates and the \n", "predicted values of our features from our trained ARIMA models." ], "id": "f1182a34e89372dc" }, { - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-08-12T22:28:57.574343Z", + "start_time": "2024-08-12T22:28:49.250050Z" + } + }, "cell_type": "code", - "outputs": [], - "execution_count": null, "source": [ "create_future_data(\n", " client=client,\n", @@ -562,7 +651,17 @@ " dataset_id=DATASET_NAME,\n", ")" ], - "id": "76a7bcee9c41fe4" + "id": "76a7bcee9c41fe4", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "I0000 00:00:1723501730.330978 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n" + ] + } + ], + "execution_count": 8 }, { "cell_type": "markdown", @@ -572,16 +671,69 @@ "## Train Sales Forecasting Models\n", "\n", "The function `create_models_for_items` trains a multivariate ARIMA model for each `'item_name'` specified in the `items_list` parameter.\n", - "By default the models are saved as `'bqmlforecast.arima_plus_xreg_model_'`. For example: `bqmlforecast.arima_plus_xreg_model_black_velvet`." + "By default, the models are saved as `'bqmlforecast.arima_plus_xreg_model_ '`.\n", + "\n", + "**For example:** bqmlforecast.arima_plus_xreg_model_black_velvet
." ] }, { "cell_type": "code", - "execution_count": null, "id": "9dbc1efc-eb17-4ab2-ba7b-2837301d6774", - "metadata": {}, - "outputs": [], - "source": "create_models_for_items(client, items_list, max_items=4, clean_spikes_and_dips=True)" + "metadata": { + "ExecuteTime": { + "end_time": "2024-08-12T22:30:54.693995Z", + "start_time": "2024-08-12T22:29:23.345278Z" + } + }, + "source": [ + "create_models_for_items(\n", + " client,\n", + " items_list,\n", + " max_items=MAX_ITEMS,\n", + " clean_spikes_and_dips=True,\n", + " test_table_name=None,\n", + ")" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "Output()" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "2618d4c00f634b32b5e6afc5535bae61" + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [], + "text/html": [ + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\n" + ], + "text/html": [ + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 9 }, { "metadata": {}, @@ -590,29 +742,34 @@ "id": "f7aae4956c0eadce" }, { - "cell_type": "code", - "execution_count": 193, - "id": "9fc07352-5a53-42e7-95bb-aaff4eca0926", "metadata": { - "execution": { - "iopub.execute_input": "2024-08-08T01:10:37.320062Z", - "iopub.status.busy": "2024-08-08T01:10:37.319628Z", - "iopub.status.idle": "2024-08-08T01:11:18.524454Z", - "shell.execute_reply": "2024-08-08T01:11:18.523350Z", - "shell.execute_reply.started": "2024-08-08T01:10:37.320030Z" + "ExecuteTime": { + "end_time": "2024-08-12T22:33:51.198438Z", + "start_time": "2024-08-12T22:33:15.204713Z" } }, + "cell_type": "code", + "source": [ + "forecast_dict = multi_evaluate_predictions(\n", + " client,\n", + " items_list[:MAX_ITEMS],\n", + " confidence_level=0.9,\n", + " horizon=HORIZON,\n", + " forecast_table_name=f\"{PROJECT_ID}.{DATASET_NAME}.future_forecast_data\",\n", + ")" + ], + "id": "409a89e2dfa3c892", "outputs": [ { "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "a2449628484d41c3a347fd159f398176", - "version_major": 2, - "version_minor": 0 - }, "text/plain": [ "Output()" - ] + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "34cc8bfbc5b94d0fae4b9aee7dd9179b" + } }, "metadata": {}, "output_type": "display_data" @@ -621,91 +778,984 @@ "name": "stderr", "output_type": "stream", "text": [ - "I0000 00:00:1723079439.210618 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079442.664537 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079446.244555 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079449.490618 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079452.582544 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079456.001371 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079459.265723 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079462.270139 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079465.979327 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079469.136013 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079472.638912 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", - "I0000 00:00:1723079475.920068 512714 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n" + "I0000 00:00:1723501996.467930 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723501999.641256 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502002.647667 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502005.389530 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502008.272938 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502011.927910 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502014.797378 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502017.566189 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502020.571530 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502023.502798 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502026.267326 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n", + "I0000 00:00:1723502029.515344 822971 check_gcp_environment_no_op.cc:29] ALTS: Platforms other than Linux and Windows are not supported\n" ] }, { "data": { + "text/plain": [], "text/html": [ "\n" - ], - "text/plain": [] + ] }, "metadata": {}, "output_type": "display_data" }, { "data": { + "text/plain": [ + "\n" + ], "text/html": [ "\n", "\n" - ], - "text/plain": [ - "\n" ] }, "metadata": {}, "output_type": "display_data" + } + ], + "execution_count": 10 + }, + { + "cell_type": "code", + "id": "9fc07352-5a53-42e7-95bb-aaff4eca0926", + "metadata": { + "execution": { + "iopub.execute_input": "2024-08-08T01:10:37.320062Z", + "iopub.status.busy": "2024-08-08T01:10:37.319628Z", + "iopub.status.idle": "2024-08-08T01:11:18.524454Z", + "shell.execute_reply": "2024-08-08T01:11:18.523350Z", + "shell.execute_reply.started": "2024-08-08T01:10:37.320030Z" }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "mode": "lines", - "name": "Historical", - "type": "scatter", - "x": [ - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-01T00:00:00", - "2024-06-02T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-09T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-16T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-23T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-06-29T00:00:00", - "2024-06-30T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", + "ExecuteTime": { + "end_time": "2024-08-12T22:36:28.500779Z", + "start_time": "2024-08-12T22:36:19.200229Z" + } + }, + "source": [ + "items_predictions = []\n", + "for item_name, forecast_info in forecast_dict.items():\n", + " training_df = forecast_info[\"train_df\"].sort_values(\"date\").assign(\n", + " **{\n", + " \"forecast_value\": 0,\n", + " \"prediction_interval_lower_bound\": 0,\n", + " \"prediction_interval_upper_bound\": 0,\n", + " \"confidence_level\": 0,\n", + " \"time_series_type\": \"history\",\n", + " }\n", + " )\n", + " predictions_df = forecast_info[\"eval_df\"].sort_values(\"date\").assign(\n", + " **{\"time_series_type\": \"forecast\"}\n", + " )\n", + " items_predictions = [*items_predictions, training_df, predictions_df]\n", + " plot_historical_and_forecast(\n", + " input_timeseries=training_df,\n", + " timestamp_col_name=\"date\",\n", + " data_col_name=\"total_amount_sold\",\n", + " forecast_output=predictions_df,\n", + " actual=predictions_df,\n", + " title=f\"Item: {item_name}\",\n", + " plotstartdate=(pd.to_datetime(END_DATE) - pd.DateOffset(months=2)).strftime(\"%Y-%m-%d\"),\n", + " prop={'size': 12},\n", + " engine=\"plotly\",\n", + " )\n", + "\n", + "items_predictions_df = (\n", + " pd.concat(items_predictions, ignore_index=True)\n", + " .sort_values([\"item_name\", \"date\"])\n", + ")\n", + "items_predictions_df = items_predictions_df.fillna(0).astype(\n", + " {\n", + " col: str for col in\n", + " items_predictions_df.select_dtypes(include=object).columns\n", + " }\n", + ")\n", + "create_bigquery_table_from_pandas(\n", + " client,\n", + " items_predictions_df,\n", + " \"predictions_table\",\n", + " DATASET_NAME,\n", + ")" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.11/site-packages/_plotly_utils/basevalidators.py:106: FutureWarning:\n", + "\n", + "The behavior of DatetimeProperties.to_pydatetime is deprecated, in a future version this will return a Series containing python datetime objects instead of an ndarray. To retain the old behavior, call `np.array` on the result\n", + "\n", + "/usr/local/lib/python3.11/site-packages/_plotly_utils/basevalidators.py:106: FutureWarning:\n", + "\n", + "The behavior of DatetimeProperties.to_pydatetime is deprecated, in a future version this will return a Series containing python datetime objects instead of an ndarray. To retain the old behavior, call `np.array` on the result\n", + "\n", + "/usr/local/lib/python3.11/site-packages/_plotly_utils/basevalidators.py:106: FutureWarning:\n", + "\n", + "The behavior of DatetimeProperties.to_pydatetime is deprecated, in a future version this will return a Series containing python datetime objects instead of an ndarray. To retain the old behavior, call `np.array` on the result\n", + "\n", + "/usr/local/lib/python3.11/site-packages/_plotly_utils/basevalidators.py:106: FutureWarning:\n", + "\n", + "The behavior of DatetimeProperties.to_pydatetime is deprecated, in a future version this will return a Series containing python datetime objects instead of an ndarray. To retain the old behavior, call `np.array` on the result\n", + "\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "data": [ + { + "mode": "lines", + "name": "Historical", + "x": [ + "2021-07-29T00:00:00", + "2021-07-30T00:00:00", + "2021-08-02T00:00:00", + "2021-08-03T00:00:00", + "2021-08-04T00:00:00", + "2021-08-05T00:00:00", + "2021-08-06T00:00:00", + "2021-08-09T00:00:00", + "2021-08-10T00:00:00", + "2021-08-11T00:00:00", + "2021-08-12T00:00:00", + "2021-08-13T00:00:00", + "2021-08-16T00:00:00", + "2021-08-17T00:00:00", + "2021-08-18T00:00:00", + "2021-08-19T00:00:00", + "2021-08-20T00:00:00", + "2021-08-23T00:00:00", + "2021-08-24T00:00:00", + "2021-08-25T00:00:00", + "2021-08-26T00:00:00", + "2021-08-27T00:00:00", + "2021-08-29T00:00:00", + "2021-08-30T00:00:00", + "2021-08-31T00:00:00", + "2021-09-01T00:00:00", + "2021-09-02T00:00:00", + "2021-09-03T00:00:00", + "2021-09-06T00:00:00", + "2021-09-07T00:00:00", + "2021-09-08T00:00:00", + "2021-09-09T00:00:00", + "2021-09-10T00:00:00", + "2021-09-11T00:00:00", + "2021-09-12T00:00:00", + "2021-09-13T00:00:00", + "2021-09-14T00:00:00", + "2021-09-15T00:00:00", + "2021-09-16T00:00:00", + "2021-09-17T00:00:00", + "2021-09-20T00:00:00", + "2021-09-21T00:00:00", + "2021-09-22T00:00:00", + "2021-09-23T00:00:00", + "2021-09-24T00:00:00", + "2021-09-26T00:00:00", + "2021-09-27T00:00:00", + "2021-09-28T00:00:00", + "2021-09-29T00:00:00", + "2021-09-30T00:00:00", + "2021-10-01T00:00:00", + "2021-10-04T00:00:00", + "2021-10-05T00:00:00", + "2021-10-06T00:00:00", + "2021-10-07T00:00:00", + "2021-10-08T00:00:00", + "2021-10-11T00:00:00", + "2021-10-12T00:00:00", + "2021-10-13T00:00:00", + "2021-10-14T00:00:00", + "2021-10-15T00:00:00", + "2021-10-18T00:00:00", + "2021-10-19T00:00:00", + "2021-10-20T00:00:00", + "2021-10-21T00:00:00", + "2021-10-22T00:00:00", + "2021-10-25T00:00:00", + "2021-10-26T00:00:00", + "2021-10-27T00:00:00", + "2021-10-28T00:00:00", + "2021-10-29T00:00:00", + "2021-10-31T00:00:00", + "2021-11-01T00:00:00", + "2021-11-02T00:00:00", + "2021-11-03T00:00:00", + "2021-11-04T00:00:00", + "2021-11-05T00:00:00", + "2021-11-08T00:00:00", + "2021-11-09T00:00:00", + "2021-11-10T00:00:00", + "2021-11-11T00:00:00", + "2021-11-12T00:00:00", + "2021-11-15T00:00:00", + "2021-11-16T00:00:00", + "2021-11-17T00:00:00", + "2021-11-18T00:00:00", + "2021-11-19T00:00:00", + "2021-11-21T00:00:00", + "2021-11-22T00:00:00", + "2021-11-23T00:00:00", + "2021-11-24T00:00:00", + "2021-11-26T00:00:00", + "2021-11-28T00:00:00", + "2021-11-29T00:00:00", + "2021-11-30T00:00:00", + "2021-12-01T00:00:00", + "2021-12-02T00:00:00", + "2021-12-03T00:00:00", + "2021-12-05T00:00:00", + "2021-12-06T00:00:00", + "2021-12-07T00:00:00", + "2021-12-08T00:00:00", + "2021-12-09T00:00:00", + "2021-12-10T00:00:00", + "2021-12-13T00:00:00", + "2021-12-14T00:00:00", + "2021-12-15T00:00:00", + "2021-12-16T00:00:00", + "2021-12-17T00:00:00", + "2021-12-20T00:00:00", + "2021-12-21T00:00:00", + "2021-12-22T00:00:00", + "2021-12-23T00:00:00", + "2021-12-24T00:00:00", + "2021-12-26T00:00:00", + "2021-12-27T00:00:00", + "2021-12-28T00:00:00", + "2021-12-29T00:00:00", + "2021-12-30T00:00:00", + "2021-12-31T00:00:00", + "2022-01-03T00:00:00", + "2022-01-04T00:00:00", + "2022-01-05T00:00:00", + "2022-01-06T00:00:00", + "2022-01-07T00:00:00", + "2022-01-09T00:00:00", + "2022-01-10T00:00:00", + "2022-01-11T00:00:00", + "2022-01-12T00:00:00", + "2022-01-13T00:00:00", + "2022-01-14T00:00:00", + "2022-01-16T00:00:00", + "2022-01-17T00:00:00", + "2022-01-18T00:00:00", + "2022-01-19T00:00:00", + "2022-01-20T00:00:00", + "2022-01-21T00:00:00", + "2022-01-23T00:00:00", + "2022-01-24T00:00:00", + "2022-01-25T00:00:00", + "2022-01-26T00:00:00", + "2022-01-27T00:00:00", + "2022-01-28T00:00:00", + "2022-01-31T00:00:00", + "2022-02-01T00:00:00", + "2022-02-02T00:00:00", + "2022-02-03T00:00:00", + "2022-02-04T00:00:00", + "2022-02-06T00:00:00", + "2022-02-07T00:00:00", + "2022-02-08T00:00:00", + "2022-02-09T00:00:00", + "2022-02-10T00:00:00", + "2022-02-11T00:00:00", + "2022-02-13T00:00:00", + "2022-02-14T00:00:00", + "2022-02-15T00:00:00", + "2022-02-16T00:00:00", + "2022-02-17T00:00:00", + "2022-02-18T00:00:00", + "2022-02-20T00:00:00", + "2022-02-21T00:00:00", + "2022-02-22T00:00:00", + "2022-02-23T00:00:00", + "2022-02-24T00:00:00", + "2022-02-25T00:00:00", + "2022-02-26T00:00:00", + "2022-02-27T00:00:00", + "2022-02-28T00:00:00", + "2022-03-01T00:00:00", + "2022-03-02T00:00:00", + "2022-03-03T00:00:00", + "2022-03-04T00:00:00", + "2022-03-06T00:00:00", + "2022-03-07T00:00:00", + "2022-03-08T00:00:00", + "2022-03-09T00:00:00", + "2022-03-10T00:00:00", + "2022-03-11T00:00:00", + "2022-03-14T00:00:00", + "2022-03-15T00:00:00", + "2022-03-16T00:00:00", + "2022-03-17T00:00:00", + "2022-03-18T00:00:00", + "2022-03-21T00:00:00", + "2022-03-22T00:00:00", + "2022-03-23T00:00:00", + "2022-03-24T00:00:00", + "2022-03-25T00:00:00", + "2022-03-28T00:00:00", + "2022-03-29T00:00:00", + "2022-03-30T00:00:00", + "2022-03-31T00:00:00", + "2022-04-01T00:00:00", + "2022-04-04T00:00:00", + "2022-04-05T00:00:00", + "2022-04-06T00:00:00", + "2022-04-07T00:00:00", + "2022-04-08T00:00:00", + "2022-04-11T00:00:00", + "2022-04-12T00:00:00", + "2022-04-13T00:00:00", + "2022-04-14T00:00:00", + "2022-04-15T00:00:00", + "2022-04-17T00:00:00", + "2022-04-18T00:00:00", + "2022-04-19T00:00:00", + "2022-04-20T00:00:00", + "2022-04-21T00:00:00", + "2022-04-22T00:00:00", + "2022-04-23T00:00:00", + "2022-04-25T00:00:00", + "2022-04-26T00:00:00", + "2022-04-27T00:00:00", + "2022-04-28T00:00:00", + "2022-04-29T00:00:00", + "2022-05-02T00:00:00", + "2022-05-03T00:00:00", + "2022-05-04T00:00:00", + "2022-05-05T00:00:00", + "2022-05-06T00:00:00", + "2022-05-09T00:00:00", + "2022-05-10T00:00:00", + "2022-05-11T00:00:00", + "2022-05-12T00:00:00", + "2022-05-13T00:00:00", + "2022-05-15T00:00:00", + "2022-05-16T00:00:00", + "2022-05-17T00:00:00", + "2022-05-18T00:00:00", + "2022-05-19T00:00:00", + "2022-05-20T00:00:00", + "2022-05-23T00:00:00", + "2022-05-24T00:00:00", + "2022-05-25T00:00:00", + "2022-05-26T00:00:00", + "2022-05-27T00:00:00", + "2022-05-31T00:00:00", + "2022-06-01T00:00:00", + "2022-06-02T00:00:00", + "2022-06-03T00:00:00", + "2022-06-04T00:00:00", + "2022-06-06T00:00:00", + "2022-06-07T00:00:00", + "2022-06-08T00:00:00", + "2022-06-09T00:00:00", + "2022-06-10T00:00:00", + "2022-06-13T00:00:00", + "2022-06-14T00:00:00", + "2022-06-15T00:00:00", + "2022-06-16T00:00:00", + "2022-06-17T00:00:00", + "2022-06-20T00:00:00", + "2022-06-21T00:00:00", + "2022-06-22T00:00:00", + "2022-06-23T00:00:00", + "2022-06-24T00:00:00", + "2022-06-26T00:00:00", + "2022-06-27T00:00:00", + "2022-06-28T00:00:00", + "2022-06-29T00:00:00", + "2022-06-30T00:00:00", + "2022-07-01T00:00:00", + "2022-07-04T00:00:00", + "2022-07-05T00:00:00", + "2022-07-06T00:00:00", + "2022-07-07T00:00:00", + "2022-07-08T00:00:00", + "2022-07-09T00:00:00", + "2022-07-10T00:00:00", + "2022-07-11T00:00:00", + "2022-07-12T00:00:00", + "2022-07-13T00:00:00", + "2022-07-14T00:00:00", + "2022-07-15T00:00:00", + "2022-07-18T00:00:00", + "2022-07-19T00:00:00", + "2022-07-20T00:00:00", + "2022-07-21T00:00:00", + "2022-07-22T00:00:00", + "2022-07-25T00:00:00", + "2022-07-26T00:00:00", + "2022-07-27T00:00:00", + "2022-07-28T00:00:00", + "2022-07-29T00:00:00", + "2022-08-01T00:00:00", + "2022-08-02T00:00:00", + "2022-08-03T00:00:00", + "2022-08-04T00:00:00", + "2022-08-05T00:00:00", + "2022-08-08T00:00:00", + "2022-08-09T00:00:00", + "2022-08-10T00:00:00", + "2022-08-11T00:00:00", + "2022-08-12T00:00:00", + "2022-08-14T00:00:00", + "2022-08-15T00:00:00", + "2022-08-16T00:00:00", + "2022-08-17T00:00:00", + "2022-08-18T00:00:00", + "2022-08-19T00:00:00", + "2022-08-22T00:00:00", + "2022-08-23T00:00:00", + "2022-08-24T00:00:00", + "2022-08-25T00:00:00", + "2022-08-26T00:00:00", + "2022-08-29T00:00:00", + "2022-08-30T00:00:00", + "2022-08-31T00:00:00", + "2022-09-01T00:00:00", + "2022-09-02T00:00:00", + "2022-09-06T00:00:00", + "2022-09-07T00:00:00", + "2022-09-08T00:00:00", + "2022-09-09T00:00:00", + "2022-09-10T00:00:00", + "2022-09-12T00:00:00", + "2022-09-13T00:00:00", + "2022-09-14T00:00:00", + "2022-09-15T00:00:00", + "2022-09-16T00:00:00", + "2022-09-18T00:00:00", + "2022-09-19T00:00:00", + "2022-09-20T00:00:00", + "2022-09-21T00:00:00", + "2022-09-22T00:00:00", + "2022-09-23T00:00:00", + "2022-09-26T00:00:00", + "2022-09-27T00:00:00", + "2022-09-28T00:00:00", + "2022-09-29T00:00:00", + "2022-09-30T00:00:00", + "2022-10-03T00:00:00", + "2022-10-04T00:00:00", + "2022-10-05T00:00:00", + "2022-10-06T00:00:00", + "2022-10-07T00:00:00", + "2022-10-09T00:00:00", + "2022-10-10T00:00:00", + "2022-10-11T00:00:00", + "2022-10-12T00:00:00", + "2022-10-13T00:00:00", + "2022-10-14T00:00:00", + "2022-10-17T00:00:00", + "2022-10-18T00:00:00", + "2022-10-19T00:00:00", + "2022-10-20T00:00:00", + "2022-10-21T00:00:00", + "2022-10-23T00:00:00", + "2022-10-24T00:00:00", + "2022-10-25T00:00:00", + "2022-10-26T00:00:00", + "2022-10-27T00:00:00", + "2022-10-28T00:00:00", + "2022-10-30T00:00:00", + "2022-10-31T00:00:00", + "2022-11-01T00:00:00", + "2022-11-02T00:00:00", + "2022-11-03T00:00:00", + "2022-11-04T00:00:00", + "2022-11-06T00:00:00", + "2022-11-07T00:00:00", + "2022-11-08T00:00:00", + "2022-11-09T00:00:00", + "2022-11-10T00:00:00", + "2022-11-11T00:00:00", + "2022-11-13T00:00:00", + "2022-11-14T00:00:00", + "2022-11-15T00:00:00", + "2022-11-16T00:00:00", + "2022-11-17T00:00:00", + "2022-11-18T00:00:00", + "2022-11-20T00:00:00", + "2022-11-21T00:00:00", + "2022-11-22T00:00:00", + "2022-11-23T00:00:00", + "2022-11-24T00:00:00", + "2022-11-25T00:00:00", + "2022-11-27T00:00:00", + "2022-11-28T00:00:00", + "2022-11-29T00:00:00", + "2022-11-30T00:00:00", + "2022-12-01T00:00:00", + "2022-12-02T00:00:00", + "2022-12-05T00:00:00", + "2022-12-06T00:00:00", + "2022-12-07T00:00:00", + "2022-12-08T00:00:00", + "2022-12-09T00:00:00", + "2022-12-10T00:00:00", + "2022-12-12T00:00:00", + "2022-12-13T00:00:00", + "2022-12-14T00:00:00", + "2022-12-15T00:00:00", + "2022-12-16T00:00:00", + "2022-12-17T00:00:00", + "2022-12-18T00:00:00", + "2022-12-19T00:00:00", + "2022-12-20T00:00:00", + "2022-12-21T00:00:00", + "2022-12-22T00:00:00", + "2022-12-23T00:00:00", + "2022-12-26T00:00:00", + "2022-12-27T00:00:00", + "2022-12-28T00:00:00", + "2022-12-29T00:00:00", + "2022-12-30T00:00:00", + "2023-01-02T00:00:00", + "2023-01-03T00:00:00", + "2023-01-04T00:00:00", + "2023-01-05T00:00:00", + "2023-01-06T00:00:00", + "2023-01-08T00:00:00", + "2023-01-09T00:00:00", + "2023-01-10T00:00:00", + "2023-01-11T00:00:00", + "2023-01-12T00:00:00", + "2023-01-13T00:00:00", + "2023-01-15T00:00:00", + "2023-01-16T00:00:00", + "2023-01-17T00:00:00", + "2023-01-18T00:00:00", + "2023-01-19T00:00:00", + "2023-01-20T00:00:00", + "2023-01-23T00:00:00", + "2023-01-24T00:00:00", + "2023-01-25T00:00:00", + "2023-01-26T00:00:00", + "2023-01-27T00:00:00", + "2023-01-29T00:00:00", + "2023-01-30T00:00:00", + "2023-01-31T00:00:00", + "2023-02-01T00:00:00", + "2023-02-02T00:00:00", + "2023-02-03T00:00:00", + "2023-02-06T00:00:00", + "2023-02-07T00:00:00", + "2023-02-08T00:00:00", + "2023-02-09T00:00:00", + "2023-02-10T00:00:00", + "2023-02-13T00:00:00", + "2023-02-14T00:00:00", + "2023-02-15T00:00:00", + "2023-02-16T00:00:00", + "2023-02-17T00:00:00", + "2023-02-20T00:00:00", + "2023-02-21T00:00:00", + "2023-02-22T00:00:00", + "2023-02-23T00:00:00", + "2023-02-24T00:00:00", + "2023-02-27T00:00:00", + "2023-02-28T00:00:00", + "2023-03-01T00:00:00", + "2023-03-02T00:00:00", + "2023-03-03T00:00:00", + "2023-03-06T00:00:00", + "2023-03-07T00:00:00", + "2023-03-08T00:00:00", + "2023-03-09T00:00:00", + "2023-03-10T00:00:00", + "2023-03-13T00:00:00", + "2023-03-14T00:00:00", + "2023-03-15T00:00:00", + "2023-03-16T00:00:00", + "2023-03-17T00:00:00", + "2023-03-20T00:00:00", + "2023-03-21T00:00:00", + "2023-03-22T00:00:00", + "2023-03-23T00:00:00", + "2023-03-24T00:00:00", + "2023-03-27T00:00:00", + "2023-03-28T00:00:00", + "2023-03-29T00:00:00", + "2023-03-30T00:00:00", + "2023-03-31T00:00:00", + "2023-04-03T00:00:00", + "2023-04-04T00:00:00", + "2023-04-05T00:00:00", + "2023-04-06T00:00:00", + "2023-04-07T00:00:00", + "2023-04-09T00:00:00", + "2023-04-10T00:00:00", + "2023-04-11T00:00:00", + "2023-04-12T00:00:00", + "2023-04-13T00:00:00", + "2023-04-14T00:00:00", + "2023-04-17T00:00:00", + "2023-04-18T00:00:00", + "2023-04-19T00:00:00", + "2023-04-20T00:00:00", + "2023-04-21T00:00:00", + "2023-04-24T00:00:00", + "2023-04-25T00:00:00", + "2023-04-26T00:00:00", + "2023-04-27T00:00:00", + "2023-04-28T00:00:00", + "2023-05-01T00:00:00", + "2023-05-02T00:00:00", + "2023-05-03T00:00:00", + "2023-05-04T00:00:00", + "2023-05-05T00:00:00", + "2023-05-08T00:00:00", + "2023-05-09T00:00:00", + "2023-05-10T00:00:00", + "2023-05-11T00:00:00", + "2023-05-12T00:00:00", + "2023-05-15T00:00:00", + "2023-05-16T00:00:00", + "2023-05-17T00:00:00", + "2023-05-18T00:00:00", + "2023-05-19T00:00:00", + "2023-05-21T00:00:00", + "2023-05-22T00:00:00", + "2023-05-23T00:00:00", + "2023-05-24T00:00:00", + "2023-05-25T00:00:00", + "2023-05-26T00:00:00", + "2023-05-29T00:00:00", + "2023-05-30T00:00:00", + "2023-05-31T00:00:00", + "2023-06-01T00:00:00", + "2023-06-02T00:00:00", + "2023-06-03T00:00:00", + "2023-06-05T00:00:00", + "2023-06-06T00:00:00", + "2023-06-07T00:00:00", + "2023-06-08T00:00:00", + "2023-06-09T00:00:00", + "2023-06-12T00:00:00", + "2023-06-13T00:00:00", + "2023-06-14T00:00:00", + "2023-06-15T00:00:00", + "2023-06-16T00:00:00", + "2023-06-19T00:00:00", + "2023-06-20T00:00:00", + "2023-06-21T00:00:00", + "2023-06-22T00:00:00", + "2023-06-23T00:00:00", + "2023-06-26T00:00:00", + "2023-06-27T00:00:00", + "2023-06-28T00:00:00", + "2023-06-29T00:00:00", + "2023-06-30T00:00:00", + "2023-07-03T00:00:00", + "2023-07-05T00:00:00", + "2023-07-06T00:00:00", + "2023-07-07T00:00:00", + "2023-07-08T00:00:00", + "2023-07-10T00:00:00", + "2023-07-11T00:00:00", + "2023-07-12T00:00:00", + "2023-07-13T00:00:00", + "2023-07-14T00:00:00", + "2023-07-17T00:00:00", + "2023-07-18T00:00:00", + "2023-07-19T00:00:00", + "2023-07-20T00:00:00", + "2023-07-21T00:00:00", + "2023-07-23T00:00:00", + "2023-07-24T00:00:00", + "2023-07-25T00:00:00", + "2023-07-26T00:00:00", + "2023-07-27T00:00:00", + "2023-07-28T00:00:00", + "2023-07-31T00:00:00", + "2023-08-01T00:00:00", + "2023-08-02T00:00:00", + "2023-08-03T00:00:00", + "2023-08-04T00:00:00", + "2023-08-07T00:00:00", + "2023-08-08T00:00:00", + "2023-08-09T00:00:00", + "2023-08-10T00:00:00", + "2023-08-11T00:00:00", + "2023-08-14T00:00:00", + "2023-08-15T00:00:00", + "2023-08-16T00:00:00", + "2023-08-17T00:00:00", + "2023-08-18T00:00:00", + "2023-08-21T00:00:00", + "2023-08-22T00:00:00", + "2023-08-23T00:00:00", + "2023-08-24T00:00:00", + "2023-08-25T00:00:00", + "2023-08-28T00:00:00", + "2023-08-29T00:00:00", + "2023-08-30T00:00:00", + "2023-08-31T00:00:00", + "2023-09-01T00:00:00", + "2023-09-02T00:00:00", + "2023-09-04T00:00:00", + "2023-09-05T00:00:00", + "2023-09-06T00:00:00", + "2023-09-07T00:00:00", + "2023-09-08T00:00:00", + "2023-09-09T00:00:00", + "2023-09-11T00:00:00", + "2023-09-12T00:00:00", + "2023-09-13T00:00:00", + "2023-09-14T00:00:00", + "2023-09-15T00:00:00", + "2023-09-18T00:00:00", + "2023-09-19T00:00:00", + "2023-09-20T00:00:00", + "2023-09-21T00:00:00", + "2023-09-22T00:00:00", + "2023-09-25T00:00:00", + "2023-09-26T00:00:00", + "2023-09-27T00:00:00", + "2023-09-28T00:00:00", + "2023-09-29T00:00:00", + "2023-10-02T00:00:00", + "2023-10-03T00:00:00", + "2023-10-04T00:00:00", + "2023-10-05T00:00:00", + "2023-10-06T00:00:00", + "2023-10-09T00:00:00", + "2023-10-10T00:00:00", + "2023-10-11T00:00:00", + "2023-10-12T00:00:00", + "2023-10-13T00:00:00", + "2023-10-15T00:00:00", + "2023-10-16T00:00:00", + "2023-10-17T00:00:00", + "2023-10-18T00:00:00", + "2023-10-19T00:00:00", + "2023-10-20T00:00:00", + "2023-10-22T00:00:00", + "2023-10-23T00:00:00", + "2023-10-24T00:00:00", + "2023-10-25T00:00:00", + "2023-10-26T00:00:00", + "2023-10-27T00:00:00", + "2023-10-30T00:00:00", + "2023-10-31T00:00:00", + "2023-11-01T00:00:00", + "2023-11-02T00:00:00", + "2023-11-03T00:00:00", + "2023-11-05T00:00:00", + "2023-11-06T00:00:00", + "2023-11-07T00:00:00", + "2023-11-08T00:00:00", + "2023-11-09T00:00:00", + "2023-11-10T00:00:00", + "2023-11-11T00:00:00", + "2023-11-12T00:00:00", + "2023-11-13T00:00:00", + "2023-11-14T00:00:00", + "2023-11-15T00:00:00", + "2023-11-16T00:00:00", + "2023-11-17T00:00:00", + "2023-11-18T00:00:00", + "2023-11-19T00:00:00", + "2023-11-20T00:00:00", + "2023-11-21T00:00:00", + "2023-11-22T00:00:00", + "2023-11-23T00:00:00", + "2023-11-24T00:00:00", + "2023-11-25T00:00:00", + "2023-11-26T00:00:00", + "2023-11-27T00:00:00", + "2023-11-28T00:00:00", + "2023-11-29T00:00:00", + "2023-11-30T00:00:00", + "2023-12-01T00:00:00", + "2023-12-03T00:00:00", + "2023-12-04T00:00:00", + "2023-12-05T00:00:00", + "2023-12-06T00:00:00", + "2023-12-07T00:00:00", + "2023-12-08T00:00:00", + "2023-12-09T00:00:00", + "2023-12-10T00:00:00", + "2023-12-11T00:00:00", + "2023-12-12T00:00:00", + "2023-12-13T00:00:00", + "2023-12-14T00:00:00", + "2023-12-15T00:00:00", + "2023-12-16T00:00:00", + "2023-12-18T00:00:00", + "2023-12-19T00:00:00", + "2023-12-20T00:00:00", + "2023-12-21T00:00:00", + "2023-12-22T00:00:00", + "2023-12-26T00:00:00", + "2023-12-27T00:00:00", + "2023-12-28T00:00:00", + "2023-12-29T00:00:00", + "2023-12-30T00:00:00", + "2024-01-01T00:00:00", + "2024-01-02T00:00:00", + "2024-01-03T00:00:00", + "2024-01-04T00:00:00", + "2024-01-05T00:00:00", + "2024-01-07T00:00:00", + "2024-01-08T00:00:00", + "2024-01-09T00:00:00", + "2024-01-10T00:00:00", + "2024-01-11T00:00:00", + "2024-01-12T00:00:00", + "2024-01-14T00:00:00", + "2024-01-15T00:00:00", + "2024-01-16T00:00:00", + "2024-01-17T00:00:00", + "2024-01-18T00:00:00", + "2024-01-19T00:00:00", + "2024-01-21T00:00:00", + "2024-01-22T00:00:00", + "2024-01-23T00:00:00", + "2024-01-24T00:00:00", + "2024-01-25T00:00:00", + "2024-01-26T00:00:00", + "2024-01-28T00:00:00", + "2024-01-29T00:00:00", + "2024-01-30T00:00:00", + "2024-01-31T00:00:00", + "2024-02-01T00:00:00", + "2024-02-02T00:00:00", + "2024-02-04T00:00:00", + "2024-02-05T00:00:00", + "2024-02-06T00:00:00", + "2024-02-07T00:00:00", + "2024-02-08T00:00:00", + "2024-02-09T00:00:00", + "2024-02-11T00:00:00", + "2024-02-12T00:00:00", + "2024-02-13T00:00:00", + "2024-02-14T00:00:00", + "2024-02-15T00:00:00", + "2024-02-16T00:00:00", + "2024-02-18T00:00:00", + "2024-02-19T00:00:00", + "2024-02-20T00:00:00", + "2024-02-21T00:00:00", + "2024-02-22T00:00:00", + "2024-02-23T00:00:00", + "2024-02-25T00:00:00", + "2024-02-26T00:00:00", + "2024-02-27T00:00:00", + "2024-02-28T00:00:00", + "2024-02-29T00:00:00", + "2024-03-01T00:00:00", + "2024-03-03T00:00:00", + "2024-03-04T00:00:00", + "2024-03-05T00:00:00", + "2024-03-06T00:00:00", + "2024-03-07T00:00:00", + "2024-03-08T00:00:00", + "2024-03-10T00:00:00", + "2024-03-11T00:00:00", + "2024-03-12T00:00:00", + "2024-03-13T00:00:00", + "2024-03-14T00:00:00", + "2024-03-15T00:00:00", + "2024-03-17T00:00:00", + "2024-03-18T00:00:00", + "2024-03-19T00:00:00", + "2024-03-20T00:00:00", + "2024-03-21T00:00:00", + "2024-03-22T00:00:00", + "2024-03-24T00:00:00", + "2024-03-25T00:00:00", + "2024-03-26T00:00:00", + "2024-03-27T00:00:00", + "2024-03-28T00:00:00", + "2024-03-29T00:00:00", + "2024-04-01T00:00:00", + "2024-04-02T00:00:00", + "2024-04-03T00:00:00", + "2024-04-04T00:00:00", + "2024-04-05T00:00:00", + "2024-04-08T00:00:00", + "2024-04-09T00:00:00", + "2024-04-10T00:00:00", + "2024-04-11T00:00:00", + "2024-04-12T00:00:00", + "2024-04-14T00:00:00", + "2024-04-15T00:00:00", + "2024-04-16T00:00:00", + "2024-04-17T00:00:00", + "2024-04-18T00:00:00", + "2024-04-19T00:00:00", + "2024-04-21T00:00:00", + "2024-04-22T00:00:00", + "2024-04-23T00:00:00", + "2024-04-24T00:00:00", + "2024-04-25T00:00:00", + "2024-04-26T00:00:00", + "2024-04-28T00:00:00", + "2024-04-29T00:00:00", + "2024-04-30T00:00:00", + "2024-05-01T00:00:00", + "2024-05-02T00:00:00", + "2024-05-03T00:00:00", + "2024-05-06T00:00:00", + "2024-05-07T00:00:00", + "2024-05-08T00:00:00", + "2024-05-09T00:00:00", + "2024-05-10T00:00:00", + "2024-05-12T00:00:00", + "2024-05-13T00:00:00", + "2024-05-14T00:00:00", + "2024-05-15T00:00:00", + "2024-05-16T00:00:00", + "2024-05-17T00:00:00", + "2024-05-19T00:00:00", + "2024-05-20T00:00:00", + "2024-05-21T00:00:00", + "2024-05-22T00:00:00", + "2024-05-23T00:00:00", + "2024-05-24T00:00:00", + "2024-05-27T00:00:00", + "2024-05-28T00:00:00", + "2024-05-29T00:00:00", + "2024-05-30T00:00:00", + "2024-05-31T00:00:00", + "2024-06-01T00:00:00", + "2024-06-02T00:00:00", + "2024-06-03T00:00:00", + "2024-06-04T00:00:00", + "2024-06-05T00:00:00", + "2024-06-06T00:00:00", + "2024-06-07T00:00:00", + "2024-06-09T00:00:00", + "2024-06-10T00:00:00", + "2024-06-11T00:00:00", + "2024-06-12T00:00:00", + "2024-06-13T00:00:00", + "2024-06-14T00:00:00", + "2024-06-16T00:00:00", + "2024-06-17T00:00:00", + "2024-06-18T00:00:00", + "2024-06-19T00:00:00", + "2024-06-20T00:00:00", + "2024-06-21T00:00:00", + "2024-06-23T00:00:00", + "2024-06-24T00:00:00", + "2024-06-25T00:00:00", + "2024-06-26T00:00:00", + "2024-06-27T00:00:00", + "2024-06-28T00:00:00", + "2024-06-29T00:00:00", + "2024-06-30T00:00:00", + "2024-07-01T00:00:00", + "2024-07-02T00:00:00", + "2024-07-03T00:00:00", "2024-07-04T00:00:00", "2024-07-05T00:00:00", "2024-07-06T00:00:00", @@ -729,74 +1779,881 @@ "2024-07-25T00:00:00", "2024-07-26T00:00:00", "2024-07-28T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00" + "2024-07-29T00:00:00" ], "y": [ - 9472, - 10465, - 13218, - 9992, - 11166, - 12627, - 9801, - 3695, - 12638, - 13089, - 10379, - 9341, - 9394, - 5712, - 13416, - 11887, - 9798, - 11590, - 13087, - 1987, - 13545, - 14966, - 7683, - 13127, - 11839, - 3599, - 11817, - 13897, - 12230, - 6675, - 9882, - 6884, - 5651, - 14228, - 13939, - 9775, - 5400, - 6416, - 10691, - 1715, - 12632, - 10847, - 8094, - 8392, - 6464, - 4041, - 13028, - 17592, - 8494, - 10339, - 3312, - 9284, - 2833, - 11898, - 14086, - 9174, - 11845, - 7598, - 3651, - 10660, - 15508, - 8743 - ] + 9223.0, + 13095.0, + 12117.0, + 9770.0, + 8752.0, + 11543.0, + 10705.0, + 7616.0, + 13263.0, + 10377.0, + 8072.0, + 9975.0, + 7547.0, + 10916.0, + 8305.0, + 12646.0, + 10422.0, + 8780.0, + 13568.0, + 9953.0, + 8208.0, + 10085.0, + 240.0, + 10601.0, + 15296.0, + 11145.0, + 8837.0, + 14545.0, + 26.0, + 11449.0, + 11409.0, + 11246.0, + 10309.0, + 7883.0, + 48.0, + 10597.0, + 11506.0, + 10516.0, + 12000.0, + 12559.0, + 8844.0, + 16480.0, + 10015.0, + 10166.0, + 15043.0, + 144.0, + 10631.0, + 8244.0, + 10132.0, + 14754.0, + 13742.0, + 11736.0, + 9533.0, + 14340.0, + 15986.0, + 14915.0, + 12369.0, + 17648.0, + 10358.0, + 13155.0, + 15509.0, + 9150.0, + 12866.0, + 13848.0, + 11833.0, + 14014.0, + 14588.0, + 13433.0, + 9259.0, + 11411.0, + 14304.0, + 24.0, + 3921.0, + 3596.0, + 4752.0, + 11305.0, + 13689.0, + 3138.0, + 5785.0, + 5448.0, + 3114.0, + 4421.0, + 2557.0, + 5504.0, + 5277.0, + 14633.0, + 19968.0, + 144.0, + 28973.0, + 19725.0, + 15787.0, + 19188.0, + 324.0, + 15850.0, + 7980.0, + 10991.0, + 13749.0, + 14305.0, + 24.0, + 14240.0, + 9490.0, + 7140.0, + 11583.0, + 14832.0, + 8491.0, + 11675.0, + 13359.0, + 13076.0, + 16647.0, + 10411.0, + 13275.0, + 11842.0, + 10247.0, + 14803.0, + 6.0, + 10562.0, + 11821.0, + 10198.0, + 8700.0, + 10641.0, + 9918.0, + 6763.0, + 7975.0, + 9617.0, + 11087.0, + 12.0, + 15884.0, + 11224.0, + 7924.0, + 10655.0, + 16061.0, + 12.0, + 5388.0, + 8816.0, + 10955.0, + 10876.0, + 14751.0, + 60.0, + 13648.0, + 14806.0, + 6978.0, + 12196.0, + 13412.0, + 10661.0, + 13562.0, + 10499.0, + 5685.0, + 4347.0, + 12.0, + 6904.0, + 9583.0, + 8124.0, + 19598.0, + 18179.0, + 150.0, + 13316.0, + 14023.0, + 13011.0, + 9826.0, + 16759.0, + 30.0, + 11304.0, + 12640.0, + 7164.0, + 6706.0, + 5110.0, + 245.0, + 96.0, + 5843.0, + 4381.0, + 5498.0, + 6260.0, + 10165.0, + 144.0, + 4285.0, + 6298.0, + 5531.0, + 6731.0, + 14495.0, + 15278.0, + 9665.0, + 8154.0, + 12261.0, + 13918.0, + 10755.0, + 11611.0, + 8729.0, + 10247.0, + 15597.0, + 11824.0, + 11806.0, + 11583.0, + 9748.0, + 15297.0, + 12776.0, + 11254.0, + 10841.0, + 12442.0, + 15715.0, + 18774.0, + 10645.0, + 8381.0, + 17629.0, + 17098.0, + 827.0, + 16015.0, + 10868.0, + 11240.0, + 12007.0, + 15372.0, + 96.0, + 14457.0, + 9617.0, + 8901.0, + 11699.0, + 14833.0, + 16465.0, + 8710.0, + 7593.0, + 13872.0, + 15754.0, + 15809.0, + 11055.0, + 9852.0, + 10834.0, + 16709.0, + 12.0, + 15615.0, + 12787.0, + 9408.0, + 13281.0, + 5055.0, + 2746.0, + 6801.0, + 10752.0, + 13632.0, + 19760.0, + 21348.0, + 10170.0, + 8724.0, + 14084.0, + 6550.0, + 5672.0, + 11585.0, + 10488.0, + 11891.0, + 17995.0, + 17901.0, + 8860.0, + 9915.0, + 11608.0, + 14981.0, + 14758.0, + 9940.0, + 3311.0, + 12364.0, + 17881.0, + 65.0, + 15530.0, + 7802.0, + 15529.0, + 14109.0, + 15095.0, + 24.0, + 12998.0, + 10260.0, + 1884.0, + 2326.0, + 2777.0, + 6.0, + 2811.0, + 7554.0, + 10622.0, + 13914.0, + 14715.0, + 14120.0, + 11024.0, + 9649.0, + 10847.0, + 13606.0, + 14820.0, + 9057.0, + 9365.0, + 10248.0, + 15833.0, + 6411.0, + 14146.0, + 6397.0, + 10438.0, + 13751.0, + 7040.0, + 15989.0, + 12689.0, + 12490.0, + 14181.0, + 1046.0, + 6568.0, + 14169.0, + 9736.0, + 14513.0, + 14822.0, + 14019.0, + 10923.0, + 8912.0, + 10935.0, + 15768.0, + 9539.0, + 16534.0, + 9990.0, + 12372.0, + 16434.0, + 14630.0, + 10906.0, + 16039.0, + 9283.0, + 8988.0, + 14099.0, + 11149.0, + 8966.0, + 13114.0, + 14246.0, + 168.0, + 15662.0, + 9354.0, + 8868.0, + 10231.0, + 13938.0, + 14149.0, + 7945.0, + 9115.0, + 12016.0, + 12620.0, + 15279.0, + 9712.0, + 11227.0, + 11519.0, + 12635.0, + 366.0, + 13707.0, + 10390.0, + 11387.0, + 14274.0, + 14217.0, + 15292.0, + 10217.0, + 10602.0, + 11710.0, + 15836.0, + 72.0, + 16789.0, + 9562.0, + 9364.0, + 11861.0, + 13815.0, + 12.0, + 13665.0, + 11836.0, + 8689.0, + 11555.0, + 14870.0, + 192.0, + 13651.0, + 10426.0, + 12100.0, + 9618.0, + 15671.0, + 60.0, + 14986.0, + 10430.0, + 9690.0, + 12315.0, + 19032.0, + 18.0, + 15553.0, + 10677.0, + 7882.0, + 804.0, + 17966.0, + 98.0, + 12993.0, + 9760.0, + 9792.0, + 11912.0, + 15814.0, + 15198.0, + 9649.0, + 11778.0, + 11257.0, + 11825.0, + 2897.0, + 16036.0, + 11106.0, + 8510.0, + 12505.0, + 8932.0, + 9298.0, + 737.0, + 17770.0, + 11104.0, + 11186.0, + 11567.0, + 2640.0, + 7043.0, + 18262.0, + 11814.0, + 13578.0, + 16715.0, + 181.0, + 12539.0, + 11054.0, + 8606.0, + 11906.0, + 6167.0, + 13920.0, + 9741.0, + 8733.0, + 10482.0, + 14139.0, + 192.0, + 12959.0, + 10306.0, + 9599.0, + 8815.0, + 13347.0, + 12728.0, + 13087.0, + 12141.0, + 10596.0, + 14661.0, + 144.0, + 13888.0, + 10646.0, + 7554.0, + 10332.0, + 15698.0, + 14076.0, + 11740.0, + 8213.0, + 11205.0, + 14260.0, + 14424.0, + 9132.0, + 9556.0, + 10932.0, + 15140.0, + 16544.0, + 9171.0, + 5725.0, + 11218.0, + 13337.0, + 12089.0, + 10648.0, + 8348.0, + 7894.0, + 19216.0, + 15522.0, + 11504.0, + 12207.0, + 13196.0, + 13318.0, + 15200.0, + 9620.0, + 8852.0, + 11840.0, + 14343.0, + 13220.0, + 10536.0, + 8281.0, + 10280.0, + 14217.0, + 12139.0, + 11376.0, + 8879.0, + 6922.0, + 16534.0, + 14859.0, + 9844.0, + 10745.0, + 11614.0, + 15976.0, + 12.0, + 14563.0, + 10121.0, + 8673.0, + 9988.0, + 15717.0, + 14122.0, + 11660.0, + 9099.0, + 10781.0, + 13990.0, + 15277.0, + 9333.0, + 9877.0, + 10601.0, + 16326.0, + 9541.0, + 13495.0, + 11568.0, + 11029.0, + 15480.0, + 14740.0, + 11571.0, + 9685.0, + 11209.0, + 14452.0, + 11927.0, + 12476.0, + 7942.0, + 11483.0, + 15996.0, + 96.0, + 15044.0, + 11517.0, + 12430.0, + 10335.0, + 15621.0, + 264.0, + 13862.0, + 7740.0, + 11313.0, + 13169.0, + 9643.0, + 8436.0, + 19035.0, + 9338.0, + 11445.0, + 13484.0, + 11470.0, + 10364.0, + 10309.0, + 13126.0, + 11550.0, + 14253.0, + 9729.0, + 9847.0, + 10337.0, + 16662.0, + 8041.0, + 15676.0, + 12848.0, + 13244.0, + 14770.0, + 13825.0, + 8351.0, + 9691.0, + 11829.0, + 9321.0, + 12212.0, + 10705.0, + 9911.0, + 7488.0, + 16936.0, + 13958.0, + 11304.0, + 10673.0, + 12050.0, + 14434.0, + 24.0, + 14438.0, + 10398.0, + 9775.0, + 10944.0, + 13033.0, + 7823.0, + 13117.0, + 10683.0, + 9416.0, + 14445.0, + 15819.0, + 11077.0, + 9511.0, + 10459.0, + 15026.0, + 13222.0, + 11804.0, + 9396.0, + 8953.0, + 13718.0, + 14777.0, + 10020.0, + 10123.0, + 10743.0, + 16568.0, + 6731.0, + 16693.0, + 6671.0, + 13383.0, + 15607.0, + 24.0, + 48.0, + 13946.0, + 11555.0, + 10339.0, + 12362.0, + 13096.0, + 9307.0, + 10719.0, + 13431.0, + 9302.0, + 13420.0, + 13133.0, + 10332.0, + 8664.0, + 10784.0, + 15303.0, + 8233.0, + 17109.0, + 9150.0, + 9473.0, + 15194.0, + 11389.0, + 13475.0, + 9261.0, + 11265.0, + 15156.0, + 14385.0, + 8514.0, + 11511.0, + 9197.0, + 10310.0, + 3952.0, + 13027.0, + 10428.0, + 12672.0, + 14772.0, + 8928.0, + 7222.0, + 13590.0, + 11743.0, + 8521.0, + 9344.0, + 17255.0, + 12426.0, + 12410.0, + 8851.0, + 12144.0, + 9149.0, + 5962.0, + 8758.0, + 14889.0, + 10511.0, + 11137.0, + 6138.0, + 12066.0, + 2040.0, + 5937.0, + 14421.0, + 11362.0, + 10587.0, + 15826.0, + 3473.0, + 8890.0, + 10540.0, + 19928.0, + 13047.0, + 929.0, + 9377.0, + 1256.0, + 6708.0, + 13005.0, + 9630.0, + 9315.0, + 10594.0, + 11211.0, + 4964.0, + 7582.0, + 13271.0, + 14673.0, + 15056.0, + 2317.0, + 10911.0, + 3307.0, + 15673.0, + 11580.0, + 10233.0, + 11385.0, + 14999.0, + 4130.0, + 12104.0, + 15780.0, + 11656.0, + 10030.0, + 17663.0, + 9254.0, + 15281.0, + 7559.0, + 11778.0, + 11376.0, + 60.0, + 11884.0, + 13094.0, + 11129.0, + 12681.0, + 1861.0, + 10594.0, + 9551.0, + 12137.0, + 11081.0, + 3241.0, + 8075.0, + 12974.0, + 13192.0, + 9368.0, + 7709.0, + 7592.0, + 1076.0, + 16058.0, + 9114.0, + 5924.0, + 13098.0, + 9390.0, + 2360.0, + 12056.0, + 12496.0, + 11107.0, + 9386.0, + 9046.0, + 6841.0, + 6256.0, + 16234.0, + 11072.0, + 11901.0, + 8750.0, + 7918.0, + 14331.0, + 10018.0, + 11107.0, + 8381.0, + 10092.0, + 1240.0, + 14243.0, + 9880.0, + 12871.0, + 12708.0, + 8453.0, + 2827.0, + 15940.0, + 13612.0, + 9707.0, + 9775.0, + 16232.0, + 628.0, + 10533.0, + 7423.0, + 11326.0, + 10965.0, + 11790.0, + 4379.0, + 9181.0, + 12245.0, + 10698.0, + 9983.0, + 11030.0, + 4251.0, + 12294.0, + 13590.0, + 8704.0, + 10955.0, + 10561.0, + 2446.0, + 8729.0, + 14862.0, + 9850.0, + 10876.0, + 15250.0, + 9119.0, + 13124.0, + 10387.0, + 10814.0, + 19481.0, + 12022.0, + 13876.0, + 10186.0, + 10067.0, + 8125.0, + 5506.0, + 11168.0, + 12633.0, + 13295.0, + 11985.0, + 9841.0, + 6650.0, + 10092.0, + 13221.0, + 7990.0, + 14072.0, + 13804.0, + 3142.0, + 10282.0, + 11969.0, + 11186.0, + 11144.0, + 18019.0, + 6915.0, + 14884.0, + 11257.0, + 7455.0, + 13370.0, + 9413.0, + 13160.0, + 12041.0, + 8405.0, + 13847.0, + 12041.0, + 3346.0, + 14561.0, + 8069.0, + 8713.0, + 13681.0, + 9472.0, + 10465.0, + 13218.0, + 9992.0, + 11166.0, + 12627.0, + 9801.0, + 3695.0, + 12638.0, + 13089.0, + 10379.0, + 9341.0, + 9394.0, + 5712.0, + 13416.0, + 11887.0, + 9798.0, + 11590.0, + 13087.0, + 1987.0, + 13545.0, + 14966.0, + 7683.0, + 13127.0, + 11839.0, + 3599.0, + 11817.0, + 13897.0, + 12230.0, + 6675.0, + 9882.0, + 6884.0, + 5651.0, + 14228.0, + 13939.0, + 9775.0, + 5400.0, + 6416.0, + 10691.0, + 1715.0, + 12632.0, + 10847.0, + 8094.0, + 8392.0, + 6464.0, + 4041.0, + 13028.0, + 17592.0, + 8494.0, + 10339.0, + 3312.0, + 9284.0, + 2833.0, + 11898.0, + 14086.0, + 9174.0, + 11845.0, + 7598.0, + 3651.0, + 10660.0 + ], + "type": "scatter" }, { "marker": { @@ -805,29 +2662,29 @@ }, "mode": "markers", "name": "Peaks", - "type": "scatter", "x": [ - "2024-05-28T00:00:00", - "2024-06-10T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-25T00:00:00", - "2024-07-01T00:00:00", - "2024-07-16T00:00:00", - "2024-07-23T00:00:00", - "2024-07-30T00:00:00" + "2021-11-19T00:00:00", + "2021-11-22T00:00:00", + "2021-11-26T00:00:00", + "2022-02-10T00:00:00", + "2022-05-31T00:00:00", + "2023-03-03T00:00:00", + "2023-06-06T00:00:00", + "2023-11-21T00:00:00", + "2024-04-05T00:00:00" ], "y": [ - 13218, - 13416, - 14966, - 13127, - 13897, - 14228, - 17592, - 14086, - 15508 - ] + 19968.0, + 28973.0, + 19188.0, + 19598.0, + 21348.0, + 19216.0, + 19035.0, + 19928.0, + 19481.0 + ], + "type": "scatter" }, { "line": { @@ -836,13 +2693,7 @@ }, "mode": "lines", "name": "Forecast", - "type": "scatter", "x": [ - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-27T00:00:00", - "2024-07-28T00:00:00", - "2024-07-29T00:00:00", "2024-07-30T00:00:00", "2024-07-31T00:00:00", "2024-08-01T00:00:00", @@ -867,40 +2718,46 @@ "2024-08-20T00:00:00", "2024-08-21T00:00:00", "2024-08-22T00:00:00", - "2024-08-23T00:00:00" + "2024-08-23T00:00:00", + "2024-08-24T00:00:00", + "2024-08-25T00:00:00", + "2024-08-26T00:00:00", + "2024-08-27T00:00:00", + "2024-08-28T00:00:00" ], "y": [ - 24896.161206395453, - 25678.805633244454, - 25961.96536411444, - 24234.673528523534, - 26730.016584288445, - 27922.099492691632, - 7049.945798121946, - 25068.663944008615, - 25373.453817777365, - 24778.26978292773, - 24016.447142833087, - 27988.024017994117, - 29537.872259393014, - 25764.9170445739, - 25319.070134148787, - 25900.05088556034, - 26829.67558944327, - 25913.720584710827, - 28136.701485240745, - 29073.142337757687, - 25301.943028624606, - 25487.901751938974, - 26373.315127322596, - 27038.342958572728, - 26117.60814289513, - 28764.717619298957, - 30165.558903930534, - 26338.517036665813, - 25713.979343231505, - 25823.639406056638 - ] + 13645.553605982845, + 8464.217903282362, + 9234.818018723905, + 4691.72799955502, + 8120.571994029058, + 4291.672135290239, + 13528.254811056308, + 14890.140140059375, + 9901.759684298362, + 9666.31905413371, + 7038.894010715201, + 8496.674348189481, + 4534.433605488142, + 13945.752926028712, + 15393.073636918969, + 10307.02939401471, + 10039.173202817328, + 7219.431361427865, + 8825.947115216331, + 4837.072926257679, + 14315.554864576508, + 15601.73882559537, + 10587.84730642641, + 10216.154556435096, + 7371.81565960373, + 8988.210468039702, + 4988.460343713072, + 14518.68405121332, + 15890.575940643525, + 10760.36227547616 + ], + "type": "scatter" }, { "line": { @@ -908,13 +2765,7 @@ }, "mode": "lines", "showlegend": false, - "type": "scatter", "x": [ - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-27T00:00:00", - "2024-07-28T00:00:00", - "2024-07-29T00:00:00", "2024-07-30T00:00:00", "2024-07-31T00:00:00", "2024-08-01T00:00:00", @@ -939,40 +2790,46 @@ "2024-08-20T00:00:00", "2024-08-21T00:00:00", "2024-08-22T00:00:00", - "2024-08-23T00:00:00" + "2024-08-23T00:00:00", + "2024-08-24T00:00:00", + "2024-08-25T00:00:00", + "2024-08-26T00:00:00", + "2024-08-27T00:00:00", + "2024-08-28T00:00:00" ], "y": [ - 23275.14899695556, - 23977.104460690807, - 24243.903719175523, - 22275.282431648244, - 24375.788890984324, - 25567.523109869882, - 4695.020777412397, - 22713.390337018172, - 23017.831676090016, - 22422.29915810458, - 21660.12808641235, - 25631.35658149116, - 27180.85649430036, - 23407.553002361234, - 22961.357866263, - 23541.990443425522, - 24471.26702446074, - 23554.96394825914, - 25777.59682867572, - 26713.689712412415, - 22942.142485809472, - 23127.75334294167, - 24012.818903408137, - 24677.498970983474, - 23756.416442850797, - 26403.17825799664, - 27803.67193254472, - 23976.28250634839, - 23351.397305111794, - 23460.7099112414 - ] + 11501.24312007483, + 6243.72747724221, + 7004.675156874327, + 2185.613746163166, + 5224.525262310664, + 1395.6254035199595, + 10632.208079234144, + 11994.093408185327, + 7005.712952372429, + 6770.272322155892, + 4142.847278685497, + 5600.627616107893, + 1638.3868733546692, + 11049.706193843354, + 12497.026904681727, + 7410.982661725582, + 7143.126470476316, + 4323.384629034968, + 5929.90038277155, + 1941.026193761012, + 11419.508132027957, + 12705.692092994934, + 7691.80057377409, + 7320.10782373089, + 4475.768926847639, + 6092.163735231727, + 2092.4136108532107, + 11622.637318301575, + 12994.529207679894, + 7864.315542460645 + ], + "type": "scatter" }, { "fill": "tonexty", @@ -982,13 +2839,7 @@ }, "mode": "lines", "name": "90.0% confidence interval", - "type": "scatter", "x": [ - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-27T00:00:00", - "2024-07-28T00:00:00", - "2024-07-29T00:00:00", "2024-07-30T00:00:00", "2024-07-31T00:00:00", "2024-08-01T00:00:00", @@ -1013,40 +2864,46 @@ "2024-08-20T00:00:00", "2024-08-21T00:00:00", "2024-08-22T00:00:00", - "2024-08-23T00:00:00" + "2024-08-23T00:00:00", + "2024-08-24T00:00:00", + "2024-08-25T00:00:00", + "2024-08-26T00:00:00", + "2024-08-27T00:00:00", + "2024-08-28T00:00:00" ], "y": [ - 26517.173415835347, - 27380.5068057981, - 27680.027009053356, - 26194.064625398823, - 29084.244277592567, - 30276.67587551338, - 9404.870818831494, - 27423.937550999057, - 27729.075959464713, - 27134.240407750884, - 26372.766199253823, - 30344.691454497075, - 31894.88802448567, - 28122.281086786566, - 27676.782402034576, - 28258.11132769516, - 29188.084154425804, - 28272.477221162513, - 30495.80614180577, - 31432.594963102958, - 27661.74357143974, - 27848.05016093628, - 28733.811351237055, - 29399.186946161983, - 28478.79984293946, - 31126.256980601276, - 32527.44587531635, - 28700.751566983236, - 28076.561381351217, - 28186.568900871876 - ] + 15789.864091890859, + 10684.708329322515, + 11464.960880573482, + 7197.8422529468735, + 11016.618725747452, + 7187.718867060517, + 16424.30154287847, + 17786.186871933423, + 12797.806416224295, + 12562.365786111528, + 9934.940742744904, + 11392.721080271069, + 7430.480337621615, + 16841.79965821407, + 18289.12036915621, + 13203.076126303837, + 12935.21993515834, + 10115.478093820762, + 11721.993847661113, + 7733.119658754345, + 17211.60159712506, + 18497.785558195807, + 13483.894039078732, + 13112.201289139302, + 10267.86239235982, + 11884.257200847678, + 7884.507076572932, + 17414.730784125066, + 18786.622673607155, + 13656.409008491675 + ], + "type": "scatter" }, { "line": { @@ -1054,13 +2911,7 @@ }, "mode": "lines", "name": "Actual", - "type": "scatter", "x": [ - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-27T00:00:00", - "2024-07-28T00:00:00", - "2024-07-29T00:00:00", "2024-07-30T00:00:00", "2024-07-31T00:00:00", "2024-08-01T00:00:00", @@ -1085,11 +2936,16 @@ "2024-08-20T00:00:00", "2024-08-21T00:00:00", "2024-08-22T00:00:00", - "2024-08-23T00:00:00" + "2024-08-23T00:00:00", + "2024-08-24T00:00:00", + "2024-08-25T00:00:00", + "2024-08-26T00:00:00", + "2024-08-27T00:00:00", + "2024-08-28T00:00:00" ], "y": [ - null, - null, + 15508.0, + 8743.0, null, null, null, @@ -1118,95 +2974,23 @@ null, null, null - ] + ], + "type": "scatter" } ], "layout": { - "autosize": true, - "legend": { - "font": { - "size": 12 - }, - "x": 0, - "y": 1 - }, "template": { "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ + "histogram2dcontour": [ { + "type": "histogram2dcontour", "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ - 0, + 0.0, "#0d0887" ], [ @@ -1242,31 +3026,31 @@ "#fdca26" ], [ - 1, + 1.0, "#f0f921" ] - ], - "type": "contour" + ] } ], - "contourcarpet": [ + "choropleth": [ { + "type": "choropleth", "colorbar": { "outlinewidth": 0, "ticks": "" - }, - "type": "contourcarpet" + } } ], - "heatmap": [ + "histogram2d": [ { + "type": "histogram2d", "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ - 0, + 0.0, "#0d0887" ], [ @@ -1302,22 +3086,22 @@ "#fdca26" ], [ - 1, + 1.0, "#f0f921" ] - ], - "type": "heatmap" + ] } ], - "heatmapgl": [ + "heatmap": [ { + "type": "heatmap", "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ - 0, + 0.0, "#0d0887" ], [ @@ -1353,34 +3137,22 @@ "#fdca26" ], [ - 1, + 1.0, "#f0f921" ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" + ] } ], - "histogram2d": [ + "heatmapgl": [ { + "type": "heatmapgl", "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ - 0, + 0.0, "#0d0887" ], [ @@ -1416,22 +3188,31 @@ "#fdca26" ], [ - 1, + 1.0, "#f0f921" ] - ], - "type": "histogram2d" + ] } ], - "histogram2dcontour": [ + "contourcarpet": [ + { + "type": "contourcarpet", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } + ], + "contour": [ { + "type": "contour", "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ - 0, + 0.0, "#0d0887" ], [ @@ -1467,37 +3248,70 @@ "#fdca26" ], [ - 1, + 1.0, "#f0f921" ] - ], - "type": "histogram2dcontour" + ] } ], - "mesh3d": [ + "surface": [ { + "type": "surface", "colorbar": { "outlinewidth": 0, "ticks": "" }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" + "colorscale": [ + [ + 0.0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1.0, + "#f0f921" + ] + ] + } + ], + "mesh3d": [ + { + "type": "mesh3d", + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } } ], "scatter": [ @@ -1510,149 +3324,162 @@ "type": "scatter" } ], - "scatter3d": [ + "parcoords": [ { + "type": "parcoords", "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } - }, + } + } + ], + "scatterpolargl": [ + { + "type": "scatterpolargl", "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } + } + } + ], + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } }, - "type": "scatter3d" + "type": "bar" } ], - "scattercarpet": [ + "scattergeo": [ { + "type": "scattergeo", "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } - }, - "type": "scattercarpet" + } } ], - "scattergeo": [ + "scatterpolar": [ { + "type": "scatterpolar", "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } + } + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } }, - "type": "scattergeo" + "type": "histogram" } ], "scattergl": [ { + "type": "scattergl", "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } - }, - "type": "scattergl" + } } ], - "scattermapbox": [ + "scatter3d": [ { - "marker": { + "type": "scatter3d", + "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, - "type": "scattermapbox" + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + } } ], - "scatterpolar": [ + "scattermapbox": [ { + "type": "scattermapbox", "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } - }, - "type": "scatterpolar" + } } ], - "scatterpolargl": [ + "scatterternary": [ { + "type": "scatterternary", "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } - }, - "type": "scatterpolargl" + } } ], - "scatterternary": [ + "scattercarpet": [ { + "type": "scattercarpet", "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } - }, - "type": "scatterternary" + } } ], - "surface": [ + "carpet": [ { - "colorbar": { - "outlinewidth": 0, - "ticks": "" + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" } ], "table": [ @@ -1675,15 +3502,84 @@ }, "type": "table" } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } ] }, "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, "autotypenumbers": "strict", + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "hovermode": "closest", + "hoverlabel": { + "align": "left" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "bgcolor": "#E5ECF6", + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "ternary": { + "bgcolor": "#E5ECF6", + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, "coloraxis": { "colorbar": { "outlinewidth": 0, @@ -1691,55 +3587,9 @@ } }, "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], "sequential": [ [ - 0, + 0.0, "#0d0887" ], [ @@ -1775,13 +3625,13 @@ "#fdca26" ], [ - 1, + 1.0, "#f0f921" ] ], "sequentialminus": [ [ - 0, + 0.0, "#0d0887" ], [ @@ -1817,83 +3667,106 @@ "#fdca26" ], [ - 1, + 1.0, "#f0f921" ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" + ], + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ] }, - "hovermode": "closest", - "mapbox": { - "style": "light" + "xaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "automargin": true, + "zerolinewidth": 2 }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" + "yaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } + "zerolinecolor": "white", + "automargin": true, + "zerolinewidth": 2 }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", - "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", - "zerolinecolor": "white" + "zerolinecolor": "white", + "gridwidth": 2 }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", - "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", - "zerolinecolor": "white" + "zerolinecolor": "white", + "gridwidth": 2 }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", - "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", - "zerolinecolor": "white" + "zerolinecolor": "white", + "gridwidth": 2 } }, "shapedefaults": { @@ -1901,48 +3774,24 @@ "color": "#2a3f5f" } }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "geo": { + "bgcolor": "white", + "landcolor": "#E5ECF6", + "subunitcolor": "white", + "showland": true, + "showlakes": true, + "lakecolor": "white" }, "title": { "x": 0.05 }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 + "mapbox": { + "style": "light" } } }, @@ -1952,29 +3801,23 @@ }, "text": "Item: FIREBALL CINNAMON WHISKEY" }, - "xaxis": { - "autorange": true, - "range": [ - "2024-05-23 02:51:05.3465", - "2024-08-23" - ], - "type": "date" + "legend": { + "font": { + "size": 12 + }, + "x": 0, + "y": 1.0 }, - "yaxis": { - "autorange": true, - "range": [ - 3.1974513713141732, - 34239.248423945035 - ], - "type": "linear" - } + "height": 400 + }, + "config": { + "plotlyServerURL": "https://plot.ly" } }, - "image/png": "iVBORw0KGgoAAAANSUhEUgAABVAAAAGQCAYAAABI2UvvAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Qd0VEXfBvAnvVdC71KVXhQBUQQLKoqI8iqiIiIq0gVBEAFpoohUAUFEsAJiw0bHgjQpggIiCggkIY30sinf9x/cuNlssnu3ZHfZZ87xvJCde2fub27y6pMpXkVFRUVgoQAFKEABClCAAhSgAAUoQAEKUIACFKAABShAgVICXgxQ+VZQgAIUoAAFKEABClCAAhSgAAUoQAEKUIACFDAtwACVbwYFKEABClCAAhSgAAUoQAEKUIACFKAABShAgTIEGKDy1aAABShAAQpQgAIUoAAFKEABClCAAhSgAAUowACV7wAFKEABClCAAhSgAAUoQAEKUIACFKAABShAAW0CnIGqzYu1KUABClCAAhSgAAUoQAEKUIACFKAABShAAQ8SYIDqQYPNR6UABShAAQpQgAIUoAAFKEABClCAAhSgAAW0CTBA1ebF2hSgAAUoQAEKUIACFKAABShAAQpQgAIUoIAHCTBA9aDB5qNSgAIUoAAFKEABClCAAhSgAAUoQAEKUIAC2gQYoGrzYm0KUIACFKAABShAAQpQgAIUoAAFKEABClDAgwQYoHrQYPNRKUABClCAAhSgAAUoQAEKUIACFKAABShAAW0CDFC1ebE2BShAAQpQgAIUoAAFKEABClCAAhSgAAUo4EECDFA9aLD5qBSgAAUoQAEKUIACFKAABShAAQpQgAIUoIA2AQao2rxYmwIUoAAFKEABClCAAhSgAAUoQAEKUIACFPAgAQaoHjTYfFQKUIACFKAABShAAQpQgAIUoAAFKEABClBAmwADVG1erE0BClCAAhSgAAUoQAEKUIACFKAABShAAQp4kAADVA8abD4qBShAAQpQgAIUoAAFKEABClCAAhSgAAUooE2AAao2L9amAAUoQAEKUIACFKAABShAAQpQgAIUoAAFPEiAAaoHDTYflQIUoAAFKEABClCAAhSgAAUoQAEKUIACFNAmwABVmxdrU4ACFKAABShAAQpQgAIUoAAFKEABClCAAh4kwADVgwabj0oBClCAAhSgAAUoQAEKUIACFKAABShAAQpoE2CAqs2LtSlAAQpQgAIUoAAFKEABClCAAhSgAAUoQAEPEmCA6kGDzUelAAUoQAEKUIACFKAA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IC+gQM1bmSRAgAABAgQIECBAgAABAgQIECBAoDABBWphCxeXAAECBAgQIECAAAECBAgQIECAAIG8gAI1b2WSAAECBAgQIECAAAECBAgQIECAAIHCBBSohS1cXAIECBAgQIAAAQIECBAgQIAAAQIE8gIK1LyVSQIECBAgQIAAAQIECBAgQIAAAQIEChNQoBa2cHEJECBAgAABAgQIECBAgAABAgQIEMgLKFDzViYJECBAgAABAgQIECBAgAABAgQIEChMQIFa2MLFJUCAAAECBAgQIECAAAECBAgQIEAgL6BAzVuZJECAAAECBAgQIECAAAECBAgQIECgMAEFamELF5cAAQIECBAgQIAAAQIECBAgQIAAgbyAAjVvZZIAAQIECBAgQIAAAQIECBAgQIAAgcIEFKiFLVxcAgQIECBAgAABAgQIECBAgAABAgTyAgrUvJVJAgQIECBAgAABAgQIECBAgAABAgQKE1CgFrZwcQkQIECAAAECBAgQIECAAAECBAgQyAsoUPNWJgkQIECAAAECBAgQIECAAAECBAgQKExAgVrYwsUlQIAAAQIECBAgQIAAAQIECBAgQCAvoEDNW5kkQIAAAQIECBAgQIAAAQIECBAgQKAwAQVqYQsXlwABAgQIECBAgAABAgQIECBAgACBvIACNW9lkgABAgQIECBAgAABAgQIECBAgACBwgQUqIUtXFwCBAgQIECAAAECBAgQIECAAAECBPICCtS8lUkCBAgQIECAAAECBAgQIECAAAECBAoTUKAWtnBxCRAgQIAAAQIECBAgQIAAAQIECBDICyhQ81YmCRAgQIAAAQIECBAgQIAAAQIECBAoTECBWtjCxSVAgAABAgQIECBAgAABAgQIECBAIC+gQM1bmSRAgAABAgQIECBAgAABAgQIECBAoDABBWphCxeXAAECBAgQIECAAAECBAgQIECAAIG8gAI1b2WSAAECBAgQIECAAAECBAgQIECAAIHCBBSohS1cXAIECBAgQIAAAQIECBAgQIAAAQIE8gIK1LyVSQIECBAgQIAAAQIECBAgQIAAAQIEChNQoBa2cHEJECBAgAABAgQIECBAgAABAgQIEMgLKFDzViYJECBAgAABAgQIECBAgAABAgQIEChMQIFa2MLFJUCAAAECBAgQIECAAAECBAgQIEAgL6BAzVuZJECAAAECBAgQIECAAAECBAgQIECgMAEFamELF5cAAQIECBAgQIAAAQIECBAgQIAAgbyAAjVvZZIAAQIECBAgQIAAAQIECBAgQIAAgcIEFKiFLVxcAgQIx5uEKQAAAWRJREFUECBAgAABAgQIECBAgAABAgTyAgrUvJVJAgQIECBAgAABAgQIECBAgAABAgQKE1CgFrZwcQkQIECAAAECBAgQIECAAAECBAgQyAsoUPNWJgkQIECAAAECBAgQIECAAAECBAgQKExAgVrYwsUlQIAAAQIECBAgQIAAAQIECBAgQCAvoEDNW5kkQIAAAQIECBAgQIAAAQIECBAgQKAwAQVqYQsXlwABAgQIECBAgAABAgQIECBAgACBvIACNW9lkgABAgQIECBAgAABAgQIECBAgACBwgQUqIUtXFwCBAgQIECAAAECBAgQIECAAAECBPICCtS8lUkCBAgQIECAAAECBAgQIECAAAECBAoTUKAWtnBxCRAgQIAAAQIECBAgQIAAAQIECBDICyhQ81YmCRAgQIAAAQIECBAgQIAAAQIECBAoTECBWtjCxSVAgAABAgQIECBAgAABAgQIECBAIC/wNxiNcOBvewYrAAAAAElFTkSuQmCC", "text/html": [ - "