diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000..5e97186a --- /dev/null +++ b/.flake8 @@ -0,0 +1,21 @@ +[flake8] +max-line-length = 120 +max-complexity = 18 +select = B,C,E,F,W,T4,B9 +ignore = + # slice notation whitespace, invalid + E203 + # too many leading ‘#’ for block comment + E266 + # module level import not at top of file + E402 + # line break before binary operator + W503 + # blank line contains whitespace + W293 + # line too long + E501 + # trailing white spaces + W291 + # missing white space after , + E231 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..8600f409 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,25 @@ +### Description + + + +### In which platform does it happen? + + + + + + +### How do we replicate the issue? + + + + + + + +### Expected behavior (i.e. solution) + + + + +### Other Comments \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..f9c7e426 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG] " +labels: 'bug' +assignees: '' + +--- + +### Description + + + +### How do we replicate the bug? + + + + + + + +### Expected behavior (i.e. solution) + + + + +### Other Comments \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..2f0af6d6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,19 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[FEATURE] " +labels: 'enhancement' +assignees: '' + +--- + +### Description + + + +### Expected behavior with the suggested feature + + + + +### Other Comments \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/general_ask.md b/.github/ISSUE_TEMPLATE/general_ask.md new file mode 100644 index 00000000..9c412a2c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/general_ask.md @@ -0,0 +1,14 @@ +--- +name: General ask +about: Technical/non-technical asks about the repo +title: "[ASK] " +labels: '' +assignees: '' + +--- + +### Description + + + +### Other Comments \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..e26f0047 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,15 @@ +### Description + + + + +### Related Issues + + + +### Checklist: + + +- [ ] My code follows the code style of this project, as detailed in our [contribution guidelines](../CONTRIBUTING.md). +- [ ] I have added tests. +- [ ] I have updated the documentation accordingly. \ No newline at end of file diff --git a/.gitignore b/.gitignore index c5c14a3a..267ac685 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,28 @@ -**/__pycache__ -**/.ipynb_checkpoints - -data/* -energy_load/GEFCom2017-D_Prob_MT_hourly/data/* \ No newline at end of file +**/__pycache__ +**/.ipynb_checkpoints +*.egg-info/ +.vscode/ +*.pkl +*.h5 + +# Data +ojdata/* +*.Rdata + +# AML Config +aml_config/ +.azureml/ +.config/ + +# Pytests +.pytest_cache/ + +# File for model deployment +score.py + +# Environments +myenv.yml + +# Logs +logs/ +*.log diff --git a/.lintr b/.lintr new file mode 100644 index 00000000..269fffb5 --- /dev/null +++ b/.lintr @@ -0,0 +1,18 @@ +linters: with_defaults( + infix_spaces_linter = NULL, + spaces_left_parentheses_linter = NULL, + open_curly_linter = NULL, + line_length_linter = NULL, + camel_case_linter = NULL, + object_name_linter = NULL, + object_usage_linter = NULL, + object_length_linter = NULL, + trailing_blank_lines_linter = NULL, + absolute_paths_linter = NULL, + commented_code_linter = NULL, + implicit_integer_linter = NULL, + extraction_operator_linter = NULL, + single_quotes_linter = NULL, + pipe_continuation_linter = NULL, + cyclocomp_linter = NULL + ) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..078edd76 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,17 @@ +repos: +- repo: https://github.com/psf/black + rev: stable + hooks: + - id: black +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v1.2.3 + hooks: + - id: flake8 +- repo: local + hooks: + - id: jupytext + name: jupytext + entry: jupytext --from ipynb --pipe black --check flake8 + pass_filenames: true + files: .ipynb + language: python \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..c2833ecb --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,139 @@ +# Contribution Guidelines + +Contribution are welcome! Here's a few things to know: + +* [Setup](./SETUP.md) +* [Microsoft Contributor License Agreement](#microsoft-contributor-license-agreement) +* [Steps to Contributing](#steps-to-contributing) +* [Coding Guidelines](#forecasting-team-contribution-guidelines) +* [Code of Conduct](#code-of-conduct) + + +## Setup +To get started, navigate to the [Setup Guide](./SETUP.md), which lists instructions on how to set up your environment and dependencies. + +## Microsoft Contributor License Agreement + +Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. + + +## Steps to Contributing + +Here are the basic steps to get started with your first contribution. Please reach out with any questions. +1. Use [open issues](https://github.com/Microsoft/Forecasting/issues) to discuss the proposed changes. Create an issue describing changes if necessary to collect feedback. Also, please use provided labels to tag issues so everyone can easily sort issues of interest. +2. [Fork the repo](https://help.github.com/articles/fork-a-repo/) so you can make and test local changes. +3. Create a new branch for the issue. We suggest prefixing the branch with your username and then a descriptive title, e.g. chenhui/python_test_pipeline. +5. Make code changes. +6. Ensure unit tests pass and code style / formatting is consistent (see [wiki](https://github.com/Microsoft/Recommenders/wiki/Coding-Guidelines#python-and-docstrings-style) for more details). +7. We use [pre-commit](https://pre-commit.com/) package to run our pre-commit hooks. We use [black](https://github.com/ambv/black) formatter and [flake8](https://pypi.org/project/flake8/) for linting on each commit. In order to set up pre-commit on your machine, follow the steps here, please note that you only need to run these steps the first time you use `pre-commit` for this project. + + * Update your conda environment, `pre-commit` is part of the yaml file or just do + ``` + $ pip install pre-commit + ``` + * Set up `pre-commit` by running following command, this will put pre-commit under your .git/hooks directory. + ``` + $ pre-commit install + ``` + > Note: Git hooks to install are specified in the pre-commit configuration file `.pre-commit-config.yaml`. Settings used by `black` and `flake8` are specified in `pyproject.toml` and `.flake8` files, respectively. + * When you've made changes on local files and are ready to commit, run + ``` + $ git commit -m "message" + ``` + * Each time you commit, git will run the pre-commit hooks on any python files that are getting committed and are part of the git index. If `black` modifies/formats the file, or if `flake8` finds any linting errors, the commit will not succeed. You will need to stage the file again if `black` changed the file, or fix the issues identified by `flake8` and and stage it again. + + * To run pre-commit on all files just run + ``` + $ pre-commit run --all-files + ``` + + +8. Create a pull request (PR) against __`staging`__ branch. + + +We use `staging` branch to land all new features, so please remember to create the Pull Request against `staging`. To work with GitHub, please see the next section for more detail about our [working with GitHub](#working-with-github). + +Once the features included in a milestone are complete we will merge `staging` into `master` branch and make a release. See the wiki for more detail about our [merge strategy](https://github.com/Microsoft/Forecasting/wiki/Strategy-to-merge-the-code-to-master-branch). + +### Working with GitHub + +1. All development is done in a branch off from the `staging` and named following this convention: `/`. +To create a new branch, run this command: + ```shell + $ git checkout -b / + ``` + + When done making the changes locally, push your branch to the server, but make sure to sync with the remote first. + + ``` + $ git pull origin staging + $ git push origin + ``` + +2. To merge a new branch into the `staging` branch, please open a pull request. + +3. The person who opens a PR should complete the PR, once it has been reviewed and all comments addressed. + +4. We will use *Squash and Merge* when completing PRs, to maintain a clean merge history on the repo. + +5. When a branch is merged into the `staging`, it must be deleted from the remote repository. + + ```shell + # Delete local branch + $ git branch -d + + # Delete remote branch + $ git push origin --delete + ``` + + +## Coding Guidelines + +We strive to maintain high quality code to make it easy to understand, use, and extend. We also work hard to maintain a friendly and constructive environment. We've found that having clear expectations on the development process and consistent style helps to ensure everyone can contribute and collaborate effectively. + +Please review the [coding guidelines](https://github.com/Microsoft/Recommenders/wiki/Coding-Guidelines) wiki page to see more details about the expectations for development approach and style. + + +## Code of Conduct + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). + +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +Apart from the official Code of Conduct developed by Microsoft, in the Forecasting team we adopt the following behaviors, to ensure a great working environment: + +#### Do not point fingers +Let’s be constructive. + +
+Click here to see some examples + +"This method is missing docstrings" instead of "YOU forgot to put docstrings". + +
+ +#### Provide code feedback based on evidence + +When making code reviews, try to support your ideas based on evidence (papers, library documentation, stackoverflow, etc) rather than your personal preferences. + +
+Click here to see some examples + +"When reviewing this code, I saw that the Python implementation the metrics are based on classes, however, [scikit-learn](https://scikit-learn.org/stable/modules/classes.html#sklearn-metrics-metrics) and [tensorflow](https://www.tensorflow.org/api_docs/python/tf/metrics) use functions. We should follow the standard in the industry." + +
+ + +#### Ask questions do not give answers +Try to be empathic. + +
+Click here to see some examples + +* Would it make more sense if ...? +* Have you considered this ... ? + +
+ diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..21071075 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 00000000..21a1719e --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,17 @@ +NOTICES AND INFORMATION +Do Not Translate or Localize + +This software incorporates material from third parties. +Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, +or you may send a check or money order for US $5.00, including the product name, +the open source component name, platform, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the extent +required to debug changes to any libraries licensed under the GNU Lesser General Public License. + diff --git a/README.md b/README.md index 4826e22c..861287f2 100644 --- a/README.md +++ b/README.md @@ -1,69 +1,98 @@ -# TSPerf +# Forecasting Best Practices -TSPerf is a repository of time-series forecasting models with a comprehensive comparison of their performance over provided benchmark data sets, implemented on Azure. Model implementations are compared by forecasting accuracy, training and scoring time and cost on Azure compute. Each implementation includes all the necessary instructions and tools that ensure its reproducibility. We envision TSPerf to become a central repository of time-series forecasting that provides wide coverage of time-series algorithms, from the very simple to the state of the art in the industry. The roadmap of TSPerf can be found [here](docs/roadmap.md). +Time series forecasting is one of the most important topics in data science. Almost every business needs to predict the future in order to make better decisions and allocate resources more effectively. + +This repository provides examples and best practice guidelines for building forecasting solutions. The goal of this repository is to build a comprehensive set of tools and examples that leverage recent advances in forecasting algorithms to build solutions and operationalize them. Rather than creating implementations from scratch, we draw from existing state-of-the-art libraries and build additional utilities around processing and featurizing the data, optimizing and evaluating models, and scaling up to the cloud. + +The examples and best practices are provided as [Python Jupyter notebooks and R markdown files](examples) and [a library of utility functions](fclib). We hope that these examples and utilities can significantly reduce the “time to market” by simplifying the experience from defining the business problem to the development of solutions by orders of magnitude. In addition, the example notebooks would serve as guidelines and showcase best practices and usage of the tools in a wide variety of languages. -The following table summarizes benchmarks that are currently included in TSPerf. - -Benchmark | Dataset | Benchmark directory ---------------------------------------------|------------------------|--------------------------------------------- -Probabilistic electricity load forecasting | GEFCom2017 | `energy_load/GEFCom2017-D_Prob_MT_Hourly` -Retail sales forecasting | Orange Juice dataset | `retail_sales/OrangeJuice_Pt_3Weeks_Weekly` - - - - -A complete documentation of TSPerf, along with the instructions for submitting and reviewing implementations, can be found [here](./docs/tsperf_rules.md). The tables below show performance of implementations that are developed so far. Source code of implementations and instructions for reproducing their performance can be found in submission folders, which are linked in the first column. - -## Probabilistic energy forecasting performance board - - -The following table lists the current submision for the energy forecasting and their respective performances. - - -Submission Name | Pinball Loss | Training and Scoring Time (sec) | Training and Scoring Cost($) | Architecture | Framework | Algorithm | Uni/Multivariate | External Feature Support ---------------------------------------------------------------------------------|----------------|-----------------------------------|--------------------------------|-----------------------------------------------|------------------------------------|---------------------------------------|--------------------|-------------------------- -[Baseline](energy_load%2FGEFCom2017_D_Prob_MT_hourly%2Fsubmissions%2Fbaseline) | 84.11 | 444 | 0.0474 | Linux DSVM (Standard D8s v3 - Premium SSD) | quantreg package of R | Linear Quantile Regression | Multivariate | Yes -[GBM](energy_load%2FGEFCom2017_D_Prob_MT_hourly%2Fsubmissions%2FGBM) | 78.71 | 888 | 0.0947 | Linux DSVM (Standard D8s v3 - Premium SSD) | gbm package of R | Gradient Boosting Decision Tree | Multivariate | Yes -[QRF](energy_load%2FGEFCom2017_D_Prob_MT_hourly%2Fsubmissions%2Fqrf) | 76.48 | 22709 | 19.03 | Linux DSVM (F72s v2 - Premium SSD) | scikit-garden package of Python | Quantile Regression Forest | Multivariate | Yes -[FNN](energy_load%2FGEFCom2017_D_Prob_MT_hourly%2Fsubmissions%2Ffnn) | 79.27 | 4604 | 0.4911 | Linux DSVM (Standard D8s v3 - Premium SSD) | qrnn package of R | Quantile Regression Neural Network | Multivariate | Yes - - -The following chart compares the submissions performance on accuracy in Pinball Loss vs. Training and Scoring cost in $: - - -![EnergyPBLvsTime](./docs/images/Energy-Cost.png) - - - - -## Retail sales forecasting performance board - - -The following table lists the current submision for the retail forecasting and their respective performances. - - -Submission Name | MAPE (%) | Training and Scoring Time (sec) | Training and Scoring Cost ($) | Architecture | Framework | Algorithm | Uni/Multivariate | External Feature Support ---------------------------------------------------------------------------------------------|------------|-----------------------------------|---------------------------------|----------------------------------------------|------------------------------|---------------------------------------------------------------------|--------------------|-------------------------- -[Baseline](retail_sales%2FOrangeJuice_Pt_3Weeks_Weekly%2Fsubmissions%2Fbaseline) | 109.67 | 114.06 | 0.003 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | Naive Forecast | Univariate | No -[AutoARIMA](retail_sales%2FOrangeJuice_Pt_3Weeks_Weekly%2Fsubmissions%2FARIMA) | 70.80 | 265.94 | 0.0071 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | Auto ARIMA | Multivariate | Yes -[ETS](retail_sales%2FOrangeJuice_Pt_3Weeks_Weekly%2Fsubmissions%2FETS) | 70.99 | 277 | 0.01 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | ETS | Multivariate | No -[MeanForecast](retail_sales%2FOrangeJuice_Pt_3Weeks_Weekly%2Fsubmissions%2FMeanForecast) | 70.74 | 69.88 | 0.002 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | Mean forecast | Univariate | No -[SeasonalNaive](retail_sales%2FOrangeJuice_Pt_3Weeks_Weekly%2Fsubmissions%2FSeasonalNaive) | 165.06 | 160.45 | 0.004 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | Seasonal Naive | Univariate | No -[LightGBM](retail_sales%2FOrangeJuice_Pt_3Weeks_Weekly%2Fsubmissions%2FLightGBM) | 36.28 | 625.10 | 0.0167 | Linux DSVM (Standard D2s v3 - Premium SSD) | lightGBM package of Python | Gradient Boosting Decision Tree | Multivariate | Yes -[DilatedCNN](retail_sales%2FOrangeJuice_Pt_3Weeks_Weekly%2Fsubmissions%2FDilatedCNN) | 37.09 | 413 | 0.1032 | Ubuntu VM(NC6 - Standard HDD) | Keras and Tensorflow | Python + Dilated convolutional neural network | Multivariate | Yes -[RNN Encoder-Decoder](retail_sales%2FOrangeJuice_Pt_3Weeks_Weekly%2Fsubmissions%2FRNN) | 37.68 | 669 | 0.2 | Ubuntu VM(NC6 - Standard HDD) | Tensorflow | Python + Encoder-decoder architecture of recurrent neural network | Multivariate | Yes - - - - - - -The following chart compares the submissions performance on accuracy in %MAPE vs. Training and Scoring cost in $: - - -![EnergyPBLvsTime](./docs/images/Retail-Cost.png) +## Content +The following is a summary of models and methods for developing forecasting solutions covered in this repository. The [examples](examples) are organized according to use cases. Currently, we focus on a retail sales forecasting use case as it is widely used in [assortment planning](https://repository.upenn.edu/cgi/viewcontent.cgi?article=1569&context=edissertations), [inventory optimization](https://en.wikipedia.org/wiki/Inventory_optimization), and [price optimization](https://en.wikipedia.org/wiki/Price_optimization). To enable high-throughput forecasting scenarios, we have included examples for forecasting multiple time series with distributed training techniques such as Ray in Python, parallel package in R, and multi-threading in LightGBM. + +| Model | Language | Description | +|---------------------------------------------------------------------------------------------------|----------|-------------------------------------------------------------------------------------------------------------| +| [Auto ARIMA](examples/grocery_sales/python/00_quick_start/autoarima_single_round.ipynb) | Python | Auto Regressive Integrated Moving Average (ARIMA) model that is automatically selected | +| [Linear Regression](examples/grocery_sales/python/00_quick_start/azure_automl_single_round.ipynb) | Python | Linear regression model trained on lagged features of the target variable and external features | +| [LightGBM](examples/grocery_sales/python/00_quick_start/lightgbm_single_round.ipynb) | Python | Gradient boosting decision tree implemented with LightGBM package for high accuracy and fast speed | +| [DilatedCNN](examples/grocery_sales/python/02_model/dilatedcnn_multi_round.ipynb) | Python | Dilated Convolutional Neural Network that captures long-range temporal flow with dilated causal connections | +| [Mean Forecast](examples/grocery_sales/R/02_basic_models.Rmd) | R | Simple forecasting method based on historical mean | +| [ARIMA](examples/grocery_sales/R/02a_reg_models.Rmd) | R | ARIMA model without or with external features | +| [ETS](examples/grocery_sales/R/02_basic_models.Rmd) | R | Exponential Smoothing algorithm with additive errors | +| [Prophet](examples/grocery_sales/R/02b_prophet_models.Rmd) | R | Automated forecasting procedure based on an additive model with non-linear trends | + +The repository also comes with AzureML-themed notebooks and best practices recipes to accelerate the development of scalable, production-grade forecasting solutions on Azure. In particular, we have the following examples for forecasting with Azure AutoML as well as tuning and deploying a forecasting model on Azure. + +| Method | Language | Description | +|-----------------------------------------------------------------------------------------------------------|----------|------------------------------------------------------------------------------------------------------------| +| [Azure AutoML](examples/grocery_sales/python/00_quick_start/azure_automl_single_round.ipynb) | Python | AzureML service that automates model development process and identifies the best machine learning pipeline | +| [HyperDrive](examples/grocery_sales/python/03_model_tune_deploy/azure_hyperdrive_lightgbm.ipynb) | Python | AzureML service for tuning hyperparameters of machine learning models in parallel on cloud | +| [AzureML Web Service](examples/grocery_sales/python/03_model_tune_deploy/azure_hyperdrive_lightgbm.ipynb) | Python | AzureML service for deploying a model as a web service on Azure Container Instances | + + +## Getting Started in Python + +To quickly get started with the repository on your local machine, use the following commands. + +1. Install Anaconda with Python >= 3.6. [Miniconda](https://conda.io/miniconda.html) is a quick way to get started. + +2. Clone the repository + ``` + git clone https://github.com/microsoft/forecasting + cd forecasting/ + ``` + +3. Run setup scripts to create conda environment. Please execute one of the following commands from the root of Forecasting repo based on your operating system. + + - Linux + ``` + ./tools/environment_setup.sh + ``` + + - Windows + ``` + tools\environment_setup.bat + ``` + + Note that for Windows you need to run the batch script from Anaconda Prompt. The script creates a conda environment `forecasting_env` and installs the forecasting utility library `fclib`. + +4. Start the Jupyter notebook server + ``` + jupyter notebook + ``` + +5. Run the [LightGBM single-round](examples/oj_retail/python/00_quick_start/lightgbm_single_round.ipynb) notebook under the `00_quick_start` folder. Make sure that the selected Jupyter kernel is `forecasting_env`. + +If you have any issues with the above setup, or want to find more detailed instructions on how to set up your environment and run examples provided in the repository, on local or a remote machine, please navigate to the [Setup Guide](./docs/SETUP.md). + +## Getting Started in R + +We assume you already have R installed on your machine. If not, simply follow the [instructions on CRAN](https://cloud.r-project.org/) to download and install R. + +The recommended editor is [RStudio](https://rstudio.com), which supports interactive editing and previewing of R notebooks. However, you can use any editor or IDE that supports RMarkdown. In particular, [Visual Studio Code](https://code.visualstudio.com) with the [R extension](https://marketplace.visualstudio.com/items?itemName=Ikuyadeu.r) can be used to edit and render the notebook files. The rendered `.nb.html` files can be viewed in any modern web browser. + +The examples use the [Tidyverts](https://tidyverts.org) family of packages, which is a modern framework for time series analysis that builds on the widely-used [Tidyverse](https://tidyverse.org) family. The Tidyverts framework is still under active development, so it's recommended that you update your packages regularly to get the latest bug fixes and features. + +## Target Audience +Our target audience for this repository includes data scientists and machine learning engineers with varying levels of knowledge in forecasting as our content is source-only and targets custom machine learning modelling. The utilities and examples provided are intended to be solution accelerators for real-world forecasting problems. + +## Contributing +We hope that the open source community would contribute to the content and bring in the latest SOTA algorithm. This project welcomes contributions and suggestions. Before contributing, please see our [Contributing Guide](CONTRIBUTING.md). + +## Reference + +The following is a list of related repositories that you may find helpful. + +| | | +|------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------| +| [Deep Learning for Time Series Forecasting](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) | A collection of examples for using deep neural networks for time series forecasting with Keras. | +| [Microsoft AI Github](https://github.com/microsoft/ai) | Find other Best Practice projects, and Azure AI designed patterns in our central repository. | +## Build Status +| Build | Branch | Status | +|---------------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Linux CPU** | master | [![Build Status](https://dev.azure.com/best-practices/forecasting/_apis/build/status/cpu_unit_tests_linux?branchName=master)](https://dev.azure.com/best-practices/forecasting/_build/latest?definitionId=128&branchName=master) | +| **Linux CPU** | staging | [![Build Status](https://dev.azure.com/best-practices/forecasting/_apis/build/status/cpu_unit_tests_linux?branchName=staging)](https://dev.azure.com/best-practices/forecasting/_build/latest?definitionId=128&branchName=staging) | diff --git a/R_utils/cluster.R b/R_utils/cluster.R new file mode 100644 index 00000000..710b83bd --- /dev/null +++ b/R_utils/cluster.R @@ -0,0 +1,36 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +#' Creates a local background cluster for parallel computations +#' +#' @param ncores The number of nodes (cores) for the cluster. The default is 2 less than the number of physical cores. +#' @param libs The packages to load on each node, as a character vector. +#' @param useXDR For most platforms, this can be left at its default `FALSE` value. +#' @return +#' A cluster object. +make_cluster <- function(ncores=NULL, libs=character(0), useXDR=FALSE) +{ + if(is.null(ncores)) + ncores <- max(2, parallel::detectCores(logical=FALSE) - 2) + cl <- parallel::makeCluster(ncores, type="PSOCK", useXDR=useXDR) + res <- try(parallel::clusterCall( + cl, + function(libs) + { + for(lib in libs) library(lib, character.only=TRUE) + }, + libs + ), silent=TRUE) + if(inherits(res, "try-error")) + parallel::stopCluster(cl) + else cl +} + + +#' Deletes a local background cluster +#' +#' @param cl The cluster object, as returned from `make_cluster`. +destroy_cluster <- function(cl) +{ + try(parallel::stopCluster(cl), silent=TRUE) +} diff --git a/R_utils/model_eval.R b/R_utils/model_eval.R new file mode 100644 index 00000000..a321ad58 --- /dev/null +++ b/R_utils/model_eval.R @@ -0,0 +1,50 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +#' Computes forecast values on a dataset +#' +#' @param mable A mable (model table) as returned by `fabletools::model`. +#' @param newdata The dataset for which to compute forecasts. +#' @param ... Further arguments to `fabletools::forecast`. +#' @return +#' A tsibble, with one column per model type in `mable`, and one column named `.response` containing the response variable from `newdata`. +get_forecasts <- function(mable, newdata, ...) +{ + fcast <- forecast(mable, new_data=newdata, ...) + keyvars <- key_vars(fcast) + keyvars <- keyvars[-length(keyvars)] + indexvar <- index_var(fcast) + fcastvar <- as.character(attr(fcast, "response")[[1]]) + fcast <- fcast %>% + as_tibble() %>% + pivot_wider( + id_cols=all_of(c(keyvars, indexvar)), + names_from=.model, + values_from=all_of(fcastvar)) + select(newdata, !!keyvars, !!indexvar, !!fcastvar) %>% + rename(.response=!!fcastvar) %>% + inner_join(fcast) +} + + +#' Evaluate quality of forecasts given a criterion +#' +#' @param fcast_df A tsibble as returned from `get_forecasts`. +#' @param gof A goodness-of-fit function. The default is to use `fabletools::MAPE`, which computes the mean absolute percentage error. +#' @return +#' A single-row data frame with the computed goodness-of-fit statistic for each model. +eval_forecasts <- function(fcast_df, gof=fabletools::MAPE) +{ + if(!is.function(gof)) + gof <- get(gof, mode="function") + resp <- fcast_df$.response + keyvars <- key_vars(fcast_df) + indexvar <- index_var(fcast_df) + fcast_df %>% + as_tibble() %>% + select(-all_of(c(keyvars, indexvar, ".response"))) %>% + summarise_all( + function(x, .actual) gof(x - .actual, .actual=.actual), + .actual=resp + ) +} diff --git a/R_utils/save_objects.R b/R_utils/save_objects.R new file mode 100644 index 00000000..b9492491 --- /dev/null +++ b/R_utils/save_objects.R @@ -0,0 +1,25 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +#' Loads serialised objects relating to a given forecasting example into the current workspace +#' +#' @param example The particular forecasting example. +#' @param file The name of the file (with extension). +#' @return +#' This function is run for its side effect, namely loading the given file into the global environment. +load_objects <- function(example, file) +{ + examp_dir <- here::here("examples", example, "R") + load(file.path(examp_dir, file), envir=globalenv()) +} + +#' Saves R objects for a forecasting example to a file +#' +#' @param ... Objects to save, as unquoted names. +#' @param example The particular forecasting example. +#' @param file The name of the file (with extension). +save_objects <- function(..., example, file) +{ + examp_dir <- here::here("examples", example, "R") + save(..., file=file.path(examp_dir, file)) +} diff --git a/assets/time_series_split_multiround.jpg b/assets/time_series_split_multiround.jpg new file mode 100644 index 00000000..ce2babae Binary files /dev/null and b/assets/time_series_split_multiround.jpg differ diff --git a/assets/time_series_split_singleround.jpg b/assets/time_series_split_singleround.jpg new file mode 100644 index 00000000..a711fa64 Binary files /dev/null and b/assets/time_series_split_singleround.jpg differ diff --git a/codeofconduct.md b/codeofconduct.md new file mode 100644 index 00000000..6af871c3 --- /dev/null +++ b/codeofconduct.md @@ -0,0 +1 @@ +[Our Code of Conduct](https://opensource.microsoft.com/codeofconduct/faq/) diff --git a/common/ReadmeGenerator.py b/common/ReadmeGenerator.py deleted file mode 100644 index 2cecc9a5..00000000 --- a/common/ReadmeGenerator.py +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -import csvtomd -import matplotlib.pyplot as plt -import pandas as pd -import numpy as np - - -### Generating performance charts -################################################# - -#Function to plot a performance chart -def plot_perf(x,y,df): - - # extract submission name from submission URL - labels = df.apply(lambda x: x['Submission Name'][1:].split(']')[0], axis=1) - - fig = plt.scatter(x=df[x],y=df[y], label=labels, s=150, alpha = 0.5, - c= ['b', 'g', 'r', 'c', 'm', 'y', 'k']) - plt.xlabel(x) - plt.ylabel(y) - plt.title(y + ' by ' + x) - offset = (max(df[y]) - min(df[y]))/50 - for i,name in enumerate(labels): - ax = df[x][i] - ay = df[y][i] + offset * (-2.5 + i % 5) - plt.text(ax, ay, name, fontsize=10) - - return(fig) - -### Printing the Readme.md file -############################################ -readmefile = '../Readme.md' -#Wrtie header -#print(file=open(readmefile)) -print('# TSPerf\n', file=open(readmefile, "w")) - -print('TSPerf is a collection of implementations of time-series forecasting algorithms in Azure cloud and comparison of their performance over benchmark datasets. \ -Algorithm implementations are compared by model accuracy, training and scoring time and cost. Each implementation includes all the necessary \ -instructions and tools that ensure its reproducibility.', file=open(readmefile, "a")) - -print('The following table summarizes benchmarks that are currently included in TSPerf.\n', file=open(readmefile, "a")) - -#Read the benchmark table the CSV file and converrt to a table in md format -with open('Benchmarks.csv', 'r') as f: - table = csvtomd.csv_to_table(f, ',') -print(csvtomd.md_table(table), file=open(readmefile, "a")) -print('\n\n\n',file=open(readmefile, "a")) - -print('A complete documentation of TSPerf, along with the instructions for submitting and reviewing implementations, \ -can be found [here](./docs/tsperf_rules.md). The tables below show performance of implementations that are developed so far. Source code of \ -implementations and instructions for reproducing their performance can be found in submission folders, which are linked in the first column.\n', file=open(readmefile, "a")) - -### Write the Energy section -#============================ - -print('## Probabilistic energy forecasting performance board\n\n', file=open(readmefile, "a")) -print('The following table lists the current submision for the energy forecasting and their respective performances.\n\n', file=open(readmefile, "a")) - -#Read the energy perfromane board from the CSV file and converrt to a table in md format -with open('TSPerfBoard-Energy.csv', 'r') as f: - table = csvtomd.csv_to_table(f, ',') -print(csvtomd.md_table(table), file=open(readmefile, "a")) - -#Read Energy Performance Board CSV file -df = pd.read_csv('TSPerfBoard-Energy.csv', engine='python') -#df - -#Plot ,'Pinball Loss' by 'Training and Scoring Cost($)' chart -fig4 = plt.figure(figsize=(12, 8), dpi= 80, facecolor='w', edgecolor='k') #this sets the plotting area size -fig4 = plot_perf('Training and Scoring Cost($)','Pinball Loss',df) -plt.savefig('../docs/images/Energy-Cost.png') - - -#insetting the performance charts -print('\n\nThe following chart compares the submissions performance on accuracy in Pinball Loss vs. Training and Scoring cost in $:\n\n ', file=open(readmefile, "a")) -print('![EnergyPBLvsTime](./docs/images/Energy-Cost.png)' ,file=open(readmefile, "a")) -print('\n\n\n',file=open(readmefile, "a")) - - -#print the retail sales forcsating section -#======================================== -print('## Retail sales forecasting performance board\n\n', file=open(readmefile, "a")) -print('The following table lists the current submision for the retail forecasting and their respective performances.\n\n', file=open(readmefile, "a")) - -#Read the energy perfromane board from the CSV file and converrt to a table in md format -with open('TSPerfBoard-Retail.csv', 'r') as f: - table = csvtomd.csv_to_table(f, ',') -print(csvtomd.md_table(table), file=open(readmefile, "a")) -print('\n\n\n',file=open(readmefile, "a")) - -#Read Retail Performane Board CSV file -df = pd.read_csv('TSPerfBoard-Retail.csv', engine='python') -#df - -#Plot MAPE (%) by Training and Scoring Cost ($) chart -fig2 = plt.figure(figsize=(12, 8), dpi= 80, facecolor='w', edgecolor='k') #this sets the plotting area size -fig2 = plot_perf('Training and Scoring Cost ($)','MAPE (%)',df) -plt.savefig('../docs/images/Retail-Cost.png') - - -#insetting the performance charts -print('\n\nThe following chart compares the submissions performance on accuracy in %MAPE vs. Training and Scoring cost in $:\n\n ', file=open(readmefile, "a")) -print('![EnergyPBLvsTime](./docs/images/Retail-Cost.png)' ,file=open(readmefile, "a")) -print('\n\n\n',file=open(readmefile, "a")) - - - -print('A new Readme.md file has been generated successfuly.') - - diff --git a/common/conda_dependencies.yml b/common/conda_dependencies.yml deleted file mode 100644 index cc43ef5f..00000000 --- a/common/conda_dependencies.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: tsperf -channels: - - defaults - - r - - conda-forge -dependencies: - - python=3.6 - - numpy=1.15.0 - - pandas=0.23.4 - - xlrd=1.1.0 - - urllib3=1.21.1 - - jupyter=1.0.0 - - r-essentials=3.5.1 - - matplotlib=2.2.3 - - pip: - - csvtomd==0.3.0 - diff --git a/common/key.txt b/common/key.txt deleted file mode 100644 index 7ffe1b7e..00000000 --- a/common/key.txt +++ /dev/null @@ -1 +0,0 @@ -5/cVuditI8OEN7ADztEWg6k+91MTQVbt \ No newline at end of file diff --git a/common/utils.py b/common/utils.py deleted file mode 100644 index 3a5898b6..00000000 --- a/common/utils.py +++ /dev/null @@ -1,118 +0,0 @@ -import datetime -import pandas as pd -from dateutil.relativedelta import relativedelta - -ALLOWED_TIME_COLUMN_TYPES = [pd.Timestamp, pd.DatetimeIndex, - datetime.datetime, datetime.date] - - -def is_datetime_like(x): - """Function that checks if a data frame column x is of a datetime type.""" - return any(isinstance(x, col_type) - for col_type in ALLOWED_TIME_COLUMN_TYPES) - - -def get_datetime_col(df, datetime_colname): - """ - Helper function for extracting the datetime column as datetime type from - a data frame. - - Args: - df: pandas DataFrame containing the column to convert - datetime_colname: name of the column to be converted - - Returns: - pandas.Series: converted column - - Raises: - Exception: if datetime_colname does not exist in the dateframe df. - Exception: if datetime_colname cannot be converted to datetime type. - """ - if datetime_colname in df.index.names: - datetime_col = df.index.get_level_values(datetime_colname) - elif datetime_colname in df.columns: - datetime_col = df[datetime_colname] - else: - raise Exception('Column or index {0} does not exist in the data ' - 'frame'.format(datetime_colname)) - - if not is_datetime_like(datetime_col): - try: - datetime_col = pd.to_datetime(df[datetime_colname]) - except: - raise Exception('Column or index {0} can not be converted to ' - 'datetime type.'.format(datetime_colname)) - return datetime_col - - -def get_month_day_range(date): - """ - Returns the first date and last date of the month of the given date. - """ - # Replace the date in the original timestamp with day 1 - first_day = date + relativedelta(day=1) - # Replace the date in the original timestamp with day 1 - # Add a month to get to the first day of the next month - # Subtract one day to get the last day of the current month - last_day = date + relativedelta(day=1, months=1, days=-1, hours=23) - return first_day, last_day - - -def split_train_validation(df, fct_horizon, datetime_colname): - """ - Splits the input dataframe into train and validate folds based on the forecast - creation time (fct) and forecast horizon specified by fct_horizon. - - Args: - df: The input data frame to split. - fct_horizon: list of tuples in the format of - (fct, (forecast_horizon_start, forecast_horizon_end)) - datetime_colname: name of the datetime column - - Note: df[datetime_colname] needs to be a datetime type. - """ - i_round = 0 - for fct, horizon in fct_horizon: - i_round += 1 - train = df.loc[df[datetime_colname] < fct, ].copy() - validation = df.loc[(df[datetime_colname] >= horizon[0]) & - (df[datetime_colname] <= horizon[1]), ].copy() - - yield i_round, train, validation - - -def add_datetime(input_datetime, unit, add_count): - """ - Function to add a specified units of time (years, months, weeks, days, - hours, or minutes) to the input datetime. - - Args: - input_datetime: datatime to be added to - unit: unit of time, valid values: 'year', 'month', 'week', - 'day', 'hour', 'minute'. - add_count: number of units to add - - Returns: - New datetime after adding the time difference to input datetime. - - Raises: - Exception: if invalid unit is provided. Valid units are: - 'year', 'month', 'week', 'day', 'hour', 'minute'. - """ - if unit == 'year': - new_datetime = input_datetime + relativedelta(years=add_count) - elif unit == 'month': - new_datetime = input_datetime + relativedelta(months=add_count) - elif unit == 'week': - new_datetime = input_datetime + relativedelta(weeks=add_count) - elif unit == 'day': - new_datetime = input_datetime + relativedelta(days=add_count) - elif unit == 'hour': - new_datetime = input_datetime + relativedelta(hours=add_count) - elif unit == 'minute': - new_datetime = input_datetime + relativedelta(minutes=add_count) - else: - raise Exception('Invalid backtest step unit, {}, provided. Valid ' - 'step units are year, month, week, day, hour, and minute' - .format(unit)) - return new_datetime \ No newline at end of file diff --git a/contrib/README.md b/contrib/README.md new file mode 100644 index 00000000..58872e4d --- /dev/null +++ b/contrib/README.md @@ -0,0 +1,3 @@ +# Contrib + +Independent or incubating algorithms and utilities are candidates for the `contrib` folder. This folder will house contributions which may not easily fit into the core repository or need time to refactor the code and add necessary tests. diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/Dockerfile b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/Dockerfile similarity index 58% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/Dockerfile rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/Dockerfile index 7dbef770..c23b38d4 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/Dockerfile +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/Dockerfile @@ -1,8 +1,6 @@ ## Download base image -FROM continuumio/anaconda3:4.4.0 -#ADD TSPerf/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/conda_dependencies.yml /tmp/conda_dependencies.yml +FROM rocker/r-base ADD ./conda_dependencies.yml /tmp -#ADD TSPerf/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/install_R_dependencies.R /tmp/install_R_dependencies.R ADD ./install_R_dependencies.R /tmp WORKDIR /tmp @@ -13,12 +11,9 @@ RUN apt-get install -y --no-install-recommends \ zlib1g-dev \ libssl-dev \ libssh2-1-dev \ - libcurl4-openssl-dev \ libreadline-gplv2-dev \ libncursesw5-dev \ libsqlite3-dev \ - tk-dev \ - libgdbm-dev \ libc6-dev \ libbz2-dev \ libffi-dev \ @@ -26,26 +21,20 @@ RUN apt-get install -y --no-install-recommends \ build-essential \ checkinstall \ ca-certificates \ - curl \ lsb-release \ apt-utils \ python3-pip \ - vim + vim -## Create and activate conda environment +# Install miniconda +RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh +RUN bash ~/miniconda.sh -b -p $HOME/miniconda +ENV PATH="/root/miniconda/bin:${PATH}" + +## Create conda environment RUN conda update -y conda RUN conda env create --file conda_dependencies.yml -## Install R -ENV R_BASE_VERSION 3.5.1 -RUN apt-get install -y aptitude -RUN echo "deb http://http.debian.net/debian sid main" > /etc/apt/sources.list.d/debian-unstable.list \ - && aptitude install -y debian-keyring debian-archive-keyring -RUN apt-get remove -y binutils -RUN apt-get update \ - && apt-get install -t unstable -y --no-install-recommends \ - r-base=${R_BASE_VERSION}-* - # Install prerequisites of R packages RUN apt-get install -y \ gfortran \ @@ -62,7 +51,7 @@ RUN Rscript install_R_dependencies.R RUN rm install_R_dependencies.R RUN rm conda_dependencies.yml -RUN mkdir /TSPerf -WORKDIR /TSPerf +RUN mkdir /Forecasting +WORKDIR /Forecasting ENTRYPOINT ["/bin/bash"] diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/README.md b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/README.md similarity index 59% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/README.md rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/README.md index b1868f99..fbdeaba0 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/README.md +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/README.md @@ -12,7 +12,7 @@ **Submission name:** GBM -**Submission path:** energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM +**Submission path:** benchmarks/GEFCom2017_D_Prob_MT_hourly/GBM ## Implementation description @@ -35,105 +35,105 @@ The data of January - April of 2016 were used as validation dataset for some min ### Description of implementation scripts -* `feature_engineering.py`: Python script for computing features and generating feature files. +* `compute_features.py`: Python script for computing features and generating feature files. * `train_predict.R`: R script that trains Gradient Boosting Machine model for quantile regression task and predicts on each round of test data. -* `train_score_vm.sh`: Bash script that runs `feature_engineering.py`and `train_predict.R` five times to generate five submission files and measure model running time. +* `train_score_vm.sh`: Bash script that runs `compute_features.py` and `train_predict.R` five times to generate five submission files and measure model running time. ### Steps to reproduce results -0. Follow the instructions [here](#resource-deployment-instructions) to provision a Linux virtual machine and log into the provisioned +1. Follow the instructions [here](#resource-deployment-instructions) to provision a Linux virtual machine and log into the provisioned VM. -1. Clone the Forecasting repository to the home directory of your machine +2. Clone the Forecasting repository to the home directory of your machine ```bash cd ~ git clone https://github.com/Microsoft/Forecasting.git ``` - Use one of the following options to securely connect to the Git repo: - * [Personal Access Tokens](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/) - For this method, the clone command becomes + Use one of the following options to securely connect to the Git repo: + * [Personal Access Tokens](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/) + For this method, the clone command becomes ```bash git clone https://:@github.com/Microsoft/Forecasting.git ``` - * [Git Credential Managers](https://github.com/Microsoft/Git-Credential-Manager-for-Windows) - * [Authenticate with SSH](https://help.github.com/articles/connecting-to-github-with-ssh/) - - -2. Create a conda environment for running the scripts of data downloading, data preparation, and result evaluation. + * [Git Credential Managers](https://github.com/Microsoft/Git-Credential-Manager-for-Windows) + * [Authenticate with SSH](https://help.github.com/articles/connecting-to-github-with-ssh/) + +3. Create a conda environment for running the scripts of data downloading, data preparation, and result evaluation. To do this, you need to check if conda has been installed by runnning command `conda -V`. If it is installed, you will see the conda version in the terminal. Otherwise, please follow the instructions [here](https://conda.io/docs/user-guide/install/linux.html) to install conda. -From the `~/Forecasting` directory on the VM create a conda environment named `tsperf` by running: +From the `~/Forecasting` directory on the VM create a conda environment named `tsperf` by running: - ```bash - conda env create --file ./common/conda_dependencies.yml - ``` + ```bash + conda env create --file tsperf/benchmarking/conda_dependencies.yml + ``` -3. Download and extract data **on the VM**. +4. Download and extract data **on the VM**. ```bash source activate tsperf - python energy_load/GEFCom2017_D_Prob_MT_hourly/common/download_data.py - python energy_load/GEFCom2017_D_Prob_MT_hourly/common/extract_data.py + python tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly/download_data.py + python tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly/extract_data.py ``` -4. Prepare Docker container for model training and predicting. +5. Prepare Docker container for model training and predicting. > NOTE: To execute docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). Otherwise, simply prefix all docker commands with sudo. - 4.1 Log into Azure Container Registry (ACR) + 4.1 Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v + ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). + + 4.2 Build a local Docker image + + ```bash + sudo docker build -t gbm_image benchmarks/GEFCom2017_D_Prob_MT_hourly/GBM ``` - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). +6. Train and predict **within Docker container** - 4.2 Pull the Docker image from ACR to your VM + 6.1 Start a Docker container from the image ```bash - sudo docker pull tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/gbm_image:v1 - ``` - -5. Train and predict **within Docker container** - - 5.1 Start a Docker container from the image - - ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name gbm_container tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/gbm_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name gbm_container gbm_image ``` Note that option `-v ~/Forecasting:/Forecasting` mounts the `~/Forecasting` folder (the one you cloned) to the container so that you can access the code and data on your VM within the container. - 5.2 Train and predict + 6.2 Train and predict ``` source activate tsperf cd /Forecasting - bash ./energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/train_score_vm.sh > out.txt & + bash benchmarks/GEFCom2017_D_Prob_MT_hourly/GBM/train_score_vm.sh > out.txt & ``` After generating the forecast results, you can exit the Docker container with command `exit`. -6. Model evaluation **on the VM** +7. Model evaluation **on the VM** ```bash source activate tsperf cd ~/Forecasting - bash ./common/evaluate submissions/GBM energy_load/GEFCom2017_D_Prob_MT_hourly + bash tsperf/benchmarking/evaluate GBM tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly ``` ## Implementation resources **Platform:** Azure Cloud **Resource location:** East US region -**Hardware:** Standard D8s v3 (8 vcpus, 32 GB memory) Ubuntu Linux VM -**Data storage:** Premium SSD -**Docker image:** tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/gbm_image +**Hardware:** Standard D8s v3 (8 vcpus, 32 GB memory) Ubuntu Linux VM +**Data storage:** Premium SSD +**Dockerfile:** [energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/Dockerfile) **Key packages/dependencies:** * Python - - python==3.6 + - python==3.7 * R - - r-base==3.5.1 + - r-base==3.5.3 - gbm==2.1.3 - data.table==1.11.4 @@ -145,34 +145,34 @@ Please follow the instructions below to deploy the Linux DSVM. ## Implementation evaluation **Quality:** -* Pinball loss run 1: 78.71 -* Pinball loss run 2: 78.72 -* Pinball loss run 3: 78.69 -* Pinball loss run 4: 78.71 -* Pinball loss run 5: 78.71 +* Pinball loss run 1: 78.85 +* Pinball loss run 2: 78.84 +* Pinball loss run 3: 78.86 +* Pinball loss run 4: 78.76 +* Pinball loss run 5: 78.82 -Median Pinball loss: **78.71** +Median Pinball loss: **78.84** **Time:** -* Run time 1: 878 seconds -* Run time 2: 888 seconds -* Run time 3: 894 seconds -* Run time 4: 894 seconds -* Run time 5: 878 seconds +* Run time 1: 268 seconds +* Run time 2: 269 seconds +* Run time 3: 269 seconds +* Run time 4: 269 seconds +* Run time 5: 266 seconds -Median run time: **888 seconds** +Median run time: **269 seconds** **Cost:** -The hourly cost of the Standard D8s Ubuntu Linux VM in East US Azure region is 0.3840 USD, based on the price at the submission date. Thus, the total cost is `888/3600 * 0.3840 = $0.0947`. +The hourly cost of the Standard D8s Ubuntu Linux VM in East US Azure region is 0.3840 USD, based on the price at the submission date. Thus, the total cost is `269/3600 * 0.3840 = $0.0287`. **Average relative improvement (in %) over GEFCom2017 benchmark model** (measured over the first run) -Round 1: 9.57 -Round 2: 18.17 -Round 3: 17.83 -Round 4: 8.58 -Round 5: 7.54 -Round 6: 6.96 +Round 1: 9.55 +Round 2: 18.24 +Round 3: 17.90 +Round 4: 8.27 +Round 5: 7.22 +Round 6: 6.80 **Ranking in the qualifying round of GEFCom2017 competition** 4 diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/compute_features.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/compute_features.py new file mode 100644 index 00000000..c5d4ae0e --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/compute_features.py @@ -0,0 +1,66 @@ +""" +This script uses +energy_load/GEFCom2017_D_Prob_MT_hourly/common/feature_engineering.py to +compute a list of features needed by the Gradient Boosting Machines model. +""" +import os +import sys +import getopt + +import localpath + +from tsperf.benchmarking.GEFCom2017_D_Prob_MT_hourly.feature_engineering import compute_features + +SUBMISSIONS_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +DATA_DIR = os.path.join(SUBMISSIONS_DIR, "data") +print("Data directory used: {}".format(DATA_DIR)) + +OUTPUT_DIR = os.path.join(DATA_DIR, "features") +TRAIN_DATA_DIR = os.path.join(DATA_DIR, "train") +TEST_DATA_DIR = os.path.join(DATA_DIR, "test") + +DF_CONFIG = { + "time_col_name": "Datetime", + "ts_id_col_names": "Zone", + "target_col_name": "DEMAND", + "frequency": "H", + "time_format": "%Y-%m-%d %H:%M:%S", +} + +# Feature configuration list used to specify the features to be computed by +# compute_features. +# Each feature configuration is a tuple in the format of (feature_name, +# featurizer_args) +# feature_name is used to determine the featurizer to use, see FEATURE_MAP in +# energy_load/GEFCom2017_D_Prob_MT_hourly/common/feature_engineering.py +# featurizer_args is a dictionary of arguments passed to the +# featurizer +feature_config_list = [ + ("temporal", {"feature_list": ["hour_of_day", "month_of_year"]}), + ("annual_fourier", {"n_harmonics": 3}), + ("weekly_fourier", {"n_harmonics": 3}), + ("previous_year_load_lag", {"input_col_names": "DEMAND", "round_agg_result": True},), + ("previous_year_temp_lag", {"input_col_names": "DryBulb", "round_agg_result": True},), +] + +if __name__ == "__main__": + opts, args = getopt.getopt(sys.argv[1:], "", ["submission="]) + for opt, arg in opts: + if opt == "--submission": + submission_folder = arg + output_data_dir = os.path.join(SUBMISSIONS_DIR, submission_folder, "data") + if not os.path.isdir(output_data_dir): + os.mkdir(output_data_dir) + OUTPUT_DIR = os.path.join(output_data_dir, "features") + if not os.path.isdir(OUTPUT_DIR): + os.mkdir(OUTPUT_DIR) + + compute_features( + TRAIN_DATA_DIR, + TEST_DATA_DIR, + OUTPUT_DIR, + DF_CONFIG, + feature_config_list, + filter_by_month=True, + compute_load_ratio=True, + ) diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/conda_dependencies.yml b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/conda_dependencies.yml similarity index 73% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/conda_dependencies.yml rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/conda_dependencies.yml index 5a16c66b..13689398 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/conda_dependencies.yml +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/conda_dependencies.yml @@ -6,4 +6,5 @@ dependencies: - numpy=1.15.1 - pandas=0.23.4 - xlrd=1.1.0 - - urllib3=1.21.1 \ No newline at end of file + - urllib3=1.21.1 + - scikit-learn=0.20.3 \ No newline at end of file diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/install_R_dependencies.R b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/install_R_dependencies.R new file mode 100644 index 00000000..7324dabb --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/install_R_dependencies.R @@ -0,0 +1,7 @@ +pkgs <- c( + 'data.table', + 'gbm', + 'doParallel' +) + +install.packages(pkgs) \ No newline at end of file diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/localpath.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/localpath.py similarity index 54% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/localpath.py rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/localpath.py index 66d2095f..e2c44cb6 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/localpath.py +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/localpath.py @@ -3,10 +3,9 @@ This script inserts the TSPerf directory into sys.path, so that scripts can impo """ import os, sys -_CUR_DIR = os.path.dirname(os.path.abspath(__file__)) -_SUBMISSIONS_DIR = os.path.dirname(_CUR_DIR) -_BENCHMARK_DIR = os.path.dirname(_SUBMISSIONS_DIR) -TSPERF_DIR = os.path.dirname(os.path.dirname(_BENCHMARK_DIR)) + +_CURR_DIR = os.path.dirname(os.path.abspath(__file__)) +TSPERF_DIR = os.path.dirname(os.path.dirname(os.path.dirname(_CURR_DIR))) if TSPERF_DIR not in sys.path: sys.path.insert(0, TSPERF_DIR) diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/train_predict.R b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/train_predict.R new file mode 100644 index 00000000..2e965af9 --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/train_predict.R @@ -0,0 +1,101 @@ +args = commandArgs(trailingOnly=TRUE) +seed_value = args[1] + +library('data.table') +library('gbm') +library('doParallel') + +n_cores = detectCores() + +cl <- parallel::makeCluster(n_cores) +parallel::clusterEvalQ(cl, lapply(c("gbm", "data.table"), library, character.only = TRUE)) +registerDoParallel(cl) + +data_dir = 'benchmarks/GEFCom2017_D_Prob_MT_hourly/GBM/data/features' + +train_dir = file.path(data_dir, 'train') +test_dir = file.path(data_dir, 'test') + +train_file_prefix = 'train_round_' +test_file_prefix = 'test_round_' + +output_file = file.path(paste('benchmarks/GEFCom2017_D_Prob_MT_hourly/GBM/submission_seed_', seed_value, '.csv', sep="")) + +normalize_columns = list( 'DEMAND_same_woy_lag', 'DryBulb_same_doy_lag') + +quantiles = seq(0.1, 0.9, by = 0.1) + +result_all = list() +N_ROUNDS = 6 +for (iR in 1:N_ROUNDS){ + print(paste('Round', iR)) + train_file = file.path(train_dir, paste(train_file_prefix, iR, '.csv', sep='')) + test_file = file.path(test_dir, paste(test_file_prefix, iR, '.csv', sep='')) + + train_df = fread(train_file) + test_df = fread(test_file) + + for (c in normalize_columns){ + min_c = min(train_df[, ..c]) + max_c = max(train_df[, ..c]) + train_df[, c] = (train_df[, ..c] - min_c)/(max_c - min_c) + test_df[, c] = (test_df[, ..c] - min_c)/(max_c - min_c) + } + + + zones = unique(train_df[, Zone]) + hours = unique(train_df[, hour_of_day]) + all_zones_hours = expand.grid(zones, hours) + colnames(all_zones_hours) = c('Zone', 'hour_of_day') + + test_df$average_load_ratio = rowMeans(test_df[,c('recent_load_ratio_10', 'recent_load_ratio_11', 'recent_load_ratio_12', + 'recent_load_ratio_13', 'recent_load_ratio_14', 'recent_load_ratio_15', 'recent_load_ratio_16')], na.rm=TRUE) + test_df[, load_ratio:=mean(average_load_ratio), by=list(hour_of_day, month_of_year)] + + ntrees = 1000 + shrinkage = 0.005 + + result_all_zones_hours = foreach(i = 1:nrow(all_zones_hours), .combine = rbind) %dopar%{ + set.seed(seed_value) + + z = all_zones_hours[i, 'Zone'] + h = all_zones_hours[i, 'hour_of_day'] + train_df_sub = train_df[Zone == z & hour_of_day == h] + test_df_sub = test_df[Zone == z & hour_of_day == h] + + + result_all_quantiles = list() + q_counter = 1 + for (tau in quantiles) { + result = data.table(Zone=test_df_sub$Zone, Datetime = test_df_sub$Datetime, Round=iR) + + gbmModel = gbm(formula = DEMAND ~ DEMAND_same_woy_lag + DryBulb_same_doy_lag + + annual_sin_1 + annual_cos_1 + annual_sin_2 + annual_cos_2 + annual_sin_3 + annual_cos_3 + + weekly_sin_1 + weekly_cos_1 + weekly_sin_2 + weekly_cos_2 + weekly_sin_3 + weekly_cos_3, + distribution = list(name = "quantile", alpha = tau), + data = train_df_sub, + n.trees = ntrees, + shrinkage = shrinkage) + + gbmPredictions = predict(object = gbmModel, + newdata = test_df_sub, + n.trees = ntrees, + type = "response") * test_df_sub$load_ratio + + result$Prediction = gbmPredictions + result$q = tau + + result_all_quantiles[[q_counter]] = result + q_counter = q_counter + 1 + } + rbindlist(result_all_quantiles) + } + result_all[[iR]] = result_all_zones_hours +} + +result_final = rbindlist(result_all) +# Sort the quantiles +result_final = result_final[order(Prediction), q:=quantiles, by=c('Zone', 'Datetime', 'Round')] +result_final$Prediction = round(result_final$Prediction) + +fwrite(result_final, output_file) diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_score_vm.sh b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/train_score_vm.sh similarity index 56% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_score_vm.sh rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/train_score_vm.sh index 9aca656e..13b6f4e9 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_score_vm.sh +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/GBM/train_score_vm.sh @@ -1,14 +1,14 @@ #!/bin/bash -path=energy_load/GEFCom2017_D_Prob_MT_hourly +path=benchmarks/GEFCom2017_D_Prob_MT_hourly for i in `seq 1 5`; do echo "Run $i" start=`date +%s` echo 'Creating features...' - python $path/submissions/fnn/feature_engineering.py --submission fnn + python $path/GBM/compute_features.py --submission GBM echo 'Training and predicting...' - Rscript $path/submissions/fnn/train_predict.R $i + Rscript $path/GBM/train_predict.R $i end=`date +%s` echo 'Running time '$((end-start))' seconds' diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/README.md b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/README.md similarity index 70% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/README.md rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/README.md index a41707fb..0d6c65c8 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/README.md +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/README.md @@ -22,7 +22,7 @@ The table below summarizes the benchmark problem definition: | **Forecast granularity** | hourly | | **Forecast type** | probabilistic, 9 quantiles: 10th, 20th, ...90th percentiles| -A template of the submission file can be found [here](https://github.com/Microsoft/Forecasting/blob/master/energy_load/GEFCom2017_D_Prob_MT_hourly/reference/submission.csv) +A template of the submission file can be found [here](https://github.com/Microsoft/Forecasting/blob/master/benchmarks/GEFCom2017_D_Prob_MT_hourly/sample_submission.csv) # Data ### Dataset attribution @@ -31,8 +31,7 @@ A template of the submission file can be found [here](https://github.com/Microso ### Dataset description 1. The data files can be downloaded from ISO New England website via the -[zonal information page of the energy, load and demand reports](https://www -.iso-ne.com/isoexpress/web/reports/load-and-demand/-/tree/zone-info). If you +[zonal information page of the energy, load and demand reports](https://www.iso-ne.com/isoexpress/web/reports/load-and-demand/-/tree/zone-info). If you are outside United States, you may need a VPN to access the data. Use columns A, B, D, M and N in the worksheets of "YYYY SMD Hourly Data" files, where YYYY represents the year. Detailed information of each column can be found in the @@ -68,6 +67,45 @@ using the available training data: | 5 | 2011-01-01 01:00:00 | 2017-01-31 00:00:00 | 2017-03-01 01:00:00 | 2017-03-31 00:00:00 | | 6 | 2011-01-01 01:00:00 | 2017-01-31 00:00:00 | 2017-04-01 01:00:00 | 2017-04-30 00:00:00 | + +### Feature engineering +A common feature engineering script, common/feature_engineering.py, is provided to be used by individual submissions. +Below is an example of using this script. +The feature configuration list is used to specify the features to be computed by the compute_features function. +Each feature configuration is a tuple in the format of (feature_name, featurizer_args). +* feature_name is used to determine the featurizer to use, see FEATURE_MAP in +common/feature_engineering.py. +* featurizer_args is a dictionary of arguments passed to the featurizer. + +```python +from energy_load.GEFCom2017_D_Prob_MT_hourly.common.feature_engineering\ + import compute_features + +DF_CONFIG = { + 'time_col_name': 'Datetime', + 'grain_col_name': 'Zone', + 'value_col_name': 'DEMAND', + 'frequency': 'hourly', + 'time_format': '%Y-%m-%d %H:%M:%S' +} + +feature_config_list = \ + [('temporal', {'feature_list': ['hour_of_day', 'month_of_year']}), + ('annual_fourier', {'n_harmonics': 3}), + ('weekly_fourier', {'n_harmonics': 3}), + ('previous_year_load_lag', + {'input_col_name': 'DEMAND', 'output_col_name': 'load_lag'}), + ('previous_year_dry_bulb_lag', + {'input_col_name': 'DryBulb', 'output_col_name': 'dry_bulb_lag'})] + +TRAIN_DATA_DIR = './data/train' +TEST_DATA_DIR = './data/test' +OUTPUT_DIR = './data/features' + +compute_features(TRAIN_DATA_DIR, TEST_DATA_DIR, OUTPUT_DIR, DF_CONFIG, + feature_config_list, + filter_by_month=True) +``` # Model Evaluation **Evaluation metric**: Pinball loss diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/Dockerfile b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/Dockerfile similarity index 50% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/Dockerfile rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/Dockerfile index 3d9cf2b3..87f3b9c9 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/Dockerfile +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/Dockerfile @@ -1,24 +1,19 @@ ## Download base image -FROM continuumio/anaconda3:4.4.0 -# ADD TSPerf/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/conda_dependencies.yml /tmp/conda_dependencies.yml -# ADD TSPerf/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/install_R_dependencies.R /tmp/install_R_dependencies.R -ADD ./conda_dependencies.yml /tmp/conda_dependencies.yml -ADD ./install_R_dependencies.R /tmp/install_R_dependencies.R +FROM rocker/r-base +ADD ./conda_dependencies.yml /tmp +ADD ./install_R_dependencies.R /tmp WORKDIR /tmp ## Install basic packages -RUN apt-get update +RUN apt-get update RUN apt-get install -y --no-install-recommends \ wget \ zlib1g-dev \ libssl-dev \ libssh2-1-dev \ - libcurl4-openssl-dev \ libreadline-gplv2-dev \ libncursesw5-dev \ libsqlite3-dev \ - tk-dev \ - libgdbm-dev \ libc6-dev \ libbz2-dev \ libffi-dev \ @@ -26,42 +21,37 @@ RUN apt-get install -y --no-install-recommends \ build-essential \ checkinstall \ ca-certificates \ - curl \ lsb-release \ apt-utils \ python3-pip \ vim -## Create and activate conda environment +# Install miniconda +RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh +RUN bash ~/miniconda.sh -b -p $HOME/miniconda +ENV PATH="/root/miniconda/bin:${PATH}" + +## Create conda environment RUN conda update -y conda RUN conda env create --file conda_dependencies.yml -## Install R -ENV R_BASE_VERSION 3.5.1 -RUN apt-get install -y aptitude -RUN echo "deb http://http.debian.net/debian sid main" > /etc/apt/sources.list.d/debian-unstable.list \ - && aptitude install -y debian-keyring debian-archive-keyring -RUN apt-get remove -y binutils -RUN apt-get update \ - && apt-get install -t unstable -y --no-install-recommends \ - r-base=${R_BASE_VERSION}-* - # Install prerequisites of R packages RUN apt-get install -y \ gfortran \ liblapack-dev \ liblapack3 \ libopenblas-base \ - libopenblas-dev + libopenblas-dev \ + g++ ## Mount R dependency file into the docker container and install dependencies # Use a MRAN snapshot URL to download packages archived on a specific date RUN echo 'options(repos = list(CRAN = "http://mran.revolutionanalytics.com/snapshot/2018-09-01/"))' >> /etc/R/Rprofile.site RUN Rscript install_R_dependencies.R -RUN rm conda_dependencies.yml RUN rm install_R_dependencies.R +RUN rm conda_dependencies.yml -RUN mkdir /TSPerf -WORKDIR /TSPerf +RUN mkdir /Forecasting +WORKDIR /Forecasting -ENTRYPOINT ["/bin/bash"] \ No newline at end of file +ENTRYPOINT ["/bin/bash"] diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/README.md b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/README.md similarity index 63% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/README.md rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/README.md index ecec4cb0..cb97560c 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/README.md +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/README.md @@ -12,7 +12,7 @@ **Submission name:** baseline -**Submission path:** energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline +**Submission path:** benchmarks/GEFCom2017_D_Prob_MT_hourly/baseline ## Implementation description @@ -36,16 +36,16 @@ No parameter tuning was done. ### Description of implementation scripts -* `feature_engineering.py`: Python script for computing features and generating feature files. +* `compute_features.py`: Python script for computing features and generating feature files. * `train_predict.R`: R script that trains Quantile Regression models and predicts on each round of test data. -* `train_score_vm.sh`: Bash script that runs `feature_engineering.py`and `train_predict.R` five times to generate five submission files and measure model running time. +* `train_score_vm.sh`: Bash script that runs `compute_features.py` and `train_predict.R` five times to generate five submission files and measure model running time. ### Steps to reproduce results -0. Follow the instructions [here](#resource-deployment-instructions) to provision a Linux virtual machine and log into the provisioned +1. Follow the instructions [here](#resource-deployment-instructions) to provision a Linux virtual machine and log into the provisioned VM. -1. Clone the Forecasting repo to the home directory of your machine +2. Clone the Forecasting repo to the home directory of your machine ```bash cd ~ @@ -60,81 +60,80 @@ VM. * [Git Credential Managers](https://github.com/Microsoft/Git-Credential-Manager-for-Windows) * [Authenticate with SSH](https://help.github.com/articles/connecting-to-github-with-ssh/) - -2. Create a conda environment for running the scripts of data downloading, data preparation, and result evaluation. +3. Create a conda environment for running the scripts of data downloading, data preparation, and result evaluation. To do this, you need to check if conda has been installed by runnning command `conda -V`. If it is installed, you will see the conda version in the terminal. Otherwise, please follow the instructions [here](https://conda.io/docs/user-guide/install/linux.html) to install conda. Then, you can go to `~/Forecasting` directory in the VM and create a conda environment named `tsperf` by running ```bash cd ~/Forecasting - conda env create --file ./common/conda_dependencies.yml + conda env create --file tsperf/benchmarking/conda_dependencies.yml ``` -3. Download and extract data **on the VM**. +4. Download and extract data **on the VM**. ```bash source activate tsperf - python energy_load/GEFCom2017_D_Prob_MT_hourly/common/download_data.py - python energy_load/GEFCom2017_D_Prob_MT_hourly/common/extract_data.py + python tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly/download_data.py + python tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly/extract_data.py ``` -4. Prepare Docker container for model training and predicting. - 4.1 Log into Azure Container Registry (ACR) +5. Prepare Docker container for model training and predicting. + + 5.1 Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v + ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). + + 5.2 Build a local Docker image + + ```bash + sudo docker build -t baseline_image benchmarks/GEFCom2017_D_Prob_MT_hourly/baseline ``` - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). - If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). +6. Train and predict **within Docker container** - 4.2 Pull the Docker image from ACR to your VM + 6.1 Start a Docker container from the image ```bash - sudo docker pull tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/baseline_image - ``` - -5. Train and predict **within Docker container** - 5.1 Start a Docker container from the image - - ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name baseline_container tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/baseline_image + sudo docker run -it -v ~/Forecasting:/Forecasting --name baseline_container baseline_image ``` Note that option `-v ~/Forecasting:/Forecasting` mounts the `~/Forecasting` folder (the one you cloned) to the container so that you can access the code and data on your VM within the container. - 5.2 Train and predict + 6.2 Train and predict ``` source activate tsperf cd /Forecasting - bash ./energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/train_score_vm.sh + bash benchmarks/GEFCom2017_D_Prob_MT_hourly/baseline/train_score_vm.sh ``` After generating the forecast results, you can exit the Docker container by command `exit`. -6. Model evaluation **on the VM** + +7. Model evaluation **on the VM** - ```bash - source activate tsperf - cd ~/Forecasting - bash ./common/evaluate submissions/baseline energy_load/GEFCom2017_D_Prob_MT_hourly - ``` + ```bash + source activate tsperf + cd ~/Forecasting + bash tsperf/benchmarking/evaluate baseline tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly + ``` ## Implementation resources **Platform:** Azure Cloud **Resource location:** East US region -**Hardware:** Standard D8s v3 (8 vcpus, 32 GB memory) Ubuntu Linux VM +**Hardware:** Standard D8s v3 (8 vcpus, 32 GB memory) Ubuntu Linux VM **Data storage:** Premium SSD -**Docker image:** tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/baseline_image +**Dockerfile:** [energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/Dockerfile) **Key packages/dependencies:** * Python - - python==3.6 + - python==3.7 * R - - r-base==3.5.1 + - r-base==3.5.3 - quantreg==5.34 - data.table==1.10.4.3 @@ -147,43 +146,43 @@ Please follow the instructions below to deploy the Linux DSVM. **Quality:** Note there is no randomness in this baseline model, so the model quality is the same for all five runs. -* Pinball loss run 1: 84.11 +* Pinball loss run 1: 84.12 -* Pinball loss run 2: 84.11 +* Pinball loss run 2: 84.12 -* Pinball loss run 3: 84.11 +* Pinball loss run 3: 84.12 -* Pinball loss run 4: 84.11 +* Pinball loss run 4: 84.12 -* Pinball loss run 5: 84.11 +* Pinball loss run 5: 84.12 -* Median Pinball loss: 84.11 +* Median Pinball loss: 84.12 **Time:** -* Run time 1: 425 seconds +* Run time 1: 188 seconds -* Run time 2: 462 seconds +* Run time 2: 185 seconds -* Run time 3: 441 seconds +* Run time 3: 185 seconds -* Run time 4: 458 seconds +* Run time 4: 189 seconds -* Run time 5: 444 seconds +* Run time 5: 189 seconds -* Median run time: **444 seconds** +* Median run time: **188 seconds** **Cost:** The hourly cost of the Standard D8s Ubuntu Linux VM in East US Azure region is 0.3840 USD, based on the price at the submission date. -Thus, the total cost is 444/3600 * 0.3840 = $0.0474. +Thus, the total cost is 188/3600 * 0.3840 = $0.0201. **Average relative improvement (in %) over GEFCom2017 benchmark model** (measured over the first run) Round 1: -6.67 -Round 2: 20.25 -Round 3: 20.04 +Round 2: 20.26 +Round 3: 20.05 Round 4: -5.61 Round 5: -6.45 -Round 6: 11.22 +Round 6: 11.21 **Ranking in the qualifying round of GEFCom2017 competition** 10 diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/compute_features.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/compute_features.py new file mode 100644 index 00000000..afc88f9e --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/compute_features.py @@ -0,0 +1,67 @@ +""" +This script uses +tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly/feature_engineering.py to +compute a list of features needed by the Quantile Regression model. +""" +import os +import sys +import getopt + +import localpath + +from tsperf.benchmarking.GEFCom2017_D_Prob_MT_hourly.feature_engineering import compute_features + +SUBMISSIONS_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +DATA_DIR = os.path.join(SUBMISSIONS_DIR, "data") +print("Data directory used: {}".format(DATA_DIR)) + +OUTPUT_DIR = os.path.join(DATA_DIR, "features") +TRAIN_DATA_DIR = os.path.join(DATA_DIR, "train") +TEST_DATA_DIR = os.path.join(DATA_DIR, "test") + +DF_CONFIG = { + "time_col_name": "Datetime", + "ts_id_col_names": "Zone", + "target_col_name": "DEMAND", + "frequency": "H", + "time_format": "%Y-%m-%d %H:%M:%S", +} + +# Feature configuration list used to specify the features to be computed by +# compute_features. +# Each feature configuration is a tuple in the format of (feature_name, +# featurizer_args) +# feature_name is used to determine the featurizer to use, see FEATURE_MAP in +# energy_load/GEFCom2017_D_Prob_MT_hourly/common/feature_engineering.py +# featurizer_args is a dictionary of arguments passed to the +# featurizer +feature_config_list = [ + ("temporal", {"feature_list": ["hour_of_day", "month_of_year"]}), + ("annual_fourier", {"n_harmonics": 3}), + ("weekly_fourier", {"n_harmonics": 3}), + ("previous_year_load_lag", {"input_col_names": "DEMAND", "round_agg_result": True},), + ("previous_year_temp_lag", {"input_col_names": "DryBulb", "round_agg_result": True},), +] + + +if __name__ == "__main__": + opts, args = getopt.getopt(sys.argv[1:], "", ["submission="]) + for opt, arg in opts: + if opt == "--submission": + submission_folder = arg + output_data_dir = os.path.join(SUBMISSIONS_DIR, submission_folder, "data") + if not os.path.isdir(output_data_dir): + os.mkdir(output_data_dir) + OUTPUT_DIR = os.path.join(output_data_dir, "features") + if not os.path.isdir(OUTPUT_DIR): + os.mkdir(OUTPUT_DIR) + + compute_features( + TRAIN_DATA_DIR, + TEST_DATA_DIR, + OUTPUT_DIR, + DF_CONFIG, + feature_config_list, + filter_by_month=True, + compute_load_ratio=True, + ) diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/conda_dependencies.yml b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/conda_dependencies.yml similarity index 72% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/conda_dependencies.yml rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/conda_dependencies.yml index 5a16c66b..414041b9 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/conda_dependencies.yml +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/conda_dependencies.yml @@ -6,4 +6,5 @@ dependencies: - numpy=1.15.1 - pandas=0.23.4 - xlrd=1.1.0 - - urllib3=1.21.1 \ No newline at end of file + - urllib3=1.21.1 + - scikit-learn=0.20.3 diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/install_R_dependencies.R b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/install_R_dependencies.R new file mode 100644 index 00000000..321008cf --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/install_R_dependencies.R @@ -0,0 +1,7 @@ +pkgs <- c( + 'data.table', + 'quantreg', + 'doParallel' +) + +install.packages(pkgs) \ No newline at end of file diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/localpath.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/localpath.py similarity index 54% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/localpath.py rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/localpath.py index bdbeb3db..73f07889 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/localpath.py +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/localpath.py @@ -5,10 +5,9 @@ localpath.py file. """ import os, sys -_CUR_DIR = os.path.dirname(os.path.abspath(__file__)) -_SUBMISSIONS_DIR = os.path.dirname(_CUR_DIR) -_BENCHMARK_DIR = os.path.dirname(_SUBMISSIONS_DIR) -TSPERF_DIR = os.path.dirname(os.path.dirname(_BENCHMARK_DIR)) + +_CURR_DIR = os.path.dirname(os.path.abspath(__file__)) +TSPERF_DIR = os.path.dirname(os.path.dirname(os.path.dirname(_CURR_DIR))) if TSPERF_DIR not in sys.path: sys.path.insert(0, TSPERF_DIR) diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/train_predict.R b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/train_predict.R new file mode 100644 index 00000000..0d35d85e --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/train_predict.R @@ -0,0 +1,87 @@ +args = commandArgs(trailingOnly=TRUE) +seed_value = args[1] +library('data.table') +library('quantreg') +library('doParallel') + +n_cores = detectCores() + +cl <- parallel::makeCluster(n_cores) +parallel::clusterEvalQ(cl, lapply(c("quantreg", "data.table"), library, character.only = TRUE)) +registerDoParallel(cl) + + +data_dir = 'benchmarks/GEFCom2017_D_Prob_MT_hourly/baseline/data/features' +train_dir = file.path(data_dir, 'train') +test_dir = file.path(data_dir, 'test') + +train_file_prefix = 'train_round_' +test_file_prefix = 'test_round_' + +output_file = file.path(paste('benchmarks/GEFCom2017_D_Prob_MT_hourly/baseline/submission_seed_', seed_value, '.csv', sep="")) + +normalize_columns = list('DEMAND_same_woy_lag', 'DryBulb_same_doy_lag') + +quantiles = seq(0.1, 0.9, by = 0.1) + +result_all = list() +for (iR in 1:6){ + print(paste('Round', iR)) + train_file = file.path(train_dir, paste(train_file_prefix, iR, '.csv', sep='')) + test_file = file.path(test_dir, paste(test_file_prefix, iR, '.csv', sep='')) + + train_df = fread(train_file) + test_df = fread(test_file) + + for (c in normalize_columns){ + min_c = min(train_df[, ..c]) + max_c = max(train_df[, ..c]) + train_df[, c] = (train_df[, ..c] - min_c)/(max_c - min_c) + test_df[, c] = (test_df[, ..c] - min_c)/(max_c - min_c) + } + + + test_df$average_load_ratio = rowMeans(test_df[,c('recent_load_ratio_10', 'recent_load_ratio_11', 'recent_load_ratio_12', + 'recent_load_ratio_13', 'recent_load_ratio_14', 'recent_load_ratio_15', 'recent_load_ratio_16')], na.rm=TRUE) + test_df[, load_ratio:=mean(average_load_ratio), by=list(hour_of_day, month_of_year)] + + + zones = unique(train_df[, Zone]) + hours = unique(train_df[, hour_of_day]) + all_zones_hours = expand.grid(zones, hours) + colnames(all_zones_hours) = c('Zone', 'hour_of_day') + + result_all_zones_hours = foreach(i = 1:nrow(all_zones_hours), .combine = rbind) %dopar%{ + z = all_zones_hours[i, 'Zone'] + h = all_zones_hours[i, 'hour_of_day'] + + train_df_sub = train_df[Zone == z & hour_of_day == h] + test_df_sub = test_df[Zone == z & hour_of_day == h] + + result_all_quantiles = list() + q_counter = 1 + for (tau in quantiles){ + result = data.table(Zone=test_df_sub$Zone, Datetime = test_df_sub$Datetime, Round=iR) + + model = rq(DEMAND ~ DEMAND_same_woy_lag + DryBulb_same_doy_lag + + annual_sin_1 + annual_cos_1 + annual_sin_2 + annual_cos_2 + annual_sin_3 + annual_cos_3 + + weekly_sin_1 + weekly_cos_1 + weekly_sin_2 + weekly_cos_2 + weekly_sin_3 + weekly_cos_3, + data=train_df_sub, tau = tau) + + result$Prediction = predict(model, test_df_sub) * test_df_sub$load_ratio + result$q = tau + + result_all_quantiles[[q_counter]] = result + q_counter = q_counter + 1 + } + rbindlist(result_all_quantiles) + } + result_all[[iR]] = result_all_zones_hours +} + +result_final = rbindlist(result_all) +# Sort the quantiles +result_final = result_final[order(Prediction), q:=quantiles, by=c('Zone', 'Datetime', 'Round')] +result_final$Prediction = round(result_final$Prediction) + +fwrite(result_final, output_file) diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/train_score_vm.sh b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/train_score_vm.sh similarity index 52% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/train_score_vm.sh rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/train_score_vm.sh index e9c35bfa..29c9e08a 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/train_score_vm.sh +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/baseline/train_score_vm.sh @@ -1,15 +1,15 @@ #!/bin/bash -path=energy_load/GEFCom2017_D_Prob_MT_hourly +path=benchmarks/GEFCom2017_D_Prob_MT_hourly for i in `seq 1 5`; do echo "Run $i" start=`date +%s` echo 'Creating features...' - python $path/submissions/baseline/feature_engineering.py --submission baseline + python $path/baseline/compute_features.py --submission baseline echo 'Training and predicting...' - Rscript $path/submissions/baseline/train_predict.R $i + Rscript $path/baseline/train_predict.R $i end=`date +%s` echo 'Running time '$((end-start))' seconds' -done +done \ No newline at end of file diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/data/.gitignore b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/data/.gitignore similarity index 100% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/data/.gitignore rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/data/.gitignore diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/reference/Data_Exploration.ipynb b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/data_explore_energy.ipynb similarity index 99% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/reference/Data_Exploration.ipynb rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/data_explore_energy.ipynb index bb4b9d28..3b7d8649 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/reference/Data_Exploration.ipynb +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/data_explore_energy.ipynb @@ -423,4 +423,4 @@ }, "nbformat": 4, "nbformat_minor": 1 -} +} \ No newline at end of file diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/Dockerfile b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/Dockerfile similarity index 50% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/Dockerfile rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/Dockerfile index 8ad4a6f2..87f3b9c9 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/Dockerfile +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/Dockerfile @@ -1,21 +1,19 @@ ## Download base image -FROM continuumio/anaconda3:4.4.0 -ADD TSPerf/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/conda_dependencies.yml /tmp/conda_dependencies.yml -ADD TSPerf/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/install_R_dependencies.R /tmp/install_R_dependencies.R +FROM rocker/r-base +ADD ./conda_dependencies.yml /tmp +ADD ./install_R_dependencies.R /tmp WORKDIR /tmp ## Install basic packages -RUN apt-get update && apt-get install -y --no-install-recommends \ +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ wget \ zlib1g-dev \ libssl-dev \ libssh2-1-dev \ - libcurl4-openssl-dev \ libreadline-gplv2-dev \ libncursesw5-dev \ libsqlite3-dev \ - tk-dev \ - libgdbm-dev \ libc6-dev \ libbz2-dev \ libffi-dev \ @@ -23,34 +21,28 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ checkinstall \ ca-certificates \ - curl \ lsb-release \ apt-utils \ python3-pip \ vim -## Create and activate conda environment -RUN conda update -y conda +# Install miniconda +RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh +RUN bash ~/miniconda.sh -b -p $HOME/miniconda +ENV PATH="/root/miniconda/bin:${PATH}" + +## Create conda environment RUN conda update -y conda RUN conda env create --file conda_dependencies.yml -## Install R -ENV R_BASE_VERSION 3.5.1 -RUN apt-get install -y aptitude -RUN echo "deb http://http.debian.net/debian sid main" > /etc/apt/sources.list.d/debian-unstable.list \ - && aptitude install -y debian-keyring debian-archive-keyring -RUN apt-get remove -y binutils -RUN apt-get update \ - && apt-get install -t unstable -y --no-install-recommends \ - r-base=${R_BASE_VERSION}-* - # Install prerequisites of R packages RUN apt-get install -y \ gfortran \ liblapack-dev \ liblapack3 \ libopenblas-base \ - libopenblas-dev + libopenblas-dev \ + g++ ## Mount R dependency file into the docker container and install dependencies # Use a MRAN snapshot URL to download packages archived on a specific date RUN echo 'options(repos = list(CRAN = "http://mran.revolutionanalytics.com/snapshot/2018-09-01/"))' >> /etc/R/Rprofile.site @@ -59,7 +51,7 @@ RUN Rscript install_R_dependencies.R RUN rm install_R_dependencies.R RUN rm conda_dependencies.yml -RUN mkdir /TSPerf -WORKDIR /TSPerf +RUN mkdir /Forecasting +WORKDIR /Forecasting -ENTRYPOINT ["/bin/bash"] \ No newline at end of file +ENTRYPOINT ["/bin/bash"] diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/README.md b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/README.md similarity index 70% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/README.md rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/README.md index f0fd6641..041d8f3e 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/README.md +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/README.md @@ -12,7 +12,7 @@ **Submission name:** Quantile Regression Neural Network -**Submission path:** energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn +**Submission path:** benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn ## Implementation description @@ -36,14 +36,14 @@ The data of January - April of 2016 were used as validation dataset for some min ### Description of implementation scripts Train and Predict: -* `feature_engineering.py`: Python script for computing features and generating feature files. +* `compute_features.py`: Python script for computing features and generating feature files. * `train_predict.R`: R script that trains Quantile Regression Neural Network models and predicts on each round of test data. -* `train_score_vm.sh`: Bash script that runs `feature_engineering.py` and `train_predict.R` five times to generate five submission files and measure model running time. +* `train_score_vm.sh`: Bash script that runs `compute_features.py` and `train_predict.R` five times to generate five submission files and measure model running time. Tune hyperparameters using R: * `cv_settings.json`: JSON script that sets cross validation folds. * `train_validate.R`: R script that trains Quantile Regression Neural Network models and evaluate the loss on validation data of each cross validation round and forecast round with a set of hyperparameters and calculate the average loss. This script is used for grid search on vm. -* `train_validate_vm.sh`: Bash script that runs `feature_engineering.py` and `train_validate.R` multiple times to generate cross validation result files and measure model tuning time. +* `train_validate_vm.sh`: Bash script that runs `compute_features.py` and `train_validate.R` multiple times to generate cross validation result files and measure model tuning time. Tune hyperparameters using AzureML HyperDrive: * `cv_settings.json`: JSON script that sets cross validation folds. @@ -53,10 +53,10 @@ Tune hyperparameters using AzureML HyperDrive: ### Steps to reproduce results -0. Follow the instructions [here](#resource-deployment-instructions) to provision a Linux virtual machine and log into the provisioned +1. Follow the instructions [here](#resource-deployment-instructions) to provision a Linux virtual machine and log into the provisioned VM. -1. Clone the Forecasting repo to the home directory of your machine +2. Clone the Forecasting repo to the home directory of your machine ```bash cd ~ @@ -72,92 +72,91 @@ VM. * [Git Credential Managers](https://docs.microsoft.com/en-us/vsts/repos/git/set-up-credential-managers?view=vsts) * [Authenticate with SSH](https://docs.microsoft.com/en-us/vsts/repos/git/use-ssh-keys-to-authenticate?view=vsts) - -2. Create a conda environment for running the scripts of data downloading, data preparation, and result evaluation. +3. Create a conda environment for running the scripts of data downloading, data preparation, and result evaluation. To do this, you need to check if conda has been installed by runnning command `conda -V`. If it is installed, you will see the conda version in the terminal. Otherwise, please follow the instructions [here](https://conda.io/docs/user-guide/install/linux.html) to install conda. Then, you can go to `~/Forecasting` directory in the VM and create a conda environment named `tsperf` by running ```bash cd ~/Forecasting - conda env create --file ./common/conda_dependencies.yml + conda env create --file tsperf/benchmarking/conda_dependencies.yml ``` -3. Download and extract data **on the VM**. +4. Download and extract data **on the VM**. ```bash source activate tsperf - python energy_load/GEFCom2017_D_Prob_MT_hourly/common/download_data.py - python energy_load/GEFCom2017_D_Prob_MT_hourly/common/extract_data.py + python tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly/download_data.py + python tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly/extract_data.py ``` -4. Prepare Docker container for model training and predicting. - > NOTE: To execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions +5. Prepare Docker container for model training and predicting. + + > NOTE: To execute docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). Otherwise, simply prefix all docker commands with sudo. - 4.1 Log into Azure Container Registry (ACR) + 5.1 Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v + ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). + + 5.2 Build a local Docker image + + ```bash + sudo docker build -t fnn_image benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn ``` - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). +6. Tune Hyperparameters **within Docker container** or **with AzureML hyperdrive**. - 4.2 Pull the Docker image from ACR to your VM + 6.1.1 Start a Docker container from the image ```bash - sudo docker pull tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/fnn_image:v1 - ``` - -5. Tune Hyperparameters **within Docker container** or **with AzureML hyperdrive**. - - 5.1.1 Start a Docker container from the image - - ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name fnn_cv_container tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/fnn_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name fnn_cv_container fnn_image ``` Note that option `-v ~/Forecasting:/Forecasting` mounts the `~/Forecasting` folder (the one you cloned) to the container so that you can access the code and data on your VM within the container. - 5.1.2 Train and validate + 6.1.2 Train and validate ``` source activate tsperf cd /Forecasting - nohup bash ./energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate_vm.sh >& cv_out.txt & + nohup bash benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate_vm.sh >& cv_out.txt & ``` After generating the cross validation results, you can exit the Docker container by command `exit`. - 5.2 Do hyperparameter tuning with AzureML hyperdrive + 6.2 Do hyperparameter tuning with AzureML hyperdrive To tune hyperparameters with AzureML hyperdrive, you don't need to create a local Docker container. You can do feature engineering on the VM by the command ``` cd ~/Forecasting source activate tsperf - python energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/feature_engineering.py + python benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn/compute_features.py ``` and then run through the jupyter notebook `hyperparameter_tuning.ipynb` on the VM with the conda env `tsperf` as the jupyter kernel. Based on the average pinball loss obtained at each set of hyperparameters, you can choose the best set of hyperparameters and use it in the Rscript of `train_predict.R`. -6. Train and predict **within Docker container**. +7. Train and predict **within Docker container**. - 6.1 Start a Docker container from the image + 7.1 Start a Docker container from the image ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name fnn_container tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/fnn_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name fnn_container fnn_image ``` Note that option `-v ~/Forecasting:/Forecasting` mounts the `~/Forecasting` folder (the one you cloned) to the container so that you can access the code and data on your VM within the container. - 6.2 Train and predict + 7.2 Train and predict ``` source activate tsperf cd /Forecasting - nohup bash ./energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_score_vm.sh >& out.txt & + nohup bash benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn/train_score_vm.sh >& out.txt & ``` The last command will take about 7 hours to complete. You can monitor its progress by checking out.txt file. Also during the run you can disconnect from VM. After reconnecting to VM, use the command @@ -168,12 +167,12 @@ Then, you can go to `~/Forecasting` directory in the VM and create a conda envir to connect to the running container and check the status of the run. After generating the forecast results, you can exit the Docker container by command `exit`. -7. Model evaluation **on the VM**. +8. Model evaluation **on the VM**. ```bash source activate tsperf cd ~/Forecasting - bash ./common/evaluate submissions/fnn energy_load/GEFCom2017_D_Prob_MT_hourly + bash tsperf/benchmarking/evaluate fnn tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly ``` ## Implementation resources @@ -182,13 +181,13 @@ Then, you can go to `~/Forecasting` directory in the VM and create a conda envir **Resource location:** East US region **Hardware:** Standard D8s v3 (8 vcpus, 32 GB memory) Ubuntu Linux VM **Data storage:** Premium SSD -**Docker image:** tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/fnn_image:v1 +**Dockerfile:** [energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/Dockerfile) **Key packages/dependencies:** * Python - - python==3.6 + - python==3.7 * R - - r-base==3.5.1 + - r-base==3.5.3 - qrnn==2.0.2 - data.table==1.10.4.3 - rjson==0.2.20 (optional for cv) @@ -202,43 +201,43 @@ Please follow the instructions below to deploy the Linux DSVM. ## Implementation evaluation **Quality:** -* Pinball loss run 1: 79.27 +* Pinball loss run 1: 79.54 -* Pinball loss run 2: 79.32 +* Pinball loss run 2: 78.32 -* Pinball loss run 3: 79.25 +* Pinball loss run 3: 80.06 -* Pinball loss run 4: 79.24 +* Pinball loss run 4: 80.12 -* Pinball loss run 5: 79.32 +* Pinball loss run 5: 80.13 -* Median Pinball loss: 79.27 +* Median Pinball loss: 80.06 **Time:** -* Run time 1: 4611 seconds +* Run time 1: 1092 seconds -* Run time 2: 4604 seconds +* Run time 2: 1085 seconds -* Run time 3: 4587 seconds +* Run time 3: 1062 seconds -* Run time 4: 4630 seconds +* Run time 4: 1083 seconds -* Run time 5: 4583 seconds +* Run time 5: 1110 seconds -* Median run time: 4604 seconds +* Median run time: 1085 seconds **Cost:** The hourly cost of the Standard D8s Ubuntu Linux VM in East US Azure region is 0.3840 USD, based on the price at the submission date. -Thus, the total cost is 4604/3600 * 0.3840 = $0.4911. +Thus, the total cost is 1085/3600 * 0.3840 = $0.1157. **Average relative improvement (in %) over GEFCom2017 benchmark model** (measured over the first run) -Round 1: 6.64 -Round 2: 20.13 -Round 3: 19.75 -Round 4: 5.01 -Round 5: 4.21 -Round 6: 10.68 +Round 1: 6.13 +Round 2: 19.20 +Round 3: 18.86 +Round 4: 3.84 +Round 5: 2.76 +Round 6: 11.10 **Ranking in the qualifying round of GEFCom2017 competition** 4 diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/aml_estimator.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/aml_estimator.py new file mode 100644 index 00000000..3b2032b4 --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/aml_estimator.py @@ -0,0 +1,70 @@ +""" +This script passes the input arguments of AzureML job to the R script train_validate_aml.R, +and then passes the output of train_validate_aml.R back to AzureML. +""" + +import subprocess +import os +import sys +import getopt +import pandas as pd +from datetime import datetime +from azureml.core import Run +import time + +start_time = time.time() +run = Run.get_submitted_run() + +base_command = "Rscript train_validate_aml.R" + +if __name__ == "__main__": + opts, args = getopt.getopt( + sys.argv[1:], "", ["path=", "cv_path=", "n_hidden_1=", "n_hidden_2=", "iter_max=", "penalty="] + ) + for opt, arg in opts: + if opt == "--path": + path = arg + elif opt == "--cv_path": + cv_path = arg + elif opt == "--n_hidden_1": + n_hidden_1 = arg + elif opt == "--n_hidden_2": + n_hidden_2 = arg + elif opt == "--iter_max": + iter_max = arg + elif opt == "--penalty": + penalty = arg + time_stamp = datetime.now().strftime("%Y%m%d%H%M%S") + task = " ".join( + [ + base_command, + "--path", + path, + "--cv_path", + cv_path, + "--n_hidden_1", + n_hidden_1, + "--n_hidden_2", + n_hidden_2, + "--iter_max", + iter_max, + "--penalty", + penalty, + "--time_stamp", + time_stamp, + ] + ) + process = subprocess.call(task, shell=True) + + # process.communicate() + # process.wait() + + output_file_name = "cv_output_" + time_stamp + ".csv" + result = pd.read_csv(os.path.join(cv_path, output_file_name)) + + APL = result["loss"].mean() + + print(APL) + print("--- %s seconds ---" % (time.time() - start_time)) + + run.log("average pinball loss", APL) diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/compute_features.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/compute_features.py new file mode 100644 index 00000000..3d60acea --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/compute_features.py @@ -0,0 +1,68 @@ +""" +This script uses +energy_load/GEFCom2017_D_Prob_MT_hourly/common/feature_engineering.py to +compute a list of features needed by the Feed-forward Neural Network model. +""" + +import os +import sys +import getopt + +import localpath + +from tsperf.benchmarking.GEFCom2017_D_Prob_MT_hourly.feature_engineering import compute_features + +SUBMISSIONS_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +DATA_DIR = os.path.join(SUBMISSIONS_DIR, "data") +print("Data directory used: {}".format(DATA_DIR)) + +OUTPUT_DIR = os.path.join(DATA_DIR, "features") +TRAIN_DATA_DIR = os.path.join(DATA_DIR, "train") +TEST_DATA_DIR = os.path.join(DATA_DIR, "test") + +DF_CONFIG = { + "time_col_name": "Datetime", + "ts_id_col_names": "Zone", + "target_col_name": "DEMAND", + "frequency": "H", + "time_format": "%Y-%m-%d %H:%M:%S", +} + +# Feature configuration list used to specify the features to be computed by +# compute_features. +# Each feature configuration is a tuple in the format of (feature_name, +# featurizer_args) +# feature_name is used to determine the featurizer to use, see FEATURE_MAP in +# energy_load/GEFCom2017_D_Prob_MT_hourly/common/feature_engineering.py +# featurizer_args is a dictionary of arguments passed to the +# featurizer +feature_config_list = [ + ("temporal", {"feature_list": ["hour_of_day", "month_of_year"]}), + ("annual_fourier", {"n_harmonics": 3}), + ("weekly_fourier", {"n_harmonics": 3}), + ("previous_year_load_lag", {"input_col_names": "DEMAND", "round_agg_result": True},), + ("previous_year_temp_lag", {"input_col_names": "DryBulb", "round_agg_result": True},), +] + + +if __name__ == "__main__": + opts, args = getopt.getopt(sys.argv[1:], "", ["submission="]) + for opt, arg in opts: + if opt == "--submission": + submission_folder = arg + output_data_dir = os.path.join(SUBMISSIONS_DIR, submission_folder, "data") + if not os.path.isdir(output_data_dir): + os.mkdir(output_data_dir) + OUTPUT_DIR = os.path.join(output_data_dir, "features") + if not os.path.isdir(OUTPUT_DIR): + os.mkdir(OUTPUT_DIR) + + compute_features( + TRAIN_DATA_DIR, + TEST_DATA_DIR, + OUTPUT_DIR, + DF_CONFIG, + feature_config_list, + filter_by_month=True, + compute_load_ratio=True, + ) diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/conda_dependencies.yml b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/conda_dependencies.yml similarity index 73% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/conda_dependencies.yml rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/conda_dependencies.yml index 5a16c66b..13689398 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/baseline/conda_dependencies.yml +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/conda_dependencies.yml @@ -6,4 +6,5 @@ dependencies: - numpy=1.15.1 - pandas=0.23.4 - xlrd=1.1.0 - - urllib3=1.21.1 \ No newline at end of file + - urllib3=1.21.1 + - scikit-learn=0.20.3 \ No newline at end of file diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/cv_settings.json b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/cv_settings.json similarity index 100% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/cv_settings.json rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/cv_settings.json diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/hyperparameter_tuning.ipynb b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/hyperparameter_tuning.ipynb similarity index 99% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/hyperparameter_tuning.ipynb rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/hyperparameter_tuning.ipynb index 64244618..8e0ba016 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/hyperparameter_tuning.ipynb +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/hyperparameter_tuning.ipynb @@ -1243,9 +1243,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [conda env:tsperf]", + "display_name": "drlnd", "language": "python", - "name": "conda-env-tsperf-py" + "name": "drlnd" }, "language_info": { "codemirror_mode": { diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/install_R_dependencies.R b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/install_R_dependencies.R new file mode 100644 index 00000000..e6b5ed18 --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/install_R_dependencies.R @@ -0,0 +1,7 @@ +pkgs <- c( + 'data.table', + 'qrnn', + 'doParallel' +) + +install.packages(pkgs) \ No newline at end of file diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/localpath.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/localpath.py similarity index 54% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/localpath.py rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/localpath.py index 6221ac52..975b3ffb 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/localpath.py +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/localpath.py @@ -4,10 +4,9 @@ all the modules in TSPerf. Each submission folder needs its own localpath.py fil """ import os, sys -_CUR_DIR = os.path.dirname(os.path.abspath(__file__)) -_SUBMISSIONS_DIR = os.path.dirname(_CUR_DIR) -_BENCHMARK_DIR = os.path.dirname(_SUBMISSIONS_DIR) -TSPERF_DIR = os.path.dirname(os.path.dirname(_BENCHMARK_DIR)) + +_CURR_DIR = os.path.dirname(os.path.abspath(__file__)) +TSPERF_DIR = os.path.dirname(os.path.dirname(os.path.dirname(_CURR_DIR))) if TSPERF_DIR not in sys.path: sys.path.insert(0, TSPERF_DIR) diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_predict.R b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_predict.R new file mode 100644 index 00000000..97f9c79f --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_predict.R @@ -0,0 +1,107 @@ +#!/usr/bin/Rscript +# +# This script trains the Quantile Regression Neural Network model and predicts on each data +# partition per zone and hour at each quantile point. + +args = commandArgs(trailingOnly=TRUE) +seed_value = args[1] + +library('data.table') +library('qrnn') +library('doParallel') + +n_cores = detectCores() + +cl <- parallel::makeCluster(n_cores) +parallel::clusterEvalQ(cl, lapply(c("qrnn", "data.table"), library, character.only = TRUE)) +registerDoParallel(cl) + +# Specify data directory +data_dir = 'benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn/data/features' +train_dir = file.path(data_dir, 'train') +test_dir = file.path(data_dir, 'test') + +train_file_prefix = 'train_round_' +test_file_prefix = 'test_round_' + +output_file = file.path(paste('benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn/submission_seed_', seed_value, '.csv', sep="")) + +# Data and forecast parameters +normalize_columns = list('DEMAND_same_woy_lag', 'DryBulb_same_doy_lag') +quantiles = seq(0.1, 0.9, by = 0.1) + +# Train and predict +result_all = list() +for (iR in 1:6){ + print(paste('Round', iR)) + train_file = file.path(train_dir, paste(train_file_prefix, iR, '.csv', sep='')) + test_file = file.path(test_dir, paste(test_file_prefix, iR, '.csv', sep='')) + + train_df = fread(train_file) + test_df = fread(test_file) + + for (c in normalize_columns){ + min_c = min(train_df[, ..c]) + max_c = max(train_df[, ..c]) + train_df[, c] = (train_df[, ..c] - min_c)/(max_c - min_c) + test_df[, c] = (test_df[, ..c] - min_c)/(max_c - min_c) + } + + zones = unique(train_df[, Zone]) + hours = unique(train_df[, hour_of_day]) + all_zones_hours = expand.grid(zones, hours) + colnames(all_zones_hours) = c('Zone', 'hour_of_day') + + test_df$average_load_ratio = rowMeans(test_df[,c('recent_load_ratio_10', 'recent_load_ratio_11', 'recent_load_ratio_12', + 'recent_load_ratio_13', 'recent_load_ratio_14', 'recent_load_ratio_15', 'recent_load_ratio_16')], na.rm=TRUE) + + + test_df[, load_ratio:=mean(average_load_ratio), by=list(hour_of_day, month_of_year)] + + result_all_zones_hours = foreach(i = 1:nrow(all_zones_hours), .combine = rbind) %dopar%{ + set.seed(seed_value) + z = all_zones_hours[i, 'Zone'] + h = all_zones_hours[i, 'hour_of_day'] + train_df_sub = train_df[Zone == z & hour_of_day == h] + test_df_sub = test_df[Zone == z & hour_of_day == h] + + train_x <- as.matrix(train_df_sub[, c('DEMAND_same_woy_lag', 'DryBulb_same_doy_lag', + 'annual_sin_1', 'annual_cos_1', 'annual_sin_2', 'annual_cos_2', 'annual_sin_3', 'annual_cos_3', + 'weekly_sin_1', 'weekly_cos_1', 'weekly_sin_2', 'weekly_cos_2', 'weekly_sin_3', 'weekly_cos_3'), + drop=FALSE]) + train_y <- as.matrix(train_df_sub[, c('DEMAND'), drop=FALSE]) + + test_x <- as.matrix(test_df_sub[, c('DEMAND_same_woy_lag', 'DryBulb_same_doy_lag', + 'annual_sin_1', 'annual_cos_1', 'annual_sin_2', 'annual_cos_2', 'annual_sin_3', 'annual_cos_3', + 'weekly_sin_1', 'weekly_cos_1', 'weekly_sin_2', 'weekly_cos_2', 'weekly_sin_3', 'weekly_cos_3'), + drop=FALSE]) + + result_all_quantiles = list() + q_counter = 1 + for (tau in quantiles){ + result = data.table(Zone=test_df_sub$Zone, Datetime = test_df_sub$Datetime, Round=iR) + + model = qrnn2.fit(x=train_x, y=train_y, + n.hidden=8, n.hidden2=4, + tau=tau, Th=tanh, + iter.max=1, + penalty=0) + + result$Prediction = qrnn2.predict(model, x=test_x) * test_df_sub$load_ratio + result$q = tau + + result_all_quantiles[[q_counter]] = result + q_counter = q_counter + 1 + } + rbindlist(result_all_quantiles) + } + result_all[[iR]] = result_all_zones_hours +} + +result_final = rbindlist(result_all) +# Sort the quantiles +result_final = result_final[order(Prediction), q:=quantiles, by=c('Zone', 'Datetime', 'Round')] +result_final$Prediction = round(result_final$Prediction) + +fwrite(result_final, output_file) + diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/train_score_vm.sh b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_score_vm.sh similarity index 56% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/train_score_vm.sh rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_score_vm.sh index b1269789..0acf6014 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/GBM/train_score_vm.sh +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_score_vm.sh @@ -1,14 +1,14 @@ #!/bin/bash -path=energy_load/GEFCom2017_D_Prob_MT_hourly +path=benchmarks/GEFCom2017_D_Prob_MT_hourly for i in `seq 1 5`; do echo "Run $i" start=`date +%s` echo 'Creating features...' - python $path/submissions/GBM/feature_engineering.py --submission GBM + python $path/fnn/compute_features.py --submission fnn echo 'Training and predicting...' - Rscript $path/submissions/GBM/train_predict.R $i + Rscript $path/fnn/train_predict.R $i end=`date +%s` echo 'Running time '$((end-start))' seconds' diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate.R b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate.R similarity index 84% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate.R rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate.R index 45b7cf71..6b7d7def 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate.R +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate.R @@ -20,7 +20,7 @@ parallel::clusterEvalQ(cl, lapply(c("qrnn", "data.table"), library, character.on registerDoParallel(cl) # Specify data directory -data_dir = 'energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/data/features' +data_dir = 'benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn/data/features' train_dir = file.path(data_dir, 'train') train_file_prefix = 'train_round_' @@ -45,10 +45,10 @@ for (j in 1:length(parameter_names)){ output_file_name = paste(output_file_name, parameter_names[j], parameter_values[j], sep="_") } -output_file = file.path(paste('energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/', output_file_name, sep="")) +output_file = file.path(paste('benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn/', output_file_name, sep="")) # Define cross validation split settings -cv_file = file.path(paste('energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/', 'cv_settings.json', sep="")) +cv_file = file.path(paste('benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn/', 'cv_settings.json', sep="")) cv_settings = fromJSON(file=cv_file) # Parameters of model @@ -58,13 +58,13 @@ iter.max = as.integer(param_grid[parameter_set, 'iter.max']) penalty = as.integer(param_grid[parameter_set, 'penalty']) # Data and forecast parameters -features = c('LoadLag', 'DryBulbLag', +features = c('DEMAND_same_woy_lag', 'DryBulb_same_doy_lag', 'annual_sin_1', 'annual_cos_1', 'annual_sin_2', 'annual_cos_2', 'annual_sin_3', 'annual_cos_3', 'weekly_sin_1', 'weekly_cos_1', 'weekly_sin_2', 'weekly_cos_2', 'weekly_sin_3', 'weekly_cos_3') -normalize_columns = list('LoadLag', 'DryBulbLag') +normalize_columns = list('DEMAND_same_woy_lag', 'DryBulb_same_doy_lag') quantiles = seq(0.1, 0.9, by = 0.1) subset_columns_train = c(features, 'DEMAND') subset_columns_validation = c(features, 'DEMAND', 'Zone', 'Datetime', 'LoadRatio') @@ -97,7 +97,7 @@ for (i in 1:length(cv_settings)){ validation_data = cvdata_df[Datetime >= validation_range[1] & Datetime <= validation_range[2]] zones = unique(validation_data$Zone) - hours = unique(validation_data$Hour) + hours = unique(validation_data$hour_of_day) for (c in normalize_columns){ min_c = min(train_data[, ..c]) @@ -106,9 +106,9 @@ for (i in 1:length(cv_settings)){ validation_data[, c] = (validation_data[, ..c] - min_c)/(max_c - min_c) } - validation_data$AverageLoadRatio = rowMeans(validation_data[,c('LoadRatio_10', 'LoadRatio_11', 'LoadRatio_12', - 'LoadRatio_13', 'LoadRatio_14', 'LoadRatio_15', 'LoadRatio_16')], na.rm=TRUE) - validation_data[, LoadRatio:=mean(AverageLoadRatio), by=list(Hour, MonthOfYear)] + validation_data$AverageLoadRatio = rowMeans(validation_data[,c('recent_load_ratio_10', 'recent_load_ratio_11', 'recent_load_ratio_12', + 'recent_load_ratio_13', 'recent_load_ratio_14', 'recent_load_ratio_15', 'recent_load_ratio_16')], na.rm=TRUE) + validation_data[, LoadRatio:=mean(AverageLoadRatio), by=list(hour_of_day, month_of_year)] result_all_zones = foreach(z = zones, .combine = rbind) %dopar% { print(paste('Zone', z)) @@ -117,8 +117,8 @@ for (i in 1:length(cv_settings)){ hour_counter = 1 for (h in hours){ - train_df_sub = train_data[Zone == z & Hour == h, ..subset_columns_train] - validation_df_sub = validation_data[Zone == z & Hour == h, ..subset_columns_validation] + train_df_sub = train_data[Zone == z & hour_of_day == h, ..subset_columns_train] + validation_df_sub = validation_data[Zone == z & hour_of_day == h, ..subset_columns_validation] result = data.table(Zone=validation_df_sub$Zone, Datetime=validation_df_sub$Datetime, Round=iR, CVRound=i) @@ -165,7 +165,7 @@ print(paste('Average Pinball Loss:', average_PL)) output_file_name = paste(output_file_name, 'APL', average_PL, sep="_") output_file_name = paste(output_file_name, '.csv', sep="") -output_file = file.path(paste('energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/', output_file_name, sep="")) +output_file = file.path(paste('benchmarks/GEFCom2017_D_Prob_MT_hourly/fnn/', output_file_name, sep="")) fwrite(result_final, output_file) diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate_aml.R b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate_aml.R similarity index 88% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate_aml.R rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate_aml.R index 56788823..fcd43357 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate_aml.R +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate_aml.R @@ -59,7 +59,7 @@ cv_settings = fromJSON(file=cv_file) # Data and forecast parameters -normalize_columns = list('LoadLag', 'DryBulbLag') +normalize_columns = list('DEMAND_same_woy_lag', 'DryBulb_same_doy_lag') quantiles = seq(0.1, 0.9, by = 0.1) @@ -101,26 +101,26 @@ for (i in 1:length(cv_settings)){ validation_data[, c] = (validation_data[, ..c] - min_c)/(max_c - min_c) } - validation_data$AverageLoadRatio = rowMeans(validation_data[, c('LoadRatio_10', 'LoadRatio_11', 'LoadRatio_12', - 'LoadRatio_13', 'LoadRatio_14', 'LoadRatio_15', 'LoadRatio_16')], na.rm=TRUE) - validation_data[, LoadRatio:=mean(AverageLoadRatio), by=list(Hour, MonthOfYear)] + validation_data$average_load_ratio = rowMeans(validation_data[, c('recent_load_ratio_10', 'recent_load_ratio_11', 'recent_load_ratio_12', + 'recent_load_ratio_13', 'recent_load_ratio_14', 'recent_load_ratio_15', 'recent_load_ratio_16')], na.rm=TRUE) + validation_data[, load_ratio:=mean(average_load_ratio), by=list(Hour, month_of_year)] result_all_zones = foreach(z = zones, .combine = rbind) %dopar% { print(paste('Zone', z)) - features = c('LoadLag', 'DryBulbLag', + features = c('DEMAND_same_woy_lag', 'DryBulb_same_doy_lag', 'annual_sin_1', 'annual_cos_1', 'annual_sin_2', 'annual_cos_2', 'annual_sin_3', 'annual_cos_3', 'weekly_sin_1', 'weekly_cos_1', 'weekly_sin_2', 'weekly_cos_2', 'weekly_sin_3', 'weekly_cos_3') subset_columns_train = c(features, 'DEMAND') - subset_columns_validation = c(features, 'DEMAND', 'Zone', 'Datetime', 'LoadRatio') + subset_columns_validation = c(features, 'DEMAND', 'Zone', 'Datetime', 'load_ratio') result_all_hours = list() hour_counter = 1 for (h in hours){ - train_df_sub = train_data[Zone == z & Hour == h, ..subset_columns_train] - validation_df_sub = validation_data[Zone == z & Hour == h, ..subset_columns_validation] + train_df_sub = train_data[Zone == z & hour_of_day == h, ..subset_columns_train] + validation_df_sub = validation_data[Zone == z & hour_of_day == h, ..subset_columns_validation] result = data.table(Zone=validation_df_sub$Zone, Datetime=validation_df_sub$Datetime, Round=iR, CVRound=i) @@ -140,7 +140,7 @@ for (i in 1:length(cv_settings)){ iter.max=iter.max, penalty=penalty) - result$Prediction = qrnn2.predict(model, x=validation_x) * validation_df_sub$LoadRatio + result$Prediction = qrnn2.predict(model, x=validation_x) * validation_df_sub$load_ratio result$DEMAND = validation_df_sub$DEMAND result$loss = pinball_loss(tau, validation_df_sub$DEMAND, result$Prediction) result$q = tau diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate_vm.sh b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate_vm.sh similarity index 57% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate_vm.sh rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate_vm.sh index 17a95bcf..9f91e16a 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/fnn/train_validate_vm.sh +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/fnn/train_validate_vm.sh @@ -1,14 +1,14 @@ #!/bin/bash -path=energy_load/GEFCom2017_D_Prob_MT_hourly +path=benchmarks/GEFCom2017_D_Prob_MT_hourly for i in `seq 1 40`; do echo "Parameter Set $i" start=`date +%s` echo 'Creating features...' - python $path/submissions/fnn/feature_engineering.py --submission fnn + python $path/fnn/compute_features.py --submission fnn echo 'Training and validation...' - Rscript $path/submissions/fnn/train_validate.R $i + Rscript $path/fnn/train_validate.R $i end=`date +%s` echo 'Running time '$((end-start))' seconds' diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/Dockerfile b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/Dockerfile similarity index 87% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/Dockerfile rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/Dockerfile index 10e88102..19d420ba 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/Dockerfile +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/Dockerfile @@ -1,5 +1,5 @@ ## Download base image -FROM continuumio/anaconda3:4.4.0 +FROM continuumio/anaconda3:5.3.0 ADD ./conda_dependencies.yml /tmp WORKDIR /tmp @@ -14,7 +14,6 @@ RUN apt-get install -y --no-install-recommends \ libreadline-gplv2-dev \ libncursesw5-dev \ libsqlite3-dev \ - tk-dev \ libgdbm-dev \ libc6-dev \ libbz2-dev \ @@ -35,7 +34,7 @@ RUN conda env create --file conda_dependencies.yml RUN rm conda_dependencies.yml -RUN mkdir /TSPerf -WORKDIR /TSPerf +RUN mkdir /Forecasting +WORKDIR /Forecasting ENTRYPOINT ["/bin/bash"] \ No newline at end of file diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/README.md b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/README.md similarity index 64% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/README.md rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/README.md index 5c564992..8ecb9ff2 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/README.md +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/README.md @@ -12,7 +12,7 @@ **Submission name:** Quantile Random Forest -**Submission path:** energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf +**Submission path:** benchmarks/GEFCom2017_D_Prob_MT_hourly/qrf ## Implementation description @@ -42,81 +42,78 @@ We used 2 validation time frames, the first one in January-April 2015, the secon ### Description of implementation scripts -* `feature_engineering.py`: Python script for computing features and generating feature files. +* `compute_features.py`: Python script for computing features and generating feature files. * `train_score.py`: Python script that trains Quantile Random Forest models and predicts on each round of test data. -* `train_score_vm.sh`: Bash script that runs `feature_engineering.py`and `train_score.py` five times to generate five submission files and measure model running time. +* `train_score_vm.sh`: Bash script that runs `compute_features.py` and `train_score.py` five times to generate five submission files and measure model running time. ### Steps to reproduce results -0. Follow the instructions [here](#resource-deployment-instructions) to provision a Linux Data Science Virtual Machine and log into it. +1. Follow the instructions [here](#resource-deployment-instructions) to provision a Linux Data Science Virtual Machine and log into it. -1. Clone the Forecasting repo to the home directory of your machine +2. Clone the Forecasting repo to the home directory of your machine ```bash cd ~ git clone https://github.com/Microsoft/Forecasting.git ``` - Use one of the following options to securely connect to the Git repo: - * [Personal Access Tokens](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/) - For this method, the clone command becomes + Use one of the following options to securely connect to the Git repo: + * [Personal Access Tokens](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/) + For this method, the clone command becomes ```bash git clone https://:@github.com/Microsoft/Forecasting.git ``` - * [Git Credential Managers](https://github.com/Microsoft/Git-Credential-Manager-for-Windows) - * [Authenticate with SSH](https://help.github.com/articles/connecting-to-github-with-ssh/) + * [Git Credential Managers](https://github.com/Microsoft/Git-Credential-Manager-for-Windows) + * [Authenticate with SSH](https://help.github.com/articles/connecting-to-github-with-ssh/) - -2. Create a conda environment for running the scripts of data downloading, data preparation, and result evaluation. +3. Create a conda environment for running the scripts of data downloading, data preparation, and result evaluation. To do this, you need to check if conda has been installed by runnning command `conda -V`. If it is installed, you will see the conda version in the terminal. Otherwise, please follow the instructions [here](https://conda.io/docs/user-guide/install/linux.html) to install conda. Then, you can go to `~/Forecasting` directory in the VM and create a conda environment named `tsperf` by running ```bash cd ~/Forecasting - conda env create --file ./common/conda_dependencies.yml + conda env create --file tsperf/benchmarking/conda_dependencies.yml ``` -3. Download and extract data **on the VM**. +4. Download and extract data **on the VM**. ```bash source activate tsperf - python energy_load/GEFCom2017_D_Prob_MT_hourly/common/download_data.py - python energy_load/GEFCom2017_D_Prob_MT_hourly/common/extract_data.py + python tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly/download_data.py + python tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly/extract_data.py ``` -4. Prepare Docker container for model training and predicting. - 4.1 Log into Azure Container Registry (ACR) +5. Prepare Docker container for model training and predicting. + + 5.1 Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v + ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). + + 5.2 Build a local Docker image + + ```bash + sudo docker build -t qrf_image benchmarks/GEFCom2017_D_Prob_MT_hourly/qrf ``` - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). - If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - - 4.2 Pull the Docker image from ACR to your VM +6. Train and predict **within Docker container** + 6.1 Start a Docker container from the image ```bash - sudo docker pull tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/qrf_image:v1 - ``` - -5. Train and predict **within Docker container** - 5.1 Start a Docker container from the image - - ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name qrf_container tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/qrf_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name qrf_container qrf_image ``` Note that option `-v ~/Forecasting:/Forecasting` mounts the `~/Forecasting` folder (the one you cloned) to the container so that you can access the code and data on your VM within the container. - 5.2 Train and predict + 6.2 Train and predict ``` source activate tsperf cd /Forecasting - nohup bash ./energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/train_score_vm.sh >& out.txt & + nohup bash benchmarks/GEFCom2017_D_Prob_MT_hourly/qrf/train_score_vm.sh >& out.txt & ``` The last command will take about 31 hours to complete. You can monitor its progress by checking out.txt file. Also during the run you can disconnect from VM. After reconnecting to VM, use the command @@ -127,12 +124,12 @@ Then, you can go to `~/Forecasting` directory in the VM and create a conda envir to connect to the running container and check the status of the run. After generating the forecast results, you can exit the Docker container by command `exit`. -6. Model evaluation **on the VM** +7. Model evaluation **on the VM** ```bash source activate tsperf cd ~/Forecasting - bash ./common/evaluate submissions/qrf energy_load/GEFCom2017_D_Prob_MT_hourly + bash tsperf/benchmarking/evaluate qrf tsperf/benchmarking/GEFCom2017_D_Prob_MT_hourly ``` ## Implementation resources @@ -141,7 +138,7 @@ Then, you can go to `~/Forecasting` directory in the VM and create a conda envir **Resource location:** East US region **Hardware:** F72s v2 (72 vcpus, 144 GB memory) Ubuntu Linux VM **Data storage:** Standard SSD -**Docker image:** tsperf.azurecr.io/energy_load/gefcom2017_d_prob_mt_hourly/qrf_image +**Dockerfile:** [energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/Dockerfile) **Key packages/dependencies:** * Python @@ -162,43 +159,43 @@ Please follow the instructions below to deploy the Linux DSVM. ## Implementation evaluation **Quality:** -* Pinball loss run 1: 76.48 +* Pinball loss run 1: 76.29 -* Pinball loss run 2: 76.49 +* Pinball loss run 2: 76.29 -* Pinball loss run 3: 76.43 +* Pinball loss run 3: 76.18 -* Pinball loss run 4: 76.47 +* Pinball loss run 4: 76.23 -* Pinball loss run 5: 76.6 +* Pinball loss run 5: 76.38 -* Median Pinball loss: 76.48 +* Median Pinball loss: 76.29 **Time:** -* Run time 1: 22289 seconds +* Run time 1: 20119 seconds -* Run time 2: 22493 seconds +* Run time 2: 20489 seconds -* Run time 3: 22859 seconds +* Run time 3: 20616 seconds -* Run time 4: 22709 seconds +* Run time 4: 20297 seconds -* Run time 5: 23197 seconds +* Run time 5: 20322 seconds -* Median run time: 22709 seconds (6.3 hours) +* Median run time: 20322 seconds (5.65 hours) **Cost:** The hourly cost of the F72s v2 Ubuntu Linux VM in East US Azure region is 3.045 USD, based on the price at the submission date. -Thus, the total cost is 22709/3600 * 3.045 = 19.21 USD. +Thus, the total cost is 20322/3600 * 3.045 = 17.19 USD. **Average relative improvement (in %) over GEFCom2017 benchmark model** (measured over the first run) -Round 1: 16.84 -Round 2: 14.98 -Round 3: 12.08 -Round 4: 14.97 -Round 5: 16.16 -Round 6: -2.52 +Round 1: 16.89 +Round 2: 14.93 +Round 3: 12.34 +Round 4: 14.95 +Round 5: 16.19 +Round 6: -0.32 **Ranking in the qualifying round of GEFCom2017 competition** 3 diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/compute_features.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/compute_features.py new file mode 100644 index 00000000..dc1c9123 --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/compute_features.py @@ -0,0 +1,94 @@ +""" +This script uses +energy_load/GEFCom2017_D_Prob_MT_hourly/common/feature_engineering.py to +compute a list of features needed by the Quantile Regression model. +""" +import os +import sys +import getopt + +import localpath + +from tsperf.benchmarking.GEFCom2017_D_Prob_MT_hourly.feature_engineering import compute_features + +SUBMISSIONS_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +DATA_DIR = os.path.join(SUBMISSIONS_DIR, "data") +print("Data directory used: {}".format(DATA_DIR)) + +OUTPUT_DIR = os.path.join(DATA_DIR, "features") +TRAIN_DATA_DIR = os.path.join(DATA_DIR, "train") +TEST_DATA_DIR = os.path.join(DATA_DIR, "test") + +DF_CONFIG = { + "time_col_name": "Datetime", + "ts_id_col_names": "Zone", + "target_col_name": "DEMAND", + "frequency": "H", + "time_format": "%Y-%m-%d %H:%M:%S", +} + +HOLIDAY_COLNAME = "Holiday" + +# Feature configuration list used to specify the features to be computed by +# compute_features. +# Each feature configuration is a tuple in the format of (feature_name, +# featurizer_args) +# feature_name is used to determine the featurizer to use, see FEATURE_MAP in +# energy_load/GEFCom2017_D_Prob_MT_hourly/common/feature_engineering.py +# featurizer_args is a dictionary of arguments passed to the +# featurizer +feature_config_list = [ + ( + "temporal", + { + "feature_list": [ + "hour_of_day", + "day_of_week", + "day_of_month", + "normalized_hour_of_year", + "week_of_year", + "month_of_year", + ] + }, + ), + ("annual_fourier", {"n_harmonics": 3}), + ("weekly_fourier", {"n_harmonics": 3}), + ("daily_fourier", {"n_harmonics": 2}), + ("normalized_date", {}), + ("normalized_datehour", {}), + ("normalized_year", {}), + ("day_type", {"holiday_col_name": HOLIDAY_COLNAME}), + ("previous_year_load_lag", {"input_col_names": "DEMAND", "round_agg_result": True},), + ("previous_year_temp_lag", {"input_col_names": ["DryBulb", "DewPnt"], "round_agg_result": True},), + ( + "recent_load_lag", + {"input_col_names": "DEMAND", "start_week": 10, "window_size": 4, "agg_count": 8, "round_agg_result": True,}, + ), + ( + "recent_temp_lag", + { + "input_col_names": ["DryBulb", "DewPnt"], + "start_week": 10, + "window_size": 4, + "agg_count": 8, + "round_agg_result": True, + }, + ), +] + + +if __name__ == "__main__": + opts, args = getopt.getopt(sys.argv[1:], "", ["submission="]) + for opt, arg in opts: + if opt == "--submission": + submission_folder = arg + output_data_dir = os.path.join(SUBMISSIONS_DIR, submission_folder, "data") + if not os.path.isdir(output_data_dir): + os.mkdir(output_data_dir) + OUTPUT_DIR = os.path.join(output_data_dir, "features") + if not os.path.isdir(OUTPUT_DIR): + os.mkdir(OUTPUT_DIR) + + compute_features( + TRAIN_DATA_DIR, TEST_DATA_DIR, OUTPUT_DIR, DF_CONFIG, feature_config_list, filter_by_month=False, + ) diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/conda_dependencies.yml b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/conda_dependencies.yml similarity index 88% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/conda_dependencies.yml rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/conda_dependencies.yml index a111522d..3ce6da15 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/conda_dependencies.yml +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/conda_dependencies.yml @@ -9,3 +9,4 @@ dependencies: - urllib3=1.21.1 - scikit-garden=0.1.3 - joblib=0.12.5 + - scikit-learn=0.20.3 diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/ensemble_parallel.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/ensemble_parallel.py similarity index 91% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/ensemble_parallel.py rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/ensemble_parallel.py index 350db27a..9150fc59 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/ensemble_parallel.py +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/ensemble_parallel.py @@ -13,6 +13,7 @@ from skgarden.quantile.tree import DecisionTreeQuantileRegressor from skgarden.quantile.ensemble import generate_sample_indices from ensemble_parallel_utils import weighted_percentile_vectorized + class BaseForestQuantileRegressor(ForestRegressor): """Training and scoring of Quantile Regression Random Forest @@ -34,6 +35,7 @@ class BaseForestQuantileRegressor(ForestRegressor): a weight of zero when estimator j is fit, then the value is -1. """ + def fit(self, X, y): """Builds a forest from the training set (X, y). @@ -68,8 +70,7 @@ class BaseForestQuantileRegressor(ForestRegressor): Returns self. """ # apply method requires X to be of dtype np.float32 - X, y = check_X_y( - X, y, accept_sparse="csc", dtype=np.float32, multi_output=False) + X, y = check_X_y(X, y, accept_sparse="csc", dtype=np.float32, multi_output=False) super(BaseForestQuantileRegressor, self).fit(X, y) self.y_train_ = y @@ -78,8 +79,7 @@ class BaseForestQuantileRegressor(ForestRegressor): for i, est in enumerate(self.estimators_): if self.bootstrap: - bootstrap_indices = generate_sample_indices( - est.random_state, len(y)) + bootstrap_indices = generate_sample_indices(est.random_state, len(y)) else: bootstrap_indices = np.arange(len(y)) @@ -87,8 +87,7 @@ class BaseForestQuantileRegressor(ForestRegressor): y_train_leaves = est.y_train_leaves_ for curr_leaf in np.unique(y_train_leaves): y_ind = y_train_leaves == curr_leaf - self.y_weights_[i, y_ind] = ( - est_weights[y_ind] / np.sum(est_weights[y_ind])) + self.y_weights_[i, y_ind] = est_weights[y_ind] / np.sum(est_weights[y_ind]) self.y_train_leaves_[i, bootstrap_indices] = y_train_leaves[bootstrap_indices] @@ -167,21 +166,24 @@ class RandomForestQuantileRegressor(BaseForestQuantileRegressor): oob_prediction_ : array of shape = [n_samples] Prediction computed with out-of-bag estimate on the training set. """ - def __init__(self, - n_estimators=10, - criterion='mse', - max_depth=None, - min_samples_split=2, - min_samples_leaf=1, - min_weight_fraction_leaf=0.0, - max_features='auto', - max_leaf_nodes=None, - bootstrap=True, - oob_score=False, - n_jobs=1, - random_state=None, - verbose=0, - warm_start=False): + + def __init__( + self, + n_estimators=10, + criterion="mse", + max_depth=None, + min_samples_split=2, + min_samples_leaf=1, + min_weight_fraction_leaf=0.0, + max_features="auto", + max_leaf_nodes=None, + bootstrap=True, + oob_score=False, + n_jobs=1, + random_state=None, + verbose=0, + warm_start=False, + ): """Initialize RandomForestQuantileRegressor class Args: @@ -271,16 +273,23 @@ class RandomForestQuantileRegressor(BaseForestQuantileRegressor): super(RandomForestQuantileRegressor, self).__init__( base_estimator=DecisionTreeQuantileRegressor(), n_estimators=n_estimators, - estimator_params=("criterion", "max_depth", "min_samples_split", - "min_samples_leaf", "min_weight_fraction_leaf", - "max_features", "max_leaf_nodes", - "random_state"), + estimator_params=( + "criterion", + "max_depth", + "min_samples_split", + "min_samples_leaf", + "min_weight_fraction_leaf", + "max_features", + "max_leaf_nodes", + "random_state", + ), bootstrap=bootstrap, oob_score=oob_score, n_jobs=n_jobs, random_state=random_state, verbose=verbose, - warm_start=warm_start) + warm_start=warm_start, + ) self.criterion = criterion self.max_depth = max_depth @@ -289,5 +298,3 @@ class RandomForestQuantileRegressor(BaseForestQuantileRegressor): self.min_weight_fraction_leaf = min_weight_fraction_leaf self.max_features = max_features self.max_leaf_nodes = max_leaf_nodes - - diff --git a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/ensemble_parallel_utils.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/ensemble_parallel_utils.py similarity index 98% rename from energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/ensemble_parallel_utils.py rename to contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/ensemble_parallel_utils.py index 5ead5c5a..8e6c325a 100644 --- a/energy_load/GEFCom2017_D_Prob_MT_hourly/submissions/qrf/ensemble_parallel_utils.py +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/ensemble_parallel_utils.py @@ -3,6 +3,7 @@ import numpy as np + def weighted_percentile_vectorized(a, quantiles, weights=None, sorter=None): """Returns the weighted percentile of a at q given weights. @@ -69,8 +70,7 @@ def weighted_percentile_vectorized(a, quantiles, weights=None, sorter=None): percentiles = np.zeros_like(quantiles) for i, q in enumerate(quantiles): if q > 100 or q < 0: - raise ValueError("q should be in-between 0 and 100, " - "got %d" % q) + raise ValueError("q should be in-between 0 and 100, " "got %d" % q) start = np.searchsorted(partial_sum, q) - 1 if start == len(sorted_cum_weights) - 1: diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/localpath.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/localpath.py new file mode 100644 index 00000000..975b3ffb --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/localpath.py @@ -0,0 +1,12 @@ +""" +This script inserts the TSPerf directory into sys.path, so that scripts can import +all the modules in TSPerf. Each submission folder needs its own localpath.py file. +""" + +import os, sys + +_CURR_DIR = os.path.dirname(os.path.abspath(__file__)) +TSPERF_DIR = os.path.dirname(os.path.dirname(os.path.dirname(_CURR_DIR))) + +if TSPERF_DIR not in sys.path: + sys.path.insert(0, TSPERF_DIR) diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/train_score.py b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/train_score.py new file mode 100644 index 00000000..00212ed2 --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/train_score.py @@ -0,0 +1,80 @@ +# This script performs training and scoring with Quantile Random Forest model + +from os.path import join +import argparse +import pandas as pd +from numpy import arange +from ensemble_parallel import RandomForestQuantileRegressor + +# get seed value +parser = argparse.ArgumentParser() +parser.add_argument( + "--data-folder", type=str, dest="data_folder", help="data folder mounting point", +) +parser.add_argument( + "--output-folder", type=str, dest="output_folder", help="output folder mounting point", +) +parser.add_argument("--seed", type=int, dest="seed", help="random seed") +args = parser.parse_args() + +# initialize location of input and output files +data_dir = join(args.data_folder, "features") +train_dir = join(data_dir, "train") +test_dir = join(data_dir, "test") +output_file = join(args.output_folder, "submission_seed_{}.csv".format(args.seed)) + +# do 6 rounds of forecasting, at each round output 9 quantiles +n_rounds = 6 +quantiles = arange(0.1, 1, 0.1) + +# schema of the output +y_test = pd.DataFrame(columns=["Datetime", "Zone", "Round", "q", "Prediction"]) + +for i in range(1, n_rounds + 1): + print("Round {}".format(i)) + + # read training and test files for the current round + train_file = join(train_dir, "train_round_{}.csv".format(i)) + train_df = pd.read_csv(train_file) + + test_file = join(test_dir, "test_round_{}.csv".format(i)) + test_df = pd.read_csv(test_file) + + # train and test for each hour separately + for hour in arange(0, 24): + print(hour) + + # select training sets + train_df_hour = train_df[(train_df["hour_of_day"] == hour)] + # create one-hot encoding of Zone + # (scikit-garden works only with numerical columns) + train_df_hour = pd.get_dummies(train_df_hour, columns=["Zone"]) + # remove column that are not useful (Datetime) or are not + # available in the test set (DEMAND, DryBulb, DewPnt) + X_train = train_df_hour.drop(columns=["Datetime", "DEMAND", "DryBulb", "DewPnt"]).values + + y_train = train_df_hour["DEMAND"].values + + # train a model + rfqr = RandomForestQuantileRegressor( + random_state=args.seed, n_jobs=-1, n_estimators=1000, max_features="sqrt", max_depth=12, + ) + rfqr.fit(X_train, y_train) + + # select test set + test_df_hour = test_df[test_df["hour_of_day"] == hour] + y_test_baseline = test_df_hour[["Datetime", "Zone"]] + test_df_cat = pd.get_dummies(test_df_hour, columns=["Zone"]) + X_test = test_df_cat.drop(columns=["Datetime"]).values + + # generate forecast for each quantile + percentiles = rfqr.predict(X_test, quantiles * 100) + for j, quantile in enumerate(quantiles): + y_test_round_quantile = y_test_baseline.copy(deep=True) + y_test_round_quantile["Round"] = i + y_test_round_quantile["q"] = quantile + y_test_round_quantile["Prediction"] = percentiles[:, j] + y_test = pd.concat([y_test, y_test_round_quantile]) + +# store forecasts +y_test.to_csv(output_file, index=False) diff --git a/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/train_score_vm.sh b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/train_score_vm.sh new file mode 100644 index 00000000..eab25850 --- /dev/null +++ b/contrib/tsperf/GEFCom2017_D_Prob_MT_hourly/qrf/train_score_vm.sh @@ -0,0 +1,15 @@ +path=benchmarks/GEFCom2017_D_Prob_MT_hourly +for i in `seq 1 5`; +do + echo "Run $i" + start=`date +%s` + echo 'Creating features...' + python $path/qrf/compute_features.py --submission qrf + + echo 'Training and predicting...' + python $path/qrf/train_score.py --data-folder $path/qrf/data --output-folder $path/qrf --seed $i + + end=`date +%s` + echo 'Running time '$((end-start))' seconds' +done +echo 'Training and scoring are completed' diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/Dockerfile b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/Dockerfile similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/Dockerfile rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/Dockerfile diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/README.md b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/README.md similarity index 87% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/README.md rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/README.md index 39bcdcc6..df47a55a 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/README.md +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/README.md @@ -87,27 +87,25 @@ to check if conda has been installed by runnning command `conda -V`. If it is in `/test` under the data directory, respectively. After running the above command, you can deactivate the conda environment by running `source deactivate`. -5. Log into Azure Container Registry (ACR): +5. Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - -6. Pull a Docker image from ACR using the following command +6. Build a local Docker image by running the following command from `~/Forecasting` directory ```bash - sudo docker pull tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker build -t baseline_image:v1 ./retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA ``` 7. Choose a name for a new Docker container (e.g. arima_container) and create it using command: ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name arima_container tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name arima_container baseline_image:v1 ``` Note that option `-v ~/Forecasting:/Forecasting` allows you to mount `~/Forecasting` folder (the one you cloned) to the container so that you will have @@ -145,7 +143,7 @@ to check if conda has been installed by runnning command `conda -V`. If it is in **Data storage:** Premium SSD -**Docker image:** tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 +**Dockerfile:** [retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/Dockerfile) **Key packages/dependencies:** * R diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/arima.Rmd b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/arima.Rmd similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/arima.Rmd rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/arima.Rmd diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/arima.nb.html b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/arima.nb.html similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/arima.nb.html rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/arima.nb.html diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/install_R_dependencies.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/install_R_dependencies.r similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/install_R_dependencies.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/install_R_dependencies.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/model_selection.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/model_selection.r old mode 100755 new mode 100644 similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/model_selection.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/model_selection.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/train_score.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/train_score.r old mode 100755 new mode 100644 similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ARIMA/train_score.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ARIMA/train_score.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/Dockerfile b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/Dockerfile similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/Dockerfile rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/Dockerfile diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/README.md b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/README.md similarity index 88% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/README.md rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/README.md index 75180dfc..dc05791c 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/README.md +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/README.md @@ -94,27 +94,25 @@ to check if conda has been installed by runnning command `conda -V`. If it is in `/test` under the data directory, respectively. After running the above command, you can deactivate the conda environment by running `source deactivate`. -5. Log into Azure Container Registry (ACR): +5. Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - -6. Pull a Docker image from ACR using the following command +6. Build a local Docker image by running the following command from `~/Forecasting` directory ```bash - sudo docker pull tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/dcnn_image:v1 + sudo docker build -t dcnn_image:v1 ./retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN ``` 7. Choose a name for a new Docker container (e.g. dcnn_container) and create it using command: ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --runtime=nvidia --name dcnn_container tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/dcnn_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --runtime=nvidia --name dcnn_container dcnn_image:v1 ``` Note that option `-v ~/Forecasting:/Forecasting` allows you to mount `~/Forecasting` folder (the one you cloned) to the container so that you will have @@ -152,7 +150,7 @@ to check if conda has been installed by runnning command `conda -V`. If it is in **Data storage:** Standard HDD -**Docker image:** tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/dcnn_image:v1 +**Dockerfile:** [retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/Dockerfile) **Key packages/dependencies:** * Python diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/hyperparameter_tuning.ipynb b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/hyperparameter_tuning.ipynb old mode 100755 new mode 100644 similarity index 96% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/hyperparameter_tuning.ipynb rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/hyperparameter_tuning.ipynb index 1cd60383..9717775b --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/hyperparameter_tuning.ipynb +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/hyperparameter_tuning.ipynb @@ -1,445 +1,445 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tuning Hyperparameters of Dilated CNN Model with AML SDK and HyperDrive\n", - "\n", - "This notebook performs hyperparameter tuning of Dilated CNN model with AML SDK and HyperDrive. It selects the best model by cross validation using the training data in the first forecast round. Specifically, it splits the training data into sub-training data and validation data. Then, it trains Dilated CNN models with different sets of hyperparameters using the sub-training data and evaluate the accuracy of each model with the validation data. The set of hyperparameters which yield the best validation accuracy will be used to train models and forecast sales across all 12 forecast rounds.\n", - "\n", - "## Prerequisites\n", - "To run this notebook, you need to install AML SDK and its widget extension in your environment by running the following commands in a terminal. Before running the commands, you need to activate your environment by executing `source activate ` in a Linux VM. \n", - "`pip3 install --upgrade azureml-sdk[notebooks,automl]` \n", - "`jupyter nbextension install --py --user azureml.widgets` \n", - "`jupyter nbextension enable --py --user azureml.widgets` \n", - "\n", - "To add the environment to your Jupyter kernels, you can do `python3 -m ipykernel install --name `. Besides, you need to create an Azure ML workspace and download its configuration file (`config.json`) by following the [configuration.ipynb](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) notebook." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import azureml\n", - "from azureml.core import Workspace, Run\n", - "\n", - "# Check core SDK version number\n", - "print(\"Azure ML SDK Version: \", azureml.core.VERSION)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.telemetry import set_diagnostics_collection\n", - "\n", - "# Opt-in diagnostics for better experience of future releases\n", - "set_diagnostics_collection(send_diagnostics=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Initialize Workspace & Create an Azure ML Experiment\n", - "\n", - "Initialize a [Machine Learning Workspace](https://docs.microsoft.com/azure/machine-learning/service/concept-azure-machine-learning-architecture#workspace) object from the workspace you created in the Prerequisites step. `Workspace.from_config()` below creates a workspace object from the details stored in `config.json` that you have downloaded." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.workspace import Workspace\n", - "\n", - "ws = Workspace.from_config()\n", - "print('Workspace name: ' + ws.name, \n", - " 'Azure region: ' + ws.location, \n", - " 'Resource group: ' + ws.resource_group, sep = '\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core import Experiment\n", - "\n", - "exp = Experiment(workspace=ws, name='tune_dcnn')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Validate Script Locally" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.runconfig import RunConfiguration\n", - "\n", - "# Configure local, user managed environment\n", - "run_config_user_managed = RunConfiguration()\n", - "run_config_user_managed.environment.python.user_managed_dependencies = True\n", - "run_config_user_managed.environment.python.interpreter_path = '/usr/bin/python3.5'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core import ScriptRunConfig\n", - "\n", - "# Please update data-folder argument before submitting the job\n", - "src = ScriptRunConfig(source_directory='./', \n", - " script='train_validate.py', \n", - " arguments=['--data-folder', \n", - " '/home/chenhui/TSPerf/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/', \n", - " '--dropout-rate', '0.2'],\n", - " run_config=run_config_user_managed)\n", - "run_local = exp.submit(src)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Check job status\n", - "run_local.get_status()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Check results\n", - "while(run_local.get_status() != 'Completed'): {}\n", - "run_local.get_details()\n", - "run_local.get_metrics()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run Script on Remote Compute Target" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a GPU cluster as compute target" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.compute import ComputeTarget, AmlCompute\n", - "from azureml.core.compute_target import ComputeTargetException\n", - "\n", - "# Choose a name for your cluster\n", - "cluster_name = \"gpucluster\"\n", - "\n", - "try:\n", - " # Look for the existing cluster by name\n", - " compute_target = ComputeTarget(workspace=ws, name=cluster_name)\n", - " if type(compute_target) is AmlCompute:\n", - " print('Found existing compute target {}.'.format(cluster_name))\n", - " else:\n", - " print('{} exists but it is not an AML Compute target. Please choose a different name.'.format(cluster_name))\n", - "except ComputeTargetException:\n", - " print('Creating a new compute target...')\n", - " compute_config = AmlCompute.provisioning_configuration(vm_size=\"STANDARD_NC6\", # GPU-based VM\n", - " #vm_priority='lowpriority', # optional\n", - " min_nodes=0, \n", - " max_nodes=4,\n", - " idle_seconds_before_scaledown=3600)\n", - " # Create the cluster\n", - " compute_target = ComputeTarget.create(ws, cluster_name, compute_config)\n", - " # Can poll for a minimum number of nodes and for a specific timeout. \n", - " # if no min node count is provided it uses the scale settings for the cluster\n", - " compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)\n", - " # Get a detailed status for the current cluster. \n", - " print(compute_target.serialize())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# If you have created the compute target, you should see one entry named 'gpucluster' of type AmlCompute \n", - "# in the workspace's compute_targets property.\n", - "compute_targets = ws.compute_targets\n", - "for name, ct in compute_targets.items():\n", - " print(name, ct.type, ct.provisioning_state)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Configure Docker environment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.runconfig import EnvironmentDefinition\n", - "from azureml.core.conda_dependencies import CondaDependencies\n", - "\n", - "env = EnvironmentDefinition()\n", - "env.python.user_managed_dependencies = False\n", - "env.python.conda_dependencies = CondaDependencies.create(conda_packages=['pandas', 'numpy', 'scipy', 'scikit-learn', 'tensorflow-gpu', 'keras', 'joblib'],\n", - " python_version='3.6.2')\n", - "env.python.conda_dependencies.add_channel('conda-forge')\n", - "env.docker.enabled=True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Upload data to default datastore\n", - "\n", - "Upload the Orange Juice dataset to the workspace's default datastore, which will later be mounted on the cluster for model training and validation. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = ws.get_default_datastore()\n", - "print(ds.datastore_type, ds.account_name, ds.container_name)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "path_on_datastore = 'data'\n", - "ds.upload(src_dir='../../data', target_path=path_on_datastore, overwrite=True, show_progress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Get data reference object for the data path\n", - "ds_data = ds.path(path_on_datastore)\n", - "print(ds_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create estimator\n", - "Next, we will check if the remote compute target is successfully created by submitting a job to the target. This compute target will be used by HyperDrive to tune the hyperparameters later. You may skip this part of code and directly jump into [Tune Hyperparameters using HyperDrive](#tune-hyperparameters-using-hyperdrive)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.runconfig import EnvironmentDefinition\n", - "from azureml.train.estimator import Estimator\n", - "\n", - "script_folder = './'\n", - "script_params = {\n", - " '--data-folder': ds_data.as_mount(),\n", - " '--dropout-rate': 0.2\n", - "}\n", - "est = Estimator(source_directory=script_folder,\n", - " script_params=script_params,\n", - " compute_target=compute_target,\n", - " use_docker=True,\n", - " entry_script='train_validate.py',\n", - " environment_definition=env)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Submit job" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Submit job to compute target\n", - "run_remote = exp.submit(config=est)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Check job status" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.widgets import RunDetails\n", - "\n", - "RunDetails(run_remote).show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run_remote.get_details()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Get metric value after the job finishes \n", - "while(run_remote.get_status() != 'Completed'): {}\n", - "run_remote.get_metrics()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Tune Hyperparameters using HyperDrive" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.train.hyperdrive import *\n", - "\n", - "script_folder = './'\n", - "script_params = {\n", - " '--data-folder': ds_data.as_mount() \n", - "}\n", - "est = Estimator(source_directory=script_folder,\n", - " script_params=script_params,\n", - " compute_target=compute_target,\n", - " use_docker=True,\n", - " entry_script='train_validate.py',\n", - " environment_definition=env)\n", - "ps = BayesianParameterSampling({\n", - " '--seq-len': quniform(5, 40, 1),\n", - " '--dropout-rate': uniform(0, 0.4),\n", - " '--batch-size': choice(32, 64),\n", - " '--learning-rate': choice(1e-4, 1e-3, 5e-3, 1e-2, 1.5e-2, 2e-2, 3e-2, 5e-2, 1e-1),\n", - " '--epochs': quniform(2, 80, 1)\n", - "})\n", - "htc = HyperDriveRunConfig(estimator=est, \n", - " hyperparameter_sampling=ps, \n", - " primary_metric_name='MAPE', \n", - " primary_metric_goal=PrimaryMetricGoal.MINIMIZE, \n", - " max_total_runs=200,\n", - " max_concurrent_runs=4)\n", - "htr = exp.submit(config=htc)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "RunDetails(htr).show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "while(htr.get_status() != 'Completed'): {}\n", - "htr.get_metrics()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "best_run = htr.get_best_run_by_primary_metric()\n", - "parameter_values = best_run.get_details()['runDefinition']['Arguments']\n", - "print(parameter_values)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tuning Hyperparameters of Dilated CNN Model with AML SDK and HyperDrive\n", + "\n", + "This notebook performs hyperparameter tuning of Dilated CNN model with AML SDK and HyperDrive. It selects the best model by cross validation using the training data in the first forecast round. Specifically, it splits the training data into sub-training data and validation data. Then, it trains Dilated CNN models with different sets of hyperparameters using the sub-training data and evaluate the accuracy of each model with the validation data. The set of hyperparameters which yield the best validation accuracy will be used to train models and forecast sales across all 12 forecast rounds.\n", + "\n", + "## Prerequisites\n", + "To run this notebook, you need to install AML SDK and its widget extension in your environment by running the following commands in a terminal. Before running the commands, you need to activate your environment by executing `source activate ` in a Linux VM. \n", + "`pip3 install --upgrade azureml-sdk[notebooks,automl]` \n", + "`jupyter nbextension install --py --user azureml.widgets` \n", + "`jupyter nbextension enable --py --user azureml.widgets` \n", + "\n", + "To add the environment to your Jupyter kernels, you can do `python3 -m ipykernel install --name `. Besides, you need to create an Azure ML workspace and download its configuration file (`config.json`) by following the [configuration.ipynb](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import azureml\n", + "from azureml.core import Workspace, Run\n", + "\n", + "# Check core SDK version number\n", + "print(\"Azure ML SDK Version: \", azureml.core.VERSION)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.telemetry import set_diagnostics_collection\n", + "\n", + "# Opt-in diagnostics for better experience of future releases\n", + "set_diagnostics_collection(send_diagnostics=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize Workspace & Create an Azure ML Experiment\n", + "\n", + "Initialize a [Machine Learning Workspace](https://docs.microsoft.com/azure/machine-learning/service/concept-azure-machine-learning-architecture#workspace) object from the workspace you created in the Prerequisites step. `Workspace.from_config()` below creates a workspace object from the details stored in `config.json` that you have downloaded." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.workspace import Workspace\n", + "\n", + "ws = Workspace.from_config()\n", + "print('Workspace name: ' + ws.name, \n", + " 'Azure region: ' + ws.location, \n", + " 'Resource group: ' + ws.resource_group, sep = '\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core import Experiment\n", + "\n", + "exp = Experiment(workspace=ws, name='tune_dcnn')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Validate Script Locally" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.runconfig import RunConfiguration\n", + "\n", + "# Configure local, user managed environment\n", + "run_config_user_managed = RunConfiguration()\n", + "run_config_user_managed.environment.python.user_managed_dependencies = True\n", + "run_config_user_managed.environment.python.interpreter_path = '/usr/bin/python3.5'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core import ScriptRunConfig\n", + "\n", + "# Please update data-folder argument before submitting the job\n", + "src = ScriptRunConfig(source_directory='./', \n", + " script='train_validate.py', \n", + " arguments=['--data-folder', \n", + " '/home/chenhui/TSPerf/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/', \n", + " '--dropout-rate', '0.2'],\n", + " run_config=run_config_user_managed)\n", + "run_local = exp.submit(src)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Check job status\n", + "run_local.get_status()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Check results\n", + "while(run_local.get_status() != 'Completed'): {}\n", + "run_local.get_details()\n", + "run_local.get_metrics()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run Script on Remote Compute Target" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a GPU cluster as compute target" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.compute import ComputeTarget, AmlCompute\n", + "from azureml.core.compute_target import ComputeTargetException\n", + "\n", + "# Choose a name for your cluster\n", + "cluster_name = \"gpucluster\"\n", + "\n", + "try:\n", + " # Look for the existing cluster by name\n", + " compute_target = ComputeTarget(workspace=ws, name=cluster_name)\n", + " if type(compute_target) is AmlCompute:\n", + " print('Found existing compute target {}.'.format(cluster_name))\n", + " else:\n", + " print('{} exists but it is not an AML Compute target. Please choose a different name.'.format(cluster_name))\n", + "except ComputeTargetException:\n", + " print('Creating a new compute target...')\n", + " compute_config = AmlCompute.provisioning_configuration(vm_size=\"STANDARD_NC6\", # GPU-based VM\n", + " #vm_priority='lowpriority', # optional\n", + " min_nodes=0, \n", + " max_nodes=4,\n", + " idle_seconds_before_scaledown=3600)\n", + " # Create the cluster\n", + " compute_target = ComputeTarget.create(ws, cluster_name, compute_config)\n", + " # Can poll for a minimum number of nodes and for a specific timeout. \n", + " # if no min node count is provided it uses the scale settings for the cluster\n", + " compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)\n", + " # Get a detailed status for the current cluster. \n", + " print(compute_target.serialize())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# If you have created the compute target, you should see one entry named 'gpucluster' of type AmlCompute \n", + "# in the workspace's compute_targets property.\n", + "compute_targets = ws.compute_targets\n", + "for name, ct in compute_targets.items():\n", + " print(name, ct.type, ct.provisioning_state)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Configure Docker environment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.runconfig import EnvironmentDefinition\n", + "from azureml.core.conda_dependencies import CondaDependencies\n", + "\n", + "env = EnvironmentDefinition()\n", + "env.python.user_managed_dependencies = False\n", + "env.python.conda_dependencies = CondaDependencies.create(conda_packages=['pandas', 'numpy', 'scipy', 'scikit-learn', 'tensorflow-gpu', 'keras', 'joblib'],\n", + " python_version='3.6.2')\n", + "env.python.conda_dependencies.add_channel('conda-forge')\n", + "env.docker.enabled=True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Upload data to default datastore\n", + "\n", + "Upload the Orange Juice dataset to the workspace's default datastore, which will later be mounted on the cluster for model training and validation. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = ws.get_default_datastore()\n", + "print(ds.datastore_type, ds.account_name, ds.container_name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "path_on_datastore = 'data'\n", + "ds.upload(src_dir='../../data', target_path=path_on_datastore, overwrite=True, show_progress=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get data reference object for the data path\n", + "ds_data = ds.path(path_on_datastore)\n", + "print(ds_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create estimator\n", + "Next, we will check if the remote compute target is successfully created by submitting a job to the target. This compute target will be used by HyperDrive to tune the hyperparameters later. You may skip this part of code and directly jump into [Tune Hyperparameters using HyperDrive](#tune-hyperparameters-using-hyperdrive)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.runconfig import EnvironmentDefinition\n", + "from azureml.train.estimator import Estimator\n", + "\n", + "script_folder = './'\n", + "script_params = {\n", + " '--data-folder': ds_data.as_mount(),\n", + " '--dropout-rate': 0.2\n", + "}\n", + "est = Estimator(source_directory=script_folder,\n", + " script_params=script_params,\n", + " compute_target=compute_target,\n", + " use_docker=True,\n", + " entry_script='train_validate.py',\n", + " environment_definition=env)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Submit job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Submit job to compute target\n", + "run_remote = exp.submit(config=est)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check job status" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.widgets import RunDetails\n", + "\n", + "RunDetails(run_remote).show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run_remote.get_details()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get metric value after the job finishes \n", + "while(run_remote.get_status() != 'Completed'): {}\n", + "run_remote.get_metrics()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Tune Hyperparameters using HyperDrive" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.train.hyperdrive import *\n", + "\n", + "script_folder = './'\n", + "script_params = {\n", + " '--data-folder': ds_data.as_mount() \n", + "}\n", + "est = Estimator(source_directory=script_folder,\n", + " script_params=script_params,\n", + " compute_target=compute_target,\n", + " use_docker=True,\n", + " entry_script='train_validate.py',\n", + " environment_definition=env)\n", + "ps = BayesianParameterSampling({\n", + " '--seq-len': quniform(5, 40, 1),\n", + " '--dropout-rate': uniform(0, 0.4),\n", + " '--batch-size': choice(32, 64),\n", + " '--learning-rate': choice(1e-4, 1e-3, 5e-3, 1e-2, 1.5e-2, 2e-2, 3e-2, 5e-2, 1e-1),\n", + " '--epochs': quniform(2, 80, 1)\n", + "})\n", + "htc = HyperDriveRunConfig(estimator=est, \n", + " hyperparameter_sampling=ps, \n", + " primary_metric_name='MAPE', \n", + " primary_metric_goal=PrimaryMetricGoal.MINIMIZE, \n", + " max_total_runs=200,\n", + " max_concurrent_runs=4)\n", + "htr = exp.submit(config=htc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "RunDetails(htr).show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "while(htr.get_status() != 'Completed'): {}\n", + "htr.get_metrics()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "best_run = htr.get_best_run_by_primary_metric()\n", + "parameter_values = best_run.get_details()['runDefinition']['Arguments']\n", + "print(parameter_values)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/make_features.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/make_features.py new file mode 100644 index 00000000..db7bb2bd --- /dev/null +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/make_features.py @@ -0,0 +1,88 @@ +# coding: utf-8 + +# Create input features for the Dilated Convolutional Neural Network (CNN) model. + +import os +import sys +import math +import datetime +import numpy as np +import pandas as pd + +# Append TSPerf path to sys.path +tsperf_dir = "." +if tsperf_dir not in sys.path: + sys.path.append(tsperf_dir) + +# Import TSPerf components +from utils import * +import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs + + +def make_features(pred_round, train_dir, pred_steps, offset, store_list, brand_list): + """Create a dataframe of the input features. + + Args: + pred_round (Integer): Prediction round + train_dir (String): Path of the training data directory + pred_steps (Integer): Number of prediction steps + offset (Integer): Length of training data skipped in the retraining + store_list (Numpy Array): List of all the store IDs + brand_list (Numpy Array): List of all the brand IDs + + Returns: + data_filled (Dataframe): Dataframe including the input features + data_scaled (Dataframe): Dataframe including the normalized features + """ + # Load training data + train_df = pd.read_csv(os.path.join(train_dir, "train_round_" + str(pred_round + 1) + ".csv")) + train_df["move"] = train_df["logmove"].apply(lambda x: round(math.exp(x))) + train_df = train_df[["store", "brand", "week", "move"]] + + # Create a dataframe to hold all necessary data + week_list = range(bs.TRAIN_START_WEEK + offset, bs.TEST_END_WEEK_LIST[pred_round] + 1) + d = {"store": store_list, "brand": brand_list, "week": week_list} + data_grid = df_from_cartesian_product(d) + data_filled = pd.merge(data_grid, train_df, how="left", on=["store", "brand", "week"]) + + # Get future price, deal, and advertisement info + aux_df = pd.read_csv(os.path.join(train_dir, "aux_round_" + str(pred_round + 1) + ".csv")) + data_filled = pd.merge(data_filled, aux_df, how="left", on=["store", "brand", "week"]) + + # Create relative price feature + price_cols = [ + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + ] + data_filled["price"] = data_filled.apply(lambda x: x.loc["price" + str(int(x.loc["brand"]))], axis=1) + data_filled["avg_price"] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) + data_filled["price_ratio"] = data_filled["price"] / data_filled["avg_price"] + data_filled.drop(price_cols, axis=1, inplace=True) + + # Fill missing values + data_filled = data_filled.groupby(["store", "brand"]).apply( + lambda x: x.fillna(method="ffill").fillna(method="bfill") + ) + + # Create datetime features + data_filled["week_start"] = data_filled["week"].apply( + lambda x: bs.FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7) + ) + data_filled["month"] = data_filled["week_start"].apply(lambda x: x.month) + data_filled["week_of_month"] = data_filled["week_start"].apply(lambda x: week_of_month(x)) + data_filled.drop("week_start", axis=1, inplace=True) + + # Normalize the dataframe of features + cols_normalize = data_filled.columns.difference(["store", "brand", "week"]) + data_scaled, min_max_scaler = normalize_dataframe(data_filled, cols_normalize) + + return data_filled, data_scaled diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/python_dependencies.txt b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/python_dependencies.txt similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/python_dependencies.txt rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/python_dependencies.txt diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/train_score.ipynb b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/train_score.ipynb old mode 100755 new mode 100644 similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/train_score.ipynb rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/train_score.ipynb diff --git a/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/train_score.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/train_score.py new file mode 100644 index 00000000..a94cd2e2 --- /dev/null +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/train_score.py @@ -0,0 +1,223 @@ +# coding: utf-8 + +# Train and score a Dilated Convolutional Neural Network (CNN) model using Keras package with TensorFlow backend. + +import os +import sys +import keras +import random +import argparse +import numpy as np +import pandas as pd +import tensorflow as tf + +from keras import optimizers +from keras.layers import * +from keras.models import Model, load_model +from keras.callbacks import ModelCheckpoint + +# Append TSPerf path to sys.path (assume we run the script from TSPerf directory) +tsperf_dir = "." +if tsperf_dir not in sys.path: + sys.path.append(tsperf_dir) + +# Import TSPerf components +from utils import * +from make_features import make_features +import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs + +# Model definition +def create_dcnn_model(seq_len, kernel_size=2, n_filters=3, n_input_series=1, n_outputs=1): + """Create a Dilated CNN model. + + Args: + seq_len (Integer): Input sequence length + kernel_size (Integer): Kernel size of each convolutional layer + n_filters (Integer): Number of filters in each convolutional layer + n_outputs (Integer): Number of outputs in the last layer + + Returns: + Keras Model object + """ + # Sequential input + seq_in = Input(shape=(seq_len, n_input_series)) + + # Categorical input + cat_fea_in = Input(shape=(2,), dtype="uint8") + store_id = Lambda(lambda x: x[:, 0, None])(cat_fea_in) + brand_id = Lambda(lambda x: x[:, 1, None])(cat_fea_in) + store_embed = Embedding(MAX_STORE_ID + 1, 7, input_length=1)(store_id) + brand_embed = Embedding(MAX_BRAND_ID + 1, 4, input_length=1)(brand_id) + + # Dilated convolutional layers + c1 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=1, padding="causal", activation="relu")( + seq_in + ) + c2 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=2, padding="causal", activation="relu")(c1) + c3 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=4, padding="causal", activation="relu")(c2) + + # Skip connections + c4 = concatenate([c1, c3]) + + # Output of convolutional layers + conv_out = Conv1D(8, 1, activation="relu")(c4) + conv_out = Dropout(args.dropout_rate)(conv_out) + conv_out = Flatten()(conv_out) + + # Concatenate with categorical features + x = concatenate([conv_out, Flatten()(store_embed), Flatten()(brand_embed)]) + x = Dense(16, activation="relu")(x) + output = Dense(n_outputs, activation="linear")(x) + + # Define model interface, loss function, and optimizer + model = Model(inputs=[seq_in, cat_fea_in], outputs=output) + + return model + + +if __name__ == "__main__": + # Parse input arguments + parser = argparse.ArgumentParser() + parser.add_argument("--seed", type=int, dest="seed", default=1, help="random seed") + parser.add_argument("--seq-len", type=int, dest="seq_len", default=15, help="length of the input sequence") + parser.add_argument("--dropout-rate", type=float, dest="dropout_rate", default=0.01, help="dropout ratio") + parser.add_argument("--batch-size", type=int, dest="batch_size", default=64, help="mini batch size for training") + parser.add_argument("--learning-rate", type=float, dest="learning_rate", default=0.015, help="learning rate") + parser.add_argument("--epochs", type=int, dest="epochs", default=25, help="# of epochs") + args = parser.parse_args() + + # Fix random seeds + np.random.seed(args.seed) + random.seed(args.seed) + tf.set_random_seed(args.seed) + + # Data paths + DATA_DIR = os.path.join(tsperf_dir, "retail_sales", "OrangeJuice_Pt_3Weeks_Weekly", "data") + SUBMISSION_DIR = os.path.join( + tsperf_dir, "retail_sales", "OrangeJuice_Pt_3Weeks_Weekly", "submissions", "DilatedCNN" + ) + TRAIN_DIR = os.path.join(DATA_DIR, "train") + + # Dataset parameters + MAX_STORE_ID = 137 + MAX_BRAND_ID = 11 + + # Parameters of the model + PRED_HORIZON = 3 + PRED_STEPS = 2 + SEQ_LEN = args.seq_len + DYNAMIC_FEATURES = ["deal", "feat", "month", "week_of_month", "price", "price_ratio"] + STATIC_FEATURES = ["store", "brand"] + + # Get unique stores and brands + train_df = pd.read_csv(os.path.join(TRAIN_DIR, "train_round_1.csv")) + store_list = train_df["store"].unique() + brand_list = train_df["brand"].unique() + store_brand = [(x, y) for x in store_list for y in brand_list] + + # Train and predict for all forecast rounds + pred_all = [] + file_name = os.path.join(SUBMISSION_DIR, "dcnn_model.h5") + for r in range(bs.NUM_ROUNDS): + print("---- Round " + str(r + 1) + " ----") + offset = 0 if r == 0 else 40 + r * PRED_STEPS + # Create features + data_filled, data_scaled = make_features(r, TRAIN_DIR, PRED_STEPS, offset, store_list, brand_list) + + # Create sequence array for 'move' + start_timestep = 0 + end_timestep = bs.TRAIN_END_WEEK_LIST[r] - bs.TRAIN_START_WEEK - PRED_HORIZON + train_input1 = gen_sequence_array( + data_scaled, store_brand, SEQ_LEN, ["move"], start_timestep, end_timestep - offset + ) + + # Create sequence array for other dynamic features + start_timestep = PRED_HORIZON + end_timestep = bs.TRAIN_END_WEEK_LIST[r] - bs.TRAIN_START_WEEK + train_input2 = gen_sequence_array( + data_scaled, store_brand, SEQ_LEN, DYNAMIC_FEATURES, start_timestep, end_timestep - offset + ) + + seq_in = np.concatenate([train_input1, train_input2], axis=2) + + # Create array of static features + total_timesteps = bs.TRAIN_END_WEEK_LIST[r] - bs.TRAIN_START_WEEK - SEQ_LEN - PRED_HORIZON + 2 + cat_fea_in = static_feature_array(data_filled, total_timesteps - offset, STATIC_FEATURES) + + # Create training output + start_timestep = SEQ_LEN + PRED_HORIZON - PRED_STEPS + end_timestep = bs.TRAIN_END_WEEK_LIST[r] - bs.TRAIN_START_WEEK + train_output = gen_sequence_array( + data_filled, store_brand, PRED_STEPS, ["move"], start_timestep, end_timestep - offset + ) + train_output = np.squeeze(train_output) + + # Create and train model + if r == 0: + model = create_dcnn_model( + seq_len=SEQ_LEN, n_filters=2, n_input_series=1 + len(DYNAMIC_FEATURES), n_outputs=PRED_STEPS + ) + adam = optimizers.Adam(lr=args.learning_rate) + model.compile(loss="mape", optimizer=adam, metrics=["mape"]) + # Define checkpoint and fit model + checkpoint = ModelCheckpoint(file_name, monitor="loss", save_best_only=True, mode="min", verbose=0) + callbacks_list = [checkpoint] + history = model.fit( + [seq_in, cat_fea_in], + train_output, + epochs=args.epochs, + batch_size=args.batch_size, + callbacks=callbacks_list, + verbose=0, + ) + else: + model = load_model(file_name) + checkpoint = ModelCheckpoint(file_name, monitor="loss", save_best_only=True, mode="min", verbose=0) + callbacks_list = [checkpoint] + history = model.fit( + [seq_in, cat_fea_in], + train_output, + epochs=1, + batch_size=args.batch_size, + callbacks=callbacks_list, + verbose=0, + ) + + # Get inputs for prediction + start_timestep = bs.TEST_START_WEEK_LIST[r] - bs.TRAIN_START_WEEK - SEQ_LEN - PRED_HORIZON + PRED_STEPS + end_timestep = bs.TEST_START_WEEK_LIST[r] - bs.TRAIN_START_WEEK + PRED_STEPS - 1 - PRED_HORIZON + test_input1 = gen_sequence_array( + data_scaled, store_brand, SEQ_LEN, ["move"], start_timestep - offset, end_timestep - offset + ) + + start_timestep = bs.TEST_END_WEEK_LIST[r] - bs.TRAIN_START_WEEK - SEQ_LEN + 1 + end_timestep = bs.TEST_END_WEEK_LIST[r] - bs.TRAIN_START_WEEK + test_input2 = gen_sequence_array( + data_scaled, store_brand, SEQ_LEN, DYNAMIC_FEATURES, start_timestep - offset, end_timestep - offset + ) + + seq_in = np.concatenate([test_input1, test_input2], axis=2) + + total_timesteps = 1 + cat_fea_in = static_feature_array(data_filled, total_timesteps, STATIC_FEATURES) + + # Make prediction + pred = np.round(model.predict([seq_in, cat_fea_in])) + + # Create dataframe for submission + exp_output = data_filled[data_filled.week >= bs.TEST_START_WEEK_LIST[r]].reset_index(drop=True) + exp_output = exp_output[["store", "brand", "week"]] + pred_df = ( + exp_output.sort_values(["store", "brand", "week"]).loc[:, ["store", "brand", "week"]].reset_index(drop=True) + ) + pred_df["weeks_ahead"] = pred_df["week"] - bs.TRAIN_END_WEEK_LIST[r] + pred_df["round"] = r + 1 + pred_df["prediction"] = np.reshape(pred, (pred.size, 1)) + pred_all.append(pred_df) + + # Generate submission + submission = pd.concat(pred_all, axis=0).reset_index(drop=True) + submission = submission[["round", "store", "brand", "week", "weeks_ahead", "prediction"]] + filename = "submission_seed_" + str(args.seed) + ".csv" + submission.to_csv(os.path.join(SUBMISSION_DIR, filename), index=False) + print("Done") diff --git a/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/train_validate.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/train_validate.py new file mode 100644 index 00000000..91468f3c --- /dev/null +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/train_validate.py @@ -0,0 +1,212 @@ +# coding: utf-8 + +# Perform cross validation of a Dilated Convolutional Neural Network (CNN) model on the training data of the 1st forecast round. + +import os +import sys +import math +import keras +import argparse +import datetime +import numpy as np +import pandas as pd + +from utils import * +from keras.layers import * +from keras.models import Model +from keras import optimizers +from keras.utils import multi_gpu_model +from azureml.core import Run + +# Model definition +def create_dcnn_model(seq_len, kernel_size=2, n_filters=3, n_input_series=1, n_outputs=1): + """Create a Dilated CNN model. + + Args: + seq_len (Integer): Input sequence length + kernel_size (Integer): Kernel size of each convolutional layer + n_filters (Integer): Number of filters in each convolutional layer + n_outputs (Integer): Number of outputs in the last layer + + Returns: + Keras Model object + """ + # Sequential input + seq_in = Input(shape=(seq_len, n_input_series)) + + # Categorical input + cat_fea_in = Input(shape=(2,), dtype="uint8") + store_id = Lambda(lambda x: x[:, 0, None])(cat_fea_in) + brand_id = Lambda(lambda x: x[:, 1, None])(cat_fea_in) + store_embed = Embedding(MAX_STORE_ID + 1, 7, input_length=1)(store_id) + brand_embed = Embedding(MAX_BRAND_ID + 1, 4, input_length=1)(brand_id) + + # Dilated convolutional layers + c1 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=1, padding="causal", activation="relu")( + seq_in + ) + c2 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=2, padding="causal", activation="relu")(c1) + c3 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=4, padding="causal", activation="relu")(c2) + + # Skip connections + c4 = concatenate([c1, c3]) + + # Output of convolutional layers + conv_out = Conv1D(8, 1, activation="relu")(c4) + conv_out = Dropout(args.dropout_rate)(conv_out) + conv_out = Flatten()(conv_out) + + # Concatenate with categorical features + x = concatenate([conv_out, Flatten()(store_embed), Flatten()(brand_embed)]) + x = Dense(16, activation="relu")(x) + output = Dense(n_outputs, activation="linear")(x) + + # Define model interface, loss function, and optimizer + model = Model(inputs=[seq_in, cat_fea_in], outputs=output) + + return model + + +if __name__ == "__main__": + # Parse input arguments + parser = argparse.ArgumentParser() + parser.add_argument("--data-folder", type=str, dest="data_folder", help="data folder mounting point") + parser.add_argument("--seq-len", type=int, dest="seq_len", default=20, help="length of the input sequence") + parser.add_argument("--batch-size", type=int, dest="batch_size", default=64, help="mini batch size for training") + parser.add_argument("--dropout-rate", type=float, dest="dropout_rate", default=0.10, help="dropout ratio") + parser.add_argument("--learning-rate", type=float, dest="learning_rate", default=0.01, help="learning rate") + parser.add_argument("--epochs", type=int, dest="epochs", default=30, help="# of epochs") + args = parser.parse_args() + args.dropout_rate = round(args.dropout_rate, 2) + print(args) + + # Start an Azure ML run + run = Run.get_context() + + # Data paths + DATA_DIR = args.data_folder + TRAIN_DIR = os.path.join(DATA_DIR, "train") + + # Data and forecast problem parameters + MAX_STORE_ID = 137 + MAX_BRAND_ID = 11 + PRED_HORIZON = 3 + PRED_STEPS = 2 + TRAIN_START_WEEK = 40 + TRAIN_END_WEEK_LIST = list(range(135, 159, 2)) + TEST_START_WEEK_LIST = list(range(137, 161, 2)) + TEST_END_WEEK_LIST = list(range(138, 162, 2)) + # The start datetime of the first week in the record + FIRST_WEEK_START = pd.to_datetime("1989-09-14 00:00:00") + + # Input sequence length and feature names + SEQ_LEN = args.seq_len + DYNAMIC_FEATURES = ["deal", "feat", "month", "week_of_month", "price", "price_ratio"] + STATIC_FEATURES = ["store", "brand"] + + # Get unique stores and brands + train_df = pd.read_csv(os.path.join(TRAIN_DIR, "train_round_1.csv")) + store_list = train_df["store"].unique() + brand_list = train_df["brand"].unique() + store_brand = [(x, y) for x in store_list for y in brand_list] + + # Train and validate the model using only the first round data + r = 0 + print("---- Round " + str(r + 1) + " ----") + # Load training data + train_df = pd.read_csv(os.path.join(TRAIN_DIR, "train_round_" + str(r + 1) + ".csv")) + train_df["move"] = train_df["logmove"].apply(lambda x: round(math.exp(x))) + train_df = train_df[["store", "brand", "week", "move"]] + + # Create a dataframe to hold all necessary data + week_list = range(TRAIN_START_WEEK, TEST_END_WEEK_LIST[r] + 1) + d = {"store": store_list, "brand": brand_list, "week": week_list} + data_grid = df_from_cartesian_product(d) + data_filled = pd.merge(data_grid, train_df, how="left", on=["store", "brand", "week"]) + + # Get future price, deal, and advertisement info + aux_df = pd.read_csv(os.path.join(TRAIN_DIR, "aux_round_" + str(r + 1) + ".csv")) + data_filled = pd.merge(data_filled, aux_df, how="left", on=["store", "brand", "week"]) + + # Create relative price feature + price_cols = [ + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + ] + data_filled["price"] = data_filled.apply(lambda x: x.loc["price" + str(int(x.loc["brand"]))], axis=1) + data_filled["avg_price"] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) + data_filled["price_ratio"] = data_filled.apply(lambda x: x["price"] / x["avg_price"], axis=1) + + # Fill missing values + data_filled = data_filled.groupby(["store", "brand"]).apply( + lambda x: x.fillna(method="ffill").fillna(method="bfill") + ) + + # Create datetime features + data_filled["week_start"] = data_filled["week"].apply( + lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7) + ) + data_filled["day"] = data_filled["week_start"].apply(lambda x: x.day) + data_filled["week_of_month"] = data_filled["week_start"].apply(lambda x: week_of_month(x)) + data_filled["month"] = data_filled["week_start"].apply(lambda x: x.month) + data_filled.drop("week_start", axis=1, inplace=True) + + # Normalize the dataframe of features + cols_normalize = data_filled.columns.difference(["store", "brand", "week"]) + data_scaled, min_max_scaler = normalize_dataframe(data_filled, cols_normalize) + + # Create sequence array for 'move' + start_timestep = 0 + end_timestep = TRAIN_END_WEEK_LIST[r] - TRAIN_START_WEEK - PRED_HORIZON + train_input1 = gen_sequence_array(data_scaled, store_brand, SEQ_LEN, ["move"], start_timestep, end_timestep) + + # Create sequence array for other dynamic features + start_timestep = PRED_HORIZON + end_timestep = TRAIN_END_WEEK_LIST[r] - TRAIN_START_WEEK + train_input2 = gen_sequence_array(data_scaled, store_brand, SEQ_LEN, DYNAMIC_FEATURES, start_timestep, end_timestep) + + seq_in = np.concatenate((train_input1, train_input2), axis=2) + + # Create array of static features + total_timesteps = TRAIN_END_WEEK_LIST[r] - TRAIN_START_WEEK - SEQ_LEN - PRED_HORIZON + 2 + cat_fea_in = static_feature_array(data_filled, total_timesteps, STATIC_FEATURES) + + # Create training output + start_timestep = SEQ_LEN + PRED_HORIZON - PRED_STEPS + end_timestep = TRAIN_END_WEEK_LIST[r] - TRAIN_START_WEEK + train_output = gen_sequence_array(data_filled, store_brand, PRED_STEPS, ["move"], start_timestep, end_timestep) + train_output = np.squeeze(train_output) + + # Create model + model = create_dcnn_model( + seq_len=SEQ_LEN, n_filters=2, n_input_series=1 + len(DYNAMIC_FEATURES), n_outputs=PRED_STEPS + ) + + # Convert to GPU model + try: + model = multi_gpu_model(model) + print("Training using multiple GPUs...") + except: + print("Training using single GPU or CPU...") + + adam = optimizers.Adam(lr=args.learning_rate) + model.compile(loss="mape", optimizer=adam, metrics=["mape", "mae"]) + + # Model training and validation + history = model.fit( + [seq_in, cat_fea_in], train_output, epochs=args.epochs, batch_size=args.batch_size, validation_split=0.05 + ) + val_loss = history.history["val_loss"][-1] + print("Validation loss is {}".format(val_loss)) + + # Log the validation loss/MAPE + run.log("MAPE", np.float(val_loss)) diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/utils.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/utils.py similarity index 83% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/utils.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/utils.py index b016e896..16b2c93a 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/utils.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/DilatedCNN/utils.py @@ -1,11 +1,12 @@ # coding: utf-8 -# Utility functions for building the Dilated Convolutional Neural Network (CNN) model. +# Utility functions for building the Dilated Convolutional Neural Network (CNN) model. import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler + def week_of_month(dt): """Get the week of the month for the specified date. @@ -14,14 +15,16 @@ def week_of_month(dt): Returns: wom (Integer): Week of the month of the input date - """ + """ from math import ceil + first_day = dt.replace(day=1) dom = dt.day adjusted_dom = dom + first_day.weekday() - wom = int(ceil(adjusted_dom/7.0)) + wom = int(ceil(adjusted_dom / 7.0)) return wom + def df_from_cartesian_product(dict_in): """Generate a Pandas dataframe from Cartesian product of lists. @@ -33,11 +36,13 @@ def df_from_cartesian_product(dict_in): """ from collections import OrderedDict from itertools import product + od = OrderedDict(sorted(dict_in.items())) cart = list(product(*od.values())) df = pd.DataFrame(cart, columns=od.keys()) return df + def gen_sequence(df, seq_len, seq_cols, start_timestep=0, end_timestep=None): """Reshape features into an array of dimension (time steps, features). @@ -54,9 +59,12 @@ def gen_sequence(df, seq_len, seq_cols, start_timestep=0, end_timestep=None): data_array = df[seq_cols].values if end_timestep is None: end_timestep = df.shape[0] - for start, stop in zip(range(start_timestep, end_timestep-seq_len+2), range(start_timestep+seq_len, end_timestep+2)): + for start, stop in zip( + range(start_timestep, end_timestep - seq_len + 2), range(start_timestep + seq_len, end_timestep + 2) + ): yield data_array[start:stop, :] + def gen_sequence_array(df_all, store_brand, seq_len, seq_cols, start_timestep=0, end_timestep=None): """Combine feature sequences for all the combinations of (store, brand) into an 3d array. @@ -70,11 +78,22 @@ def gen_sequence_array(df_all, store_brand, seq_len, seq_cols, start_timestep=0, Returns: seq_array (Numpy Array): An array of the feature sequences of all stores and brands """ - seq_gen = (list(gen_sequence(df_all[(df_all['store']==cur_store) & (df_all['brand']==cur_brand)], seq_len, seq_cols, start_timestep, end_timestep)) \ - for cur_store, cur_brand in store_brand) + seq_gen = ( + list( + gen_sequence( + df_all[(df_all["store"] == cur_store) & (df_all["brand"] == cur_brand)], + seq_len, + seq_cols, + start_timestep, + end_timestep, + ) + ) + for cur_store, cur_brand in store_brand + ) seq_array = np.concatenate(list(seq_gen)).astype(np.float32) return seq_array + def static_feature_array(df_all, total_timesteps, seq_cols): """Generate an array which encodes all the static features. @@ -86,10 +105,11 @@ def static_feature_array(df_all, total_timesteps, seq_cols): Return: fea_array (Numpy Array): An array of static features of all stores and brands """ - fea_df = df_all.groupby(['store', 'brand']).apply(lambda x: x.iloc[:total_timesteps,:]).reset_index(drop=True) + fea_df = df_all.groupby(["store", "brand"]).apply(lambda x: x.iloc[:total_timesteps, :]).reset_index(drop=True) fea_array = fea_df[seq_cols].values return fea_array + def normalize_dataframe(df, seq_cols, scaler=MinMaxScaler()): """Normalize a subset of columns of a dataframe. @@ -102,7 +122,6 @@ def normalize_dataframe(df, seq_cols, scaler=MinMaxScaler()): df_scaled (Dataframe): Normalized dataframe """ cols_fixed = df.columns.difference(seq_cols) - df_scaled = pd.DataFrame(scaler.fit_transform(df[seq_cols]), - columns=seq_cols, index=df.index) + df_scaled = pd.DataFrame(scaler.fit_transform(df[seq_cols]), columns=seq_cols, index=df.index) df_scaled = pd.concat([df[cols_fixed], df_scaled], axis=1) - return df_scaled, scaler \ No newline at end of file + return df_scaled, scaler diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/Dockerfile b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/Dockerfile similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/Dockerfile rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/Dockerfile diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/README.md b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/README.md similarity index 87% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/README.md rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/README.md index 1ac54c85..903e1afe 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/README.md +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/README.md @@ -84,27 +84,25 @@ to check if conda has been installed by runnning command `conda -V`. If it is in `/test` under the data directory, respectively. After running the above command, you can deactivate the conda environment by running `source deactivate`. -5. Log into Azure Container Registry (ACR): +5. Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - -6. Pull a Docker image from ACR using the following command +6. Build a local Docker image by running the following command from `~/Forecasting` directory ```bash - sudo docker pull tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker build -t baseline_image:v1 ./retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS ``` 7. Choose a name for a new Docker container (e.g. ets_container) and create it using command: ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name ets_container tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name ets_container baseline_image:v1 ``` Note that option `-v ~/Forecasting:/Forecasting` allows you to mount `~/Forecasting` folder (the one you cloned) to the container so that you will have @@ -142,7 +140,7 @@ to check if conda has been installed by runnning command `conda -V`. If it is in **Data storage:** Premium SSD -**Docker image:** tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 +**Dockerfile:** [retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/Dockerfile) **Key packages/dependencies:** * R diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/ets.Rmd b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/ets.Rmd similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/ets.Rmd rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/ets.Rmd diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/ets.nb.html.REMOVED.git-id b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/ets.nb.html.REMOVED.git-id similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/ets.nb.html.REMOVED.git-id rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/ets.nb.html.REMOVED.git-id diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/install_R_dependencies.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/install_R_dependencies.r similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/install_R_dependencies.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/install_R_dependencies.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/train_score.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/train_score.r similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/ETS/train_score.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/ETS/train_score.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/Dockerfile b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/Dockerfile old mode 100755 new mode 100644 similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/Dockerfile rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/Dockerfile diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/README.md b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/README.md old mode 100755 new mode 100644 similarity index 88% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/README.md rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/README.md index 081429e6..b6585c3a --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/README.md +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/README.md @@ -94,28 +94,26 @@ to check if conda has been installed by runnning command `conda -V`. If it is in `/test` under the data directory, respectively. After running the above command, you can deactivate the conda environment by running `source deactivate`. -5. Log into Azure Container Registry (ACR): +5. Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - -6. Pull a Docker image from ACR using the following command +6. Build a local Docker image by running the following command from `~/Forecasting` directory ```bash - sudo docker pull tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/lightgbm_image:v1 + sudo docker build -t lightgbm_image:v1 ./retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM ``` 7. Choose a name for a new Docker container (e.g. lightgbm_container) and create it using command: ```bash cd ~/Forecasting - sudo docker run -it -v ~/Forecasting:/Forecasting --name lightgbm_container tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/lightgbm_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name lightgbm_container lightgbm_image:v1 ``` Note that option `-v ~/Forecasting:/Forecasting` allows you to mount `~/Forecasting` folder (the one you cloned) to the container so that you will have @@ -153,7 +151,7 @@ to check if conda has been installed by runnning command `conda -V`. If it is in **Data storage:** Premium SSD -**Docker image:** tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 +**Dockerfile:** [retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/Dockerfile) **Key packages/dependencies:** * Python diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/config.json b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/config.json similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/config.json rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/config.json diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/hyperparameter_tuning.ipynb b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/hyperparameter_tuning.ipynb old mode 100755 new mode 100644 similarity index 97% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/hyperparameter_tuning.ipynb rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/hyperparameter_tuning.ipynb index 314f7b65..686b5a5f --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/hyperparameter_tuning.ipynb +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/hyperparameter_tuning.ipynb @@ -1,449 +1,449 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tuning Hyperparameters of LightGBM Model with AML SDK and HyperDrive\n", - "\n", - "This notebook performs hyperparameter tuning of LightGBM model with AML SDK and HyperDrive. It selects the best model by cross validation using the training data in the first forecast round. Specifically, it splits the training data into sub-training data and validation data. Then, it trains LightGBM models with different sets of hyperparameters using the sub-training data and evaluate the accuracy of each model with the validation data. The set of hyperparameters which yield the best validation accuracy will be used to train models and forecast sales across all 12 forecast rounds.\n", - "\n", - "## Prerequisites\n", - "To run this notebook, you need to install AML SDK and its widget extension in your environment by running the following commands in a terminal. Before running the commands, you need to activate your environment by executing `source activate ` in a Linux VM. \n", - "`pip3 install --upgrade azureml-sdk[notebooks,automl]` \n", - "`jupyter nbextension install --py --user azureml.widgets` \n", - "`jupyter nbextension enable --py --user azureml.widgets` \n", - "\n", - "To add the environment to your Jupyter kernels, you can do `python3 -m ipykernel install --name `. Besides, you need to create an Azure ML workspace and download its configuration file (`config.json`) by following the [configuration.ipynb](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) notebook." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import azureml\n", - "from azureml.core import Workspace, Run\n", - "\n", - "# Check core SDK version number\n", - "print(\"Azure ML SDK Version: \", azureml.core.VERSION)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.telemetry import set_diagnostics_collection\n", - "\n", - "# Opt-in diagnostics for better experience of future releases\n", - "set_diagnostics_collection(send_diagnostics=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Initialize Workspace & Create an Azure ML Experiment\n", - "\n", - "Initialize a [Machine Learning Workspace](https://docs.microsoft.com/azure/machine-learning/service/concept-azure-machine-learning-architecture#workspace) object from the workspace you created in the Prerequisites step. `Workspace.from_config()` below creates a workspace object from the details stored in `config.json` that you have downloaded." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.workspace import Workspace\n", - "\n", - "ws = Workspace.from_config()\n", - "print('Workspace name: ' + ws.name, \n", - " 'Azure region: ' + ws.location, \n", - " 'Resource group: ' + ws.resource_group, sep = '\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core import Experiment\n", - "\n", - "exp = Experiment(workspace=ws, name='tune_lgbm')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Validate Script Locally" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.runconfig import RunConfiguration\n", - "\n", - "# Configure local, user managed environment\n", - "run_config_user_managed = RunConfiguration()\n", - "run_config_user_managed.environment.python.user_managed_dependencies = True\n", - "run_config_user_managed.environment.python.interpreter_path = '/usr/bin/python3.5'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core import ScriptRunConfig\n", - "\n", - "# Please update data-folder argument before submitting the job\n", - "src = ScriptRunConfig(source_directory='./', \n", - " script='train_validate.py', \n", - " arguments=['--data-folder', \n", - " '/home/chenhui/TSPerf/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/', \n", - " '--bagging-fraction', '0.8'],\n", - " run_config=run_config_user_managed)\n", - "run_local = exp.submit(src)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Check job status\n", - "run_local.get_status()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Check results\n", - "while(run_local.get_status() != 'Completed'): {}\n", - "run_local.get_details()\n", - "run_local.get_metrics()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run Script on Remote Compute Target" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a CPU cluster as compute target" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.compute import ComputeTarget, AmlCompute\n", - "from azureml.core.compute_target import ComputeTargetException\n", - "\n", - "# Choose a name for your cluster\n", - "cluster_name = \"cpucluster\"\n", - "\n", - "try:\n", - " # Look for the existing cluster by name\n", - " compute_target = ComputeTarget(workspace=ws, name=cluster_name)\n", - " if type(compute_target) is AmlCompute:\n", - " print('Found existing compute target {}.'.format(cluster_name))\n", - " else:\n", - " print('{} exists but it is not an AML Compute target. Please choose a different name.'.format(cluster_name))\n", - "except ComputeTargetException:\n", - " print('Creating a new compute target...')\n", - " compute_config = AmlCompute.provisioning_configuration(vm_size=\"STANDARD_D14_v2\", # CPU-based VM\n", - " #vm_priority='lowpriority', # optional\n", - " min_nodes=0, \n", - " max_nodes=4,\n", - " idle_seconds_before_scaledown=3600)\n", - " # Create the cluster\n", - " compute_target = ComputeTarget.create(ws, cluster_name, compute_config)\n", - " # Can poll for a minimum number of nodes and for a specific timeout. \n", - " # if no min node count is provided it uses the scale settings for the cluster\n", - " compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)\n", - " # Get a detailed status for the current cluster. \n", - " print(compute_target.serialize())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# If you have created the compute target, you should see one entry named 'cpucluster' of type AmlCompute \n", - "# in the workspace's compute_targets property.\n", - "compute_targets = ws.compute_targets\n", - "for name, ct in compute_targets.items():\n", - " print(name, ct.type, ct.provisioning_state)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Configure Docker environment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.runconfig import EnvironmentDefinition\n", - "from azureml.core.conda_dependencies import CondaDependencies\n", - "\n", - "env = EnvironmentDefinition()\n", - "env.python.user_managed_dependencies = False\n", - "env.python.conda_dependencies = CondaDependencies.create(conda_packages=['pandas', 'numpy', 'scipy', 'scikit-learn', 'lightgbm', 'joblib'],\n", - " python_version='3.6.2')\n", - "env.python.conda_dependencies.add_channel('conda-forge')\n", - "env.docker.enabled=True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Upload data to default datastore\n", - "\n", - "Upload the Orange Juice dataset to the workspace's default datastore, which will later be mounted on the cluster for model training and validation. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = ws.get_default_datastore()\n", - "print(ds.datastore_type, ds.account_name, ds.container_name)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "path_on_datastore = 'data'\n", - "ds.upload(src_dir='../../data', target_path=path_on_datastore, overwrite=True, show_progress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Get data reference object for the data path\n", - "ds_data = ds.path(path_on_datastore)\n", - "print(ds_data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create estimator\n", - "Next, we will check if the remote compute target is successfully created by submitting a job to the target. This compute target will be used by HyperDrive to tune the hyperparameters later. You may skip this part of code and directly jump into [Tune Hyperparameters using HyperDrive](#tune-hyperparameters-using-hyperdrive)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core.runconfig import EnvironmentDefinition\n", - "from azureml.train.estimator import Estimator\n", - "\n", - "script_folder = './'\n", - "script_params = {\n", - " '--data-folder': ds_data.as_mount(),\n", - " '--bagging-fraction': 0.8\n", - "}\n", - "est = Estimator(source_directory=script_folder,\n", - " script_params=script_params,\n", - " compute_target=compute_target,\n", - " use_docker=True,\n", - " entry_script='train_validate.py',\n", - " environment_definition=env)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Submit job" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Submit job to compute target\n", - "run_remote = exp.submit(config=est)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Check job status" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.widgets import RunDetails\n", - "\n", - "RunDetails(run_remote).show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "run_remote.get_details()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Get metric value after the job finishes \n", - "while(run_remote.get_status() != 'Completed'): {}\n", - "run_remote.get_metrics()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Tune Hyperparameters using HyperDrive" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.train.hyperdrive import *\n", - "\n", - "script_folder = './'\n", - "script_params = {\n", - " '--data-folder': ds_data.as_mount() \n", - "}\n", - "est = Estimator(source_directory=script_folder,\n", - " script_params=script_params,\n", - " compute_target=compute_target,\n", - " use_docker=True,\n", - " entry_script='train_validate.py',\n", - " environment_definition=env)\n", - "ps = BayesianParameterSampling({\n", - " '--num-leaves': quniform(8, 128, 1),\n", - " '--min-data-in-leaf': quniform(20, 500, 10),\n", - " '--learning-rate': choice(1e-4, 1e-3, 5e-3, 1e-2, 1.5e-2, 2e-2, 3e-2, 5e-2, 1e-1),\n", - " '--feature-fraction': uniform(0.2, 1), \n", - " '--bagging-fraction': uniform(0.1, 1), \n", - " '--bagging-freq': quniform(1, 20, 1), \n", - " '--max-rounds': quniform(50, 2000, 10),\n", - " '--max-lag': quniform(3, 40, 1), \n", - " '--window-size': quniform(3, 40, 1), \n", - "})\n", - "htc = HyperDriveRunConfig(estimator=est, \n", - " hyperparameter_sampling=ps, \n", - " primary_metric_name='MAPE', \n", - " primary_metric_goal=PrimaryMetricGoal.MINIMIZE, \n", - " max_total_runs=200,\n", - " max_concurrent_runs=4)\n", - "htr = exp.submit(config=htc)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "RunDetails(htr).show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "while(htr.get_status() != 'Completed'): {}\n", - "htr.get_metrics()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "best_run = htr.get_best_run_by_primary_metric()\n", - "parameter_values = best_run.get_details()['runDefinition']['Arguments']\n", - "print(parameter_values)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tuning Hyperparameters of LightGBM Model with AML SDK and HyperDrive\n", + "\n", + "This notebook performs hyperparameter tuning of LightGBM model with AML SDK and HyperDrive. It selects the best model by cross validation using the training data in the first forecast round. Specifically, it splits the training data into sub-training data and validation data. Then, it trains LightGBM models with different sets of hyperparameters using the sub-training data and evaluate the accuracy of each model with the validation data. The set of hyperparameters which yield the best validation accuracy will be used to train models and forecast sales across all 12 forecast rounds.\n", + "\n", + "## Prerequisites\n", + "To run this notebook, you need to install AML SDK and its widget extension in your environment by running the following commands in a terminal. Before running the commands, you need to activate your environment by executing `source activate ` in a Linux VM. \n", + "`pip3 install --upgrade azureml-sdk[notebooks,automl]` \n", + "`jupyter nbextension install --py --user azureml.widgets` \n", + "`jupyter nbextension enable --py --user azureml.widgets` \n", + "\n", + "To add the environment to your Jupyter kernels, you can do `python3 -m ipykernel install --name `. Besides, you need to create an Azure ML workspace and download its configuration file (`config.json`) by following the [configuration.ipynb](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import azureml\n", + "from azureml.core import Workspace, Run\n", + "\n", + "# Check core SDK version number\n", + "print(\"Azure ML SDK Version: \", azureml.core.VERSION)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.telemetry import set_diagnostics_collection\n", + "\n", + "# Opt-in diagnostics for better experience of future releases\n", + "set_diagnostics_collection(send_diagnostics=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize Workspace & Create an Azure ML Experiment\n", + "\n", + "Initialize a [Machine Learning Workspace](https://docs.microsoft.com/azure/machine-learning/service/concept-azure-machine-learning-architecture#workspace) object from the workspace you created in the Prerequisites step. `Workspace.from_config()` below creates a workspace object from the details stored in `config.json` that you have downloaded." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.workspace import Workspace\n", + "\n", + "ws = Workspace.from_config()\n", + "print('Workspace name: ' + ws.name, \n", + " 'Azure region: ' + ws.location, \n", + " 'Resource group: ' + ws.resource_group, sep = '\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core import Experiment\n", + "\n", + "exp = Experiment(workspace=ws, name='tune_lgbm')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Validate Script Locally" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.runconfig import RunConfiguration\n", + "\n", + "# Configure local, user managed environment\n", + "run_config_user_managed = RunConfiguration()\n", + "run_config_user_managed.environment.python.user_managed_dependencies = True\n", + "run_config_user_managed.environment.python.interpreter_path = '/usr/bin/python3.5'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core import ScriptRunConfig\n", + "\n", + "# Please update data-folder argument before submitting the job\n", + "src = ScriptRunConfig(source_directory='./', \n", + " script='train_validate.py', \n", + " arguments=['--data-folder', \n", + " '/home/chenhui/TSPerf/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/', \n", + " '--bagging-fraction', '0.8'],\n", + " run_config=run_config_user_managed)\n", + "run_local = exp.submit(src)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Check job status\n", + "run_local.get_status()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Check results\n", + "while(run_local.get_status() != 'Completed'): {}\n", + "run_local.get_details()\n", + "run_local.get_metrics()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run Script on Remote Compute Target" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a CPU cluster as compute target" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.compute import ComputeTarget, AmlCompute\n", + "from azureml.core.compute_target import ComputeTargetException\n", + "\n", + "# Choose a name for your cluster\n", + "cluster_name = \"cpucluster\"\n", + "\n", + "try:\n", + " # Look for the existing cluster by name\n", + " compute_target = ComputeTarget(workspace=ws, name=cluster_name)\n", + " if type(compute_target) is AmlCompute:\n", + " print('Found existing compute target {}.'.format(cluster_name))\n", + " else:\n", + " print('{} exists but it is not an AML Compute target. Please choose a different name.'.format(cluster_name))\n", + "except ComputeTargetException:\n", + " print('Creating a new compute target...')\n", + " compute_config = AmlCompute.provisioning_configuration(vm_size=\"STANDARD_D14_v2\", # CPU-based VM\n", + " #vm_priority='lowpriority', # optional\n", + " min_nodes=0, \n", + " max_nodes=4,\n", + " idle_seconds_before_scaledown=3600)\n", + " # Create the cluster\n", + " compute_target = ComputeTarget.create(ws, cluster_name, compute_config)\n", + " # Can poll for a minimum number of nodes and for a specific timeout. \n", + " # if no min node count is provided it uses the scale settings for the cluster\n", + " compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)\n", + " # Get a detailed status for the current cluster. \n", + " print(compute_target.serialize())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# If you have created the compute target, you should see one entry named 'cpucluster' of type AmlCompute \n", + "# in the workspace's compute_targets property.\n", + "compute_targets = ws.compute_targets\n", + "for name, ct in compute_targets.items():\n", + " print(name, ct.type, ct.provisioning_state)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Configure Docker environment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.runconfig import EnvironmentDefinition\n", + "from azureml.core.conda_dependencies import CondaDependencies\n", + "\n", + "env = EnvironmentDefinition()\n", + "env.python.user_managed_dependencies = False\n", + "env.python.conda_dependencies = CondaDependencies.create(conda_packages=['pandas', 'numpy', 'scipy', 'scikit-learn', 'lightgbm', 'joblib'],\n", + " python_version='3.6.2')\n", + "env.python.conda_dependencies.add_channel('conda-forge')\n", + "env.docker.enabled=True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Upload data to default datastore\n", + "\n", + "Upload the Orange Juice dataset to the workspace's default datastore, which will later be mounted on the cluster for model training and validation. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = ws.get_default_datastore()\n", + "print(ds.datastore_type, ds.account_name, ds.container_name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "path_on_datastore = 'data'\n", + "ds.upload(src_dir='../../data', target_path=path_on_datastore, overwrite=True, show_progress=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get data reference object for the data path\n", + "ds_data = ds.path(path_on_datastore)\n", + "print(ds_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create estimator\n", + "Next, we will check if the remote compute target is successfully created by submitting a job to the target. This compute target will be used by HyperDrive to tune the hyperparameters later. You may skip this part of code and directly jump into [Tune Hyperparameters using HyperDrive](#tune-hyperparameters-using-hyperdrive)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.runconfig import EnvironmentDefinition\n", + "from azureml.train.estimator import Estimator\n", + "\n", + "script_folder = './'\n", + "script_params = {\n", + " '--data-folder': ds_data.as_mount(),\n", + " '--bagging-fraction': 0.8\n", + "}\n", + "est = Estimator(source_directory=script_folder,\n", + " script_params=script_params,\n", + " compute_target=compute_target,\n", + " use_docker=True,\n", + " entry_script='train_validate.py',\n", + " environment_definition=env)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Submit job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Submit job to compute target\n", + "run_remote = exp.submit(config=est)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check job status" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.widgets import RunDetails\n", + "\n", + "RunDetails(run_remote).show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run_remote.get_details()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get metric value after the job finishes \n", + "while(run_remote.get_status() != 'Completed'): {}\n", + "run_remote.get_metrics()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Tune Hyperparameters using HyperDrive" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.train.hyperdrive import *\n", + "\n", + "script_folder = './'\n", + "script_params = {\n", + " '--data-folder': ds_data.as_mount() \n", + "}\n", + "est = Estimator(source_directory=script_folder,\n", + " script_params=script_params,\n", + " compute_target=compute_target,\n", + " use_docker=True,\n", + " entry_script='train_validate.py',\n", + " environment_definition=env)\n", + "ps = BayesianParameterSampling({\n", + " '--num-leaves': quniform(8, 128, 1),\n", + " '--min-data-in-leaf': quniform(20, 500, 10),\n", + " '--learning-rate': choice(1e-4, 1e-3, 5e-3, 1e-2, 1.5e-2, 2e-2, 3e-2, 5e-2, 1e-1),\n", + " '--feature-fraction': uniform(0.2, 1), \n", + " '--bagging-fraction': uniform(0.1, 1), \n", + " '--bagging-freq': quniform(1, 20, 1), \n", + " '--max-rounds': quniform(50, 2000, 10),\n", + " '--max-lag': quniform(3, 40, 1), \n", + " '--window-size': quniform(3, 40, 1), \n", + "})\n", + "htc = HyperDriveRunConfig(estimator=est, \n", + " hyperparameter_sampling=ps, \n", + " primary_metric_name='MAPE', \n", + " primary_metric_goal=PrimaryMetricGoal.MINIMIZE, \n", + " max_total_runs=200,\n", + " max_concurrent_runs=4)\n", + "htr = exp.submit(config=htc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "RunDetails(htr).show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "while(htr.get_status() != 'Completed'): {}\n", + "htr.get_metrics()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "best_run = htr.get_best_run_by_primary_metric()\n", + "parameter_values = best_run.get_details()['runDefinition']['Arguments']\n", + "print(parameter_values)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/make_features.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/make_features.py old mode 100755 new mode 100644 similarity index 61% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/make_features.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/make_features.py index 0b503b2e..05a0a9d0 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/make_features.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/make_features.py @@ -1,6 +1,6 @@ # coding: utf-8 -# Create input features for the boosted decision tree model. +# Create input features for the boosted decision tree model. import os import sys @@ -9,9 +9,9 @@ import itertools import datetime import numpy as np import pandas as pd -import lightgbm as lgb +import lightgbm as lgb -# Append TSPerf path to sys.path +# Append TSPerf path to sys.path tsperf_dir = os.getcwd() if tsperf_dir not in sys.path: sys.path.append(tsperf_dir) @@ -20,6 +20,7 @@ if tsperf_dir not in sys.path: from utils import * import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs + def lagged_features(df, lags): """Create lagged features based on time series data. @@ -33,11 +34,12 @@ def lagged_features(df, lags): df_list = [] for lag in lags: df_shifted = df.shift(lag) - df_shifted.columns = [x + '_lag' + str(lag) for x in df_shifted.columns] + df_shifted.columns = [x + "_lag" + str(lag) for x in df_shifted.columns] df_list.append(df_shifted) fea = pd.concat(df_list, axis=1) return fea + def moving_averages(df, start_step, window_size=None): """Compute averages of every feature over moving time windows. @@ -49,12 +51,13 @@ def moving_averages(df, start_step, window_size=None): Returns: fea (Dataframe): Dataframe consisting of the moving averages """ - if window_size == None: # Use a large window to compute average over all historical data + if window_size == None: # Use a large window to compute average over all historical data window_size = df.shape[0] fea = df.shift(start_step).rolling(min_periods=1, center=False, window=window_size).mean() - fea.columns = fea.columns + '_mean' + fea.columns = fea.columns + "_mean" return fea + def combine_features(df, lag_fea, lags, window_size, used_columns): """Combine different features for a certain store-brand. @@ -73,6 +76,7 @@ def combine_features(df, lag_fea, lags, window_size, used_columns): fea_all = pd.concat([df[used_columns], lagged_fea, moving_avg], axis=1) return fea_all + def make_features(pred_round, train_dir, lags, window_size, offset, used_columns, store_list, brand_list): """Create a dataframe of the input features. @@ -88,46 +92,59 @@ def make_features(pred_round, train_dir, lags, window_size, offset, used_columns Returns: features (Dataframe): Dataframe including all the input features and target variable - """ + """ # Load training data - train_df = pd.read_csv(os.path.join(train_dir, 'train_round_'+str(pred_round+1)+'.csv')) - train_df['move'] = train_df['logmove'].apply(lambda x: round(math.exp(x))) - train_df = train_df[['store', 'brand', 'week', 'move']] + train_df = pd.read_csv(os.path.join(train_dir, "train_round_" + str(pred_round + 1) + ".csv")) + train_df["move"] = train_df["logmove"].apply(lambda x: round(math.exp(x))) + train_df = train_df[["store", "brand", "week", "move"]] # Create a dataframe to hold all necessary data - week_list = range(bs.TRAIN_START_WEEK + offset, bs.TEST_END_WEEK_LIST[pred_round]+1) - d = {'store': store_list, - 'brand': brand_list, - 'week': week_list} + week_list = range(bs.TRAIN_START_WEEK + offset, bs.TEST_END_WEEK_LIST[pred_round] + 1) + d = {"store": store_list, "brand": brand_list, "week": week_list} data_grid = df_from_cartesian_product(d) - data_filled = pd.merge(data_grid, train_df, how='left', - on=['store', 'brand', 'week']) + data_filled = pd.merge(data_grid, train_df, how="left", on=["store", "brand", "week"]) # Get future price, deal, and advertisement info - aux_df = pd.read_csv(os.path.join(train_dir, 'aux_round_'+str(pred_round+1)+'.csv')) - data_filled = pd.merge(data_filled, aux_df, how='left', - on=['store', 'brand', 'week']) - + aux_df = pd.read_csv(os.path.join(train_dir, "aux_round_" + str(pred_round + 1) + ".csv")) + data_filled = pd.merge(data_filled, aux_df, how="left", on=["store", "brand", "week"]) + # Create relative price feature - price_cols = ['price1', 'price2', 'price3', 'price4', 'price5', 'price6', 'price7', 'price8', \ - 'price9', 'price10', 'price11'] - data_filled['price'] = data_filled.apply(lambda x: x.loc['price' + str(int(x.loc['brand']))], axis=1) - data_filled['avg_price'] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) - data_filled['price_ratio'] = data_filled['price'] / data_filled['avg_price'] - data_filled.drop(price_cols, axis=1, inplace=True) + price_cols = [ + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + ] + data_filled["price"] = data_filled.apply(lambda x: x.loc["price" + str(int(x.loc["brand"]))], axis=1) + data_filled["avg_price"] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) + data_filled["price_ratio"] = data_filled["price"] / data_filled["avg_price"] + data_filled.drop(price_cols, axis=1, inplace=True) # Fill missing values - data_filled = data_filled.groupby(['store', 'brand']).apply(lambda x: x.fillna(method='ffill').fillna(method='bfill')) + data_filled = data_filled.groupby(["store", "brand"]).apply( + lambda x: x.fillna(method="ffill").fillna(method="bfill") + ) # Create datetime features - data_filled['week_start'] = data_filled['week'].apply(lambda x: bs.FIRST_WEEK_START + datetime.timedelta(days=(x-1)*7)) - data_filled['year'] = data_filled['week_start'].apply(lambda x: x.year) - data_filled['month'] = data_filled['week_start'].apply(lambda x: x.month) - data_filled['week_of_month'] = data_filled['week_start'].apply(lambda x: week_of_month(x)) - data_filled['day'] = data_filled['week_start'].apply(lambda x: x.day) - data_filled.drop('week_start', axis=1, inplace=True) + data_filled["week_start"] = data_filled["week"].apply( + lambda x: bs.FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7) + ) + data_filled["year"] = data_filled["week_start"].apply(lambda x: x.year) + data_filled["month"] = data_filled["week_start"].apply(lambda x: x.month) + data_filled["week_of_month"] = data_filled["week_start"].apply(lambda x: week_of_month(x)) + data_filled["day"] = data_filled["week_start"].apply(lambda x: x.day) + data_filled.drop("week_start", axis=1, inplace=True) # Create other features (lagged features, moving averages, etc.) - features = data_filled.groupby(['store','brand']).apply(lambda x: combine_features(x, ['move'], lags, window_size, used_columns)) + features = data_filled.groupby(["store", "brand"]).apply( + lambda x: combine_features(x, ["move"], lags, window_size, used_columns) + ) - return features \ No newline at end of file + return features diff --git a/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/make_features_new.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/make_features_new.py new file mode 100644 index 00000000..31c20625 --- /dev/null +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/make_features_new.py @@ -0,0 +1,201 @@ +# coding: utf-8 + +# Create input features for the boosted decision tree model. + +import os +import sys +import math +import datetime +import pandas as pd + +from sklearn.pipeline import Pipeline +from common.features.lag import LagFeaturizer +from common.features.rolling_window import RollingWindowFeaturizer +from common.features.stats import PopularityFeaturizer +from common.features.temporal import TemporalFeaturizer + +# Append TSPerf path to sys.path +tsperf_dir = os.getcwd() +if tsperf_dir not in sys.path: + sys.path.append(tsperf_dir) + +# Import TSPerf components +from utils import df_from_cartesian_product +import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs + +pd.set_option("display.max_columns", None) + + +def oj_preprocess(df, aux_df, week_list, store_list, brand_list, train_df=None): + + df["move"] = df["logmove"].apply(lambda x: round(math.exp(x))) + df = df[["store", "brand", "week", "move"]].copy() + + # Create a dataframe to hold all necessary data + d = {"store": store_list, "brand": brand_list, "week": week_list} + data_grid = df_from_cartesian_product(d) + data_filled = pd.merge(data_grid, df, how="left", on=["store", "brand", "week"]) + + # Get future price, deal, and advertisement info + data_filled = pd.merge(data_filled, aux_df, how="left", on=["store", "brand", "week"]) + + # Fill missing values + if train_df is not None: + data_filled = pd.concat(train_df, data_filled) + forecast_creation_time = train_df["week_start"].max() + + data_filled = data_filled.groupby(["store", "brand"]).apply( + lambda x: x.fillna(method="ffill").fillna(method="bfill") + ) + + data_filled["week_start"] = data_filled["week"].apply( + lambda x: bs.FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7) + ) + + if train_df is not None: + data_filled = data_filled.loc[data_filled["week_start"] > forecast_creation_time].copy() + + return data_filled + + +def make_features( + pred_round, train_dir, lags, window_size, offset, used_columns, store_list, brand_list, +): + """Create a dataframe of the input features. + + Args: + pred_round (Integer): Prediction round + train_dir (String): Path of the training data directory + lags (Numpy Array): Numpy array including all the lags + window_size (Integer): Maximum step for computing the moving average + offset (Integer): Length of training data skipped in the retraining + used_columns (List): A list of names of columns used in model training + (including target variable) + store_list (Numpy Array): List of all the store IDs + brand_list (Numpy Array): List of all the brand IDs + + Returns: + features (Dataframe): Dataframe including all the input features and + target variable + """ + # Load training data + train_df = pd.read_csv(os.path.join(train_dir, "train_round_" + str(pred_round + 1) + ".csv")) + aux_df = pd.read_csv(os.path.join(train_dir, "aux_round_" + str(pred_round + 1) + ".csv")) + week_list = range(bs.TRAIN_START_WEEK + offset, bs.TEST_END_WEEK_LIST[pred_round] + 1) + + train_df_preprocessed = oj_preprocess(train_df, aux_df, week_list, store_list, brand_list) + + df_config = { + "time_col_name": "week_start", + "ts_id_col_names": ["brand", "store"], + "target_col_name": "move", + "frequency": "W", + "time_format": "%Y-%m-%d", + } + + temporal_featurizer = TemporalFeaturizer(df_config=df_config, feature_list=["month_of_year", "week_of_month"]) + + popularity_featurizer = PopularityFeaturizer( + df_config=df_config, + id_col_name="brand", + data_format="wide", + feature_col_name="price", + wide_col_names=[ + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + ], + output_col_name="price_ratio", + return_feature_col=True, + ) + + lag_featurizer = LagFeaturizer(df_config=df_config, input_col_names="move", lags=lags, future_value_available=True,) + moving_average_featurizer = RollingWindowFeaturizer( + df_config=df_config, + input_col_names="move", + window_size=window_size, + window_args={"min_periods": 1, "center": False}, + future_value_available=True, + rolling_gap=2, + ) + + feature_engineering_pipeline = Pipeline( + [ + ("temporal", temporal_featurizer), + ("popularity", popularity_featurizer), + ("lag", lag_featurizer), + ("moving_average", moving_average_featurizer), + ] + ) + + features = feature_engineering_pipeline.transform(train_df_preprocessed) + + # Temporary code for result verification + features.rename( + mapper={ + "move_lag_2": "move_lag2", + "move_lag_3": "move_lag3", + "move_lag_4": "move_lag4", + "move_lag_5": "move_lag5", + "move_lag_6": "move_lag6", + "move_lag_7": "move_lag7", + "move_lag_8": "move_lag8", + "move_lag_9": "move_lag9", + "move_lag_10": "move_lag10", + "move_lag_11": "move_lag11", + "move_lag_12": "move_lag12", + "move_lag_13": "move_lag13", + "move_lag_14": "move_lag14", + "move_lag_15": "move_lag15", + "move_lag_16": "move_lag16", + "move_lag_17": "move_lag17", + "move_lag_18": "move_lag18", + "move_lag_19": "move_lag19", + "month_of_year": "month", + }, + axis=1, + inplace=True, + ) + features = features[ + [ + "store", + "brand", + "week", + "week_of_month", + "month", + "deal", + "feat", + "move", + "price", + "price_ratio", + "move_lag2", + "move_lag3", + "move_lag4", + "move_lag5", + "move_lag6", + "move_lag7", + "move_lag8", + "move_lag9", + "move_lag10", + "move_lag11", + "move_lag12", + "move_lag13", + "move_lag14", + "move_lag15", + "move_lag16", + "move_lag17", + "move_lag18", + "move_lag19", + "move_mean", + ] + ] + + return features diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/python_dependencies.txt b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/python_dependencies.txt similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/python_dependencies.txt rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/python_dependencies.txt diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/train_score.ipynb b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/train_score.ipynb old mode 100755 new mode 100644 similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/train_score.ipynb rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/train_score.ipynb diff --git a/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/train_score.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/train_score.py new file mode 100644 index 00000000..51cd9af8 --- /dev/null +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/train_score.py @@ -0,0 +1,137 @@ +# coding: utf-8 + +# Train and score a boosted decision tree model using [LightGBM Python package](https://github.com/Microsoft/LightGBM) from Microsoft, +# which is a fast, distributed, high performance gradient boosting framework based on decision tree algorithms. + +import os +import sys +import argparse +import numpy as np +import pandas as pd +import lightgbm as lgb + +import warnings + +warnings.filterwarnings("ignore") + +# Append TSPerf path to sys.path +tsperf_dir = os.getcwd() +if tsperf_dir not in sys.path: + sys.path.append(tsperf_dir) + +from make_features import make_features +import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs + + +def make_predictions(df, model): + """Predict sales with the trained GBM model. + + Args: + df (Dataframe): Dataframe including all needed features + model (Model): Trained GBM model + + Returns: + Dataframe including the predicted sales of every store-brand + """ + predictions = pd.DataFrame({"move": model.predict(df.drop("move", axis=1))}) + predictions["move"] = predictions["move"].apply(lambda x: round(x)) + return pd.concat([df[["brand", "store", "week"]].reset_index(drop=True), predictions], axis=1) + + +if __name__ == "__main__": + # Parse input arguments + parser = argparse.ArgumentParser() + parser.add_argument("--seed", type=int, dest="seed", default=1, help="Random seed of GBM model") + parser.add_argument("--num-leaves", type=int, dest="num_leaves", default=124, help="# of leaves of the tree") + parser.add_argument( + "--min-data-in-leaf", type=int, dest="min_data_in_leaf", default=340, help="minimum # of samples in each leaf" + ) + parser.add_argument("--learning-rate", type=float, dest="learning_rate", default=0.1, help="learning rate") + parser.add_argument( + "--feature-fraction", + type=float, + dest="feature_fraction", + default=0.65, + help="ratio of features used in each iteration", + ) + parser.add_argument( + "--bagging-fraction", + type=float, + dest="bagging_fraction", + default=0.87, + help="ratio of samples used in each iteration", + ) + parser.add_argument("--bagging-freq", type=int, dest="bagging_freq", default=19, help="bagging frequency") + parser.add_argument("--max-rounds", type=int, dest="max_rounds", default=940, help="# of boosting iterations") + parser.add_argument("--max-lag", type=int, dest="max_lag", default=19, help="max lag of unit sales") + parser.add_argument( + "--window-size", type=int, dest="window_size", default=40, help="window size of moving average of unit sales" + ) + args = parser.parse_args() + print(args) + + # Data paths + DATA_DIR = os.path.join(tsperf_dir, "retail_sales", "OrangeJuice_Pt_3Weeks_Weekly", "data") + SUBMISSION_DIR = os.path.join(tsperf_dir, "retail_sales", "OrangeJuice_Pt_3Weeks_Weekly", "submissions", "LightGBM") + TRAIN_DIR = os.path.join(DATA_DIR, "train") + + # Parameters of GBM model + params = { + "objective": "mape", + "num_leaves": args.num_leaves, + "min_data_in_leaf": args.min_data_in_leaf, + "learning_rate": args.learning_rate, + "feature_fraction": args.feature_fraction, + "bagging_fraction": args.bagging_fraction, + "bagging_freq": args.bagging_freq, + "num_rounds": args.max_rounds, + "early_stopping_rounds": 125, + "num_threads": 4, + "seed": args.seed, + } + + # Lags and categorical features + lags = np.arange(2, args.max_lag + 1) + used_columns = ["store", "brand", "week", "week_of_month", "month", "deal", "feat", "move", "price", "price_ratio"] + categ_fea = ["store", "brand", "deal"] + + # Get unique stores and brands + train_df = pd.read_csv(os.path.join(TRAIN_DIR, "train_round_1.csv")) + store_list = train_df["store"].unique() + brand_list = train_df["brand"].unique() + + # Train and predict for all forecast rounds + pred_all = [] + metric_all = [] + for r in range(bs.NUM_ROUNDS): + print("---- Round " + str(r + 1) + " ----") + # Create features + features = make_features(r, TRAIN_DIR, lags, args.window_size, 0, used_columns, store_list, brand_list) + train_fea = features[features.week <= bs.TRAIN_END_WEEK_LIST[r]].reset_index(drop=True) + + # Drop rows with NaN values + train_fea.dropna(inplace=True) + + # Create training set + dtrain = lgb.Dataset(train_fea.drop("move", axis=1, inplace=False), label=train_fea["move"]) + if r % 3 == 0: + # Train GBM model + print("Training model...") + bst = lgb.train(params, dtrain, valid_sets=[dtrain], categorical_feature=categ_fea, verbose_eval=False) + + # Generate forecasts + print("Making predictions...") + test_fea = features[features.week >= bs.TEST_START_WEEK_LIST[r]].reset_index(drop=True) + pred = make_predictions(test_fea, bst).sort_values(by=["store", "brand", "week"]).reset_index(drop=True) + # Additional columns required by the submission format + pred["round"] = r + 1 + pred["weeks_ahead"] = pred["week"] - bs.TRAIN_END_WEEK_LIST[r] + # Keep the predictions + pred_all.append(pred) + + # Generate submission + submission = pd.concat(pred_all, axis=0) + submission.rename(columns={"move": "prediction"}, inplace=True) + submission = submission[["round", "store", "brand", "week", "weeks_ahead", "prediction"]] + filename = "submission_seed_" + str(args.seed) + ".csv" + submission.to_csv(os.path.join(SUBMISSION_DIR, filename), index=False) diff --git a/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/train_validate.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/train_validate.py new file mode 100644 index 00000000..17ec1d25 --- /dev/null +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/train_validate.py @@ -0,0 +1,241 @@ +# coding: utf-8 + +# Perform cross validation of a boosted decision tree model on the training data of the 1st forecast round. + +import os +import sys +import math +import argparse +import datetime +import itertools +import numpy as np +import pandas as pd +import lightgbm as lgb +from azureml.core import Run +from sklearn.model_selection import train_test_split +from utils import week_of_month, df_from_cartesian_product + + +def lagged_features(df, lags): + """Create lagged features based on time series data. + + Args: + df (Dataframe): Input time series data sorted by time + lags (List): Lag lengths + + Returns: + fea (Dataframe): Lagged features + """ + df_list = [] + for lag in lags: + df_shifted = df.shift(lag) + df_shifted.columns = [x + "_lag" + str(lag) for x in df_shifted.columns] + df_list.append(df_shifted) + fea = pd.concat(df_list, axis=1) + return fea + + +def moving_averages(df, start_step, window_size=None): + """Compute averages of every feature over moving time windows. + + Args: + df (Dataframe): Input features as a dataframe + start_step (Integer): Starting time step of rolling mean + window_size (Integer): Windows size of rolling mean + + Returns: + fea (Dataframe): Dataframe consisting of the moving averages + """ + if window_size == None: # Use a large window to compute average over all historical data + window_size = df.shape[0] + fea = df.shift(start_step).rolling(min_periods=1, center=False, window=window_size).mean() + fea.columns = fea.columns + "_mean" + return fea + + +def combine_features(df, lag_fea, lags, window_size, used_columns): + """Combine different features for a certain store-brand. + + Args: + df (Dataframe): Time series data of a certain store-brand + lag_fea (List): A list of column names for creating lagged features + lags (Numpy Array): Numpy array including all the lags + window_size (Integer): Windows size of rolling mean + used_columns (List): A list of names of columns used in model training (including target variable) + + Returns: + fea_all (Dataframe): Dataframe including all features for the specific store-brand + """ + lagged_fea = lagged_features(df[lag_fea], lags) + moving_avg = moving_averages(df[lag_fea], 2, window_size) + fea_all = pd.concat([df[used_columns], lagged_fea, moving_avg], axis=1) + return fea_all + + +def make_predictions(df, model): + """Predict sales with the trained GBM model. + + Args: + df (Dataframe): Dataframe including all needed features + model (Model): Trained GBM model + + Returns: + Dataframe including the predicted sales of a certain store-brand + """ + predictions = pd.DataFrame({"move": model.predict(df.drop("move", axis=1))}) + predictions["move"] = predictions["move"].apply(lambda x: round(x)) + return pd.concat([df[["brand", "store", "week"]].reset_index(drop=True), predictions], axis=1) + + +if __name__ == "__main__": + # Parse input arguments + parser = argparse.ArgumentParser() + parser.add_argument("--data-folder", type=str, dest="data_folder", default=".", help="data folder mounting point") + parser.add_argument("--num-leaves", type=int, dest="num_leaves", default=64, help="# of leaves of the tree") + parser.add_argument( + "--min-data-in-leaf", type=int, dest="min_data_in_leaf", default=50, help="minimum # of samples in each leaf" + ) + parser.add_argument("--learning-rate", type=float, dest="learning_rate", default=0.001, help="learning rate") + parser.add_argument( + "--feature-fraction", + type=float, + dest="feature_fraction", + default=1.0, + help="ratio of features used in each iteration", + ) + parser.add_argument( + "--bagging-fraction", + type=float, + dest="bagging_fraction", + default=1.0, + help="ratio of samples used in each iteration", + ) + parser.add_argument("--bagging-freq", type=int, dest="bagging_freq", default=1, help="bagging frequency") + parser.add_argument("--max-rounds", type=int, dest="max_rounds", default=400, help="# of boosting iterations") + parser.add_argument("--max-lag", type=int, dest="max_lag", default=10, help="max lag of unit sales") + parser.add_argument( + "--window-size", type=int, dest="window_size", default=10, help="window size of moving average of unit sales" + ) + args = parser.parse_args() + args.feature_fraction = round(args.feature_fraction, 2) + args.bagging_fraction = round(args.bagging_fraction, 2) + print(args) + + # Start an Azure ML run + run = Run.get_context() + + # Data paths + DATA_DIR = args.data_folder + TRAIN_DIR = os.path.join(DATA_DIR, "train") + + # Data and forecast problem parameters + TRAIN_START_WEEK = 40 + TRAIN_END_WEEK_LIST = list(range(135, 159, 2)) + TEST_START_WEEK_LIST = list(range(137, 161, 2)) + TEST_END_WEEK_LIST = list(range(138, 162, 2)) + # The start datetime of the first week in the record + FIRST_WEEK_START = pd.to_datetime("1989-09-14 00:00:00") + + # Parameters of GBM model + params = { + "objective": "mape", + "num_leaves": args.num_leaves, + "min_data_in_leaf": args.min_data_in_leaf, + "learning_rate": args.learning_rate, + "feature_fraction": args.feature_fraction, + "bagging_fraction": args.bagging_fraction, + "bagging_freq": args.bagging_freq, + "num_rounds": args.max_rounds, + "early_stopping_rounds": 125, + "num_threads": 16, + } + + # Lags and used column names + lags = np.arange(2, args.max_lag + 1) + used_columns = ["store", "brand", "week", "week_of_month", "month", "deal", "feat", "move", "price", "price_ratio"] + categ_fea = ["store", "brand", "deal"] + + # Train and validate the model using only the first round data + r = 0 + print("---- Round " + str(r + 1) + " ----") + # Load training data + train_df = pd.read_csv(os.path.join(TRAIN_DIR, "train_round_" + str(r + 1) + ".csv")) + train_df["move"] = train_df["logmove"].apply(lambda x: round(math.exp(x))) + train_df = train_df[["store", "brand", "week", "move"]] + + # Create a dataframe to hold all necessary data + store_list = train_df["store"].unique() + brand_list = train_df["brand"].unique() + week_list = range(TRAIN_START_WEEK, TEST_END_WEEK_LIST[r] + 1) + d = {"store": store_list, "brand": brand_list, "week": week_list} + data_grid = df_from_cartesian_product(d) + data_filled = pd.merge(data_grid, train_df, how="left", on=["store", "brand", "week"]) + + # Get future price, deal, and advertisement info + aux_df = pd.read_csv(os.path.join(TRAIN_DIR, "aux_round_" + str(r + 1) + ".csv")) + data_filled = pd.merge(data_filled, aux_df, how="left", on=["store", "brand", "week"]) + + # Create relative price feature + price_cols = [ + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + ] + data_filled["price"] = data_filled.apply(lambda x: x.loc["price" + str(int(x.loc["brand"]))], axis=1) + data_filled["avg_price"] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) + data_filled["price_ratio"] = data_filled["price"] / data_filled["avg_price"] + data_filled.drop(price_cols, axis=1, inplace=True) + + # Fill missing values + data_filled = data_filled.groupby(["store", "brand"]).apply( + lambda x: x.fillna(method="ffill").fillna(method="bfill") + ) + + # Create datetime features + data_filled["week_start"] = data_filled["week"].apply( + lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7) + ) + data_filled["year"] = data_filled["week_start"].apply(lambda x: x.year) + data_filled["month"] = data_filled["week_start"].apply(lambda x: x.month) + data_filled["week_of_month"] = data_filled["week_start"].apply(lambda x: week_of_month(x)) + data_filled["day"] = data_filled["week_start"].apply(lambda x: x.day) + data_filled.drop("week_start", axis=1, inplace=True) + + # Create other features (lagged features, moving averages, etc.) + features = data_filled.groupby(["store", "brand"]).apply( + lambda x: combine_features(x, ["move"], lags, args.window_size, used_columns) + ) + train_fea = features[features.week <= TRAIN_END_WEEK_LIST[r]].reset_index(drop=True) + + # Drop rows with NaN values + train_fea.dropna(inplace=True) + + # Model training and validation + # Create a training/validation split + train_fea, valid_fea, train_label, valid_label = train_test_split( + train_fea.drop("move", axis=1, inplace=False), train_fea["move"], test_size=0.05, random_state=1 + ) + dtrain = lgb.Dataset(train_fea, train_label) + dvalid = lgb.Dataset(valid_fea, valid_label) + # A dictionary to record training results + evals_result = {} + # Train GBM model + bst = lgb.train( + params, dtrain, valid_sets=[dtrain, dvalid], categorical_feature=categ_fea, evals_result=evals_result + ) + # Get final training loss & validation loss + train_loss = evals_result["training"]["mape"][-1] + valid_loss = evals_result["valid_1"]["mape"][-1] + print("Final training loss is {}".format(train_loss)) + print("Final validation loss is {}".format(valid_loss)) + + # Log the validation loss/MAPE + run.log("MAPE", np.float(valid_loss) * 100) diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/utils.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/utils.py old mode 100755 new mode 100644 similarity index 89% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/utils.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/utils.py index e37a1b44..5a5e6400 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/utils.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/LightGBM/utils.py @@ -1,9 +1,10 @@ # coding: utf-8 -# Utility functions for building the boosted decision tree model. +# Utility functions for building the boosted decision tree model. import pandas as pd + def week_of_month(dt): """Get the week of the month for the specified date. @@ -12,15 +13,17 @@ def week_of_month(dt): Returns: wom (Integer): Week of the month of the input date - """ + """ from math import ceil + first_day = dt.replace(day=1) dom = dt.day adjusted_dom = dom + first_day.weekday() - wom = int(ceil(adjusted_dom/7.0)) + wom = int(ceil(adjusted_dom / 7.0)) return wom -def df_from_cartesian_product(dict_in): + +def df_from_cartesian_product(dict_in): """Generate a Pandas dataframe from Cartesian product of lists. Args: @@ -31,7 +34,8 @@ def df_from_cartesian_product(dict_in): """ from collections import OrderedDict from itertools import product + od = OrderedDict(sorted(dict_in.items())) cart = list(product(*od.values())) df = pd.DataFrame(cart, columns=od.keys()) - return df \ No newline at end of file + return df diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/Dockerfile b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/Dockerfile similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/Dockerfile rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/Dockerfile diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/README.md b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/README.md similarity index 87% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/README.md rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/README.md index 174e9fa1..9278670b 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/README.md +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/README.md @@ -84,27 +84,25 @@ to check if conda has been installed by runnning command `conda -V`. If it is in `/test` under the data directory, respectively. After running the above command, you can deactivate the conda environment by running `source deactivate`. -5. Log into Azure Container Registry (ACR): +5. Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - -6. Pull a Docker image from ACR using the following command +6. Build a local Docker image by running the following command from `~/Forecasting` directory ```bash - sudo docker pull tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker build -t baseline_image:v1 ./retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast ``` 7. Choose a name for a new Docker container (e.g. meanf_container) and create it using command: ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name meanf_container tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name meanf_container baseline_image:v1 ``` Note that option `-v ~/Forecasting:/Forecasting` allows you to mount `~/Forecasting` folder (the one you cloned) to the container so that you will have @@ -142,7 +140,7 @@ to check if conda has been installed by runnning command `conda -V`. If it is in **Data storage:** Premium SSD -**Docker image:** tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 +**Dockerfile:** [retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/Dockerfile) **Key packages/dependencies:** * R diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/install_R_dependencies.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/install_R_dependencies.r similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/install_R_dependencies.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/install_R_dependencies.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/mean_forecast.Rmd b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/mean_forecast.Rmd similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/mean_forecast.Rmd rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/mean_forecast.Rmd diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/mean_forecast.nb.html b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/mean_forecast.nb.html similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/mean_forecast.nb.html rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/mean_forecast.nb.html diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/train_score.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/train_score.r similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/MeanForecast/train_score.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/MeanForecast/train_score.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/README.md b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/README.md similarity index 96% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/README.md rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/README.md index debcc010..3a82877b 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/README.md +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/README.md @@ -15,6 +15,8 @@ separation](#training-and-test-data-separation). The table below summarizes the | **Forecast granularity** | weekly | | **Forecast type** | point | +A template of the submission file can be found [here](https://github.com/Microsoft/Forecasting/blob/master/benchmarks/OrangeJuice_Pt_3Weeks_Weekly/sample_submission.csv) + # Data ## Dataset attribution diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/Dockerfile b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/Dockerfile similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/Dockerfile rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/Dockerfile diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/README.md b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/README.md similarity index 89% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/README.md rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/README.md index 4e026794..c3ae13f5 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/README.md +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/README.md @@ -95,27 +95,25 @@ to check if conda has been installed by runnning command `conda -V`. If it is in `/test` under the data directory, respectively. After running the above command, you can deactivate the conda environment by running `source deactivate`. -5. Log into Azure Container Registry (ACR): +5. Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - -6. Pull a Docker image from ACR using the following command: +6. Build a local Docker image by running the following command from `~/Forecasting` directory ```bash - sudo docker pull tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/rnn_image:v1 + sudo docker build -t rnn_image:v1 ./retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN ``` 7. Choose a name for a new Docker container (e.g. dcnn_container) and create it using command: ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --runtime=nvidia --name rnn_container tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/rnn_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --runtime=nvidia --name rnn_container rnn_image:v1 ``` Note that option `-v ~/Forecasting:/Forecasting` allows you to mount `~/Forecasting` folder (the one you cloned) to the container so that you will have @@ -153,7 +151,7 @@ to check if conda has been installed by runnning command `conda -V`. If it is in **Data storage:** Standard HDD -**Docker image:** tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/rnn_image:v1 +**Dockerfile:** [retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/Dockerfile) **Key packages/dependencies:** * Python diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/hparams.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/hparams.py similarity index 97% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/hparams.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/hparams.py index b28be51a..819bad83 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/hparams.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/hparams.py @@ -22,7 +22,7 @@ hparams_manual = dict( learning_rate=0.001, beta1=0.9, beta2=0.999, - epsilon=1e-08 + epsilon=1e-08, ) # this is the hyperparameter selected when running 50 trials in SMAC # hyperparameter tuning. @@ -43,7 +43,7 @@ hparams_smac = dict( learning_rate=0.001, beta1=0.7763754022206656, beta2=0.7923825287287111, - epsilon=1e-08 + epsilon=1e-08, ) # this is the hyperparameter selected when running 100 trials in SMAC @@ -68,5 +68,5 @@ hparams_smac_100 = dict( learning_rate=0.01, beta1=0.6011027681578323, beta2=0.9809964662293627, - epsilon=1e-08 -) \ No newline at end of file + epsilon=1e-08, +) diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/hyper_parameter_tuning.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/hyper_parameter_tuning.py similarity index 60% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/hyper_parameter_tuning.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/hyper_parameter_tuning.py index fc2e5a7b..71231761 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/hyper_parameter_tuning.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/hyper_parameter_tuning.py @@ -22,7 +22,7 @@ from utils import * # Add TSPerf root directory to sys.path file_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) -tsperf_dir = os.path.join(file_dir, '../../../../') +tsperf_dir = os.path.join(file_dir, "../../../../") if tsperf_dir not in sys.path: sys.path.append(tsperf_dir) @@ -32,13 +32,16 @@ from common.evaluation_utils import MAPE from smac.configspace import ConfigurationSpace from smac.scenario.scenario import Scenario -from ConfigSpace.hyperparameters import CategoricalHyperparameter, \ - UniformFloatHyperparameter, UniformIntegerHyperparameter +from ConfigSpace.hyperparameters import ( + CategoricalHyperparameter, + UniformFloatHyperparameter, + UniformIntegerHyperparameter, +) from smac.facade.smac_facade import SMAC -LIST_HYPERPARAMETER = ['decoder_input_dropout', 'decoder_state_dropout', 'decoder_output_dropout'] -data_relative_dir = '../../data' +LIST_HYPERPARAMETER = ["decoder_input_dropout", "decoder_state_dropout", "decoder_output_dropout"] +data_relative_dir = "../../data" def eval_function(hparams_dict): @@ -56,10 +59,10 @@ def eval_function(hparams_dict): hparams_dict[key] = [hparams_dict[key]] # add the value of other hyper parameters which are not tuned - hparams_dict['encoder_rnn_layers'] = 1 - hparams_dict['decoder_rnn_layers'] = 1 - hparams_dict['decoder_variational_dropout'] = [False] - hparams_dict['asgd_decay'] = None + hparams_dict["encoder_rnn_layers"] = 1 + hparams_dict["decoder_rnn_layers"] = 1 + hparams_dict["decoder_variational_dropout"] = [False] + hparams_dict["asgd_decay"] = None hparams = training.HParams(**hparams_dict) # use round 1 training data for hyper parameter tuning to avoid data leakage for later rounds @@ -67,106 +70,113 @@ def eval_function(hparams_dict): make_features_flag = False train_model_flag = True train_back_offset = 3 # equal to predict_window - predict_cut_mode = 'eval' + predict_cut_mode = "eval" # get prediction - pred_o, train_mape = create_round_prediction(data_dir, submission_round, hparams, make_features_flag=make_features_flag, - train_model_flag=train_model_flag, train_back_offset=train_back_offset, - predict_cut_mode=predict_cut_mode) + pred_o, train_mape = create_round_prediction( + data_dir, + submission_round, + hparams, + make_features_flag=make_features_flag, + train_model_flag=train_model_flag, + train_back_offset=train_back_offset, + predict_cut_mode=predict_cut_mode, + ) # get rid of prediction at horizon 1 pred_sub = pred_o[:, 1:].reshape((-1)) # evaluate the prediction on last two days in the first round training data # TODO: get train error and evalution error for different parameters - train_file = os.path.join(data_dir, 'train/train_round_{}.csv'.format(submission_round)) + train_file = os.path.join(data_dir, "train/train_round_{}.csv".format(submission_round)) train = pd.read_csv(train_file, index_col=False) train_last_week = bs.TRAIN_END_WEEK_LIST[submission_round - 1] # filter the train to contain ony last two days' data - train = train.loc[train['week'] >= train_last_week - 1] + train = train.loc[train["week"] >= train_last_week - 1] # create the data frame without missing dates - store_list = train['store'].unique() - brand_list = train['brand'].unique() + store_list = train["store"].unique() + brand_list = train["brand"].unique() week_list = range(train_last_week - 1, train_last_week + 1) item_list = list(itertools.product(store_list, brand_list, week_list)) - item_df = pd.DataFrame.from_records(item_list, columns=['store', 'brand', 'week']) + item_df = pd.DataFrame.from_records(item_list, columns=["store", "brand", "week"]) - train = item_df.merge(train, how='left', on=['store', 'brand', 'week']) - result = train.sort_values(by=['store', 'brand', 'week'], ascending=True) - result['prediction'] = pred_sub - result['sales'] = result['logmove'].apply(lambda x: round(np.exp(x))) + train = item_df.merge(train, how="left", on=["store", "brand", "week"]) + result = train.sort_values(by=["store", "brand", "week"], ascending=True) + result["prediction"] = pred_sub + result["sales"] = result["logmove"].apply(lambda x: round(np.exp(x))) # calculate MAPE on the evaluate set - result = result.loc[result['sales'].notnull()] - eval_mape = MAPE(result['prediction'], result['sales']) + result = result.loc[result["sales"].notnull()] + eval_mape = MAPE(result["prediction"], result["sales"]) return eval_mape -if __name__ == '__main__': +if __name__ == "__main__": # Build Configuration Space which defines all parameters and their ranges cs = ConfigurationSpace() # add parameters to the configuration space - train_window = UniformIntegerHyperparameter('train_window', 3, 70, default_value=60) + train_window = UniformIntegerHyperparameter("train_window", 3, 70, default_value=60) cs.add_hyperparameter(train_window) - batch_size = CategoricalHyperparameter('batch_size', [64, 128, 256, 1024], default_value=64) + batch_size = CategoricalHyperparameter("batch_size", [64, 128, 256, 1024], default_value=64) cs.add_hyperparameter(batch_size) - rnn_depth = UniformIntegerHyperparameter('rnn_depth', 100, 500, default_value=400) + rnn_depth = UniformIntegerHyperparameter("rnn_depth", 100, 500, default_value=400) cs.add_hyperparameter(rnn_depth) - encoder_dropout = UniformFloatHyperparameter('encoder_dropout', 0.0, 0.05, default_value=0.03) + encoder_dropout = UniformFloatHyperparameter("encoder_dropout", 0.0, 0.05, default_value=0.03) cs.add_hyperparameter(encoder_dropout) - gate_dropout = UniformFloatHyperparameter('gate_dropout', 0.95, 1.0, default_value=0.997) + gate_dropout = UniformFloatHyperparameter("gate_dropout", 0.95, 1.0, default_value=0.997) cs.add_hyperparameter(gate_dropout) - decoder_input_dropout = UniformFloatHyperparameter('decoder_input_dropout', 0.95, 1.0, default_value=1.0) + decoder_input_dropout = UniformFloatHyperparameter("decoder_input_dropout", 0.95, 1.0, default_value=1.0) cs.add_hyperparameter(decoder_input_dropout) - decoder_state_dropout = UniformFloatHyperparameter('decoder_state_dropout', 0.95, 1.0, default_value=0.99) + decoder_state_dropout = UniformFloatHyperparameter("decoder_state_dropout", 0.95, 1.0, default_value=0.99) cs.add_hyperparameter(decoder_state_dropout) - decoder_output_dropout = UniformFloatHyperparameter('decoder_output_dropout', 0.95, 1.0, default_value=0.975) + decoder_output_dropout = UniformFloatHyperparameter("decoder_output_dropout", 0.95, 1.0, default_value=0.975) cs.add_hyperparameter(decoder_output_dropout) - max_epoch = CategoricalHyperparameter('max_epoch', [50, 100, 150, 200], default_value=100) + max_epoch = CategoricalHyperparameter("max_epoch", [50, 100, 150, 200], default_value=100) cs.add_hyperparameter(max_epoch) - learning_rate = CategoricalHyperparameter('learning_rate', [0.001, 0.01, 0.1], default_value=0.001) + learning_rate = CategoricalHyperparameter("learning_rate", [0.001, 0.01, 0.1], default_value=0.001) cs.add_hyperparameter(learning_rate) - beta1 = UniformFloatHyperparameter('beta1', 0.5, 0.9999, default_value=0.9) + beta1 = UniformFloatHyperparameter("beta1", 0.5, 0.9999, default_value=0.9) cs.add_hyperparameter(beta1) - beta2 = UniformFloatHyperparameter('beta2', 0.5, 0.9999, default_value=0.999) + beta2 = UniformFloatHyperparameter("beta2", 0.5, 0.9999, default_value=0.999) cs.add_hyperparameter(beta2) - epsilon = CategoricalHyperparameter('epsilon', [1e-08, 0.00001, 0.0001, 0.1, 1], default_value=1e-08) + epsilon = CategoricalHyperparameter("epsilon", [1e-08, 0.00001, 0.0001, 0.1, 1], default_value=1e-08) cs.add_hyperparameter(epsilon) - scenario = Scenario({"run_obj": "quality", # we optimize quality (alternatively runtime) - "runcount-limit": 50, # maximum function evaluations - "cs": cs, # configuration space - "deterministic": "true" - }) + scenario = Scenario( + { + "run_obj": "quality", # we optimize quality (alternatively runtime) + "runcount-limit": 50, # maximum function evaluations + "cs": cs, # configuration space + "deterministic": "true", + } + ) # test the default configuration works # eval_function(cs.get_default_configuration()) - # import hyper parameters # TODO: add ema in the code to imporve the performance - smac = SMAC(scenario=scenario, rng=np.random.RandomState(42), - tae_runner=eval_function) + smac = SMAC(scenario=scenario, rng=np.random.RandomState(42), tae_runner=eval_function) incumbent = smac.optimize() inc_value = eval_function(incumbent) - print('the best hyper parameter sets are:') + print("the best hyper parameter sets are:") print(incumbent) - print('the corresponding MAPE on validation datset is: {}'.format(inc_value)) + print("the corresponding MAPE on validation datset is: {}".format(inc_value)) # following are the print out: # the best hyper parameter sets are: @@ -186,6 +196,3 @@ if __name__ == '__main__': # train_window, Value: 26 # the corresponding MAPE is: 0.36703585613035433 - - - diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/make_features.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/make_features.py similarity index 57% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/make_features.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/make_features.py index c0649713..03239e8c 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/make_features.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/make_features.py @@ -14,14 +14,14 @@ from sklearn.preprocessing import OneHotEncoder # Add TSPerf root directory to sys.path file_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) -tsperf_dir = os.path.join(file_dir, '../../../../') +tsperf_dir = os.path.join(file_dir, "../../../../") if tsperf_dir not in sys.path: sys.path.append(tsperf_dir) import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs -data_relative_dir = '../../data' +data_relative_dir = "../../data" def make_features(submission_round): @@ -37,63 +37,77 @@ def make_features(submission_round): file_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) data_dir = os.path.join(file_dir, data_relative_dir) - train_file = os.path.join(data_dir, 'train/train_round_{}.csv'.format(submission_round)) - test_file = os.path.join(data_dir, 'train/aux_round_{}.csv'.format(submission_round)) + train_file = os.path.join(data_dir, "train/train_round_{}.csv".format(submission_round)) + test_file = os.path.join(data_dir, "train/aux_round_{}.csv".format(submission_round)) train = pd.read_csv(train_file, index_col=False) test = pd.read_csv(test_file, index_col=False) # select the test data range for test data - train_last_week = train['week'].max() - test = test.loc[test['week'] > train_last_week] + train_last_week = train["week"].max() + test = test.loc[test["week"] > train_last_week] # calculate series popularity - series_popularity = train.groupby(['store', 'brand']).apply(lambda x: x['logmove'].median()) + series_popularity = train.groupby(["store", "brand"]).apply(lambda x: x["logmove"].median()) # fill the datetime gaps # such that every time series have the same length both in train and test - store_list = train['store'].unique() - brand_list = train['brand'].unique() + store_list = train["store"].unique() + brand_list = train["brand"].unique() train_week_list = range(bs.TRAIN_START_WEEK, bs.TRAIN_END_WEEK_LIST[submission_round - 1] + 1) - test_week_list = range(bs.TEST_START_WEEK_LIST[submission_round - 1] - 1, bs.TEST_END_WEEK_LIST[submission_round - 1] + 1) + test_week_list = range( + bs.TEST_START_WEEK_LIST[submission_round - 1] - 1, bs.TEST_END_WEEK_LIST[submission_round - 1] + 1 + ) train_item_list = list(itertools.product(store_list, brand_list, train_week_list)) - train_item_df = pd.DataFrame.from_records(train_item_list, columns=['store', 'brand', 'week']) + train_item_df = pd.DataFrame.from_records(train_item_list, columns=["store", "brand", "week"]) test_item_list = list(itertools.product(store_list, brand_list, test_week_list)) - test_item_df = pd.DataFrame.from_records(test_item_list, columns=['store', 'brand', 'week']) + test_item_df = pd.DataFrame.from_records(test_item_list, columns=["store", "brand", "week"]) - train = train_item_df.merge(train, how='left', on=['store', 'brand', 'week']) - test = test_item_df.merge(test, how='left', on=['store', 'brand', 'week']) + train = train_item_df.merge(train, how="left", on=["store", "brand", "week"]) + test = test_item_df.merge(test, how="left", on=["store", "brand", "week"]) # sort the train, test, series_popularity by store and brand - train = train.sort_values(by=['store', 'brand', 'week'], ascending=True) - test = test.sort_values(by=['store', 'brand', 'week'], ascending=True) - series_popularity = series_popularity.reset_index().sort_values( - by=['store', 'brand'], ascending=True).rename(columns={0: 'pop'}) + train = train.sort_values(by=["store", "brand", "week"], ascending=True) + test = test.sort_values(by=["store", "brand", "week"], ascending=True) + series_popularity = ( + series_popularity.reset_index().sort_values(by=["store", "brand"], ascending=True).rename(columns={0: "pop"}) + ) # calculate one-hot encoding for brands - enc = OneHotEncoder(categories='auto') - brand_train = np.reshape(train['brand'].values, (-1, 1)) - brand_test = np.reshape(test['brand'].values, (-1, 1)) + enc = OneHotEncoder(categories="auto") + brand_train = np.reshape(train["brand"].values, (-1, 1)) + brand_test = np.reshape(test["brand"].values, (-1, 1)) enc = enc.fit(brand_train) brand_enc_train = enc.transform(brand_train).todense() brand_enc_test = enc.transform(brand_test).todense() # calculate price and price_ratio - price_cols = ['price1', 'price2', 'price3', 'price4', 'price5', 'price6', 'price7', 'price8', - 'price9', 'price10', 'price11'] + price_cols = [ + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + ] - train['price'] = train.apply(lambda x: x.loc['price' + str(int(x.loc['brand']))], axis=1) - train['avg_price'] = train[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) - train['price_ratio'] = train['price'] / train['avg_price'] + train["price"] = train.apply(lambda x: x.loc["price" + str(int(x.loc["brand"]))], axis=1) + train["avg_price"] = train[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) + train["price_ratio"] = train["price"] / train["avg_price"] - test['price'] = test.apply(lambda x: x.loc['price' + str(int(x.loc['brand']))], axis=1) - test['avg_price'] = test[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) - test['price_ratio'] = test.apply(lambda x: x['price'] / x['avg_price'], axis=1) + test["price"] = test.apply(lambda x: x.loc["price" + str(int(x.loc["brand"]))], axis=1) + test["avg_price"] = test[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) + test["price_ratio"] = test.apply(lambda x: x["price"] / x["avg_price"], axis=1) # fill the missing values for feat, deal, price, price_ratio with 0 - for cl in ['price', 'price_ratio', 'feat', 'deal']: + for cl in ["price", "price_ratio", "feat", "deal"]: train.loc[train[cl].isna(), cl] = 0 test.loc[test[cl].isna(), cl] = 0 @@ -102,16 +116,15 @@ def make_features(submission_round): # 2) brand - 11 # 3) price: price and price_ratio # 4) promo: feat and deal - series_popularity = series_popularity['pop'].values - series_popularity = (series_popularity - series_popularity.mean()) \ - / np.std(series_popularity) + series_popularity = series_popularity["pop"].values + series_popularity = (series_popularity - series_popularity.mean()) / np.std(series_popularity) brand_enc_mean = brand_enc_train.mean(axis=0) brand_enc_std = brand_enc_train.std(axis=0) brand_enc_train = (brand_enc_train - brand_enc_mean) / brand_enc_std brand_enc_test = (brand_enc_test - brand_enc_mean) / brand_enc_std - for cl in ['price', 'price_ratio', 'feat', 'deal']: + for cl in ["price", "price_ratio", "feat", "deal"]: cl_mean = train[cl].mean() cl_std = train[cl].std() train[cl] = (train[cl] - cl_mean) / cl_std @@ -132,41 +145,37 @@ def make_features(submission_round): # ts_value_train # the target variable fed into the neural network are: log(sales + 1), where sales = exp(logmove). - ts_value_train = np.log(np.exp(train['logmove'].values) + 1) + ts_value_train = np.log(np.exp(train["logmove"].values) + 1) ts_value_train = ts_value_train.reshape((ts_number, train_ts_length)) # fill missing value with zero ts_value_train = np.nan_to_num(ts_value_train) # feature_train - series_popularity_train = np.repeat(series_popularity, train_ts_length).reshape( - (ts_number, train_ts_length, 1)) + series_popularity_train = np.repeat(series_popularity, train_ts_length).reshape((ts_number, train_ts_length, 1)) brand_number = brand_enc_train.shape[1] - brand_enc_train = np.array(brand_enc_train).reshape( - (ts_number, train_ts_length, brand_number)) - price_promo_features_train = train[['price', 'price_ratio', 'feat', 'deal']].values.reshape( - (ts_number, train_ts_length, 4)) + brand_enc_train = np.array(brand_enc_train).reshape((ts_number, train_ts_length, brand_number)) + price_promo_features_train = train[["price", "price_ratio", "feat", "deal"]].values.reshape( + (ts_number, train_ts_length, 4) + ) feature_train = np.concatenate((series_popularity_train, brand_enc_train, price_promo_features_train), axis=-1) # feature_test - series_popularity_test = np.repeat(series_popularity, test_ts_length).reshape( - (ts_number, test_ts_length, 1)) + series_popularity_test = np.repeat(series_popularity, test_ts_length).reshape((ts_number, test_ts_length, 1)) - brand_enc_test = np.array(brand_enc_test).reshape( - (ts_number, test_ts_length, brand_number)) - price_promo_features_test = test[['price', 'price_ratio', 'feat', 'deal']].values.reshape( - (ts_number, test_ts_length, 4)) + brand_enc_test = np.array(brand_enc_test).reshape((ts_number, test_ts_length, brand_number)) + price_promo_features_test = test[["price", "price_ratio", "feat", "deal"]].values.reshape( + (ts_number, test_ts_length, 4) + ) feature_test = np.concatenate((series_popularity_test, brand_enc_test, price_promo_features_test), axis=-1) # save the numpy arrays - intermediate_data_dir = os.path.join(data_dir, 'intermediate/round_{}'.format(submission_round)) + intermediate_data_dir = os.path.join(data_dir, "intermediate/round_{}".format(submission_round)) if not os.path.isdir(intermediate_data_dir): os.makedirs(intermediate_data_dir) - np.save(os.path.join(intermediate_data_dir, 'ts_value_train.npy'), ts_value_train) - np.save(os.path.join(intermediate_data_dir, 'feature_train.npy'), feature_train) - np.save(os.path.join(intermediate_data_dir, 'feature_test.npy'), feature_test) - - + np.save(os.path.join(intermediate_data_dir, "ts_value_train.npy"), ts_value_train) + np.save(os.path.join(intermediate_data_dir, "feature_train.npy"), feature_train) + np.save(os.path.join(intermediate_data_dir, "feature_test.npy"), feature_test) diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/python_dependencies.txt b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/python_dependencies.txt similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/python_dependencies.txt rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/python_dependencies.txt diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/rnn_predict.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/rnn_predict.py similarity index 71% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/rnn_predict.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/rnn_predict.py index 0a640f19..31fc28c2 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/rnn_predict.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/rnn_predict.py @@ -13,8 +13,17 @@ from utils import * IS_TRAIN = False -def rnn_predict(ts_value_train, feature_train, feature_test, hparams, predict_window, intermediate_data_dir, - submission_round, batch_size, cut_mode='predict'): +def rnn_predict( + ts_value_train, + feature_train, + feature_test, + hparams, + predict_window, + intermediate_data_dir, + submission_round, + batch_size, + cut_mode="predict", +): """ This function creates predictions by loading the trained RNN model. @@ -39,13 +48,21 @@ def rnn_predict(ts_value_train, feature_train, feature_test, hparams, predict_wi (#time series, #predict_window) """ # build the dataset - root_ds = tf.data.Dataset.from_tensor_slices( - (ts_value_train, feature_train, feature_test)).repeat(1) - batch = (root_ds - .map(lambda *x: cut(*x, cut_mode=cut_mode, train_window=hparams.train_window, - predict_window=predict_window, ts_length=ts_value_train.shape[1], back_offset=0)) - .map(normalize_target) - .batch(batch_size)) + root_ds = tf.data.Dataset.from_tensor_slices((ts_value_train, feature_train, feature_test)).repeat(1) + batch = ( + root_ds.map( + lambda *x: cut( + *x, + cut_mode=cut_mode, + train_window=hparams.train_window, + predict_window=predict_window, + ts_length=ts_value_train.shape[1], + back_offset=0 + ) + ) + .map(normalize_target) + .batch(batch_size) + ) iterator = batch.make_initializable_iterator() it_tensors = iterator.get_next() @@ -55,9 +72,9 @@ def rnn_predict(ts_value_train, feature_train, feature_test, hparams, predict_wi predictions = build_rnn_model(norm_x, feature_x, feature_y, norm_mean, norm_std, predict_window, IS_TRAIN, hparams) # init the saver - saver = tf.train.Saver(name='eval_saver', var_list=None) + saver = tf.train.Saver(name="eval_saver", var_list=None) # read the saver from checkpoint - saver_path = os.path.join(intermediate_data_dir, 'cpt_round_{}'.format(submission_round)) + saver_path = os.path.join(intermediate_data_dir, "cpt_round_{}".format(submission_round)) paths = [p for p in tf.train.get_checkpoint_state(saver_path).all_model_checkpoint_paths] checkpoint = paths[0] @@ -66,12 +83,10 @@ def rnn_predict(ts_value_train, feature_train, feature_test, hparams, predict_wi sess.run(iterator.initializer) saver.restore(sess, checkpoint) - pred, = sess.run([predictions]) + (pred,) = sess.run([predictions]) # invert the prediction back to original scale pred_o = np.exp(pred) - 1 pred_o = pred_o.astype(int) return pred_o - - diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/rnn_train.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/rnn_train.py similarity index 76% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/rnn_train.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/rnn_train.py index 9fd248d8..09532dcd 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/rnn_train.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/rnn_train.py @@ -8,12 +8,20 @@ from utils import * import numpy as np import shutil -MODE = 'train' +MODE = "train" IS_TRAIN = True -def rnn_train(ts_value_train, feature_train, feature_test, hparams, predict_window, intermediate_data_dir, - submission_round, back_offset=0): +def rnn_train( + ts_value_train, + feature_train, + feature_test, + hparams, + predict_window, + intermediate_data_dir, + submission_round, + back_offset=0, +): """ This function trains the RNN model and saves it to the disk. @@ -42,14 +50,26 @@ def rnn_train(ts_value_train, feature_train, feature_test, hparams, predict_wind max_train_empty = int(round(hparams.train_window * max_train_empty_percentage)) # build the dataset - root_ds = tf.data.Dataset.from_tensor_slices( - (ts_value_train, feature_train, feature_test)).shuffle(ts_value_train.shape[0], reshuffle_each_iteration=True).repeat() - batch = (root_ds - .map(lambda *x: cut(*x, cut_mode=MODE, train_window=hparams.train_window, - predict_window=predict_window, ts_length=ts_value_train.shape[1], back_offset=back_offset)) - .filter(lambda *x: reject_filter(max_train_empty, *x)) - .map(normalize_target) - .batch(hparams.batch_size)) + root_ds = ( + tf.data.Dataset.from_tensor_slices((ts_value_train, feature_train, feature_test)) + .shuffle(ts_value_train.shape[0], reshuffle_each_iteration=True) + .repeat() + ) + batch = ( + root_ds.map( + lambda *x: cut( + *x, + cut_mode=MODE, + train_window=hparams.train_window, + predict_window=predict_window, + ts_length=ts_value_train.shape[1], + back_offset=back_offset + ) + ) + .filter(lambda *x: reject_filter(max_train_empty, *x)) + .map(normalize_target) + .batch(hparams.batch_size) + ) iterator = batch.make_initializable_iterator() it_tensors = iterator.get_next() @@ -67,24 +87,26 @@ def rnn_train(ts_value_train, feature_train, feature_test, hparams, predict_wind # Sum all losses total_loss = mape_loss - train_op, glob_norm, ema = make_train_op(total_loss, hparams.learning_rate, hparams.beta1, hparams.beta2, - hparams.epsilon, hparams.asgd_decay) + train_op, glob_norm, ema = make_train_op( + total_loss, hparams.learning_rate, hparams.beta1, hparams.beta2, hparams.epsilon, hparams.asgd_decay + ) train_size = ts_value_train.shape[0] steps_per_epoch = train_size // hparams.batch_size - global_step = tf.Variable(0, name='global_step', trainable=False) + global_step = tf.Variable(0, name="global_step", trainable=False) inc_step = tf.assign_add(global_step, 1) - saver = tf.train.Saver(max_to_keep=1, name='train_saver') + saver = tf.train.Saver(max_to_keep=1, name="train_saver") init = tf.global_variables_initializer() results_mae = [] results_mape = [] results_mape_loss = [] - with tf.Session(config=tf.ConfigProto(allow_soft_placement=True, - gpu_options=tf.GPUOptions(allow_growth=False))) as sess: + with tf.Session( + config=tf.ConfigProto(allow_soft_placement=True, gpu_options=tf.GPUOptions(allow_growth=False)) + ) as sess: sess.run(init) sess.run(iterator.initializer) @@ -137,10 +159,10 @@ def rnn_train(ts_value_train, feature_train, feature_test, hparams, predict_wind results_mape_loss.append(results_epoch_mape_loss) step = results[0] - saver_path = os.path.join(intermediate_data_dir, 'cpt_round_{}'.format(submission_round)) + saver_path = os.path.join(intermediate_data_dir, "cpt_round_{}".format(submission_round)) if os.path.exists(saver_path): shutil.rmtree(saver_path) - saver.save(sess, os.path.join(saver_path, 'cpt'), global_step=step, write_state=True) + saver.save(sess, os.path.join(saver_path, "cpt"), global_step=step, write_state=True) # look at the training results # examine step_mae and step_mape_loss @@ -152,5 +174,3 @@ def rnn_train(ts_value_train, feature_train, feature_test, hparams, predict_wind # print(np.mean(results_mape, axis=1)) return np.mean(results_mape, axis=1)[-1] - - diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/train_score.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/train_score.py similarity index 52% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/train_score.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/train_score.py index be2811ab..70f85678 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/train_score.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/train_score.py @@ -23,18 +23,26 @@ from utils import * # Add TSPerf root directory to sys.path file_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) -tsperf_dir = os.path.join(file_dir, '../../../../') +tsperf_dir = os.path.join(file_dir, "../../../../") if tsperf_dir not in sys.path: sys.path.append(tsperf_dir) import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs -data_relative_dir = '../../data' +data_relative_dir = "../../data" -def create_round_prediction(data_dir, submission_round, hparams, make_features_flag=True, train_model_flag=True, train_back_offset=0, - predict_cut_mode='predict', random_seed=1): +def create_round_prediction( + data_dir, + submission_round, + hparams, + make_features_flag=True, + train_model_flag=True, + train_back_offset=0, + predict_cut_mode="predict", + random_seed=1, +): """ This function trains the model and creates the predictions for a certain submission round. @@ -46,16 +54,16 @@ def create_round_prediction(data_dir, submission_round, hparams, make_features_f # read the numpy arrays output from the make_features.py # file_dir = './prototypes/retail_rnn_model' - intermediate_data_dir = os.path.join(data_dir, 'intermediate/round_{}'.format(submission_round)) + intermediate_data_dir = os.path.join(data_dir, "intermediate/round_{}".format(submission_round)) - ts_value_train = np.load(os.path.join(intermediate_data_dir, 'ts_value_train.npy')) - feature_train = np.load(os.path.join(intermediate_data_dir, 'feature_train.npy')) - feature_test = np.load(os.path.join(intermediate_data_dir, 'feature_test.npy')) + ts_value_train = np.load(os.path.join(intermediate_data_dir, "ts_value_train.npy")) + feature_train = np.load(os.path.join(intermediate_data_dir, "feature_train.npy")) + feature_test = np.load(os.path.join(intermediate_data_dir, "feature_test.npy")) # convert the dtype to float32 to suffice tensorflow cudnn_rnn requirements. - ts_value_train = ts_value_train.astype(dtype='float32') - feature_train = feature_train.astype(dtype='float32') - feature_test = feature_test.astype(dtype='float32') + ts_value_train = ts_value_train.astype(dtype="float32") + feature_train = feature_train.astype(dtype="float32") + feature_test = feature_test.astype(dtype="float32") # define parameters # constant @@ -65,66 +73,98 @@ def create_round_prediction(data_dir, submission_round, hparams, make_features_f if train_model_flag: tf.reset_default_graph() tf.set_random_seed(seed=random_seed) - train_error = rnn_train(ts_value_train, feature_train, feature_test, hparams, predict_window, - intermediate_data_dir, submission_round, back_offset=train_back_offset) - + train_error = rnn_train( + ts_value_train, + feature_train, + feature_test, + hparams, + predict_window, + intermediate_data_dir, + submission_round, + back_offset=train_back_offset, + ) # make prediction tf.reset_default_graph() pred_batch_size = 1024 - pred_o = rnn_predict(ts_value_train, feature_train, feature_test, hparams, predict_window, intermediate_data_dir, - submission_round, pred_batch_size, cut_mode=predict_cut_mode) + pred_o = rnn_predict( + ts_value_train, + feature_train, + feature_test, + hparams, + predict_window, + intermediate_data_dir, + submission_round, + pred_batch_size, + cut_mode=predict_cut_mode, + ) return pred_o, train_error -def create_round_submission(data_dir, submission_round, hparams, make_features_flag=True, train_model_flag=True, train_back_offset=0, - predict_cut_mode='predict', random_seed=1): +def create_round_submission( + data_dir, + submission_round, + hparams, + make_features_flag=True, + train_model_flag=True, + train_back_offset=0, + predict_cut_mode="predict", + random_seed=1, +): """ This function trains the model and creates the submission in pandas DataFrame for a certain submission round. """ - pred_o, _ = create_round_prediction(data_dir, submission_round, hparams, make_features_flag=make_features_flag, - train_model_flag=train_model_flag, train_back_offset=train_back_offset, - predict_cut_mode=predict_cut_mode, random_seed=random_seed) + pred_o, _ = create_round_prediction( + data_dir, + submission_round, + hparams, + make_features_flag=make_features_flag, + train_model_flag=train_model_flag, + train_back_offset=train_back_offset, + predict_cut_mode=predict_cut_mode, + random_seed=random_seed, + ) # get rid of prediction at horizon 1 pred_sub = pred_o[:, 1:].reshape((-1)) # arrange the predictions into pd.DataFrame # read in the test_file for this round - train_file = os.path.join(data_dir, 'train/train_round_{}.csv'.format(submission_round)) - test_file = os.path.join(data_dir, 'train/aux_round_{}.csv'.format(submission_round)) + train_file = os.path.join(data_dir, "train/train_round_{}.csv".format(submission_round)) + test_file = os.path.join(data_dir, "train/aux_round_{}.csv".format(submission_round)) train = pd.read_csv(train_file, index_col=False) test = pd.read_csv(test_file, index_col=False) - train_last_week = bs.TRAIN_END_WEEK_LIST[submission_round- 1] + train_last_week = bs.TRAIN_END_WEEK_LIST[submission_round - 1] - store_list = train['store'].unique() - brand_list = train['brand'].unique() - test_week_list = range(bs.TEST_START_WEEK_LIST[submission_round - 1], bs.TEST_END_WEEK_LIST[submission_round - 1] + 1) + store_list = train["store"].unique() + brand_list = train["brand"].unique() + test_week_list = range( + bs.TEST_START_WEEK_LIST[submission_round - 1], bs.TEST_END_WEEK_LIST[submission_round - 1] + 1 + ) test_item_list = list(itertools.product(store_list, brand_list, test_week_list)) - test_item_df = pd.DataFrame.from_records(test_item_list, columns=['store', 'brand', 'week']) + test_item_df = pd.DataFrame.from_records(test_item_list, columns=["store", "brand", "week"]) - test = test_item_df.merge(test, how='left', on=['store', 'brand', 'week']) + test = test_item_df.merge(test, how="left", on=["store", "brand", "week"]) - submission = test.sort_values(by=['store', 'brand', 'week'], ascending=True) - submission['round'] = submission_round - submission['weeks_ahead'] = submission['week'] - train_last_week - submission['prediction'] = pred_sub - submission = submission[['round', 'store', 'brand', 'week', 'weeks_ahead', 'prediction']] + submission = test.sort_values(by=["store", "brand", "week"], ascending=True) + submission["round"] = submission_round + submission["weeks_ahead"] = submission["week"] - train_last_week + submission["prediction"] = pred_sub + submission = submission[["round", "store", "brand", "week", "weeks_ahead", "prediction"]] return submission -if __name__ == '__main__': +if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument('--seed', type=int, dest='seed', default=1, help='random seed') + parser.add_argument("--seed", type=int, dest="seed", default=1, help="random seed") args = parser.parse_args() random_seed = args.seed - # set the data directory file_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) data_dir = os.path.join(file_dir, data_relative_dir) @@ -136,7 +176,7 @@ if __name__ == '__main__': num_round = len(bs.TEST_END_WEEK_LIST) pred_all = pd.DataFrame() for R in range(1, num_round + 1): - print('create submission for round {}...'.format(R)) + print("create submission for round {}...".format(R)) round_submission = create_round_submission(data_dir, R, hparams, random_seed=random_seed) pred_all = pred_all.append(round_submission) @@ -145,7 +185,5 @@ if __name__ == '__main__': if not os.path.isdir(submission_dir): os.makedirs(submission_dir) - submission_file = os.path.join(submission_dir, 'submission_seed_{}.csv'.format(str(random_seed))) + submission_file = os.path.join(submission_dir, "submission_seed_{}.csv".format(str(random_seed))) pred_all.to_csv(submission_file, index=False) - - diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/utils.py b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/utils.py similarity index 79% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/utils.py rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/utils.py index 8a88d95e..85e07f62 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/RNN/utils.py +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/RNN/utils.py @@ -4,14 +4,22 @@ from tensorflow.python.util import nest import tensorflow.contrib.layers as layers import tensorflow.contrib.rnn as rnn import tensorflow.contrib.cudnn_rnn as cudnn_rnn + RNN = cudnn_rnn.CudnnGRU GRAD_CLIP_THRESHOLD = 10 # input pipe utils -def cut(ts_value_train_slice, feature_train_slice, - feature_test_slice, train_window, predict_window, ts_length, - cut_mode='train', back_offset=0): +def cut( + ts_value_train_slice, + feature_train_slice, + feature_test_slice, + train_window, + predict_window, + ts_length, + cut_mode="train", + back_offset=0, +): """ Cut each element of the tensorflow dataset into x and y for supervised learning. @@ -33,32 +41,30 @@ def cut(ts_value_train_slice, feature_train_slice, feature_x: (#train_window, #features) feature_y: (#predict_window, #features) """ - if cut_mode in ['train', 'eval']: - if cut_mode == 'train': + if cut_mode in ["train", "eval"]: + if cut_mode == "train": min_start_idx = 0 - max_start_idx = (ts_length - back_offset) - \ - (train_window + predict_window) - train_start = tf.random_uniform((), min_start_idx, max_start_idx, - dtype=tf.int32) - elif cut_mode == 'eval': + max_start_idx = (ts_length - back_offset) - (train_window + predict_window) + train_start = tf.random_uniform((), min_start_idx, max_start_idx, dtype=tf.int32) + elif cut_mode == "eval": train_start = ts_length - (train_window + predict_window) train_end = train_start + train_window test_start = train_end test_end = test_start + predict_window - true_x = ts_value_train_slice[train_start: train_end] - true_y = ts_value_train_slice[test_start: test_end] - feature_x = feature_train_slice[train_start: train_end] - feature_y = feature_train_slice[test_start: test_end] + true_x = ts_value_train_slice[train_start:train_end] + true_y = ts_value_train_slice[test_start:test_end] + feature_x = feature_train_slice[train_start:train_end] + feature_y = feature_train_slice[test_start:test_end] else: train_start = ts_length - train_window train_end = ts_length - true_x = ts_value_train_slice[train_start: train_end] + true_x = ts_value_train_slice[train_start:train_end] true_y = tf.fill((predict_window,), np.nan) - feature_x = feature_train_slice[train_start: train_end] + feature_x = feature_train_slice[train_start:train_end] feature_y = feature_test_slice return true_x, true_y, feature_x, feature_y @@ -106,10 +112,13 @@ def make_encoder(time_inputs, is_train, hparams): """ def build_rnn(): - return RNN(num_layers=hparams.encoder_rnn_layers, num_units=hparams.rnn_depth, - kernel_initializer=tf.initializers.random_uniform(minval=-0.05, maxval=0.05), - direction='unidirectional', - dropout=hparams.encoder_dropout if is_train else 0) + return RNN( + num_layers=hparams.encoder_rnn_layers, + num_units=hparams.rnn_depth, + kernel_initializer=tf.initializers.random_uniform(minval=-0.05, maxval=0.05), + direction="unidirectional", + dropout=hparams.encoder_dropout if is_train else 0, + ) cuda_model = build_rnn() @@ -152,23 +161,21 @@ def convert_cudnn_state_v2(h_state, hparams, dropout=1.0): # encoder_layers < decoder_layers: feed encoder outputs to lower decoder layers, feed zeros to top layers h_layers = tf.unstack(h_state) if hparams.encoder_rnn_layers >= hparams.decoder_rnn_layers: - return squeeze(wrap_dropout(h_layers[hparams.encoder_rnn_layers - hparams.decoder_rnn_layers:])) + return squeeze(wrap_dropout(h_layers[hparams.encoder_rnn_layers - hparams.decoder_rnn_layers :])) else: lower_inputs = wrap_dropout(h_layers) - upper_inputs = [tf.zeros_like(h_layers[0]) for _ in - range(hparams.decoder_rnn_layers - hparams.encoder_rnn_layers)] + upper_inputs = [ + tf.zeros_like(h_layers[0]) for _ in range(hparams.decoder_rnn_layers - hparams.encoder_rnn_layers) + ] return squeeze(lower_inputs + upper_inputs) def default_init(): # replica of tf.glorot_uniform_initializer(seed=seed) - return layers.variance_scaling_initializer(factor=1.0, - mode="FAN_AVG", - uniform=True) + return layers.variance_scaling_initializer(factor=1.0, mode="FAN_AVG", uniform=True) -def decoder(encoder_state, prediction_inputs, previous_y, hparams, is_train, - predict_window): +def decoder(encoder_state, prediction_inputs, previous_y, hparams, is_train, predict_window): """ Build the decoder part for the RNN model. @@ -187,18 +194,25 @@ def decoder(encoder_state, prediction_inputs, previous_y, hparams, is_train, """ def build_cell(idx): - with tf.variable_scope('decoder_cell', initializer=default_init()): + with tf.variable_scope("decoder_cell", initializer=default_init()): cell = rnn.GRUBlockCell(hparams.rnn_depth) - has_dropout = hparams.decoder_input_dropout[idx] < 1 \ - or hparams.decoder_state_dropout[idx] < 1 or hparams.decoder_output_dropout[idx] < 1 + has_dropout = ( + hparams.decoder_input_dropout[idx] < 1 + or hparams.decoder_state_dropout[idx] < 1 + or hparams.decoder_output_dropout[idx] < 1 + ) if is_train and has_dropout: input_size = prediction_inputs.shape[-1].value + 1 if idx == 0 else hparams.rnn_depth - cell = rnn.DropoutWrapper(cell, dtype=tf.float32, input_size=input_size, - variational_recurrent=hparams.decoder_variational_dropout[idx], - input_keep_prob=hparams.decoder_input_dropout[idx], - output_keep_prob=hparams.decoder_output_dropout[idx], - state_keep_prob=hparams.decoder_state_dropout[idx]) + cell = rnn.DropoutWrapper( + cell, + dtype=tf.float32, + input_size=input_size, + variational_recurrent=hparams.decoder_variational_dropout[idx], + input_keep_prob=hparams.decoder_input_dropout[idx], + output_keep_prob=hparams.decoder_output_dropout[idx], + state_keep_prob=hparams.decoder_state_dropout[idx], + ) return cell if hparams.decoder_rnn_layers > 1: @@ -218,7 +232,7 @@ def decoder(encoder_state, prediction_inputs, previous_y, hparams, is_train, # FC projecting layer to get single predicted value from RNN output def project_output(tensor): - return tf.layers.dense(tensor, 1, name='decoder_output_proj', kernel_initializer=default_init()) + return tf.layers.dense(tensor, 1, name="decoder_output_proj", kernel_initializer=default_init()) def loop_fn(time, prev_output, prev_state, array_targets: tf.TensorArray, array_outputs: tf.TensorArray): """ @@ -245,7 +259,6 @@ def decoder(encoder_state, prediction_inputs, previous_y, hparams, is_train, # Append previous predicted value to input features next_input = tf.concat([prev_output, features], axis=1) - # Run RNN cell output, state = cell(next_input, prev_state) # Make prediction from RNN outputs @@ -256,11 +269,13 @@ def decoder(encoder_state, prediction_inputs, previous_y, hparams, is_train, return time + 1, projected_output, state, array_targets, array_outputs # Initial values for loop - loop_init = [tf.constant(0, dtype=tf.int32), - tf.expand_dims(previous_y, -1), - encoder_state, - tf.TensorArray(dtype=tf.float32, size=predict_window), - tf.constant(0)] + loop_init = [ + tf.constant(0, dtype=tf.int32), + tf.expand_dims(previous_y, -1), + encoder_state, + tf.TensorArray(dtype=tf.float32, size=predict_window), + tf.constant(0), + ] # Run the loop _, _, _, targets_ta, outputs_ta = tf.while_loop(cond_fn, loop_fn, loop_init) @@ -289,8 +304,7 @@ def decode_predictions(decoder_readout, norm_mean, norm_std): return batch_readout * batch_std + batch_mean -def build_rnn_model(norm_x, feature_x, feature_y, norm_mean, norm_std, - predict_window, is_train, hparams): +def build_rnn_model(norm_x, feature_x, feature_y, norm_mean, norm_std, predict_window, is_train, hparams): """ For a single supervised learning time series sample, feed the input features and historical time series value into the RNN model, and create @@ -303,12 +317,12 @@ def build_rnn_model(norm_x, feature_x, feature_y, norm_mean, norm_std, encoder_output, h_state = make_encoder(x_all_features, is_train, hparams) # convert the encoder state - encoder_state = convert_cudnn_state_v2(h_state, hparams, - dropout=hparams.gate_dropout if is_train else 1.0) + encoder_state = convert_cudnn_state_v2(h_state, hparams, dropout=hparams.gate_dropout if is_train else 1.0) # Run decoder - decoder_targets = decoder(encoder_state, feature_y, norm_x[:, -1], hparams, is_train=is_train, - predict_window=predict_window) + decoder_targets = decoder( + encoder_state, feature_y, norm_x[:, -1], hparams, is_train=is_train, predict_window=predict_window + ) # get predictions predictions = decode_predictions(decoder_targets, norm_mean, norm_std) @@ -365,16 +379,13 @@ def calc_rounded_mape(true_y, predictions): return mape -def make_train_op(loss, learning_rate, beta1, beta2, epsilon, - ema_decay=None, prefix=None): +def make_train_op(loss, learning_rate, beta1, beta2, epsilon, ema_decay=None, prefix=None): """ Creates the training operation which updates the gradient using the AdamOptimizer. """ - optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, - beta1=beta1, beta2=beta2, - epsilon=epsilon) + optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, beta1=beta1, beta2=beta2, epsilon=epsilon) glob_step = tf.train.get_global_step() # Add regularization losses diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/Dockerfile b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/Dockerfile similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/Dockerfile rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/Dockerfile diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/README.md b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/README.md similarity index 87% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/README.md rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/README.md index b1b71038..179abfd1 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/README.md +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/README.md @@ -84,27 +84,25 @@ to check if conda has been installed by runnning command `conda -V`. If it is in `/test` under the data directory, respectively. After running the above command, you can deactivate the conda environment by running `source deactivate`. -5. Log into Azure Container Registry (ACR): +5. Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - -6. Pull a Docker image from ACR using the following command +6. Build a local Docker image by running the following command from `~/Forecasting` directory ```bash - sudo docker pull tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker build -t baseline_image:v1 ./retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive ``` 7. Choose a name for a new Docker container (e.g. snaive_container) and create it using command: ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name snaive_container tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name snaive_container baseline_image:v1 ``` Note that option `-v ~/Forecasting:/Forecasting` allows you to mount `~/Forecasting` folder (the one you cloned) to the container so that you will have @@ -142,7 +140,7 @@ to check if conda has been installed by runnning command `conda -V`. If it is in **Data storage:** Premium SSD -**Docker image:** tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 +**Dockerfile:** [retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/Dockerfile) **Key packages/dependencies:** * R diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/install_R_dependencies.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/install_R_dependencies.r similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/install_R_dependencies.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/install_R_dependencies.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/seasonal_naive.Rmd b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/seasonal_naive.Rmd similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/seasonal_naive.Rmd rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/seasonal_naive.Rmd diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/seasonal_naive.nb.html b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/seasonal_naive.nb.html similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/seasonal_naive.nb.html rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/seasonal_naive.nb.html diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/train_score.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/train_score.r similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/SeasonalNaive/train_score.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/SeasonalNaive/train_score.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/Dockerfile b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/Dockerfile similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/Dockerfile rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/Dockerfile diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/README.md b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/README.md similarity index 87% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/README.md rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/README.md index 2dd8df6d..888e39ce 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/README.md +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/README.md @@ -85,27 +85,25 @@ to check if conda has been installed by runnning command `conda -V`. If it is in `/test` under the data directory, respectively. After running the above command, you can deactivate the conda environment by running `source deactivate`. -5. Log into Azure Container Registry (ACR): +5. Make sure Docker is installed + + You can check if Docker is installed on your VM by running ```bash - sudo docker login --username tsperf --password tsperf.azurecr.io + sudo docker -v ``` + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - The `` can be found [here](https://github.com/Microsoft/Forecasting/blob/master/common/key.txt). If want to execute docker commands without - sudo as a non-root user, you need to create a - Unix group and add users to it by following the instructions - [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). - -6. Pull a Docker image from ACR using the following command +6. Build a local Docker image by running the following command from `~/Forecasting` directory ```bash - sudo docker pull tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker build -t baseline_image:v1 ./retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline ``` 7. Choose a name for a new Docker container (e.g. baseline_container) and create it using command: ```bash - sudo docker run -it -v ~/Forecasting:/Forecasting --name baseline_container tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 + sudo docker run -it -v ~/Forecasting:/Forecasting --name baseline_container baseline_image:v1 ``` Note that option `-v ~/Forecasting:/Forecasting` allows you to mount `~/Forecasting` folder (the one you cloned) to the container so that you will have @@ -143,7 +141,7 @@ to check if conda has been installed by runnning command `conda -V`. If it is in **Data storage:** Premium SSD -**Docker image:** tsperf.azurecr.io/retail_sales/orangejuice_pt_3weeks_weekly/baseline_image:v1 +**Dockerfile:** [retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/Dockerfile](https://github.com/Microsoft/Forecasting/blob/master/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/Dockerfile) **Key packages/dependencies:** * R diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/install_R_dependencies.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/install_R_dependencies.r similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/install_R_dependencies.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/install_R_dependencies.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/naive.Rmd b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/naive.Rmd similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/naive.Rmd rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/naive.Rmd diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/naive.nb.html b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/naive.nb.html similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/naive.nb.html rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/naive.nb.html diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/train_score.r b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/train_score.r similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/baseline/train_score.r rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/baseline/train_score.r diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/.gitignore b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/data/.gitignore similarity index 88% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/.gitignore rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/data/.gitignore index 9f182f45..974621d8 100644 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/.gitignore +++ b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/data/.gitignore @@ -1,5 +1,5 @@ -# include placeholder data directory in repository. -# Ignore all files in this directory except the .gitignore file. - -* +# include placeholder data directory in repository. +# Ignore all files in this directory except the .gitignore file. + +* !.gitignore \ No newline at end of file diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/reference/data_explore/explore_oj_data_R.ipynb b/contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/data/data_explore_retail_r.ipynb similarity index 100% rename from retail_sales/OrangeJuice_Pt_3Weeks_Weekly/reference/data_explore/explore_oj_data_R.ipynb rename to contrib/tsperf/OrangeJuice_Pt_3Weeks_Weekly/data/data_explore_retail_r.ipynb diff --git a/contrib/tsperf/README.md b/contrib/tsperf/README.md new file mode 100644 index 00000000..e05dce46 --- /dev/null +++ b/contrib/tsperf/README.md @@ -0,0 +1,73 @@ +# TSPerf + +TSPerf is a collection of implementations of time-series forecasting algorithms in Azure cloud and comparison of their performance over benchmark datasets. Algorithm implementations are compared by model accuracy, training and scoring time and cost. Each implementation includes all the necessary instructions and tools that ensure its reproducibility. +The following table summarizes benchmarks that are currently included in TSPerf. + +| Benchmark | Dataset | Benchmark directory | +|--------------------------------------------|----------------------|---------------------------------------------| +| Probabilistic electricity load forecasting | GEFCom2017 | `energy_load/GEFCom2017-D_Prob_MT_Hourly` | +| Retail sales forecasting | Orange Juice dataset | `retail_sales/OrangeJuice_Pt_3Weeks_Weekly` | + + + + +A complete documentation of TSPerf, along with the instructions for submitting and reviewing implementations, can be found [here](./docs/tsperf_rules.md). The tables below show performance of implementations that are developed so far. Source code of implementations and instructions for reproducing their performance can be found in submission folders, which are linked in the first column. + +## Probabilistic energy forecasting performance board + + +The following table lists the current submision for the energy forecasting and their respective performances. + + +| Submission Name | Pinball Loss | Training and Scoring Time (sec) | Training and Scoring Cost($) | Architecture | Framework | Algorithm | Uni/Multivariate | External Feature Support | +|-----------------------------------------------------------------|--------------|---------------------------------|------------------------------|--------------------------------------------|---------------------------------|------------------------------------|--|--| +| [Baseline](benchmarks%2FGEFCom2017_D_Prob_MT_hourly%2Fbaseline) | 84.12 | 188 | 0.0201 | Linux DSVM (Standard D8s v3 - Premium SSD) | quantreg package of R | Linear Quantile Regression | Multivariate | Yes | +| [GBM](benchmarks%2FGEFCom2017_D_Prob_MT_hourly%2FGBM) | 78.84 | 269 | 0.0287 | Linux DSVM (Standard D8s v3 - Premium SSD) | gbm package of R | Gradient Boosting Decision Tree | Multivariate | Yes | +| [QRF](benchmarks%2FGEFCom2017_D_Prob_MT_hourly%2Fqrf) | 76.29 | 20322 | 17.19 | Linux DSVM (F72s v2 - Premium SSD) | scikit-garden package of Python | Quantile Regression Forest | Multivariate | Yes | +| [FNN](benchmarks%2FGEFCom2017_D_Prob_MT_hourly%2Ffnn) | 80.06 | 1085 | 0.1157 | Linux DSVM (Standard D8s v3 - Premium SSD) | qrnn package of R | Quantile Regression Neural Network | Multivariate | Yes | +| | | | | | | | + + +The following chart compares the submissions performance on accuracy in Pinball Loss vs. Training and Scoring cost in $: + + +![EnergyPBLvsTime](./docs/images/Energy-Cost.png) + + + + +## Retail sales forecasting performance board + + +The following table lists the current submision for the retail forecasting and their respective performances. + + +| Submission Name | MAPE (%) | Training and Scoring Time (sec) | Training and Scoring Cost ($) | Architecture | Framework | Algorithm | Uni/Multivariate | External Feature Support | +|----------------------------------------------------------------------------|----------|---------------------------------|-------------------------------|--------------------------------------------|----------------------------|-------------------------------------------------------------------|------------------|--------------------------| +| [Baseline](benchmarks%2FOrangeJuice_Pt_3Weeks_Weekly%2Fbaseline) | 109.67 | 114.06 | 0.003 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | Naive Forecast | Univariate | No | +| [AutoARIMA](benchmarks%2FOrangeJuice_Pt_3Weeks_Weekly%2FARIMA) | 70.80 | 265.94 | 0.0071 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | Auto ARIMA | Multivariate | Yes | +| [ETS](benchmarks%2FOrangeJuice_Pt_3Weeks_Weekly%2FETS) | 70.99 | 277 | 0.01 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | ETS | Multivariate | No | +| [MeanForecast](benchmarks%2FOrangeJuice_Pt_3Weeks_Weekly%2FMeanForecast) | 70.74 | 69.88 | 0.002 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | Mean forecast | Univariate | No | +| [SeasonalNaive](benchmarks%2FOrangeJuice_Pt_3Weeks_Weekly%2FSeasonalNaive) | 165.06 | 160.45 | 0.004 | Linux DSVM(Standard D2s v3 - Premium SSD) | forecast package of R | Seasonal Naive | Univariate | No | +| [LightGBM](benchmarks%2FOrangeJuice_Pt_3Weeks_Weekly%2FLightGBM) | 36.28 | 625.10 | 0.0167 | Linux DSVM (Standard D2s v3 - Premium SSD) | lightGBM package of Python | Gradient Boosting Decision Tree | Multivariate | Yes | +| [DilatedCNN](benchmarks%2FOrangeJuice_Pt_3Weeks_Weekly%2FDilatedCNN) | 37.09 | 413 | 0.1032 | Ubuntu VM(NC6 - Standard HDD) | Keras and Tensorflow | Python + Dilated convolutional neural network | Multivariate | Yes | +| [RNN Encoder-Decoder](benchmarks%2FOrangeJuice_Pt_3Weeks_Weekly%2FRNN) | 37.68 | 669 | 0.2 | Ubuntu VM(NC6 - Standard HDD) | Tensorflow | Python + Encoder-decoder architecture of recurrent neural network | Multivariate | Yes | + + + + + + +The following chart compares the submissions performance on accuracy in %MAPE vs. Training and Scoring cost in $: + + +![EnergyPBLvsTime](./docs/images/Retail-Cost.png) + +## Build Status + + +| Build Type | Branch | Status | | Branch | Status | +|----------------------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Python Linux CPU** | master | [![Build Status](https://dev.azure.com/best-practices/forecasting/_apis/build/status/python_unit_tests_base?branchName=master)](https://dev.azure.com/best-practices/forecasting/_build/latest?definitionId=12&branchName=master) | | staging | [![Build Status](https://dev.azure.com/best-practices/forecasting/_apis/build/status/python_unit_tests_base?branchName=chenhui/python_test_pipeline)](https://dev.azure.com/best-practices/forecasting/_build/latest?definitionId=12&branchName=chenhui/python_test_pipeline) | +| **R Linux CPU** | master | [![Build Status](https://dev.azure.com/best-practices/forecasting/_apis/build/status/Forecasting/r_unit_tests_prototype?branchName=master)](https://dev.azure.com/best-practices/forecasting/_build/latest?definitionId=9&branchName=master) | | staging | [![Build Status](https://dev.azure.com/best-practices/forecasting/_apis/build/status/Forecasting/r_unit_tests_prototype?branchName=zhouf/r_test_pipeline)](https://dev.azure.com/best-practices/forecasting/_build/latest?definitionId=9&branchName=zhouf/r_test_pipeline) | + diff --git a/prototypes/cross_validation/Dockerfile b/contrib/tsperf/cross_validation/Dockerfile similarity index 100% rename from prototypes/cross_validation/Dockerfile rename to contrib/tsperf/cross_validation/Dockerfile diff --git a/prototypes/cross_validation/backtest_config.json b/contrib/tsperf/cross_validation/backtest_config.json similarity index 100% rename from prototypes/cross_validation/backtest_config.json rename to contrib/tsperf/cross_validation/backtest_config.json diff --git a/prototypes/cross_validation/conda_dependencies.yml b/contrib/tsperf/cross_validation/conda_dependencies.yml similarity index 100% rename from prototypes/cross_validation/conda_dependencies.yml rename to contrib/tsperf/cross_validation/conda_dependencies.yml diff --git a/prototypes/cross_validation/cross_validation.py b/contrib/tsperf/cross_validation/cross_validation.py similarity index 54% rename from prototypes/cross_validation/cross_validation.py rename to contrib/tsperf/cross_validation/cross_validation.py index fbabe4d5..790969dc 100644 --- a/prototypes/cross_validation/cross_validation.py +++ b/contrib/tsperf/cross_validation/cross_validation.py @@ -1,3 +1,6 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + import json import os import itertools @@ -5,7 +8,7 @@ from datetime import datetime from dateutil.relativedelta import relativedelta import subprocess -from common.train_utils import TSCVSplitter +from ..train_utils import TSCVSplitter class ParameterSweeper: @@ -17,48 +20,53 @@ class ParameterSweeper: def __init__(self, config): - self.work_directory = config['WorkDirectory'] - data_config = config['DataParams'] - self.data_path = data_config['DataPath'] - if 'DataFile' in data_config: - data_file = data_config['DataFile'] - self.data_full_path = os.path.join(self.work_directory, - self.data_path, data_file) + self.work_directory = config["WorkDirectory"] + data_config = config["DataParams"] + self.data_path = data_config["DataPath"] + if "DataFile" in data_config: + data_file = data_config["DataFile"] + self.data_full_path = os.path.join(self.work_directory, self.data_path, data_file) else: - self.data_full_path = os.path.join(self.work_directory, - self.data_path) + self.data_full_path = os.path.join(self.work_directory, self.data_path) - parameters_config = config['Parameters'] + parameters_config = config["Parameters"] self.parameter_name_list = [n for n, _ in parameters_config.items()] parameter_value_list = [p for _, p in parameters_config.items()] - self.parameter_combinations = \ - list(itertools.product(*parameter_value_list)) + self.parameter_combinations = list(itertools.product(*parameter_value_list)) - features_config = config['Features'] - self.feature_selection_mode = features_config['FeatureSelectionMode'] - if self.feature_selection_mode == 'Default': + features_config = config["Features"] + self.feature_selection_mode = features_config["FeatureSelectionMode"] + if self.feature_selection_mode == "Default": # In default mode, simply iterate through each feature set in # FeatureList - self.feature_list = features_config['FeatureList'] + self.feature_list = features_config["FeatureList"] else: # Placeholder for more advanced feature selection strategy pass - def sweep_parameters_script(self, script_config, - cv_setting_file, params_setting_file): - script_command = script_config['ScriptCommand'] - script = os.path.join(self.work_directory, script_config['Script']) + def sweep_parameters_script(self, script_config, cv_setting_file, params_setting_file): + script_command = script_config["ScriptCommand"] + script = os.path.join(self.work_directory, script_config["Script"]) task_list = [] parameter_sets = {} count = 0 for f in self.feature_list: for p in self.parameter_combinations: count += 1 - task = ' '.join([script_command, script, - '-d', self.data_full_path, - '-p', params_setting_file, - '-c', cv_setting_file, - '-s', str(count)]) + task = " ".join( + [ + script_command, + script, + "-d", + self.data_full_path, + "-p", + params_setting_file, + "-c", + cv_setting_file, + "-s", + str(count), + ] + ) task_list.append(task) parameter_dict = {} @@ -66,10 +74,12 @@ class ParameterSweeper: for n, v in zip(self.parameter_name_list, p): parameter_dict[n] = v - parameter_sets[count] = {'feature_set': f, - 'features': self.feature_list[f], - 'parameters': parameter_dict} - with open(params_setting_file, 'w') as fp: + parameter_sets[count] = { + "feature_set": f, + "features": self.feature_list[f], + "parameters": parameter_dict, + } + with open(params_setting_file, "w") as fp: json.dump(parameter_sets, fp, indent=True) # Run tasks in parallel @@ -97,10 +107,10 @@ def main(config_file): with open(config_file) as f: config = json.load(f) - datetime_format = config['DatetimeFormat'] - work_directory = config['WorkDirectory'] + datetime_format = config["DatetimeFormat"] + work_directory = config["WorkDirectory"] - cv_setting_file = os.path.join(work_directory, 'cv_settings.json') + cv_setting_file = os.path.join(work_directory, "cv_settings.json") # parameter_setting_file = os.path.join(work_directory, # 'parameter_settings.json') @@ -112,20 +122,16 @@ def main(config_file): for k, v in cv.train_validation_split.items(): round_dict = {} # Training data ends on 12/31, used to forecast Feb. and Mar. - train_end = datetime.strptime(v['train_range'][1], datetime_format) + train_end = datetime.strptime(v["train_range"][1], datetime_format) # Jan. validation range - validation_start_1 = datetime.strptime(v['validation_range'][0], - datetime_format) - validation_end_1 = validation_start_1 + \ - relativedelta(months=1, hours=-1) + validation_start_1 = datetime.strptime(v["validation_range"][0], datetime_format) + validation_end_1 = validation_start_1 + relativedelta(months=1, hours=-1) # Training data ends on 11/30, used to forecast Jan. and Feb. - train_end_prev = datetime.strftime( - train_end + relativedelta(months=-1), datetime_format) + train_end_prev = datetime.strftime(train_end + relativedelta(months=-1), datetime_format) # Training data ends on 01/31, used to forecast Mar. and Apr. - train_end_next = datetime.strftime( - train_end + relativedelta(months=1), datetime_format) + train_end_next = datetime.strftime(train_end + relativedelta(months=1), datetime_format) # Feb. validation range validation_start_2 = validation_start_1 + relativedelta(months=1) @@ -148,29 +154,35 @@ def main(config_file): validation_start_4 = datetime.strftime(validation_start_4, datetime_format) validation_end_4 = datetime.strftime(validation_end_4, datetime_format) - round_dict[1] = {'train_range': [v['train_range'][0], train_end_prev], - 'validation_range': [validation_start_1, validation_end_1] - } - round_dict[2] = {'train_range': [v['train_range'][0], train_end_prev], - 'validation_range': [validation_start_2, validation_end_2] - } - round_dict[3] = {'train_range': [v['train_range'][0], v['train_range'][1]], - 'validation_range': [validation_start_2, validation_end_2] - } - round_dict[4] = {'train_range': [v['train_range'][0], v['train_range'][1]], - 'validation_range': [validation_start_3, validation_end_3] - } + round_dict[1] = { + "train_range": [v["train_range"][0], train_end_prev], + "validation_range": [validation_start_1, validation_end_1], + } + round_dict[2] = { + "train_range": [v["train_range"][0], train_end_prev], + "validation_range": [validation_start_2, validation_end_2], + } + round_dict[3] = { + "train_range": [v["train_range"][0], v["train_range"][1]], + "validation_range": [validation_start_2, validation_end_2], + } + round_dict[4] = { + "train_range": [v["train_range"][0], v["train_range"][1]], + "validation_range": [validation_start_3, validation_end_3], + } - round_dict[5] = {'train_range': [v['train_range'][0], train_end_next], - 'validation_range': [validation_start_3, validation_end_3] - } - round_dict[6] = {'train_range': [v['train_range'][0], train_end_next], - 'validation_range': [validation_start_4, validation_end_4] - } + round_dict[5] = { + "train_range": [v["train_range"][0], train_end_next], + "validation_range": [validation_start_3, validation_end_3], + } + round_dict[6] = { + "train_range": [v["train_range"][0], train_end_next], + "validation_range": [validation_start_4, validation_end_4], + } cv.train_validation_split[k] = round_dict - with open(cv_setting_file, 'w') as fp: + with open(cv_setting_file, "w") as fp: json.dump(cv.train_validation_split, fp, indent=True) # # ps = ParameterSweeper(config) @@ -180,6 +192,5 @@ def main(config_file): # parameter_setting_file) -if __name__ == '__main__': - main('backtest_config.json') - +if __name__ == "__main__": + main("backtest_config.json") diff --git a/prototypes/cross_validation/cv_settings.json b/contrib/tsperf/cross_validation/cv_settings.json similarity index 100% rename from prototypes/cross_validation/cv_settings.json rename to contrib/tsperf/cross_validation/cv_settings.json diff --git a/prototypes/cross_validation/time_series_backtesting.ipynb b/contrib/tsperf/cross_validation/time_series_backtesting.ipynb similarity index 100% rename from prototypes/cross_validation/time_series_backtesting.ipynb rename to contrib/tsperf/cross_validation/time_series_backtesting.ipynb diff --git a/contrib/tsperf/docs/images/Energy-Cost.png b/contrib/tsperf/docs/images/Energy-Cost.png new file mode 100644 index 00000000..fe068b30 Binary files /dev/null and b/contrib/tsperf/docs/images/Energy-Cost.png differ diff --git a/docs/images/Retail-Cost.png b/contrib/tsperf/docs/images/Retail-Cost.png similarity index 100% rename from docs/images/Retail-Cost.png rename to contrib/tsperf/docs/images/Retail-Cost.png diff --git a/docs/images/definitions.png b/contrib/tsperf/docs/images/definitions.png similarity index 100% rename from docs/images/definitions.png rename to contrib/tsperf/docs/images/definitions.png diff --git a/docs/roadmap.md b/contrib/tsperf/docs/roadmap.md similarity index 100% rename from docs/roadmap.md rename to contrib/tsperf/docs/roadmap.md diff --git a/docs/submission_form_template.md b/contrib/tsperf/docs/submission_form_template.md similarity index 88% rename from docs/submission_form_template.md rename to contrib/tsperf/docs/submission_form_template.md index 4858ab60..2eb3eadd 100644 --- a/docs/submission_form_template.md +++ b/contrib/tsperf/docs/submission_form_template.md @@ -52,7 +52,7 @@ Fill out this form before making a submission. Save it as README.md in the submi **Data storage:** <*e.g. Premium SSD, blob storage*> -**Docker image:** +**Dockerfile:** **Key packages/dependencies:** List the key packages, deep learning frameworks included in the docker image. Only include the packages that are important for implementing the model. Exclude packages used for data manipulation, feature engineering etc. E.g.: diff --git a/docs/tsperf_rules.md b/contrib/tsperf/docs/tsperf_rules.md similarity index 87% rename from docs/tsperf_rules.md rename to contrib/tsperf/docs/tsperf_rules.md index 2a2bc93e..2d6da13a 100755 --- a/docs/tsperf_rules.md +++ b/contrib/tsperf/docs/tsperf_rules.md @@ -14,7 +14,7 @@ 3.2 [Retail sales forecasting](#retail-sales-forecasting) 4. [Development of benchmark implementation](#development-of-benchmark-implementation) 4.1 [Feature engineering](#feature-engineering) - 4.2 [Guideline for setting up conda environment](#Guideline-for-setting-up-conda-environment) + 4.2 [Guideline for setting up conda environment](#Guideline-for-setting-up-conda-environment) 4.3 [Guideline for creating Docker images](#guideline-for-creating-docker-images) 4.4 [Measuring performance](#measuring-performance) 5. [Submission of benchmark implementation](#submission-of-benchmark-implementation) @@ -101,16 +101,16 @@ In addition to it, there will be a specific benchmark submission guidelines docu ### Structure of repository We use Git repo to maintain the source code and relevant files. The repository has three hierarchy levels: use case, benchmark, and benchmark -implementation. The top-level directory `/TSPerf` consists of folders of all the existing use cases, a folder storing common utility scripts, a +implementation. The top-level directory `/Forecasting` consists of folders of all the existing use cases, a folder storing common utility scripts, a folder storing internal docs, and a Markdown file with an overview of TSPerf framework. * Use case folders: Each such folder is named after a specific use case and contains scripts of the implementations/submissions for every -benchmark of this use case. Currently, we have a folder `/TSPerf/energy_load` for the energy load forecasting use case and another folder -`/TSPerf/retail_sales` for the retail sales forecasting use case. +benchmark of this use case. Currently, we have a folder `/Forecasting/energy_load` for the energy load forecasting use case and another folder +`/Forecasting/retail_sales` for the retail sales forecasting use case. Under each use case folder, we have subfolders for different benchmarks and a Markdown file listing all the benchmarks of this use case. For - example, `/TSPerf/energy_load/GEFCom2017-D_Prob_MT_hourly` contains all the submissions for a probabilistic forecasting problem defined upon - GEFCom2017-D dataset. In addition, `/TSPerf/energy_load/README.md` summarizes all the benchmarks of the energy load forecasting use case. + example, `/Forecasting/energy_load/GEFCom2017-D_Prob_MT_hourly` contains all the submissions for a probabilistic forecasting problem defined upon + GEFCom2017-D dataset. In addition, `/Forecasting/energy_load/README.md` summarizes all the benchmarks of the energy load forecasting use case. Under each benchmark folder, there are a subfolder containing reference materials, a subfolder containing source code of all submissions, a subfolder storing common utility scripts, a subfolder reserved for data storage, and a Markdown file specifying the benchmark. The @@ -120,11 +120,11 @@ benchmark of this use case. Currently, we have a folder `/TSPerf/energy_load` fo * `/submissions` folder: This folder contains multiple subfolders where each subfolder includes all the necessary scripts and the submission form for reproducing a certain submission. For instance, `/baseline` folder under - `/TSPerf/energy_load/GEFCom2014_Pt_1Month_Hourly/submissions` includes the required submission files of the baseline model which is simple + `/Forecasting/energy_load/GEFCom2014_Pt_1Month_Hourly/submissions` includes the required submission files of the baseline model which is simple method used to be compared with other submissions. * `/common` folder: This folder includes utility scripts for a benchmark. As an example, - `/TSPerf/energy_load/GEFCom2014_Pt_1Month_Hourly/common` + `/Forecasting/energy_load/GEFCom2014_Pt_1Month_Hourly/common` contains the scripts that could be commonly used for GEFCom2014_Pt_1Month_Hourly, such as Python scripts that download the data, prepare training and scoring data, and evaluate performance of the benchmark implementation. @@ -132,15 +132,15 @@ benchmark of this use case. Currently, we have a folder `/TSPerf/energy_load` fo of the benchmark. * `/README.md`: This Markdown file provides detailed introductions about a certain benchmark. For instance, - `/TSPerf/energy_load/GEFCom2014_Pt_1Month_Hourly/README.md` describes the dataset and goal of the benchmark. + `/Forecasting/energy_load/GEFCom2014_Pt_1Month_Hourly/README.md` describes the dataset and goal of the benchmark. -* `/TSPerf/common` folder: This folder has the scripts that could be used across different use cases, such as Python scripts which compute the +* `/Forecasting/common` folder: This folder has the scripts that could be used across different use cases, such as Python scripts which compute the evaluation metrics of the forecasting results. -* `/TSPerf/internal_docs` folder: This folder contains a high-level document summarizing the goals, rules, and general guidelines for +* `/Forecasting/docs` folder: This folder contains a high-level document summarizing the goals, rules, and general guidelines for participating and leveraging TSPerf. There is also a template of the submission form used for documenting a particular submission. -* `/TSPerf/README.md` file: This Markdown file describes the TSPerf framework in general. It introduces the goal and vision, specifies the use +* `/Forecasting/README.md` file: This Markdown file describes the TSPerf framework in general. It introduces the goal and vision, specifies the use cases and benchmarks, and includes a performance board for each use case. ## Benchmarks @@ -149,8 +149,8 @@ The following table summarizes benchmarks that are currently included in TSPerf: | **Benchmark** | **Dataset** | **Benchmark directory** | | --------------------- | ----|---------------- | -| Probabilistic electricity load forecasting | GEFCom2017 |`TSPerf\energy_load\GEFCom2017-D_Prob_MT_Hourly` | -| Retail sales forecasting | Orange Juice dataset | `TSPerf\retail_sales\OrangeJuice_Pt_3Weeks_Weekly` | +| Probabilistic electricity load forecasting | GEFCom2017 |`Forecasting\energy_load\GEFCom2017-D_Prob_MT_Hourly` | +| Retail sales forecasting | Orange Juice dataset | `Forecasting\retail_sales\OrangeJuice_Pt_3Weeks_Weekly` | Next sections provide a high-level description of the benchmarks. A more detailed description of the benchmarks is in README files in benchmark directories. @@ -216,7 +216,7 @@ or Run the following commands to set up the tsperf conda environment: ``` -cd TSPerf +cd ~/Forecasting conda env create -f common/conda_dependencies.yml source activate tsperf ``` @@ -260,25 +260,25 @@ After customizing the Dockerfile and dependency files, you can build a local Doc 1. Make sure Docker is installed. You can check if Docker is installed in your VM by running ```bash - docker -v + sudo docker -v ``` - You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). Otherwise, you need to run the commands with sudo. + You will see the Docker version if Docker is installed. If not, you can install it by following the instructions [here](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Note that if you want to execute Docker commands without sudo as a non-root user, you need to create a Unix group and add users to it by following the instructions [here](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user). 2. Build Docker image by running ```bash - docker build -t . + sudo docker build -t . ``` from the submission folder where the Dockerfile and dependency files reside. Here `` is the name of the local Docker image. An example name is `lightgbm_image:v1`, where `v1` indicates the version of the Docker image. It may take tens of minutes to build the Docker image for the first time. But the process could be much faster if you rebuild the image after applying small changes to the Dockerfile or dependency files, since previous Docker building steps will be cached and most of them will not be repeated. 3. After the Docker image is built, you may need to test your model training and scoring script inside a Docker container created from this image. To do this, you will need to - * 3.1 Choose a name for a new Docker container and create it by running the following command from `/TSPerf` folder (assuming that you've cloned TSPerf repository): + * 3.1 Choose a name for a new Docker container and create it by running the following command from `~/Forecasting` folder (assuming that you've cloned Forecasting repository): ```bash - docker run -it -v $(pwd):/TSPerf --name + sudo docker run -it -v ~/Forecasting:/Forecasting --name ``` - Note that option `-v $(pwd):/TSPerf` allows you to mount `/TSPerf` folder (the one you cloned) to the container so that you will have access to the source code and data in the container. Here `` is the name of the Docker container, e.g. `lightgbm_container`. You will automatically enter the Docker container after executing the above command. + Note that option `-v ~/Forecasting:/Forecasting` allows you to mount `~/Forecasting` folder (the one you cloned) to the container so that you will have access to the source code and data in the container. Here `` is the name of the Docker container, e.g. `lightgbm_container`. You will automatically enter the Docker container after executing the above command. For Docker images with GPU support, you will need to run the above command with an additional argument `--runtime=nvidia`. - * 3.2 Inside the Docker container, train the model and make predictions by running the following command from `/TSPerf` folder + * 3.2 Inside the Docker container, train the model and make predictions by running the following command from `~/Forecasting` folder ```bash source ./common/train_score_vm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +

Copyright (c) Microsoft Corporation.
Licensed under the MIT License.

+

In this notebook, we generate the datasets that will be used for model training and validating.

+

The orange juice dataset comes from the bayesm package, and gives pricing and sales figures over time for a variety of orange juice brands in several stores in Florida. Rather than installing the entire package (which is very complex), we download the dataset itself from the GitHub mirror of the CRAN repository.

+ + + +
# download the data from the GitHub mirror of the bayesm package source
+ojfile <- tempfile(fileext=".rda")
+download.file("https://github.com/cran/bayesm/raw/master/data/orangeJuice.rda", ojfile)
+load(ojfile)
+file.remove(ojfile)
+ + + +

The dataset generation parameters are obtained from the file ojdata_forecast_settings.yaml; you can modify that file to vary the experimental setup. The settings are

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescriptionDefault
N_SPLITSThe number of splits to make.10
HORIZONThe forecast horizon for the test dataset for each split.2
GAPThe gap in weeks from the end of the training period to the start of the testing period; see below.2
FIRST_WEEKThe first week of data to use.40
LAST_WEEKThe last week of data to use.156
START_DATEThe actual calendar date for the start of the first week in the data.1989-09-14
+

A complicating factor is that the data does not include every possible combination of store, brand and date, so we have to pad out the missing rows with complete. In addition, one store/brand combination has no data beyond week 156; we therefore end the analysis at this week. We also do not fill in the missing values in the data, as many of the modelling functions in the fable package can handle this innately.

+ + + +
library(tidyr)
+library(dplyr)
+library(tsibble)
+library(feasts)
+library(fable)
+
+settings <- yaml::read_yaml(here::here("examples/grocery_sales/R/forecast_settings.yaml"))
+start_date <- as.Date(settings$START_DATE)
+train_periods <- seq(to=settings$LAST_WEEK - settings$HORIZON - settings$GAP + 1,
+                     by=settings$HORIZON,
+                     length.out=settings$N_SPLITS)
+
+oj_data <- orangeJuice$yx %>%
+    complete(store, brand, week) %>%
+    mutate(week=yearweek(start_date + week*7)) %>%
+    as_tsibble(index=week, key=c(store, brand))
+ + + +

Here are some glimpses of what the data looks like. The dependent variable is logmove, the logarithm of the total sales for a given brand and store, in a particular week.

+ + + +
head(oj_data)
+ +
+ +
+ + +

The time series plots for a small subset of brands and stores are shown below. We can make the following observations:

+
    +
  • There appears to be little seasonal variation in sales (probably because Florida is a state without very different seasons). In any case, with less than 2 years of observations, the time series is not long enough for many model-fitting functions in the fable package to automatically estimate seasonal parameters.
  • +
  • While some store/brand combinations show weak trends over time, this is far from universal.
  • +
  • Different brands can exhibit very different behaviour, especially in terms of variation about the mean.
  • +
  • Many of the time series have missing values, indicating that the dataset is incomplete.
  • +
+ + + +
library(ggplot2)
+
+oj_data %>%
+    filter(store < 25, brand < 5) %>%
+    ggplot(aes(x=week, y=logmove)) +
+        geom_line() +
+        scale_x_date(labels=NULL) +
+        facet_grid(vars(store), vars(brand), labeller="label_both")
+ + +

+ + + +

Finally, we split the dataset into separate samples for training and testing. The schema used is broadly time series cross-validation, whereby we train a model on data up to time \(t\), test it on data for times \(t+1\) to \(t+k\), then train on data up to time \(t+k\), test it on data for times \(t+k+1\) to \(t+2k\), and so on. In this specific case study, however, we introduce a small extra piece of complexity based on discussions with domain experts. We train a model on data up to week \(t\), then test it on week \(t+2\) to \(t+3\). Then we train on data up to week \(t+2\), and test it on weeks \(t+4\) to \(t+5\), and so on. There is thus always a gap of one week between the training and test samples. The reason for this is because in reality, inventory planning always takes some time; the gap allows store managers to prepare the stock based on the forecasted demand.

+ + + +
subset_oj_data <- function(start, end)
+{
+    start <- yearweek(start_date + start*7)
+    end <- yearweek(start_date + end*7)
+    filter(oj_data, week >= start, week <= end)
+}
+
+oj_train <- lapply(train_periods, function(i) subset_oj_data(settings$FIRST_WEEK, i))
+oj_test <- lapply(train_periods, function(i) subset_oj_data(i + settings$GAP, i + settings$GAP + settings$HORIZON - 1))
+
+save(oj_train, oj_test, file=here::here("examples/grocery_sales/R/data.Rdata"))
+
+head(oj_train[[1]])
+ +
+ +
+ +
head(oj_test[[1]])
+ +
+ +
+ + +
LS0tCnRpdGxlOiBEYXRhIHByZXBhcmF0aW9uCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCl9Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5fPGJyLz4KX0xpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5fCgpJbiB0aGlzIG5vdGVib29rLCB3ZSBnZW5lcmF0ZSB0aGUgZGF0YXNldHMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIG1vZGVsIHRyYWluaW5nIGFuZCB2YWxpZGF0aW5nLiAKClRoZSBvcmFuZ2UganVpY2UgZGF0YXNldCBjb21lcyBmcm9tIHRoZSBiYXllc20gcGFja2FnZSwgYW5kIGdpdmVzIHByaWNpbmcgYW5kIHNhbGVzIGZpZ3VyZXMgb3ZlciB0aW1lIGZvciBhIHZhcmlldHkgb2Ygb3JhbmdlIGp1aWNlIGJyYW5kcyBpbiBzZXZlcmFsIHN0b3JlcyBpbiBGbG9yaWRhLiBSYXRoZXIgdGhhbiBpbnN0YWxsaW5nIHRoZSBlbnRpcmUgcGFja2FnZSAod2hpY2ggaXMgdmVyeSBjb21wbGV4KSwgd2UgZG93bmxvYWQgdGhlIGRhdGFzZXQgaXRzZWxmIGZyb20gdGhlIEdpdEh1YiBtaXJyb3Igb2YgdGhlIENSQU4gcmVwb3NpdG9yeS4KCmBgYHtyLCByZXN1bHRzPSJoaWRlIiwgbWVzc2FnZT1GQUxTRX0KIyBkb3dubG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBHaXRIdWIgbWlycm9yIG9mIHRoZSBiYXllc20gcGFja2FnZSBzb3VyY2UKb2pmaWxlIDwtIHRlbXBmaWxlKGZpbGVleHQ9Ii5yZGEiKQpkb3dubG9hZC5maWxlKCJodHRwczovL2dpdGh1Yi5jb20vY3Jhbi9iYXllc20vcmF3L21hc3Rlci9kYXRhL29yYW5nZUp1aWNlLnJkYSIsIG9qZmlsZSkKbG9hZChvamZpbGUpCmZpbGUucmVtb3ZlKG9qZmlsZSkKYGBgCgpUaGUgZGF0YXNldCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGZpbGUgYG9qZGF0YV9mb3JlY2FzdF9zZXR0aW5ncy55YW1sYDsgeW91IGNhbiBtb2RpZnkgdGhhdCBmaWxlIHRvIHZhcnkgdGhlIGV4cGVyaW1lbnRhbCBzZXR1cC4gVGhlIHNldHRpbmdzIGFyZQoKfCBQYXJhbWV0ZXIgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQgfCAKfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tfAp8IGBOX1NQTElUU2AgfCBUaGUgbnVtYmVyIG9mIHNwbGl0cyB0byBtYWtlLiB8IDEwIHwKfCBgSE9SSVpPTmAgfCBUaGUgZm9yZWNhc3QgaG9yaXpvbiBmb3IgdGhlIHRlc3QgZGF0YXNldCBmb3IgZWFjaCBzcGxpdC4gfCAyIHwKfCBgR0FQYCB8IFRoZSBnYXAgaW4gd2Vla3MgZnJvbSB0aGUgZW5kIG9mIHRoZSB0cmFpbmluZyBwZXJpb2QgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0aW5nIHBlcmlvZDsgc2VlIGJlbG93LiB8IDIgfAp8IGBGSVJTVF9XRUVLYCB8IFRoZSBmaXJzdCB3ZWVrIG9mIGRhdGEgdG8gdXNlLiB8IDQwIHwKfCBgTEFTVF9XRUVLYCB8IFRoZSBsYXN0IHdlZWsgb2YgZGF0YSB0byB1c2UuIHwgMTU2IHwKfCBgU1RBUlRfREFURWAgfCBUaGUgYWN0dWFsIGNhbGVuZGFyIGRhdGUgZm9yIHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgd2VlayBpbiB0aGUgZGF0YS4gfCBgMTk4OS0wOS0xNGAgfAoKQSBjb21wbGljYXRpbmcgZmFjdG9yIGlzIHRoYXQgdGhlIGRhdGEgZG9lcyBub3QgaW5jbHVkZSBldmVyeSBwb3NzaWJsZSBjb21iaW5hdGlvbiBvZiBzdG9yZSwgYnJhbmQgYW5kIGRhdGUsIHNvIHdlIGhhdmUgdG8gcGFkIG91dCB0aGUgbWlzc2luZyByb3dzIHdpdGggYGNvbXBsZXRlYC4gSW4gYWRkaXRpb24sIG9uZSBzdG9yZS9icmFuZCBjb21iaW5hdGlvbiBoYXMgbm8gZGF0YSBiZXlvbmQgd2VlayAxNTY7IHdlIHRoZXJlZm9yZSBlbmQgdGhlIGFuYWx5c2lzIGF0IHRoaXMgd2Vlay4gV2UgYWxzbyBkbyBfbm90XyBmaWxsIGluIHRoZSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgZGF0YSwgYXMgbWFueSBvZiB0aGUgbW9kZWxsaW5nIGZ1bmN0aW9ucyBpbiB0aGUgZmFibGUgcGFja2FnZSBjYW4gaGFuZGxlIHRoaXMgaW5uYXRlbHkuCgpgYGB7ciwgcmVzdWx0cz0iaGlkZSIsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodHNpYmJsZSkKbGlicmFyeShmZWFzdHMpCmxpYnJhcnkoZmFibGUpCgpzZXR0aW5ncyA8LSB5YW1sOjpyZWFkX3lhbWwoaGVyZTo6aGVyZSgiZXhhbXBsZXMvZ3JvY2VyeV9zYWxlcy9SL2ZvcmVjYXN0X3NldHRpbmdzLnlhbWwiKSkKc3RhcnRfZGF0ZSA8LSBhcy5EYXRlKHNldHRpbmdzJFNUQVJUX0RBVEUpCnRyYWluX3BlcmlvZHMgPC0gc2VxKHRvPXNldHRpbmdzJExBU1RfV0VFSyAtIHNldHRpbmdzJEhPUklaT04gLSBzZXR0aW5ncyRHQVAgKyAxLAogICAgICAgICAgICAgICAgICAgICBieT1zZXR0aW5ncyRIT1JJWk9OLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgub3V0PXNldHRpbmdzJE5fU1BMSVRTKQoKb2pfZGF0YSA8LSBvcmFuZ2VKdWljZSR5eCAlPiUKICAgIGNvbXBsZXRlKHN0b3JlLCBicmFuZCwgd2VlaykgJT4lCiAgICBtdXRhdGUod2Vlaz15ZWFyd2VlayhzdGFydF9kYXRlICsgd2Vlayo3KSkgJT4lCiAgICBhc190c2liYmxlKGluZGV4PXdlZWssIGtleT1jKHN0b3JlLCBicmFuZCkpCmBgYAoKSGVyZSBhcmUgc29tZSBnbGltcHNlcyBvZiB3aGF0IHRoZSBkYXRhIGxvb2tzIGxpa2UuIFRoZSBkZXBlbmRlbnQgdmFyaWFibGUgaXMgYGxvZ21vdmVgLCB0aGUgbG9nYXJpdGhtIG9mIHRoZSB0b3RhbCBzYWxlcyBmb3IgYSBnaXZlbiBicmFuZCBhbmQgc3RvcmUsIGluIGEgcGFydGljdWxhciB3ZWVrLgoKYGBge3J9CmhlYWQob2pfZGF0YSkKYGBgCgpUaGUgdGltZSBzZXJpZXMgcGxvdHMgZm9yIGEgc21hbGwgc3Vic2V0IG9mIGJyYW5kcyBhbmQgc3RvcmVzIGFyZSBzaG93biBiZWxvdy4gV2UgY2FuIG1ha2UgdGhlIGZvbGxvd2luZyBvYnNlcnZhdGlvbnM6CgotIFRoZXJlIGFwcGVhcnMgdG8gYmUgbGl0dGxlIHNlYXNvbmFsIHZhcmlhdGlvbiBpbiBzYWxlcyAocHJvYmFibHkgYmVjYXVzZSBGbG9yaWRhIGlzIGEgc3RhdGUgd2l0aG91dCB2ZXJ5IGRpZmZlcmVudCBzZWFzb25zKS4gSW4gYW55IGNhc2UsIHdpdGggbGVzcyB0aGFuIDIgeWVhcnMgb2Ygb2JzZXJ2YXRpb25zLCB0aGUgdGltZSBzZXJpZXMgaXMgbm90IGxvbmcgZW5vdWdoIGZvciBtYW55IG1vZGVsLWZpdHRpbmcgZnVuY3Rpb25zIGluIHRoZSBmYWJsZSBwYWNrYWdlIHRvIGF1dG9tYXRpY2FsbHkgZXN0aW1hdGUgc2Vhc29uYWwgcGFyYW1ldGVycy4KLSBXaGlsZSBzb21lIHN0b3JlL2JyYW5kIGNvbWJpbmF0aW9ucyBzaG93IHdlYWsgdHJlbmRzIG92ZXIgdGltZSwgdGhpcyBpcyBmYXIgZnJvbSB1bml2ZXJzYWwuCi0gRGlmZmVyZW50IGJyYW5kcyBjYW4gZXhoaWJpdCB2ZXJ5IGRpZmZlcmVudCBiZWhhdmlvdXIsIGVzcGVjaWFsbHkgaW4gdGVybXMgb2YgdmFyaWF0aW9uIGFib3V0IHRoZSBtZWFuLgotIE1hbnkgb2YgdGhlIHRpbWUgc2VyaWVzIGhhdmUgbWlzc2luZyB2YWx1ZXMsIGluZGljYXRpbmcgdGhhdCB0aGUgZGF0YXNldCBpcyBpbmNvbXBsZXRlLgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTEwfQpsaWJyYXJ5KGdncGxvdDIpCgpval9kYXRhICU+JQogICAgZmlsdGVyKHN0b3JlIDwgMjUsIGJyYW5kIDwgNSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9d2VlaywgeT1sb2dtb3ZlKSkgKwogICAgICAgIGdlb21fbGluZSgpICsKICAgICAgICBzY2FsZV94X2RhdGUobGFiZWxzPU5VTEwpICsKICAgICAgICBmYWNldF9ncmlkKHZhcnMoc3RvcmUpLCB2YXJzKGJyYW5kKSwgbGFiZWxsZXI9ImxhYmVsX2JvdGgiKQpgYGAKCkZpbmFsbHksIHdlIHNwbGl0IHRoZSBkYXRhc2V0IGludG8gc2VwYXJhdGUgc2FtcGxlcyBmb3IgdHJhaW5pbmcgYW5kIHRlc3RpbmcuIFRoZSBzY2hlbWEgdXNlZCBpcyBicm9hZGx5IHRpbWUgc2VyaWVzIGNyb3NzLXZhbGlkYXRpb24sIHdoZXJlYnkgd2UgdHJhaW4gYSBtb2RlbCBvbiBkYXRhIHVwIHRvIHRpbWUgJHQkLCB0ZXN0IGl0IG9uIGRhdGEgZm9yIHRpbWVzICR0KzEkIHRvICR0K2skLCB0aGVuIHRyYWluIG9uIGRhdGEgdXAgdG8gdGltZSAkdCtrJCwgdGVzdCBpdCBvbiBkYXRhIGZvciB0aW1lcyAkdCtrKzEkIHRvICR0KzJrJCwgYW5kIHNvIG9uLiBJbiB0aGlzIHNwZWNpZmljIGNhc2Ugc3R1ZHksIGhvd2V2ZXIsIHdlIGludHJvZHVjZSBhIHNtYWxsIGV4dHJhIHBpZWNlIG9mIGNvbXBsZXhpdHkgYmFzZWQgb24gZGlzY3Vzc2lvbnMgd2l0aCBkb21haW4gZXhwZXJ0cy4gV2UgdHJhaW4gYSBtb2RlbCBvbiBkYXRhIHVwIHRvIHdlZWsgJHQkLCB0aGVuIHRlc3QgaXQgb24gd2VlayAkdCsyJCB0byAkdCszJC4gVGhlbiB3ZSB0cmFpbiBvbiBkYXRhIHVwIHRvIHdlZWsgJHQrMiQsIGFuZCB0ZXN0IGl0IG9uIHdlZWtzICR0KzQkIHRvICR0KzUkLCBhbmQgc28gb24uIFRoZXJlIGlzIHRodXMgYWx3YXlzIGEgZ2FwIG9mIG9uZSB3ZWVrIGJldHdlZW4gdGhlIHRyYWluaW5nIGFuZCB0ZXN0IHNhbXBsZXMuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBpbiByZWFsaXR5LCBpbnZlbnRvcnkgcGxhbm5pbmcgYWx3YXlzIHRha2VzIHNvbWUgdGltZTsgdGhlIGdhcCBhbGxvd3Mgc3RvcmUgbWFuYWdlcnMgdG8gcHJlcGFyZSB0aGUgc3RvY2sgYmFzZWQgb24gdGhlIGZvcmVjYXN0ZWQgZGVtYW5kLgoKYGBge3J9CnN1YnNldF9val9kYXRhIDwtIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpCnsKICAgIHN0YXJ0IDwtIHllYXJ3ZWVrKHN0YXJ0X2RhdGUgKyBzdGFydCo3KQogICAgZW5kIDwtIHllYXJ3ZWVrKHN0YXJ0X2RhdGUgKyBlbmQqNykKICAgIGZpbHRlcihval9kYXRhLCB3ZWVrID49IHN0YXJ0LCB3ZWVrIDw9IGVuZCkKfQoKb2pfdHJhaW4gPC0gbGFwcGx5KHRyYWluX3BlcmlvZHMsIGZ1bmN0aW9uKGkpIHN1YnNldF9val9kYXRhKHNldHRpbmdzJEZJUlNUX1dFRUssIGkpKQpval90ZXN0IDwtIGxhcHBseSh0cmFpbl9wZXJpb2RzLCBmdW5jdGlvbihpKSBzdWJzZXRfb2pfZGF0YShpICsgc2V0dGluZ3MkR0FQLCBpICsgc2V0dGluZ3MkR0FQICsgc2V0dGluZ3MkSE9SSVpPTiAtIDEpKQoKc2F2ZShval90cmFpbiwgb2pfdGVzdCwgZmlsZT1oZXJlOjpoZXJlKCJleGFtcGxlcy9ncm9jZXJ5X3NhbGVzL1IvZGF0YS5SZGF0YSIpKQoKaGVhZChval90cmFpbltbMV1dKQoKaGVhZChval90ZXN0W1sxXV0pCmBgYAo=
+ + + +
+ + + + + + + + + + + + + + + + diff --git a/examples/grocery_sales/R/02_basic_models.Rmd b/examples/grocery_sales/R/02_basic_models.Rmd new file mode 100644 index 00000000..6dda9451 --- /dev/null +++ b/examples/grocery_sales/R/02_basic_models.Rmd @@ -0,0 +1,87 @@ +--- +title: Basic models +output: html_notebook +--- + +_Copyright (c) Microsoft Corporation._
+_Licensed under the MIT License._ + +```{r, echo=FALSE, results="hide", message=FALSE} +library(tidyr) +library(dplyr) +library(tsibble) +library(feasts) +library(fable) +``` + +We fit some simple models to the orange juice data for illustrative purposes. Here, each model is actually a _group_ of models, one for each combination of store and brand. This is the standard approach taken in statistical forecasting, and is supported out-of-the-box by the tidyverts framework. + +- `mean`: This is just a simple mean. +- `naive`: A random walk model without any other components. This amounts to setting all forecast values to the last observed value. +- `drift`: This adjusts the `naive` model to incorporate a straight-line trend. +- `arima`: An ARIMA model with the parameter values estimated from the data. + +Note that the model training process is embarrassingly parallel on 3 levels: + +- We have multiple independent training datasets; +- For which we fit multiple independent models; +- Within which we have independent sub-models for each store and brand. + +This lets us speed up the training significantly. While the `fable::model` function can fit multiple models in parallel, we will run it sequentially here and instead parallelise by dataset. This avoids contention for cores, and also results in the simplest code. As a guard against returning invalid results, we also specify the argument `.safely=FALSE`; this forces `model` to throw an error if a model algorithm fails. + +```{r} +srcdir <- here::here("R_utils") +for(src in dir(srcdir, full.names=TRUE)) source(src) + +load_objects("grocery_sales", "data.Rdata") + +cl <- make_cluster(libs=c("tidyr", "dplyr", "fable", "tsibble", "feasts")) + +oj_modelset_basic <- parallel::parLapply(cl, oj_train, function(df) +{ + model(df, + mean=MEAN(logmove), + naive=NAIVE(logmove), + drift=RW(logmove ~ drift()), + arima=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0)), + .safely=FALSE + ) +}) +oj_fcast_basic <- parallel::clusterMap(cl, get_forecasts, oj_modelset_basic, oj_test) + +save_objects(oj_modelset_basic, oj_fcast_basic, + example="grocery_sales", file="model_basic.Rdata") + +do.call(rbind, oj_fcast_basic) %>% + mutate_at(-(1:3), exp) %>% + eval_forecasts() +``` + +The ARIMA model does the best of the simple models, but not any better than a simple mean. + +Having fit some basic models, we can also try an exponential smoothing model, fit using the `ETS` function. Unlike the others, `ETS` does not currently support time series with missing values; we therefore have to use one of the other models to impute missing values first via the `interpolate` function. + +```{r} +oj_modelset_ets <- parallel::clusterMap(cl, function(df, basicmod) +{ + df %>% + interpolate(object=select(basicmod, -c(mean, naive, drift))) %>% + model( + ets=ETS(logmove ~ error("A") + trend("A") + season("N")), + .safely=FALSE + ) +}, oj_train, oj_modelset_basic) + +oj_fcast_ets <- parallel::clusterMap(cl, get_forecasts, oj_modelset_ets, oj_test) + +destroy_cluster(cl) + +save_objects(oj_modelset_ets, oj_fcast_ets, + example="grocery_sales", file="model_ets.Rdata") + +do.call(rbind, oj_fcast_ets) %>% + mutate_at(-(1:3), exp) %>% + eval_forecasts() +``` + +The ETS model does _worse_ than the ARIMA model, something that should not be a surprise given the lack of strong seasonality and trend in this dataset. We conclude that any simple univariate approach is unlikely to do well. diff --git a/examples/grocery_sales/R/02_basic_models.nb.html b/examples/grocery_sales/R/02_basic_models.nb.html new file mode 100644 index 00000000..6f91ee65 --- /dev/null +++ b/examples/grocery_sales/R/02_basic_models.nb.html @@ -0,0 +1,384 @@ + + + + + + + + + + + + + +Basic models + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +

Copyright (c) Microsoft Corporation.
Licensed under the MIT License.

+ + + + +

We fit some simple models to the orange juice data for illustrative purposes. Here, each model is actually a group of models, one for each combination of store and brand. This is the standard approach taken in statistical forecasting, and is supported out-of-the-box by the tidyverts framework.

+
    +
  • mean: This is just a simple mean.
  • +
  • naive: A random walk model without any other components. This amounts to setting all forecast values to the last observed value.
  • +
  • drift: This adjusts the naive model to incorporate a straight-line trend.
  • +
  • arima: An ARIMA model with the parameter values estimated from the data.
  • +
+

Note that the model training process is embarrassingly parallel on 3 levels:

+
    +
  • We have multiple independent training datasets;
  • +
  • For which we fit multiple independent models;
  • +
  • Within which we have independent sub-models for each store and brand.
  • +
+

This lets us speed up the training significantly. While the fable::model function can fit multiple models in parallel, we will run it sequentially here and instead parallelise by dataset. This avoids contention for cores, and also results in the simplest code. As a guard against returning invalid results, we also specify the argument .safely=FALSE; this forces model to throw an error if a model algorithm fails.

+ + + +
srcdir <- here::here("R_utils")
+for(src in dir(srcdir, full.names=TRUE)) source(src)
+
+load_objects("grocery_sales", "data.Rdata")
+
+cl <- make_cluster(libs=c("tidyr", "dplyr", "fable", "tsibble", "feasts"))
+
+oj_modelset_basic <- parallel::parLapply(cl, oj_train, function(df)
+{
+    model(df,
+        mean=MEAN(logmove),
+        naive=NAIVE(logmove),
+        drift=RW(logmove ~ drift()),
+        arima=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0)),
+        .safely=FALSE
+    )
+})
+oj_fcast_basic <- parallel::clusterMap(cl, get_forecasts, oj_modelset_basic, oj_test)
+
+save_objects(oj_modelset_basic, oj_fcast_basic,
+             example="grocery_sales", file="model_basic.Rdata")
+
+do.call(rbind, oj_fcast_basic) %>%
+    mutate_at(-(1:3), exp) %>%
+    eval_forecasts()
+ +
+ +
+ + +

The ARIMA model does the best of the simple models, but not any better than a simple mean.

+

Having fit some basic models, we can also try an exponential smoothing model, fit using the ETS function. Unlike the others, ETS does not currently support time series with missing values; we therefore have to use one of the other models to impute missing values first via the interpolate function.

+ + + +
oj_modelset_ets <- parallel::clusterMap(cl, function(df, basicmod)
+{
+    df %>%
+        interpolate(object=select(basicmod, -c(mean, naive, drift))) %>%
+        model(
+            ets=ETS(logmove ~ error("A") + trend("A") + season("N")),
+            .safely=FALSE
+        )
+}, oj_train, oj_modelset_basic)
+
+oj_fcast_ets <- parallel::clusterMap(cl, get_forecasts, oj_modelset_ets, oj_test)
+
+destroy_cluster(cl)
+
+save_objects(oj_modelset_ets, oj_fcast_ets,
+             example="grocery_sales", file="model_ets.Rdata")
+
+do.call(rbind, oj_fcast_ets) %>%
+    mutate_at(-(1:3), exp) %>%
+    eval_forecasts()
+ +
+ +
+ + +

The ETS model does worse than the ARIMA model, something that should not be a surprise given the lack of strong seasonality and trend in this dataset. We conclude that any simple univariate approach is unlikely to do well.

+ + +
LS0tCnRpdGxlOiBCYXNpYyBtb2RlbHMKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKX0NvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLl88YnIvPgpfTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLl8KCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSJoaWRlIiwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5cikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0c2liYmxlKQpsaWJyYXJ5KGZlYXN0cykKbGlicmFyeShmYWJsZSkKYGBgCgpXZSBmaXQgc29tZSBzaW1wbGUgbW9kZWxzIHRvIHRoZSBvcmFuZ2UganVpY2UgZGF0YSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLiBIZXJlLCBlYWNoIG1vZGVsIGlzIGFjdHVhbGx5IGEgX2dyb3VwXyBvZiBtb2RlbHMsIG9uZSBmb3IgZWFjaCBjb21iaW5hdGlvbiBvZiBzdG9yZSBhbmQgYnJhbmQuIFRoaXMgaXMgdGhlIHN0YW5kYXJkIGFwcHJvYWNoIHRha2VuIGluIHN0YXRpc3RpY2FsIGZvcmVjYXN0aW5nLCBhbmQgaXMgc3VwcG9ydGVkIG91dC1vZi10aGUtYm94IGJ5IHRoZSB0aWR5dmVydHMgZnJhbWV3b3JrLgoKLSBgbWVhbmA6IFRoaXMgaXMganVzdCBhIHNpbXBsZSBtZWFuLgotIGBuYWl2ZWA6IEEgcmFuZG9tIHdhbGsgbW9kZWwgd2l0aG91dCBhbnkgb3RoZXIgY29tcG9uZW50cy4gVGhpcyBhbW91bnRzIHRvIHNldHRpbmcgYWxsIGZvcmVjYXN0IHZhbHVlcyB0byB0aGUgbGFzdCBvYnNlcnZlZCB2YWx1ZS4KLSBgZHJpZnRgOiBUaGlzIGFkanVzdHMgdGhlIGBuYWl2ZWAgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgYSBzdHJhaWdodC1saW5lIHRyZW5kLgotIGBhcmltYWA6IEFuIEFSSU1BIG1vZGVsIHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZXMgZXN0aW1hdGVkIGZyb20gdGhlIGRhdGEuCgpOb3RlIHRoYXQgdGhlIG1vZGVsIHRyYWluaW5nIHByb2Nlc3MgaXMgZW1iYXJyYXNzaW5nbHkgcGFyYWxsZWwgb24gMyBsZXZlbHM6CgotIFdlIGhhdmUgbXVsdGlwbGUgaW5kZXBlbmRlbnQgdHJhaW5pbmcgZGF0YXNldHM7Ci0gRm9yIHdoaWNoIHdlIGZpdCBtdWx0aXBsZSBpbmRlcGVuZGVudCBtb2RlbHM7Ci0gV2l0aGluIHdoaWNoIHdlIGhhdmUgaW5kZXBlbmRlbnQgc3ViLW1vZGVscyBmb3IgZWFjaCBzdG9yZSBhbmQgYnJhbmQuCgpUaGlzIGxldHMgdXMgc3BlZWQgdXAgdGhlIHRyYWluaW5nIHNpZ25pZmljYW50bHkuIFdoaWxlIHRoZSBgZmFibGU6Om1vZGVsYCBmdW5jdGlvbiBjYW4gZml0IG11bHRpcGxlIG1vZGVscyBpbiBwYXJhbGxlbCwgd2Ugd2lsbCBydW4gaXQgc2VxdWVudGlhbGx5IGhlcmUgYW5kIGluc3RlYWQgcGFyYWxsZWxpc2UgYnkgZGF0YXNldC4gVGhpcyBhdm9pZHMgY29udGVudGlvbiBmb3IgY29yZXMsIGFuZCBhbHNvIHJlc3VsdHMgaW4gdGhlIHNpbXBsZXN0IGNvZGUuIEFzIGEgZ3VhcmQgYWdhaW5zdCByZXR1cm5pbmcgaW52YWxpZCByZXN1bHRzLCB3ZSBhbHNvIHNwZWNpZnkgdGhlIGFyZ3VtZW50IGAuc2FmZWx5PUZBTFNFYDsgdGhpcyBmb3JjZXMgYG1vZGVsYCB0byB0aHJvdyBhbiBlcnJvciBpZiBhIG1vZGVsIGFsZ29yaXRobSBmYWlscy4KCmBgYHtyfQpzcmNkaXIgPC0gaGVyZTo6aGVyZSgiUl91dGlscyIpCmZvcihzcmMgaW4gZGlyKHNyY2RpciwgZnVsbC5uYW1lcz1UUlVFKSkgc291cmNlKHNyYykKCmxvYWRfb2JqZWN0cygiZ3JvY2VyeV9zYWxlcyIsICJkYXRhLlJkYXRhIikKCmNsIDwtIG1ha2VfY2x1c3RlcihsaWJzPWMoInRpZHlyIiwgImRwbHlyIiwgImZhYmxlIiwgInRzaWJibGUiLCAiZmVhc3RzIikpCgpval9tb2RlbHNldF9iYXNpYyA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBval90cmFpbiwgZnVuY3Rpb24oZGYpCnsKICAgIG1vZGVsKGRmLAogICAgICAgIG1lYW49TUVBTihsb2dtb3ZlKSwKICAgICAgICBuYWl2ZT1OQUlWRShsb2dtb3ZlKSwKICAgICAgICBkcmlmdD1SVyhsb2dtb3ZlIH4gZHJpZnQoKSksCiAgICAgICAgYXJpbWE9QVJJTUEobG9nbW92ZSB+IHBkcSgpICsgUERRKDAsIDAsIDApKSwKICAgICAgICAuc2FmZWx5PUZBTFNFCiAgICApCn0pCm9qX2ZjYXN0X2Jhc2ljIDwtIHBhcmFsbGVsOjpjbHVzdGVyTWFwKGNsLCBnZXRfZm9yZWNhc3RzLCBval9tb2RlbHNldF9iYXNpYywgb2pfdGVzdCkKCnNhdmVfb2JqZWN0cyhval9tb2RlbHNldF9iYXNpYywgb2pfZmNhc3RfYmFzaWMsCiAgICAgICAgICAgICBleGFtcGxlPSJncm9jZXJ5X3NhbGVzIiwgZmlsZT0ibW9kZWxfYmFzaWMuUmRhdGEiKQoKZG8uY2FsbChyYmluZCwgb2pfZmNhc3RfYmFzaWMpICU+JQogICAgbXV0YXRlX2F0KC0oMTozKSwgZXhwKSAlPiUKICAgIGV2YWxfZm9yZWNhc3RzKCkKYGBgCgpUaGUgQVJJTUEgbW9kZWwgZG9lcyB0aGUgYmVzdCBvZiB0aGUgc2ltcGxlIG1vZGVscywgYnV0IG5vdCBhbnkgYmV0dGVyIHRoYW4gYSBzaW1wbGUgbWVhbi4KCkhhdmluZyBmaXQgc29tZSBiYXNpYyBtb2RlbHMsIHdlIGNhbiBhbHNvIHRyeSBhbiBleHBvbmVudGlhbCBzbW9vdGhpbmcgbW9kZWwsIGZpdCB1c2luZyB0aGUgYEVUU2AgZnVuY3Rpb24uIFVubGlrZSB0aGUgb3RoZXJzLCBgRVRTYCBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCB0aW1lIHNlcmllcyB3aXRoIG1pc3NpbmcgdmFsdWVzOyB3ZSB0aGVyZWZvcmUgaGF2ZSB0byB1c2Ugb25lIG9mIHRoZSBvdGhlciBtb2RlbHMgdG8gaW1wdXRlIG1pc3NpbmcgdmFsdWVzIGZpcnN0IHZpYSB0aGUgYGludGVycG9sYXRlYCBmdW5jdGlvbi4KCmBgYHtyfQpval9tb2RlbHNldF9ldHMgPC0gcGFyYWxsZWw6OmNsdXN0ZXJNYXAoY2wsIGZ1bmN0aW9uKGRmLCBiYXNpY21vZCkKewogICAgZGYgJT4lCiAgICAgICAgaW50ZXJwb2xhdGUob2JqZWN0PXNlbGVjdChiYXNpY21vZCwgLWMobWVhbiwgbmFpdmUsIGRyaWZ0KSkpICU+JQogICAgICAgIG1vZGVsKAogICAgICAgICAgICBldHM9RVRTKGxvZ21vdmUgfiBlcnJvcigiQSIpICsgdHJlbmQoIkEiKSArIHNlYXNvbigiTiIpKSwKICAgICAgICAgICAgLnNhZmVseT1GQUxTRQogICAgICAgICkKfSwgb2pfdHJhaW4sIG9qX21vZGVsc2V0X2Jhc2ljKQoKb2pfZmNhc3RfZXRzIDwtIHBhcmFsbGVsOjpjbHVzdGVyTWFwKGNsLCBnZXRfZm9yZWNhc3RzLCBval9tb2RlbHNldF9ldHMsIG9qX3Rlc3QpCgpkZXN0cm95X2NsdXN0ZXIoY2wpCgpzYXZlX29iamVjdHMob2pfbW9kZWxzZXRfZXRzLCBval9mY2FzdF9ldHMsCiAgICAgICAgICAgICBleGFtcGxlPSJncm9jZXJ5X3NhbGVzIiwgZmlsZT0ibW9kZWxfZXRzLlJkYXRhIikKCmRvLmNhbGwocmJpbmQsIG9qX2ZjYXN0X2V0cykgJT4lCiAgICBtdXRhdGVfYXQoLSgxOjMpLCBleHApICU+JQogICAgZXZhbF9mb3JlY2FzdHMoKQpgYGAKClRoZSBFVFMgbW9kZWwgZG9lcyBfd29yc2VfIHRoYW4gdGhlIEFSSU1BIG1vZGVsLCBzb21ldGhpbmcgdGhhdCBzaG91bGQgbm90IGJlIGEgc3VycHJpc2UgZ2l2ZW4gdGhlIGxhY2sgb2Ygc3Ryb25nIHNlYXNvbmFsaXR5IGFuZCB0cmVuZCBpbiB0aGlzIGRhdGFzZXQuIFdlIGNvbmNsdWRlIHRoYXQgYW55IHNpbXBsZSB1bml2YXJpYXRlIGFwcHJvYWNoIGlzIHVubGlrZWx5IHRvIGRvIHdlbGwuCg==
+ + + +
+ + + + + + + + + + + + + + + + diff --git a/examples/grocery_sales/R/02a_reg_models.Rmd b/examples/grocery_sales/R/02a_reg_models.Rmd new file mode 100644 index 00000000..581f4e35 --- /dev/null +++ b/examples/grocery_sales/R/02a_reg_models.Rmd @@ -0,0 +1,86 @@ +--- +title: ARIMA-Regression models +output: html_notebook +--- + +_Copyright (c) Microsoft Corporation._
+_Licensed under the MIT License._ + +```{r, echo=FALSE, results="hide", message=FALSE} +library(tidyr) +library(dplyr) +library(tsibble) +library(feasts) +library(fable) +``` + +This notebook builds on the output from "Basic models" by including regressor variables in the ARIMA model(s). We fit the following model types: + +- `ar_trend` includes only a linear trend over time. +- `ar_reg` allows stepwise selection of independent regressors. +- `ar_reg_price`: rather than allowing the algorithm to select from the 11 price variables, we use only the price relevant to each brand. This is to guard against possible overfitting, something that classical stepwise procedures are wont to do. +- `ar_reg_price_trend` is the same as `ar_reg_price`, but including a linear trend. + +As part of the modelling, we also compute a new independent variable `maxpricediff`, the log-ratio of the price of this brand compared to the best competing price. A positive `maxpricediff` means this brand is cheaper than all the other brands, and a negative `maxpricediff` means it is more expensive. + +```{r} +srcdir <- here::here("R_utils") +for(src in dir(srcdir, full.names=TRUE)) source(src) + +load_objects("grocery_sales", "data.Rdata") + +cl <- make_cluster(libs=c("tidyr", "dplyr", "fable", "tsibble", "feasts")) + +# add extra regression variables to training and test datasets +add_regvars <- function(df) +{ + df %>% + group_by(store, brand) %>% + group_modify(~ { + pricevars <- grep("price", names(.x), value=TRUE) + thispricevar <- unique(paste0("price", .y$brand)) + best_other_price <- do.call(pmin, .x[setdiff(pricevars, thispricevar)]) + .x$price <- .x[[thispricevar]] + .x$maxpricediff <- log(best_other_price/.x$price) + .x + }) %>% + ungroup() %>% + mutate(week=yearweek(week)) %>% # need to recreate this variable because of tsibble/vctrs issues + as_tsibble(week, key=c(store, brand)) +} + +oj_trainreg <- parallel::parLapply(cl, oj_train, add_regvars) +oj_testreg <- parallel::parLapply(cl, oj_test, add_regvars) + +save_objects(oj_trainreg, oj_testreg, + example="grocery_sales", file="data_reg.Rdata") + +oj_modelset_reg <- parallel::parLapply(cl, oj_trainreg, function(df) +{ + model(df, + ar_trend=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0) + trend()), + + ar_reg=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0) + deal + feat + maxpricediff + + price1 + price2 + price3 + price4 + price5 + price6 + price7 + price8 + price9 + price10 + price11), + + ar_reg_price=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0) + deal + feat + maxpricediff + price), + + ar_reg_price_trend=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0) + trend() + deal + feat + maxpricediff + price), + + .safely=FALSE + ) +}) + +oj_fcast_reg <- parallel::clusterMap(cl, get_forecasts, oj_modelset_reg, oj_testreg) + +destroy_cluster(cl) + +save_objects(oj_modelset_reg, oj_fcast_reg, + example="grocery_sales", file="model_reg.Rdata") + +do.call(rbind, oj_fcast_reg) %>% + mutate_at(-(1:3), exp) %>% + eval_forecasts() +``` + +This shows that the models incorporating price are a significant improvement over the previous naive models. The model that uses stepwise selection to choose the best price variable does worse than the one where we choose the price beforehand, confirming the suspicion that stepwise leads to overfitting in this case. diff --git a/examples/grocery_sales/R/02a_reg_models.nb.html b/examples/grocery_sales/R/02a_reg_models.nb.html new file mode 100644 index 00000000..dea3ef98 --- /dev/null +++ b/examples/grocery_sales/R/02a_reg_models.nb.html @@ -0,0 +1,423 @@ + + + + + + + + + + + + + ARIMA-Regression models + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +

Copyright (c) Microsoft Corporation.
Licensed under the MIT License.

+ + + + +

This notebook builds on the output from “Basic models” by including regressor variables in the ARIMA model(s). We + fit the following model types:

+
    +
  • ar_trend includes only a linear trend over time.
  • +
  • ar_reg allows stepwise selection of independent regressors.
  • +
  • ar_reg_price: rather than allowing the algorithm to select from the 11 price variables, we use + only the price relevant to each brand. This is to guard against possible overfitting, something that classical + stepwise procedures are wont to do.
  • +
  • ar_reg_price_trend is the same as ar_reg_price, but including a linear trend.
  • +
+

As part of the modelling, we also compute a new independent variable maxpricediff, the log-ratio of + the price of this brand compared to the best competing price. A positive maxpricediff means this + brand is cheaper than all the other brands, and a negative maxpricediff means it is more expensive. +

+ + + +
srcdir <- here::here("R_utils")
+for(src in dir(srcdir, full.names=TRUE)) source(src)
+
+load_objects("grocery_sales", "data.Rdata")
+
+cl <- make_cluster(libs=c("tidyr", "dplyr", "fable", "tsibble", "feasts"))
+
+# add extra regression variables to training and test datasets
+add_regvars <- function(df)
+{
+    df %>%
+        group_by(store, brand) %>%
+        group_modify(~ {
+            pricevars <- grep("price", names(.x), value=TRUE)
+            thispricevar <- unique(paste0("price", .y$brand))
+            best_other_price <- do.call(pmin, .x[setdiff(pricevars, thispricevar)])
+            .x$price <- .x[[thispricevar]]
+            .x$maxpricediff <- log(best_other_price/.x$price)
+            .x
+        }) %>%
+        ungroup() %>%
+        mutate(week=yearweek(week)) %>%  # need to recreate this variable because of tsibble/vctrs issues
+        as_tsibble(week, key=c(store, brand))
+}
+
+oj_trainreg <- parallel::parLapply(cl, oj_train, add_regvars)
+oj_testreg <- parallel::parLapply(cl, oj_test, add_regvars)
+
+save_objects(oj_trainreg, oj_testreg,
+             example="grocery_sales", file="data_reg.Rdata")
+
+oj_modelset_reg <- parallel::parLapply(cl, oj_trainreg, function(df)
+{
+    model(df,
+        ar_trend=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0) + trend()),
+
+        ar_reg=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0) + deal + feat + maxpricediff +
+            price1 + price2 + price3 + price4 + price5 + price6 + price7 + price8 + price9 + price10 + price11),
+
+        ar_reg_price=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0) + deal + feat + maxpricediff + price),
+
+        ar_reg_price_trend=ARIMA(logmove ~ pdq() + PDQ(0, 0, 0) + trend() + deal + feat + maxpricediff + price),
+
+        .safely=FALSE
+    )
+})
+
+oj_fcast_reg <- parallel::clusterMap(cl, get_forecasts, oj_modelset_reg, oj_testreg)
+
+destroy_cluster(cl)
+
+save_objects(oj_modelset_reg, oj_fcast_reg,
+             example="grocery_sales", file="model_reg.Rdata")
+
+do.call(rbind, oj_fcast_reg) %>%
+    mutate_at(-(1:3), exp) %>%
+    eval_forecasts()
+ +
+ +
+ + +

This shows that the models incorporating price are a significant improvement over the previous naive models. The + model that uses stepwise selection to choose the best price variable does worse than the one where we choose the + price beforehand, confirming the suspicion that stepwise leads to overfitting in this case.

+ + +
+ LS0tCnRpdGxlOiBBUklNQS1SZWdyZXNzaW9uIG1vZGVscwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpfQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXzxici8+Cl9MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXwoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9ImhpZGUiLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRzaWJibGUpCmxpYnJhcnkoZmVhc3RzKQpsaWJyYXJ5KGZhYmxlKQpgYGAKClRoaXMgbm90ZWJvb2sgYnVpbGRzIG9uIHRoZSBvdXRwdXQgZnJvbSAiQmFzaWMgbW9kZWxzIiBieSBpbmNsdWRpbmcgcmVncmVzc29yIHZhcmlhYmxlcyBpbiB0aGUgQVJJTUEgbW9kZWwocykuIFdlIGZpdCB0aGUgZm9sbG93aW5nIG1vZGVsIHR5cGVzOgoKLSBgYXJfdHJlbmRgIGluY2x1ZGVzIG9ubHkgYSBsaW5lYXIgdHJlbmQgb3ZlciB0aW1lLgotIGBhcl9yZWdgIGFsbG93cyBzdGVwd2lzZSBzZWxlY3Rpb24gb2YgaW5kZXBlbmRlbnQgcmVncmVzc29ycy4KLSBgYXJfcmVnX3ByaWNlYDogcmF0aGVyIHRoYW4gYWxsb3dpbmcgdGhlIGFsZ29yaXRobSB0byBzZWxlY3QgZnJvbSB0aGUgMTEgcHJpY2UgdmFyaWFibGVzLCB3ZSB1c2Ugb25seSB0aGUgcHJpY2UgcmVsZXZhbnQgdG8gZWFjaCBicmFuZC4gVGhpcyBpcyB0byBndWFyZCBhZ2FpbnN0IHBvc3NpYmxlIG92ZXJmaXR0aW5nLCBzb21ldGhpbmcgdGhhdCBjbGFzc2ljYWwgc3RlcHdpc2UgcHJvY2VkdXJlcyBhcmUgd29udCB0byBkby4KLSBgYXJfcmVnX3ByaWNlX3RyZW5kYCBpcyB0aGUgc2FtZSBhcyBgYXJfcmVnX3ByaWNlYCwgYnV0IGluY2x1ZGluZyBhIGxpbmVhciB0cmVuZC4KCkFzIHBhcnQgb2YgdGhlIG1vZGVsbGluZywgd2UgYWxzbyBjb21wdXRlIGEgbmV3IGluZGVwZW5kZW50IHZhcmlhYmxlIGBtYXhwcmljZWRpZmZgLCB0aGUgbG9nLXJhdGlvIG9mIHRoZSBwcmljZSBvZiB0aGlzIGJyYW5kIGNvbXBhcmVkIHRvIHRoZSBiZXN0IGNvbXBldGluZyBwcmljZS4gQSBwb3NpdGl2ZSBgbWF4cHJpY2VkaWZmYCBtZWFucyB0aGlzIGJyYW5kIGlzIGNoZWFwZXIgdGhhbiBhbGwgdGhlIG90aGVyIGJyYW5kcywgYW5kIGEgbmVnYXRpdmUgYG1heHByaWNlZGlmZmAgbWVhbnMgaXQgaXMgbW9yZSBleHBlbnNpdmUuCgpgYGB7cn0Kc3JjZGlyIDwtIGhlcmU6OmhlcmUoIlJfdXRpbHMiKQpmb3Ioc3JjIGluIGRpcihzcmNkaXIsIGZ1bGwubmFtZXM9VFJVRSkpIHNvdXJjZShzcmMpCgpsb2FkX29iamVjdHMoImdyb2Nlcnlfc2FsZXMiLCAiZGF0YS5SZGF0YSIpCgpjbCA8LSBtYWtlX2NsdXN0ZXIobGlicz1jKCJ0aWR5ciIsICJkcGx5ciIsICJmYWJsZSIsICJ0c2liYmxlIiwgImZlYXN0cyIpKQoKIyBhZGQgZXh0cmEgcmVncmVzc2lvbiB2YXJpYWJsZXMgdG8gdHJhaW5pbmcgYW5kIHRlc3QgZGF0YXNldHMKYWRkX3JlZ3ZhcnMgPC0gZnVuY3Rpb24oZGYpCnsKICAgIGRmICU+JQogICAgICAgIGdyb3VwX2J5KHN0b3JlLCBicmFuZCkgJT4lCiAgICAgICAgZ3JvdXBfbW9kaWZ5KH4gewogICAgICAgICAgICBwcmljZXZhcnMgPC0gZ3JlcCgicHJpY2UiLCBuYW1lcygueCksIHZhbHVlPVRSVUUpCiAgICAgICAgICAgIHRoaXNwcmljZXZhciA8LSB1bmlxdWUocGFzdGUwKCJwcmljZSIsIC55JGJyYW5kKSkKICAgICAgICAgICAgYmVzdF9vdGhlcl9wcmljZSA8LSBkby5jYWxsKHBtaW4sIC54W3NldGRpZmYocHJpY2V2YXJzLCB0aGlzcHJpY2V2YXIpXSkKICAgICAgICAgICAgLngkcHJpY2UgPC0gLnhbW3RoaXNwcmljZXZhcl1dCiAgICAgICAgICAgIC54JG1heHByaWNlZGlmZiA8LSBsb2coYmVzdF9vdGhlcl9wcmljZS8ueCRwcmljZSkKICAgICAgICAgICAgLngKICAgICAgICB9KSAlPiUKICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgbXV0YXRlKHdlZWs9eWVhcndlZWsod2VlaykpICU+JSAgIyBuZWVkIHRvIHJlY3JlYXRlIHRoaXMgdmFyaWFibGUgYmVjYXVzZSBvZiB0c2liYmxlL3ZjdHJzIGlzc3VlcwogICAgICAgIGFzX3RzaWJibGUod2Vlaywga2V5PWMoc3RvcmUsIGJyYW5kKSkKfQoKb2pfdHJhaW5yZWcgPC0gcGFyYWxsZWw6OnBhckxhcHBseShjbCwgb2pfdHJhaW4sIGFkZF9yZWd2YXJzKQpval90ZXN0cmVnIDwtIHBhcmFsbGVsOjpwYXJMYXBwbHkoY2wsIG9qX3Rlc3QsIGFkZF9yZWd2YXJzKQoKc2F2ZV9vYmplY3RzKG9qX3RyYWlucmVnLCBval90ZXN0cmVnLAogICAgICAgICAgICAgZXhhbXBsZT0iZ3JvY2VyeV9zYWxlcyIsIGZpbGU9ImRhdGFfcmVnLlJkYXRhIikKCm9qX21vZGVsc2V0X3JlZyA8LSBwYXJhbGxlbDo6cGFyTGFwcGx5KGNsLCBval90cmFpbnJlZywgZnVuY3Rpb24oZGYpCnsKICAgIG1vZGVsKGRmLAogICAgICAgIGFyX3RyZW5kPUFSSU1BKGxvZ21vdmUgfiBwZHEoKSArIFBEUSgwLCAwLCAwKSArIHRyZW5kKCkpLAoKICAgICAgICBhcl9yZWc9QVJJTUEobG9nbW92ZSB+IHBkcSgpICsgUERRKDAsIDAsIDApICsgZGVhbCArIGZlYXQgKyBtYXhwcmljZWRpZmYgKwogICAgICAgICAgICBwcmljZTEgKyBwcmljZTIgKyBwcmljZTMgKyBwcmljZTQgKyBwcmljZTUgKyBwcmljZTYgKyBwcmljZTcgKyBwcmljZTggKyBwcmljZTkgKyBwcmljZTEwICsgcHJpY2UxMSksCgogICAgICAgIGFyX3JlZ19wcmljZT1BUklNQShsb2dtb3ZlIH4gcGRxKCkgKyBQRFEoMCwgMCwgMCkgKyBkZWFsICsgZmVhdCArIG1heHByaWNlZGlmZiArIHByaWNlKSwKCiAgICAgICAgYXJfcmVnX3ByaWNlX3RyZW5kPUFSSU1BKGxvZ21vdmUgfiBwZHEoKSArIFBEUSgwLCAwLCAwKSArIHRyZW5kKCkgKyBkZWFsICsgZmVhdCArIG1heHByaWNlZGlmZiArIHByaWNlKSwKCiAgICAgICAgLnNhZmVseT1GQUxTRQogICAgKQp9KQoKb2pfZmNhc3RfcmVnIDwtIHBhcmFsbGVsOjpjbHVzdGVyTWFwKGNsLCBnZXRfZm9yZWNhc3RzLCBval9tb2RlbHNldF9yZWcsIG9qX3Rlc3RyZWcpCgpkZXN0cm95X2NsdXN0ZXIoY2wpCgpzYXZlX29iamVjdHMob2pfbW9kZWxzZXRfcmVnLCBval9mY2FzdF9yZWcsCiAgICAgICAgICAgICBleGFtcGxlPSJncm9jZXJ5X3NhbGVzIiwgZmlsZT0ibW9kZWxfcmVnLlJkYXRhIikKCmRvLmNhbGwocmJpbmQsIG9qX2ZjYXN0X3JlZykgJT4lCiAgICBtdXRhdGVfYXQoLSgxOjMpLCBleHApICU+JQogICAgZXZhbF9mb3JlY2FzdHMoKQpgYGAKClRoaXMgc2hvd3MgdGhhdCB0aGUgbW9kZWxzIGluY29ycG9yYXRpbmcgcHJpY2UgYXJlIGEgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnQgb3ZlciB0aGUgcHJldmlvdXMgbmFpdmUgbW9kZWxzLiBUaGUgbW9kZWwgdGhhdCB1c2VzIHN0ZXB3aXNlIHNlbGVjdGlvbiB0byBjaG9vc2UgdGhlIGJlc3QgcHJpY2UgdmFyaWFibGUgZG9lcyB3b3JzZSB0aGFuIHRoZSBvbmUgd2hlcmUgd2UgY2hvb3NlIHRoZSBwcmljZSBiZWZvcmVoYW5kLCBjb25maXJtaW5nIHRoZSBzdXNwaWNpb24gdGhhdCBzdGVwd2lzZSBsZWFkcyB0byBvdmVyZml0dGluZyBpbiB0aGlzIGNhc2UuCg== +
+ + + +
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/grocery_sales/R/02b_prophet_models.Rmd b/examples/grocery_sales/R/02b_prophet_models.Rmd new file mode 100644 index 00000000..0d416e11 --- /dev/null +++ b/examples/grocery_sales/R/02b_prophet_models.Rmd @@ -0,0 +1,67 @@ +--- +title: Prophet models +output: html_notebook +--- + +_Copyright (c) Microsoft Corporation._
+_Licensed under the MIT License._ + +```{r, echo=FALSE, results="hide", message=FALSE} +library(tidyr) +library(dplyr) +library(tsibble) +library(feasts) +library(fable) +library(prophet) +library(fable.prophet) +``` + +This notebook builds a forecasting model using the [Prophet](https://facebook.github.io/prophet/) algorithm. Prophet is a time series model developed by Facebook that is designed to be simple for non-experts to use, yet flexible and powerful. + +> Prophet is a procedure for forecasting time series data based on an additive model where non-linear trends are fit with yearly, weekly, and daily seasonality, plus holiday effects. It works best with time series that have strong seasonal effects and several seasons of historical data. Prophet is robust to missing data and shifts in the trend, and typically handles outliers well. + +Here, we will use the fable.prophet package which provides a tidyverts frontend to the prophet package itself. As with ETS, prophet does not support time series with missing values, so we again impute them using the ARIMA model forecasts. + +```{r} +srcdir <- here::here("R_utils") +for(src in dir(srcdir, full.names=TRUE)) source(src) + +load_objects("grocery_sales", "data_reg.Rdata") +load_objects("grocery_sales", "model_basic.Rdata") + +cl <- make_cluster(libs=c("tidyr", "dplyr", "fable", "tsibble", "feasts", "prophet", "fable.prophet")) + +oj_modelset_pr <- parallel::clusterMap(cl, function(df, basicmod) +{ + df$logmove <- interpolate(select(basicmod, -c(mean, naive, drift)), df)$logmove + df %>% + group_by(store, brand) %>% + fill(deal:maxpricediff, .direction="downup") %>% + model( + pr=prophet(logmove ~ deal + feat + price + maxpricediff), + + pr_tune=prophet(logmove ~ deal + feat + price + maxpricediff + + growth(n_changepoints=2) + season(period=52, order=5, prior_scale=2)), + + .safely=FALSE + ) +}, oj_trainreg, oj_modelset_basic) + +oj_fcast_pr <- parallel::clusterMap(cl, function(mable, newdata, fcast_func) +{ + newdata <- newdata %>% + fill(deal:maxpricediff, .direction="downup") + fcast_func(mable, newdata) +}, oj_modelset_pr, oj_testreg, MoreArgs=list(fcast_func=get_forecasts)) + +destroy_cluster(cl) + +save_objects(oj_modelset_pr, oj_fcast_pr, + example="grocery_sales", file="model_pr.Rdata") + +do.call(rbind, oj_fcast_pr) %>% + mutate_at(-(1:3), exp) %>% + eval_forecasts() +``` + +It appears that Prophet does _not_ do better than the simple ARIMA model with regression variables. This is possibly because the dataset does not have a strong time series nature: there is no seasonality, and only weak or nonexistent trends. These are features which the Prophet algorithm is designed to detect, and their absence means that there would be little advantage in using it. diff --git a/examples/grocery_sales/R/02b_prophet_models.nb.html b/examples/grocery_sales/R/02b_prophet_models.nb.html new file mode 100644 index 00000000..4bf9ae60 --- /dev/null +++ b/examples/grocery_sales/R/02b_prophet_models.nb.html @@ -0,0 +1,356 @@ + + + + + + + + + + + + + +Prophet models + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +

Copyright (c) Microsoft Corporation.
Licensed under the MIT License.

+ + + + +

This notebook builds a forecasting model using the Prophet algorithm. Prophet is a time series model developed by Facebook that is designed to be simple for non-experts to use, yet flexible and powerful.

+
+

Prophet is a procedure for forecasting time series data based on an additive model where non-linear trends are fit with yearly, weekly, and daily seasonality, plus holiday effects. It works best with time series that have strong seasonal effects and several seasons of historical data. Prophet is robust to missing data and shifts in the trend, and typically handles outliers well.

+
+

Here, we will use the fable.prophet package which provides a tidyverts frontend to the prophet package itself. As with ETS, prophet does not support time series with missing values, so we again impute them using the ARIMA model forecasts.

+ + + +
srcdir <- here::here("R_utils")
+for(src in dir(srcdir, full.names=TRUE)) source(src)
+
+load_objects("grocery_sales", "data_reg.Rdata")
+load_objects("grocery_sales", "model_basic.Rdata")
+
+cl <- make_cluster(libs=c("tidyr", "dplyr", "fable", "tsibble", "feasts", "prophet", "fable.prophet"))
+
+oj_modelset_pr <- parallel::clusterMap(cl, function(df, basicmod)
+{
+    df$logmove <- interpolate(select(basicmod, -c(mean, naive, drift)), df)$logmove
+    df %>%
+        group_by(store, brand) %>%
+        fill(deal:maxpricediff, .direction="downup") %>%
+        model(
+            pr=prophet(logmove ~ deal + feat + price + maxpricediff),
+
+            pr_tune=prophet(logmove ~ deal + feat + price + maxpricediff +
+                growth(n_changepoints=2) + season(period=52, order=5, prior_scale=2)),
+
+            .safely=FALSE
+        )
+}, oj_trainreg, oj_modelset_basic)
+
+oj_fcast_pr <- parallel::clusterMap(cl, function(mable, newdata, fcast_func)
+{
+    newdata <- newdata %>%
+        fill(deal:maxpricediff, .direction="downup")
+    fcast_func(mable, newdata)
+}, oj_modelset_pr, oj_testreg, MoreArgs=list(fcast_func=get_forecasts))
+
+destroy_cluster(cl)
+
+save_objects(oj_modelset_pr, oj_fcast_pr,
+             example="grocery_sales", file="model_pr.Rdata")
+
+do.call(rbind, oj_fcast_pr) %>%
+    mutate_at(-(1:3), exp) %>%
+    eval_forecasts()
+ +
+ +
+ + +

It appears that Prophet does not do better than the simple ARIMA model with regression variables. This is possibly because the dataset does not have a strong time series nature: there is no seasonality, and only weak or nonexistent trends. These are features which the Prophet algorithm is designed to detect, and their absence means that there would be little advantage in using it.

+ + +
LS0tCnRpdGxlOiBQcm9waGV0IG1vZGVscwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpfQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXzxici8+Cl9MaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXwoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9ImhpZGUiLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRzaWJibGUpCmxpYnJhcnkoZmVhc3RzKQpsaWJyYXJ5KGZhYmxlKQpsaWJyYXJ5KHByb3BoZXQpCmxpYnJhcnkoZmFibGUucHJvcGhldCkKYGBgCgpUaGlzIG5vdGVib29rIGJ1aWxkcyBhIGZvcmVjYXN0aW5nIG1vZGVsIHVzaW5nIHRoZSBbUHJvcGhldF0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcHJvcGhldC8pIGFsZ29yaXRobS4gUHJvcGhldCBpcyBhIHRpbWUgc2VyaWVzIG1vZGVsIGRldmVsb3BlZCBieSBGYWNlYm9vayB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHNpbXBsZSBmb3Igbm9uLWV4cGVydHMgdG8gdXNlLCB5ZXQgZmxleGlibGUgYW5kIHBvd2VyZnVsLgoKPiBQcm9waGV0IGlzIGEgcHJvY2VkdXJlIGZvciBmb3JlY2FzdGluZyB0aW1lIHNlcmllcyBkYXRhIGJhc2VkIG9uIGFuIGFkZGl0aXZlIG1vZGVsIHdoZXJlIG5vbi1saW5lYXIgdHJlbmRzIGFyZSBmaXQgd2l0aCB5ZWFybHksIHdlZWtseSwgYW5kIGRhaWx5IHNlYXNvbmFsaXR5LCBwbHVzIGhvbGlkYXkgZWZmZWN0cy4gSXQgd29ya3MgYmVzdCB3aXRoIHRpbWUgc2VyaWVzIHRoYXQgaGF2ZSBzdHJvbmcgc2Vhc29uYWwgZWZmZWN0cyBhbmQgc2V2ZXJhbCBzZWFzb25zIG9mIGhpc3RvcmljYWwgZGF0YS4gUHJvcGhldCBpcyByb2J1c3QgdG8gbWlzc2luZyBkYXRhIGFuZCBzaGlmdHMgaW4gdGhlIHRyZW5kLCBhbmQgdHlwaWNhbGx5IGhhbmRsZXMgb3V0bGllcnMgd2VsbC4KCkhlcmUsIHdlIHdpbGwgdXNlIHRoZSBmYWJsZS5wcm9waGV0IHBhY2thZ2Ugd2hpY2ggcHJvdmlkZXMgYSB0aWR5dmVydHMgZnJvbnRlbmQgdG8gdGhlIHByb3BoZXQgcGFja2FnZSBpdHNlbGYuIEFzIHdpdGggRVRTLCBwcm9waGV0IGRvZXMgbm90IHN1cHBvcnQgdGltZSBzZXJpZXMgd2l0aCBtaXNzaW5nIHZhbHVlcywgc28gd2UgYWdhaW4gaW1wdXRlIHRoZW0gdXNpbmcgdGhlIEFSSU1BIG1vZGVsIGZvcmVjYXN0cy4KCmBgYHtyfQpzcmNkaXIgPC0gaGVyZTo6aGVyZSgiUl91dGlscyIpCmZvcihzcmMgaW4gZGlyKHNyY2RpciwgZnVsbC5uYW1lcz1UUlVFKSkgc291cmNlKHNyYykKCmxvYWRfb2JqZWN0cygiZ3JvY2VyeV9zYWxlcyIsICJkYXRhX3JlZy5SZGF0YSIpCmxvYWRfb2JqZWN0cygiZ3JvY2VyeV9zYWxlcyIsICJtb2RlbF9iYXNpYy5SZGF0YSIpCgpjbCA8LSBtYWtlX2NsdXN0ZXIobGlicz1jKCJ0aWR5ciIsICJkcGx5ciIsICJmYWJsZSIsICJ0c2liYmxlIiwgImZlYXN0cyIsICJwcm9waGV0IiwgImZhYmxlLnByb3BoZXQiKSkKCm9qX21vZGVsc2V0X3ByIDwtIHBhcmFsbGVsOjpjbHVzdGVyTWFwKGNsLCBmdW5jdGlvbihkZiwgYmFzaWNtb2QpCnsKICAgIGRmJGxvZ21vdmUgPC0gaW50ZXJwb2xhdGUoc2VsZWN0KGJhc2ljbW9kLCAtYyhtZWFuLCBuYWl2ZSwgZHJpZnQpKSwgZGYpJGxvZ21vdmUKICAgIGRmICU+JQogICAgICAgIGdyb3VwX2J5KHN0b3JlLCBicmFuZCkgJT4lCiAgICAgICAgZmlsbChkZWFsOm1heHByaWNlZGlmZiwgLmRpcmVjdGlvbj0iZG93bnVwIikgJT4lCiAgICAgICAgbW9kZWwoCiAgICAgICAgICAgIHByPXByb3BoZXQobG9nbW92ZSB+IGRlYWwgKyBmZWF0ICsgcHJpY2UgKyBtYXhwcmljZWRpZmYpLAoKICAgICAgICAgICAgcHJfdHVuZT1wcm9waGV0KGxvZ21vdmUgfiBkZWFsICsgZmVhdCArIHByaWNlICsgbWF4cHJpY2VkaWZmICsKICAgICAgICAgICAgICAgIGdyb3d0aChuX2NoYW5nZXBvaW50cz0yKSArIHNlYXNvbihwZXJpb2Q9NTIsIG9yZGVyPTUsIHByaW9yX3NjYWxlPTIpKSwKCiAgICAgICAgICAgIC5zYWZlbHk9RkFMU0UKICAgICAgICApCn0sIG9qX3RyYWlucmVnLCBval9tb2RlbHNldF9iYXNpYykKCm9qX2ZjYXN0X3ByIDwtIHBhcmFsbGVsOjpjbHVzdGVyTWFwKGNsLCBmdW5jdGlvbihtYWJsZSwgbmV3ZGF0YSwgZmNhc3RfZnVuYykKewogICAgbmV3ZGF0YSA8LSBuZXdkYXRhICU+JQogICAgICAgIGZpbGwoZGVhbDptYXhwcmljZWRpZmYsIC5kaXJlY3Rpb249ImRvd251cCIpCiAgICBmY2FzdF9mdW5jKG1hYmxlLCBuZXdkYXRhKQp9LCBval9tb2RlbHNldF9wciwgb2pfdGVzdHJlZywgTW9yZUFyZ3M9bGlzdChmY2FzdF9mdW5jPWdldF9mb3JlY2FzdHMpKQoKZGVzdHJveV9jbHVzdGVyKGNsKQoKc2F2ZV9vYmplY3RzKG9qX21vZGVsc2V0X3ByLCBval9mY2FzdF9wciwKICAgICAgICAgICAgIGV4YW1wbGU9Imdyb2Nlcnlfc2FsZXMiLCBmaWxlPSJtb2RlbF9wci5SZGF0YSIpCgpkby5jYWxsKHJiaW5kLCBval9mY2FzdF9wcikgJT4lCiAgICBtdXRhdGVfYXQoLSgxOjMpLCBleHApICU+JQogICAgZXZhbF9mb3JlY2FzdHMoKQpgYGAKCkl0IGFwcGVhcnMgdGhhdCBQcm9waGV0IGRvZXMgX25vdF8gZG8gYmV0dGVyIHRoYW4gdGhlIHNpbXBsZSBBUklNQSBtb2RlbCB3aXRoIHJlZ3Jlc3Npb24gdmFyaWFibGVzLiBUaGlzIGlzIHBvc3NpYmx5IGJlY2F1c2UgdGhlIGRhdGFzZXQgZG9lcyBub3QgaGF2ZSBhIHN0cm9uZyB0aW1lIHNlcmllcyBuYXR1cmU6IHRoZXJlIGlzIG5vIHNlYXNvbmFsaXR5LCBhbmQgb25seSB3ZWFrIG9yIG5vbmV4aXN0ZW50IHRyZW5kcy4gVGhlc2UgYXJlIGZlYXR1cmVzIHdoaWNoIHRoZSBQcm9waGV0IGFsZ29yaXRobSBpcyBkZXNpZ25lZCB0byBkZXRlY3QsIGFuZCB0aGVpciBhYnNlbmNlIG1lYW5zIHRoYXQgdGhlcmUgd291bGQgYmUgbGl0dGxlIGFkdmFudGFnZSBpbiB1c2luZyBpdC4K
+ + + +
+ + + + + + + + + + + + + + + + diff --git a/examples/grocery_sales/R/README.md b/examples/grocery_sales/R/README.md new file mode 100644 index 00000000..6e3ca408 --- /dev/null +++ b/examples/grocery_sales/R/README.md @@ -0,0 +1,45 @@ +# Forecasting examples in R: orange juice retail sales + +The Rmarkdown notebooks in this directory are as follows. Each notebook also has a corresponding HTML file, which is the rendered output from running the code. + +- [`01_dataprep.Rmd`](01_dataprep.Rmd) creates the training and test datasets +- [`02_basic_models.Rmd`](02_basic_models.Rmd) fits a range of simple time series models to the data, including ARIMA and ETS. +- [`02a_reg_models.Rmd`](02a_reg_models.Rmd) adds independent variables as regressors to the ARIMA model. +- [`02b_prophet_models.Rmd`](02b_prophet_models.Rmd) fits some simple models using the Prophet algorithm. + +If you want to run the code in the notebooks interactively, you must start from `01_dataprep.Rmd` and proceed in sequence, as the earlier notebooks will generate artifacts (datasets/model objects) that are used by later ones. + +## Package installation + +The following packages are needed to run the basic analysis notebooks in this directory: + +- rmarkdown +- dplyr +- tidyr +- ggplot2 +- tsibble +- fable +- feasts +- yaml +- here + +It's likely that you will already have many of these (particularly the [Tidyverse](https://tidyverse.org) packages) installed, if you use R for data science tasks. The main exceptions are the packages in the [Tidyverts](https://tidyverts.org) family, which is a modern framework for time series analysis building on the Tidyverse. + +```r +install.packages("tidyverse") # installs all tidyverse packages +install.packages("rmarkdown") +install.packages("here") +install.packages(c("tsibble", "fable", "feasts")) +``` + +The following packages are needed to run the Prophet analysis notebook: + +- prophet +- fable.prophet + +While prophet is available from CRAN, its frontend for the tidyverts framework, fable.prophet, is currently on GitHub only. You can install these packages with + +```r +install.packages("prophet") +install.packages("https://github.com/mitchelloharawild/fable.prophet/archive/master.tar.gz", repos=NULL) +``` diff --git a/examples/grocery_sales/R/forecast_settings.yaml b/examples/grocery_sales/R/forecast_settings.yaml new file mode 100644 index 00000000..638662ce --- /dev/null +++ b/examples/grocery_sales/R/forecast_settings.yaml @@ -0,0 +1,6 @@ +N_SPLITS: 10 +HORIZON: 2 +GAP: 2 +FIRST_WEEK: 40 +LAST_WEEK: 156 +START_DATE: "1989-09-14" diff --git a/examples/grocery_sales/README.md b/examples/grocery_sales/README.md new file mode 100644 index 00000000..b50cafc2 --- /dev/null +++ b/examples/grocery_sales/README.md @@ -0,0 +1,26 @@ +# Forecasting examples + +This folder contains Python and R examples for building forecasting solutions on the Orange Juice dataset. The examples are presented in Python Jupyter notebooks and R Markdown files, respectively. + + +## Orange Juice Dataset + +In this scenario, we will use the Orange Juice (OJ) dataset to forecast its sales. The OJ dataset is from R package [bayesm](https://cran.r-project.org/web/packages/bayesm/index.html) and is part of the [Dominick's dataset](https://www.chicagobooth.edu/research/kilts/datasets/dominicks). + +This dataset contains the following two tables: +- **yx.cs.** - Weekly sales of refrigerated orange juice at 83 stores. This table has 106139 rows and 19 columns. It includes weekly sales and prices of 11 orange juice brands as well as information about profit, deal, and advertisement for each brand. Note that the weekly sales is captured by a column named `logmove` which corresponds to the natural logarithm of the number of units sold. To get the number of units sold, you need to apply an exponential transform to this column. +- **storedemo.csv** - Demographic information on those stores. This table has 83 rows and 13 columns. For every store, the table describes demographic information of its consumers, distance to the nearest warehouse store, average distance to the nearest 5 supermarkets, ratio of its sales to the nearest warehouse store, and ratio of its sales to the average of the nearest 5 stores. + +Note that the week number starts from 40 in this dataset, while the full Dominick's dataset has data starting from week 1 to week 400. According to [Dominick's Data Manual](https://www.chicagobooth.edu/-/media/enterprise/centers/kilts/datasets/dominicks-dataset/dominicks-manual-and-codebook_kiltscenter.aspx), week 1 starts on 09/14/1989. Please see pages 40 and 41 of the [bayesm reference manual](https://cran.r-project.org/web/packages/bayesm/bayesm.pdf) and the [Dominick's Data Manual](https://www.chicagobooth.edu/-/media/enterprise/centers/kilts/datasets/dominicks-dataset/dominicks-manual-and-codebook_kiltscenter.aspx) for more details about the data. + + + +## Summary + +The following summarizes each directory of the forecasting examples. + +| Directory | Content | Description | +|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [python](./python) | [00_quick_start/](./python/00_quick_start)
[01_prepare_data/](./python/01_prepare_data)
[02_model/](./python/02_model)
[03_model_tune_deploy/](./python/03_model_tune_deploy/) |
  • Quick start examples for single-round training
  • Data exploration and preparation notebooks
  • Multi-round training examples
  • Model tuning and deployment example
| +| [R](./R) | [01_dataprep.Rmd](R/01_dataprep.Rmd)
[02_basic_models.Rmd](R/02_basic_models.Rmd)
[02a_reg_models.Rmd](R/02a_reg_models.Rmd)
[02b_prophet_models.Rmd](R/02b_prophet_models.Rmd) |
  • Data preparation
  • Basic time series models
  • ARIMA-regression models
  • Prophet models
| + diff --git a/examples/grocery_sales/python/00_quick_start/autoarima_single_round.ipynb b/examples/grocery_sales/python/00_quick_start/autoarima_single_round.ipynb new file mode 100644 index 00000000..0d9685bf --- /dev/null +++ b/examples/grocery_sales/python/00_quick_start/autoarima_single_round.ipynb @@ -0,0 +1,1405 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ARIMA: Autoregressive Integrated Moving Average\n", + "\n", + "This notebook provides an example of how to train an ARIMA model to generate point forecasts of product sales in retail. We will train an ARIMA based model on the Orange Juice dataset.\n", + "\n", + "An ARIMA, which stands for AutoRegressive Integrated Moving Average, model can be created using an `ARIMA(p,d,q)` model within `statsmodels` library. In this notebook, we will be using an alternative library `pmdarima`, which allows us to automatically search for optimal ARIMA parameters, within a specified range. More specifically, we will be using `auto_arima` function within `pmdarima` to automatically discover the optimal parameters for an ARIMA model. This function wraps `ARIMA` and `SARIMAX` models of `statsmodels` library, that correspond to non-seasonal and seasonal model space, respectively.\n", + "\n", + "In an ARIMA model there are 3 parameters that are used to help model the major aspects of a times series: seasonality, trend, and noise. These parameters are:\n", + "- **p** is the parameter associated with the auto-regressive aspect of the model, which incorporates past values.\n", + "- **d** is the parameter associated with the integrated part of the model, which effects the amount of differencing to apply to a time series.\n", + "- **q** is the parameter associated with the moving average part of the model.,\n", + "\n", + "If our data has a seasonal component, we use a seasonal ARIMA model or `ARIMA(p,d,q)(P,D,Q)m`. In that case, we have an additional set of parameters: `P`, `D`, and `Q` which describe the autoregressive, differencing, and moving average terms for the seasonal part of the ARIMA model, and `m` refers to the number of periods in each season.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Settings and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "System version: 3.6.10 |Anaconda, Inc.| (default, Mar 23 2020, 23:13:11) \n", + "[GCC 7.3.0]\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "import math\n", + "import warnings\n", + "import itertools\n", + "import numpy as np\n", + "import pandas as pd\n", + "import scrapbook as sb\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from pmdarima.arima import auto_arima\n", + "\n", + "from fclib.common.utils import git_repo_path, module_exists\n", + "from fclib.common.plot import plot_predictions_with_history\n", + "from fclib.evaluation.evaluation_utils import MAPE\n", + "from fclib.dataset.ojdata import download_ojdata, split_train_test, complete_and_fill_df\n", + "\n", + "pd.options.display.float_format = \"{:,.2f}\".format\n", + "np.set_printoptions(precision=2)\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "print(\"System version: {}\".format(sys.version))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parameters\n", + "\n", + "Next, we define global settings related to the model. We will use historical weekly sales data only, without any covariate features to train the ARIMA model. The model parameter ranges are provided in params. These are later used by the `auto_arima()` function to search the space for the optimal set of parameters. To increase the space of models to search over, increase the `max_p` and `max_q` parameters.\n", + "\n", + "> NOTE: Our data does not show a strong seasonal component (as demonstrated in data exploration example notebook), so we will not be searching over the seasonal ARIMA models. To search over the seasonal models, set `seasonal` to `True` and include `start_P`, `start_Q`, `max_P`, and `max_Q` parameters in the auto_arima() function." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Use False if you've already downloaded and split the data\n", + "DOWNLOAD_SPLIT_DATA = True\n", + "\n", + "# Data directory\n", + "DATA_DIR = os.path.join(git_repo_path(), \"ojdata\")\n", + "\n", + "# Forecasting settings\n", + "N_SPLITS = 1\n", + "HORIZON = 2\n", + "GAP = 2\n", + "FIRST_WEEK = 40\n", + "LAST_WEEK = 138\n", + "\n", + "# Parameters of ARIMA model\n", + "params = {\n", + " \"seasonal\": False,\n", + " \"start_p\": 0,\n", + " \"start_q\": 0,\n", + " \"max_p\": 5,\n", + " \"max_q\": 5,\n", + " \"m\": 52,\n", + "}\n", + "\n", + "# If True, run notebook on a subset of stores (to reduce the run time)\n", + "STORE_SUBSET = False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preparation\n", + "\n", + "We need to download the Orange Juice data and split it into training and test sets. By default, the following cell will download and spit the data. If you've already done so, you may skip this part by switching `DOWNLOAD_SPLIT_DATA` to `False`.\n", + "\n", + "We store the training data and test data using dataframes. The training data includes `train_df` and `aux_df` with `train_df` containing the historical sales up to week 135 (the time we make forecasts) and `aux_df` containing price/promotion information up until week 138. Here we assume that future price and promotion information up to a certain number of weeks ahead is predetermined and known. In our example, we will be using historical sales only, and will not be using the `aux_df` data. The test data is stored in `test_df` which contains the sales of each product in week 137 and 138. Assuming the current week is week 135, our goal is to forecast the sales in week 137 and 138 using the training data. There is a one-week gap between the current week and the first target week of forecasting as we want to leave time for planning inventory in practice.\n", + "\n", + "The setting of the forecast problem are defined in `fclib.dataset.ojdata.split_train_test` function. We can change this setting (e.g., modify the horizon of the forecast or the range of the historical data) by passing different parameters to this functions. Below, we split the data into `n_splits=1` splits, using the forecasting settings listed above in the **Parameters** section." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data already exists at the specified location.\n" + ] + } + ], + "source": [ + "if DOWNLOAD_SPLIT_DATA:\n", + " download_ojdata(DATA_DIR)\n", + " train_df_list, test_df_list, _ = split_train_test(\n", + " DATA_DIR,\n", + " n_splits=N_SPLITS,\n", + " horizon=HORIZON,\n", + " gap=GAP,\n", + " first_week=FIRST_WEEK,\n", + " last_week=LAST_WEEK,\n", + " write_csv=True,\n", + " )\n", + "\n", + " # Split returns a list, extract the dataframes from the list\n", + " train_df = train_df_list[0].reset_index()\n", + " test_df = test_df_list[0].reset_index()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Process training data\n", + "\n", + "Our time series data is not complete, since we have missing sales for some stores/products and weeks. We will fill in those missing values by propagating the last valid observation forward to next available value. We will define functions for data frame processing, then use these functions within a loop that loops over each forecasting rounds.\n", + "\n", + "Note that our time series are grouped by `store` and `brand`, while `week` represents a time step, and `logmove` represents the value to predict.\n", + "\n", + "Let's first process the training data. Note that the training data runs from `FIRST_WEEK` to `LAST_WEEK - HORIZON - GAP + 1` as defined in Parameters section above." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweeklogmove
021409.02
121468.72
221478.25
321488.99
421509.09
521518.88
621529.29
721538.95
821549.05
921578.61
\n", + "
" + ], + "text/plain": [ + " store brand week logmove\n", + "0 2 1 40 9.02\n", + "1 2 1 46 8.72\n", + "2 2 1 47 8.25\n", + "3 2 1 48 8.99\n", + "4 2 1 50 9.09\n", + "5 2 1 51 8.88\n", + "6 2 1 52 9.29\n", + "7 2 1 53 8.95\n", + "8 2 1 54 9.05\n", + "9 2 1 57 8.61" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Select only required columns\n", + "train_df = train_df[[\"store\", \"brand\", \"week\", \"logmove\"]]\n", + "train_df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that the unit sales of the products are given in logarithmic scale. We will use this quantity for training the forecasting model, as it smooths out the time series, and results in better forecasting performance. We will convert the `logmove` to a unit scale for evaluation, for consistency across our examples." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweeklogmove
021409.02
121419.02
221429.02
321439.02
421449.02
521459.02
621468.72
721478.25
821488.99
921498.99
\n", + "
" + ], + "text/plain": [ + " store brand week logmove\n", + "0 2 1 40 9.02\n", + "1 2 1 41 9.02\n", + "2 2 1 42 9.02\n", + "3 2 1 43 9.02\n", + "4 2 1 44 9.02\n", + "5 2 1 45 9.02\n", + "6 2 1 46 8.72\n", + "7 2 1 47 8.25\n", + "8 2 1 48 8.99\n", + "9 2 1 49 8.99" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create a dataframe to hold all necessary data\n", + "store_list = train_df[\"store\"].unique()\n", + "brand_list = train_df[\"brand\"].unique()\n", + "train_week_list = range(FIRST_WEEK, LAST_WEEK - (HORIZON - 1) - (GAP - 1))\n", + "\n", + "train_filled = complete_and_fill_df(train_df, stores=store_list, brands=brand_list, weeks=train_week_list)\n", + "\n", + "train_filled.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Process test data\n", + "\n", + "Let's now process the test data. Note that the test data runs from `LAST_WEEK - HORIZON + 1` to `LAST_WEEK`. Note that, in addition to filling out missing values, we also convert unit sales from logarithmic scale to the counts. We will do model training on the log scale, due to improved performance, however, we will transfrom the test data back into the unit scale (counts) by applying `math.exp()`, so that we can evaluate the performance on the unit scale." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweekactuals
0211379792
12113816960
2221376240
32213814784
4231371920
5231381408
6241371984
72413810944
82513719008
9251383904
\n", + "
" + ], + "text/plain": [ + " store brand week actuals\n", + "0 2 1 137 9792\n", + "1 2 1 138 16960\n", + "2 2 2 137 6240\n", + "3 2 2 138 14784\n", + "4 2 3 137 1920\n", + "5 2 3 138 1408\n", + "6 2 4 137 1984\n", + "7 2 4 138 10944\n", + "8 2 5 137 19008\n", + "9 2 5 138 3904" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Evaluate prediction accuracy\n", + "test_df[\"actuals\"] = test_df.logmove.apply(lambda x: round(math.exp(x)))\n", + "test_df = test_df[[\"store\", \"brand\", \"week\", \"actuals\"]]\n", + "\n", + "test_week_list = range(LAST_WEEK - HORIZON + 1, LAST_WEEK + 1)\n", + "test_filled = complete_and_fill_df(test_df, stores=store_list, brands=brand_list, weeks=test_week_list)\n", + "\n", + "test_filled.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model training\n", + "\n", + "We next train an ARIMA model for a single time series, for demonstration. We select `STORE=2` and `BRAND=6` and filter our data based on these values." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweeklogmove
566261268.52
567261278.03
568261288.15
569261298.03
570261307.74
571261317.45
572261327.70
573261337.93
574261347.27
575261356.96
\n", + "
" + ], + "text/plain": [ + " store brand week logmove\n", + "566 2 6 126 8.52\n", + "567 2 6 127 8.03\n", + "568 2 6 128 8.15\n", + "569 2 6 129 8.03\n", + "570 2 6 130 7.74\n", + "571 2 6 131 7.45\n", + "572 2 6 132 7.70\n", + "573 2 6 133 7.93\n", + "574 2 6 134 7.27\n", + "575 2 6 135 6.96" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "STORE = 2\n", + "BRAND = 6\n", + "\n", + "train_ts = train_filled.loc[(train_filled.store == STORE) & (train_filled.brand == BRAND)]\n", + "train_ts.tail(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ARIMA(callback=None, disp=0, maxiter=None, method=None, order=(1, 0, 0),\n", + " out_of_sample_size=0, scoring='mse', scoring_args={},\n", + " seasonal_order=None, solver='lbfgs', start_params=None,\n", + " suppress_warnings=False, transparams=True, trend=None,\n", + " with_intercept=True)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_ts = np.array(train_ts.logmove)\n", + "\n", + "model = auto_arima(\n", + " train_ts,\n", + " seasonal=params[\"seasonal\"],\n", + " start_p=params[\"start_p\"],\n", + " start_q=params[\"start_q\"],\n", + " max_p=params[\"max_p\"],\n", + " max_q=params[\"max_q\"],\n", + " stepwise=True,\n", + ")\n", + "\n", + "model.fit(train_ts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's look at the model summary. As seen from the summary, the selected ARIMA model is `(p=1, d=0, q=0)`. This is a relatively simple model, also referred to as first-order auto-regressive model. It indicates that the time series is stationary and can be predicted as a multiple of its own previous value, plus a constant. This is an `ARIMA(1,0,0)+constant` model." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
ARMA Model Results
Dep. Variable: y No. Observations: 96
Model: ARMA(1, 0) Log Likelihood -18.335
Method: css-mle S.D. of innovations 0.292
Date: Mon, 30 Mar 2020 AIC 42.669
Time: 16:49:09 BIC 50.362
Sample: 0 HQIC 45.779
\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err z P>|z| [0.025 0.975]
const 8.0271 0.066 120.804 0.000 7.897 8.157
ar.L1.y 0.5559 0.090 6.159 0.000 0.379 0.733
\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
Roots
Real Imaginary Modulus Frequency
AR.1 1.7990 +0.0000j 1.7990 0.0000
" + ], + "text/plain": [ + "\n", + "\"\"\"\n", + " ARMA Model Results \n", + "==============================================================================\n", + "Dep. Variable: y No. Observations: 96\n", + "Model: ARMA(1, 0) Log Likelihood -18.335\n", + "Method: css-mle S.D. of innovations 0.292\n", + "Date: Mon, 30 Mar 2020 AIC 42.669\n", + "Time: 16:49:09 BIC 50.362\n", + "Sample: 0 HQIC 45.779\n", + " \n", + "==============================================================================\n", + " coef std err z P>|z| [0.025 0.975]\n", + "------------------------------------------------------------------------------\n", + "const 8.0271 0.066 120.804 0.000 7.897 8.157\n", + "ar.L1.y 0.5559 0.090 6.159 0.000 0.379 0.733\n", + " Roots \n", + "=============================================================================\n", + " Real Imaginary Modulus Frequency\n", + "-----------------------------------------------------------------------------\n", + "AR.1 1.7990 +0.0000j 1.7990 0.0000\n", + "-----------------------------------------------------------------------------\n", + "\"\"\"" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model summary contains a lot of information. The coefficient table in the middle provides the estimates for the weights of the respective p and q terms. Notice that the coefficient of the AR1 term has a low p-value (`P>|z|` column), indicating that this term is significant. It also shows that the constant term is significant with a low p-value.\n", + "\n", + "Next, let's also examine the diagnostics plot for the selected model." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "model.plot_diagnostics(figsize=(10, 8))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the top left, the residual errors fluctuate around a mean of zero and have a uniform variance, which may indicate that there is no bias in prediction. The density plot in the top right suggests normal distribution with mean zero.\n", + "\n", + "The Correlogram, or the ACF plot, in the lower right shows the residual errors are not autocorrelated. Any detected autocorrelation in this plot suggests that there may be some pattern in the residual errors which are not explained in the model, so adding additional predictors to the model may be beneficial.\n", + "\n", + "In the bottom left, we do not see significant deviation of residuals from the red line, which indicates that the model is a good fit.\n", + "\n", + "Overall, based on the above, it seems to that the model is a good fit for this data.\n", + "\n", + "\n", + "It is worth noting that selecting the best parameters for an ARIMA model can be challenging - somewhat subjective and time intesive, and should be done following a thorough data examination (seasonality, trend, bias). We use an `auto_arima()` function to search a provided space of parameters for the best model, mostly to demonstrate its usage and functionality.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model evaluation\n", + "\n", + "Let's now take a look at the predictions. Since auto_arima model makes consecutive forecasts from the last time point, we want to forecast the next `n_periods = GAP + HORIZON - 1` points, so that we can account for the GAP, as described in the data setup. As mentioned above, we are also transforming our predictions from logarithmic scale to counts, for calculating evaluation metric." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
predictionsstorebrandweek
02,204.0026137
12,551.0026138
\n", + "
" + ], + "text/plain": [ + " predictions store brand week\n", + "0 2,204.00 2 6 137\n", + "1 2,551.00 2 6 138" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preds = model.predict(n_periods=GAP + HORIZON - 1)\n", + "\n", + "predictions = np.round(np.exp(preds[-HORIZON:]))\n", + "pred_df = pd.DataFrame({\"predictions\": predictions, \"store\": STORE, \"brand\": BRAND, \"week\": test_week_list})\n", + "\n", + "pred_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To evaluate the model, we will use *mean absolute percentage error* or **MAPE**." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
predictionsstorebrandweekactuals
02,204.00261375760
12,551.00261381440
\n", + "
" + ], + "text/plain": [ + " predictions store brand week actuals\n", + "0 2,204.00 2 6 137 5760\n", + "1 2,551.00 2 6 138 1440" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Combine actual units and predictions\n", + "test_ts = test_filled.loc[(test_filled.store == STORE) & (test_filled.brand == BRAND)]\n", + "\n", + "combined = pd.merge(pred_df, test_ts, on=[\"store\", \"brand\", \"week\"], how=\"left\")\n", + "combined" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of the forecasts is 69.44444444444444 %\n" + ] + } + ], + "source": [ + "metric_value = MAPE(combined.predictions, combined.actuals) * 100\n", + "\n", + "print(f\"MAPE of the forecasts is {metric_value} %\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model training for all stores and brands\n", + "\n", + "Now let's run model training across all the stores and brands. We will re-run the same code to automatically search for the best parameters, simply wrapped in a for loop iterating over stores and brands.\n", + "\n", + "Note that we will be using [Ray](https://ray.readthedocs.io/en/latest/#) to distribute the computation to the cores available on your machine if Ray is installed. Otherwise, we will train the models for different stores and brands sequentially. By the time we develop this example, Ray only supports Linux and MacOS. Thus, sequential training will be used on Windows. In the cells below, we first define a function that trains an ARIMA model for a specific store-brand. Then, we use the following to leverage Ray:\n", + "- `ray.init()` will start all the relevant Ray processes\n", + "- we define a function to run an ARIMA model on a single brand and single store. To turn this function into a function that can be executed remotely, we declare the function with the ` @ray.remote` decorator.\n", + "- `ray.get()` collects the results, and `ray.shutdown()` will stop Ray.\n", + "\n", + "It will take around 2.5 minutes to run the below cell on a machine with 4 cores and about 1.6 minutes on a machine with 6 cores, respectively. If you would like to further reduce the run time, you can run the below code on a subset of stores, by setting the `STORE_SUBSET` parameter to `True` in the *Parameters* section on top. This will limit the modeling to the first 20 stores.\n", + "\n", + "After Ray is initialized, you can monitor its resource utilization from [Ray dashboard](https://ray.readthedocs.io/en/latest/ray-dashboard.html). After running the following cell, you will see the URL of the dashboard like `'webui_url': 'localhost:8265'` in the printed address information. The default port of the Ray dashboard is 8265. If this port is taken, it will be launched from another port. You can directly access the dashboard through a web browser if you use a local machine. If you work with a remote VM, please do a port forwarding by executing\n", + "```\n", + "ssh -L 8265:localhost:8265 @\n", + "```\n", + "on your local machine before accessing the dashboard locally. Below is a snapshot of the Ray dashboard during a previous run of the notebook.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def train_store_brand(data, store, brand):\n", + " train_ts = data.loc[(data.store == store) & (data.brand == brand)]\n", + " train_ts = np.array(train_ts[\"logmove\"])\n", + "\n", + " model = auto_arima(\n", + " train_ts,\n", + " seasonal=params[\"seasonal\"],\n", + " start_p=params[\"start_p\"],\n", + " start_q=params[\"start_q\"],\n", + " max_p=params[\"max_p\"],\n", + " max_q=params[\"max_q\"],\n", + " stepwise=True,\n", + " error_action=\"ignore\",\n", + " )\n", + "\n", + " model.fit(train_ts)\n", + " preds = model.predict(n_periods=GAP + HORIZON - 1)\n", + " predictions = np.round(np.exp(preds[-HORIZON:]))\n", + "\n", + " pred_df = pd.DataFrame({\"predictions\": predictions, \"store\": store, \"brand\": brand, \"week\": test_week_list})\n", + " test_ts = test_filled.loc[(test_filled.store == store) & (test_filled.brand == brand)]\n", + "\n", + " return pd.merge(pred_df, test_ts, on=[\"store\", \"brand\", \"week\"], how=\"left\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ray is available. Parallel training will be used. \n", + "\n", + "Initializing Ray...\n", + "Address information about the processes started by Ray:\n", + "{'node_ip_address': '172.18.9.4', 'redis_address': '172.18.9.4:62767', 'object_store_address': '/tmp/ray/session_2020-03-30_16-49-09_880221_16552/sockets/plasma_store', 'raylet_socket_name': '/tmp/ray/session_2020-03-30_16-49-09_880221_16552/sockets/raylet', 'webui_url': 'localhost:8265', 'session_dir': '/tmp/ray/session_2020-03-30_16-49-09_880221_16552'} \n", + "\n", + "Training ARIMA model...\n", + "CPU times: user 2.61 s, sys: 439 ms, total: 3.05 s\n", + "Wall time: 1min 38s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "if module_exists(\"ray\"):\n", + " print(\"Ray is available. Parallel training will be used. \\n\")\n", + " \n", + " import ray\n", + " import logging\n", + "\n", + " # Initialize Ray\n", + " print(\"Initializing Ray...\")\n", + " address_info = ray.init(log_to_driver=False, logging_level=logging.ERROR)\n", + " print(\"Address information about the processes started by Ray:\")\n", + " print(address_info, \"\\n\")\n", + "\n", + " if STORE_SUBSET:\n", + " store_list = store_list[0:20]\n", + "\n", + " @ray.remote\n", + " def ray_train_store_brand(data, store, brand):\n", + " return train_store_brand(data, store, brand)\n", + "\n", + " print(\"Training ARIMA model...\")\n", + "\n", + " # Persist input data into Ray shared memory\n", + " train_filled_id = ray.put(train_filled)\n", + "\n", + " # Train for each store/brand\n", + " results = [\n", + " ray_train_store_brand.remote(train_filled_id, store, brand)\n", + " for store, brand in itertools.product(store_list, brand_list)\n", + " ]\n", + "\n", + " result_df = pd.concat(ray.get(results), ignore_index=True)\n", + "\n", + " # Stop Ray\n", + " ray.shutdown()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If Ray is not installed, we will train all the models sequentially as follows. The training time could be several times longer compared with training the models in parallel with Ray." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 8.81 ms, sys: 8.15 ms, total: 17 ms\n", + "Wall time: 16.3 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "if not module_exists(\"ray\"):\n", + " print(\"Ray is not available. Sequential training will be used. \\n\")\n", + " \n", + " from datetime import datetime\n", + " \n", + " if STORE_SUBSET:\n", + " store_list = store_list[0:10]\n", + "\n", + " result_df = pd.DataFrame(None, columns=[\"predictions\", \"store\", \"brand\", \"week\", \"actuals\"])\n", + "\n", + " print(\"Training ARIMA model...\")\n", + " for store, brand in itertools.product(store_list, brand_list):\n", + "\n", + " if brand == 1:\n", + " print(f\"{datetime.now().time()} - Forecasting for store: {store}\")\n", + "\n", + " combined_df = train_store_brand(train_filled, store, brand)\n", + " result_df = result_df.append(combined_df, ignore_index=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's compute `MAPE` for all predictions." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "application/scrapbook.scrap.json+json": { + "data": 69.74494861298409, + "encoder": "json", + "name": "MAPE", + "version": 1 + } + }, + "metadata": { + "scrapbook": { + "data": true, + "display": false, + "name": "MAPE" + } + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of the forecasts is 69.74494861298409 %\n" + ] + } + ], + "source": [ + "metric_value = MAPE(result_df.predictions, result_df.actuals) * 100\n", + "sb.glue(\"MAPE\", metric_value)\n", + "\n", + "print(f\"MAPE of the forecasts is {metric_value} %\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When building a model with `auto_arima` for a large number of time series, it is often difficult to examine each model individually (in a similar way we did for the single time series above). As `auto_arima` searches a restricted space of the models, defined by the range of `p` and `q` parameters, we often might not find an optimal model for each time series.\n", + "\n", + "Let's plot a few examples of forecasted results." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAARRCAYAAADQPHLpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdeXzcVb3/8denS5K26Zp0YW8FZG8RCrZSFawCKgrXCxdQEa5cUNHrdlUELwIqrveC4kWxCoIIgiII/kR2CrLb2qKySYEipbQ0aWmbLkmTfH5/nPNNJ5PvZGayzUzyfj4eeUzmfLfzXc+Z8z2LuTsiIiIiIiIiIuVsWKkjICIiIiIiIiKSjwowRERERERERKTsqQBDRERERERERMqeCjBEREREREREpOypAENEREREREREyp4KMERERERERESk7KkAQ0rOzKabmZvZVVnhV8Xw6f203cPj+i/oj/UPBWZ2QTyGh5dg2+PM7FIzW25mrTEeBw50PPqSmU0zs6vNbIWZtcV9mlDqeA0VuZ5FAxwHN7OFpdp+JSm3Y2VmVWb2nJn9odRxKZaZLTQzzwrr9zQyPr+X99f6pTzpvA+swX68zez3Zva8mVWVOi4yMFSAMUTETEjmX5uZNZjZvWb2oVLHrz+Uw4+RoWqAflh8F/hP4G/At4ALgVX9vM3+dhVwCnA/8A3CPm0tZYSkbw32jOQQ92lgD+CrpY5IuUgrGBEpN3qhVRgzO9TMvmVmfzSzVfGYrcizzHfM7B4ze9nMtpjZWjNbYmbnm1ldyvxJ3j3X3/UpmzkPmEF4BssQMKLUEZABd2H8HAnsBRwHHGFmB7v750sXrVTnAN8GXumn9T8O7AM09NP6pX8dA/zD3d9X6oj0hfjm4F3A3e4+KAsVpSD7AJtLHYkKUTbHyszGAF8B7nL3xaWOTx8ZiDRyfj+uW0T61geBzwDbgKeBqQUs8zngL8BdwGvAGGAOcAFwppnNcfeXU5Z7AvhdSvjfswPcfamZ3Q58xcx+7O6bCoiXVDAVYAwx7n5B5nczm094qHzWzC519+WliFcad38VeLUf178ZeKa/1i/9bkfggVJHog9NI9SKW1nqiEjpuLueSQUqs2P1QWACoRbVoDAQaaS7P9+f6xeRPnUVcDXwpLu3FFi7apy7d6lJamYXAecSXlaelbLc0uzfLHlcDbwbOBn4WRHLSQVSE5Ihzt3vIWRQDDgEOje9MLM3mtkNZvaambVn9nVgZpNiVbKnY7Ww9bGa2JFp2zKzsWZ2cWzfv9XMnjGzz5PjOuyuD4xYje0GM3vFzJrN7FUzu9PM/i1OvwB4Mc5+alb1s9PiPDmrDJrZnmb2i7j+FjNbGb/vmTJvRz8QZna8mT1uZptjNbnrzWynXMc/ZV2nJXE0s6Nj9dv1KW2T947H5+W4/6vN7Doz2ytlnVPN7H/M7Fkz22Rmr8f/rzKzN6RtO0fc8jYLSdYRv74967hfkDHf++O18mqM/0ozu9/M0hKx7G0kVZItaxsLM+YZZmYfN7M/m1lT3O8/m9knzKzL9ZYsb6EPip/F896W61hkLFdlZp8ys9vM7KW4L2vN7G4ze3e+fclYz3Lgpfg183q9Kmu+k83sPjNbF++hp83sv82sOmu+lZZSrTPG0c3svKzw98TwrxUQVzOzU83sYTNbE+PxspndYWYnZs17hJktMLOnzGyDhefE3y1UHa1JWXfmvXSymS2O99JKC8+O6jjfO+L52hCPxTWWXhV1efwbb2b/F8/r1hifT5uZ5dvfjHWNNrNzzGxpvJ6azOwRMzu5wOUPj9ftbsBuWffGVRnzdbnP+vq4xHl3jsfkhXjdNprZrWZ2SKHHJK6n4HvZikgzrIBnYdqxiuEjzOwsM3s0HovNFqosf8rS7/8eP48ynA60kPLGMOv8nRrjssVCunqlmU1LWWZhXKbKzL5q4ZndbD18JmTMf1K8fpLtX2NmO+aYt7s0cpKZXWThft4cz80TZvZtMxtjMR8BvD3On3m9L8xYT2qTKjOrNrMvm9lf4/o3mNmfLKbxWfNm5lmmW0h3G+LxWGRmx6QsU2XhGfCXeOw2x7jcYmbvTDseKet4Y9zfRRaehc0WnrELzGzn7o6nhTzMHyykF53yOdYH92bWMdndzG6M69loIa+0f5xvcozvq/F4/dnMjkhZ347xOnzIQtOBJF90nZntkyMOZuGeezKu+5W4X+PzxL2oazrHOgo+Nxbuqfvi1/OzrtXD82ynT9Ja60H6YmZHWch7NMT9e97MvmdF9JtlZh+Myz5tZrvlm9/dl7r7EndvKXQbaYUX0a/jZ5d8dQ/dQmhye3ofrU/KmGpgCIQfggDZJam7A48B/wCuBUYBGwDig24hMB34E3A7oVrYMcDtZvYxd/9pxwZCwnMPoZDkibi+CYR2a28vKrJmZwA/BtqAW4HngCnAbEIp7q9j3CYQqrplV0Nbmmf9hwB3A2Pj+p8C9gY+BBxrZvPdfVHKomcB74/L3A+8GTgRmGVmB7p7cxG7eTxwNPBH4HLCcU7idzRwE6EZ0O+BZcDOwAeA95rZEe7+lzjvaOAhwrm8K85vhB9RxwI3Ai8UEa98lhKaKZ1P+EF+Vca0hTFOZwI/IfRX8XtC9eQpwEzg34Ef5dnGVXFd2dtYnjHPNYQ3oi8TSuId+Je47nmEc5ltEvAo0EQ4vu3A6jxxmQT8AHiYcHzXADsA7wNuM7Mz3L2QNwHfJ5zj7Ou141o1syuAjwIrYvxeJ1TD/Dow38ze5e6tcfZ7gQ+Z2d7JW2oz2wPYNU6fH5dLvCN+3lNAXC8ivDF5kXCvrY/7fAhwAnBDxrxnE+6dh4E/ADXAYYSqo4eb2TvdvS1lG/9JeJPyO8K5PpJQDXWSmd0CXB/XtwB4C/BhoD4uk62KcD9PiMtVAf9KOG97AZ/Mt8MxQ3gv8CZCVdgrCQWvRwHXmdl+7v7feVaznHBvfDZ+/37GtG6fSRn65LiY2UHAnYTr9w7C9VRPaFL4oJn9i7vfli8yxdzLxaYZGXI+C3PEKXkuHgU8C1xHyNQeAfyQ8Fw+pSf70M02xxPSnz/HWgu5fI5wzm4g7P+8uI3DzezN7r4mZZnfEu6tPxLO+2sZ2y3mmYCZfQ64OM73i/h5FOH+XJ9vPzPWM4Pwg283YDEhPR4GvDHu4+Vx3RcCp8X5LsxYxfI8668iXJdvJ7xguQwYTbgWbojp6bkpi+5GaPbyAiENmERIg2+Jz5r7Mua9ivCm9u+EY7GFUKtvHuF6uzvfcSCkuR8nHIuHCQVY+wH/AbzPzGa7e1oT2LmEZ+iDhGdJfVy2z+7NDNMJ+bin4z5PJ6SFC81sLuE63EC4JicBJwF/NLM3uvs/M9bzNuDLcV9/S0gn9ySck/eb2WHu/kTWtr9P6JPgVcIzaRsh3/FmwnO4y4/gYq/pbhRzbpL09lRC3m1hxnqW59lOr9PanqQvZvZVwj21Fvh/hOfCTOALwHvMbK67b+gu4mb2JUIz7YeB97v72jz72teS5r9/zTF9RzP7GFAHNAKPuHuueXH3rWa2GJhrZuPdveBnmlQgd9ffEPgj/IDzlPB3En6otQO7xbDpyfzAN3Osb2Fc5qSs8AmEzPgWYGpG+Llxfb8FhmWEzyA8gB24KmtdV8Xw6Rlh+xISwbXAfinx2jnj/+lp682YfnicfkFGmBESegc+lDX/iTH8max9uCCGbwAOyFrmujjt3wo8T6fF+duBo1OmTwTWETLZ+2ZN24+QqfhLRtj74vouSVlXFTA2ZdundXMNLcwKS/b98HzzZkxbDDQDU1Km1Rd5TXfZBiFT6oSMQG1G+BhgUZz2wbT7g5CRHVFEHKozr7mM8PGEjPFaYFSB68p5vWacm5uy15dxDj6TEfbRGPbJjLCPxbA74/EfnTFtCaEvgaoC4tlIyFyOTplWn/X9DYClzPf1GJcTc+zLemCfrOP8JKHQshF4e8a0YYTCIwcOzFrf8hj+IFCdET4JeD5Oe1u+c8D2Z9GXssJrCD8A2rO33c3xWw4sL+a67svjQnhxsYzwo/7tWdvZkdDn0KuZx6ubuBZ8L1N8mnEa3TwLCzhWPwSGZ4QPB66I047tyT50cxyOTraZY3oSpxbgTVnTLonTrkg5Xk7I3HeJB8U/E6bH/VxL5zR1GCFd7pJHICWNjOEPxfBz0o4ZUJO9H8XcD4Qf9w7cRsbzmFCwtDxOe0vWviXP8POz1nVUsq6MsPHxulqUeY1kTK8r8LzvRMp9QiikagN+nON4OvCxlOX68t7MPCZfyZp2XgxfSyhsyszPnEJKniEe+7Ep25lFyHf8MSv8LXE9y4BJGeE1wCNxWvZ5L+qa7qdzc0Eh689YrtdpLUWmL4TCWCcUPEzIcQyzz9/y5HgT7vkfsj1PXlPMPmet14EVBc77hXgeLyEUYjvhhc3kbq7d7L/7gF272UbyPH1PT/dJf5XxV/II6G+ATvT2m/+C+HcR4e17awy/OGPe5OGxKkcCMCtO/02ObR0bp5+VEfZcTDR2T5k/SZiuygpPHurTM8KSh+7nCtjn6WnrzZjeJcEivB124OEcyyQP3belxP8bKfMnCc3/FHieksTn5hzTP0NWYpk1PXl47xu/JwUYqQVRObZ9WjfX0MIc5+7wfPNmTFsMbAIm9sE13WUbbP/RdmTKtPlx2r0p60r9EdOL+H0++1rp6fVKyPRsIyuzEqcNJxRoPZ4Rtltc100ZYb8m1Cg5JvP4EN5utAN3FhjPRkLti7yZ6G7WURfjcGWO6+nrKct8NU77Rcq0U+O0U7PCl8fwt3Zzvf+8u3MQ49pKeLueti/J8/C7Be77cnpegNHr48L25/P3cmw/ecbkzQAWei/TszQjOT+pz8K0Y0XImDcQfuR1KYgkFJa0A78udh/y7N+ZMS7n5pienL8rUqaNJ7xl3kLnQraFZBW2ZC1X7DPhK3F9F6bM/wZC+uxZ4YfTNY08OIYtIeOHbzfHZmH2evPdD4T8Qjuwd8r8p5P17GD7fbuc9AKJl4CGjO/j4vwPkVLA2hd/hIKnF3IczyV57oO+uDeTY/Ji9jEh1A7weN2PzZo2PF5X9xWxr7cSCl1GZoT9NG7j31PmT45D9nkv6prup3NzQZHr6lVaSw/SF+DmGNblJV7GcXwtK2x5/KshFBA5IT+d9x7Os/9O4QUYq+hcGPFHMgqtM+abAnwNOIjwzJ5AqAF0b1zuOWBMjm2cHef5eG+vE/2V95+akAw958dPJ2Sa/kTIVP0yZd4nPL3Zw9z4Od7Sh5yaHD/3gdD3BWFouZc9vcOuhRnxymdO/PxjgfMX66D4eW+O6fcSqpi+ia4dSKY1K0l6Vp5YZDwezxGeHPtZOY79G+PnPoSmL/cT3tp8OVZNvY2QaVvq6VX3B8K1wP8CT5rZDTGOD3l69emeOIiQSViYMu1+Qkb9TSnTlrv7aynh3TKz/YAvEhLYHQgZhEwF94GSY/2jCZmYBkJnu2mzNRPvNwB3f8nMXiCMMDSMWMhEqBZ9PyHDNJ/whugIQs2jXNd8tmsJTRmeNLPfxPU94inVNS2MzPAZQpXlNxKaZWXuQK5jk3YvJZ2bpo3wkFQF7tLunLCvD6eEL4yfaddCpkMImedcQ+yNjJ+p7cD7WF8cl+QZsluO/UnaI+9DeF50p9B7uag0I0uuZ2GaNxJ+EDwH/HeOe2VL1nb64nmU9DOyLs9892cHuPt6M1tKaC6xD12bE3XZ/548E9ietqXF4QUze5nwYyyfJA2+w93bC5i/KBn5hVc8vZPW5DmVdt/mStdeZvs1iLtvMLPfEwr4l5rZbwl5oce8+yZA2XE1QnPE0wjnYyLhWZHI1U9AvvS9L+7NRNoxSZ4Z/3D3jZkT3L3NzFaT8iw1s/cSmmXMJtS0yf4NUc/2jtdzXm+EY92pGUgPr+mcenFuitIHaW1P0pe5hIKeE8zshJRlqoDJZlbn7o0Z4aMITVfmAme7+3eL2NVec/dpEPplI9TQ+TawxMyO8djsOc73Gl2Hon7AQl9JDxKaIP0HoRlotqQZTH0fR1/KjAowhhh3L7jTOkJpaZoks/au+JdLbfxMOmzK1Z9Aru2kSTon6q+hVZO45hr9JAlP6yTp9ZSwJJEenjKtO/mO/Rl5lq+FjozaHEJbyfcTqtMCNJjZjwi1RrYVGbdecfeLzayB0GfIpwl9AriZ3Q980dP7FynGeGCtp3Qy5e6tcdtTUpYr5joEIB7bewnP0nsIb6I2EKt8Et6oFdzxWA4TCZmeyRRe0EeMzxmEjOS2uPw97r7RzP7M9uEL52fMX4jPEZpffJTQJvrLQKuZ3Qb8l7svg46+CO4FDiU0p7mB0EdIcr2dT+5jk9Z2tbWAaSNTpjXk+FGTnO9uO5Rj+z13SPzLpbabaX2lL45Lsj9pGd9MefeniHu52DQjUzH3ZbKdPen+XunYTh89j7bEzy4d02bJlwamXYtp+9+TZ0Ih6XAhBRiVlgZDuA+yO289kfC29oNs759jq5ndCHzB3fP1fwShP5HPxjjdQTgmybVwGrmPZ770vdf3ZoYuz4WYDqZOi1rJepaa2acJPxjXEWo5/pPQFMIJ/XPMovPzPOf1FgtJGrOCe5rO5dLTc9MTvUlre5K+1BHyHPmOUy2hxmTm94MIeZQ78izbb+K9dbOZ/YXQx94vgP0LWK7VzH5GKMB4G+kFGKPi55aUaTKIqABDuuM5wpNE7zPufmkB60nmzzVedJce2LuRZFB2on+Gd0vimitOO2TN11/yHftZ3k1nRp1W5L4COD2+kdiX0InUJwkl3MMI7WEh/OiGlOeCFdGrdYFx+gXwi7jetxDe0H8UuMPM9ulJTYgM6wmdGo7MLpwxsxGEkvm0zq1yHfPu/DchwTzC3RdmbescQgFGbyXnfIm7H9TtnJ3dS8hUvZPtb5vuzfg8x8wmETJV6wl9huQVCwN+APzAzKYQaiSdRMh07xc7HGsm7PuhwNXuflrmOsxsB/omk1qIejMbnlKIkdzj+e7lZPol7v75vo1aSST7c6y739rblRV4LxebZnTaRBHzJtu52d0/UPAGev88SqanjviSIV8amPZjM23/e/JMyEyHn+wmDvlkpsH9YUDSYHffQmxSa2a7EH4QnUbo+HY68Nbulo/Pvk8TCmffkl2TwbofnShf+t4n92ZfienmhYSCl4M8DHGfOX1uymKZ11unjsLNbDjhXnklZf5i07m0+Pbm3PREb9LanqQv6wlNPyYVGc81hCZYtwL3mdmRffDCqMdi7ZWngAPNrN7dGwpYLKkZNybH9OQZ3Js8pFQADaMqPfFo/Ow2gU/ExGMZsJOZ7Z4yy+E92HYhQ1QmP1iKqf2wJH4enmN6El7Qj71+UNSxz+TBk+7+Q7a/BT0uY5ak+vMuKYvPLnJz7RRw3N39dXe/zd3PIPR5Moke7FuWJYRn29tSpr0txquvzt8ehNoeC1Omvb0vNuDuTYQfHPvFTFChkvai8wmFVi+4+4tx2j2EY3QK4W31wp40KXL319z9Jnf/t7i93dn+JmWP+PnblEX75NgUaAThR2m2w+PnkpRpmR4nXM+9vS4TbRRfI6sv9fgZ0p0893K/bDPFM8RRC2INoKL04nmUFCbvnWe+Ltd9HMHkQEIfAk8XGM+ePBOSZ15aHN5A+nM/TXIuj7KUIWlTtMVtFHTNx/zC84T8QtrwiskQn32WBrv7y+5+LaGG4nPAPMsx/HCGNxCeoXem/EDeOU4v1kDdJ8WqJ9R4eTil8CJ5q58t5/VG2L9OL0p6kc6l6cm56Ul+MdGbtLYn6cujwMTYfLUo7n4PodPhEcDdOQqfBlIyhHOh+Y+kCVuu0fOSZ3ChI3tJhVIBhhQtltj+CfiAmX00bR4zOyCWgid+TrjevpOZ6bEwHNuni9j8jwnVG88zs31TtpvZbnMdIVHZNXu+bjxEGHpvnpkdn7Xu4wk/gP9BaIdXCj8nZNDPN7NDsyea2TDLGLfczPa3jPHlMyRvAjPb+y4iJKQfjO1Rk3VMAoptK9lIjgyxmR0d3+hkS66Xgtsg53Bl/PxW1n6MJrS5hDAaQV9YTqjtMTMz0MxOZ3tznb5wMaFd65VptWHMbKKFPk46xLfGTxI6pn0bnautPkz4wZQMRVhQ/xdmVm1m8y2rgXL8sZhkOpPztzx+Hp417xuA7xSyvT70LQtDOSdxmESoPQPhnsopHsdrgdlmdl7atWtmu8dnWSEaCe2TR+Wds3/cQviB+Ekze0/aDGY2N/PeyaXQe7mHaUbRPAyv+EPCW/pL046xme2QmXb00fPoScKbwTl55jvFzLL7briAUN3+Vzn6nMql2GfCtYTq7f+ZmSbE9Ph7FJgfdPfFhOfHgYQmGNnbrTOzzKY0SRX2YtLhKwnNCb6XWfBhZvVsrzF4ZdqChTCzyWb25pRJYwj99LSSv4+E5fFzXlYcawkdWPakhnOf3Zt97DXCfXBw3L8kLiMJtfHS+hu4Kn5+JbNAIl4b38qxnaLTuRyWx89izk1PrlOgd2ltD9OXS+LnT81sx5T5x1ho3porvn8ivMRy4E4z67cXCma2t5l1qU0V86oXEZ6zD7v7uoxpb7YwlHL2Mu8gNGEFSOu3D8IzuIFQ+0YGMTUhkZ76IOFBfIWFtpGPEX5Y70wYi3p/QkdBSTWu/yW87f9X4C9mdgch03YioTPM9xeyUXd/yszOIgz9tcTMbiG8Makj1BLYSHxD4+5NZvYY8FYzu5ZQ8NAG3Jqr+YW7u5mdSmjjeUNc/zPAXjH+G4GP9EfnZYVw98ZYkHIz8KiZ3UNIONsJCe9cwrFIMpDvBC42s4cJ+/Ea4RwdG5f5Xsa6X43H6RRCx2Z/IPTW/h7COcrX2WGme4CTLHSUtpiQIXzA3R8Arie0NX6QkNEwwtuHQ+K8dxdzTLK5+3Vmdizwb4SO+X7H9na6MwgjEFzbm21k+D6hoOJBM/s1oWrnbEKzihuB47tZtmDufqWZHUxop/98vH/+SSg0mEHINP2c0MFapnvYXiOiI1Pl7s1m9hDF938xinB+lsd76yXCtfYuQidjt7p78hb594SaV583swMINR12JfTM/gd6kFHsoVcJbbP/bma3Etp2H0/4kfujeE3m8ynC27OvEX6EPkho270jYb8PIQzf+2LONWx3T5z/djN7gNAx3RPu/vui9qqH3H2bmX2A0Ab6D/HZsJTwA2WXGLc3EI5Pvh/vxdzLxaYZPfV1Qnv8jwPvM7N7CVXVpxDO4WGEETme6sE+pIrpxs3AmRaaUKU10YDQ+fRD8VnxKuE5MS9u98vF7GSxzwR3X25mXyakxUssdFi6nvD8mkCoRTKzy4bSfZjQCe43zexf4/9GOL5HEt6CLo/z3kNoXnaThX5ytgAvufs13az/fwi1LI8FnojLjY7rmUIYkaE3LxF2IqSfTxNqCrxMSOuOITRduTT7zX02d19lZtcTms8tNbM7CXmadxF+sC4lFPIUrI/vzT7j7u1mdinhGv1bzBdVEfJakwhDWx6RtcxDZvZDQofPf7fQt8g2wjldR0ofJ71I57LX05Nz8yzhOXGSmbXE7Tpwjbu/lP8o9SqtLSp9cfd74r38LeC5eH+8SOjjYjdCrZcHCTUtUrn7Y7FA4C7gNjM7zt3vyreTZrY3XZ9VE83sqozvX8hoDnI0oSDyAULhXCPhBdrbCdfyKrr26fYdQk2chYQh2yE8m94R/z/P3bt0zG1mexHyFQtyNL2TwcTLYCgU/fX/H3Qd472beafH+a/KM99YQqnyYsI44FsID9E/EIaVG5M1/zhCCfsrhETkGeC/CA+xLtsjZRjVjGlzCVXTXyO8KVlJGC/7+Kz59iD8kGok/GB34jChdDNsFqHA4hpCIrstfv4S2Ctl3gvieg7v6bHMmP+0zDjmOUf/Ryi82Uro0+GZGOfjMubbJx7zRYQ3hM2EjOWNhLah2eutJhRqrIjHdRlwDqGw0yl8GNUpwHWERLgt8zgTMh83E6oAbib0Gr0E+BIp48znuaYX5pg2jJAJWhS3sTlep58kZdiw7tZVQDyOIVTp3Ej4QXYn29tT5z2XxVwrcVv/L+O6X0WogvoN0occTIbRbSdriNh4Xh1YVcS+jozn6Y+EDN7WeF09Gs9rVdb8uxDeLiUdqD0Zly/qesp3b5DjXmb70HHjgctiPJoJVfU/TdYQit2dA0KG/VOEN2rr43r+SciQfhaoK/AYjiHUJFvB9mGsr8qY3u/HJeMe/TbhTdVmwjP8OcKz4cOkDEOaso6i7mWKSDO626989y3hx/Qp8dysJdwrrxAy9ecCu/R0H7qJSzLc4XdSpnWcv7hfS+O+ryH8INshZZmFFJBmU/wz4WTCj/bk3v0l4YdSl+3luX7qCD80no3rej3u10XA6Iz5hgPfjMd3W/Y5I8ewwoSC0XPj9bmF8Hx9EDg5Zd7pdPPszN43QoHNVwkFaskz4dU438kUOLQqoVDlIkI6uZVQEHJZPDZFHc9+uDfzHZPu0s8u54TwzP48oeBvS7zOriH8YL6KlLwa4T78FOF520zIp11GeB6nnveeXNN9cW7iMocQnhnr2Z5fPLzA7fUqraUH6Quh8PPX8bi2EO7npYQ83+x85zSG7x+P71bgvQXsZ3INd/c3PWv9l8V4NRDSvPXAnwnPxUkp2zg9nv/lhGs/ORY3kDIkesZy34zbP7CQc6a/yv6zeNJFREQGFTNbDuDu00sbExkK4hvjWcAMD51EJuEXEDqt7dLZr4iI9I6FJqIvAE+7+ztLHR/pf+oDQ0RERKT3vkDoD+CsUkdERGQI+QSh+dd/lToiMjBUgCEiIiLSS+7+N8Lwq1tLHRcRkSGkGTjd3Z8odURkYKgTTxEREZE+4O6/KHUcRESGEnf/canjIANLfWCIiIiIiIiISNlTExIRERERERERKXsqwBARERERERGRsqcCDBEREREREREpeyrAEBEREREREZGypwIMERERERERESl7KsAQERERERERkbKnAgwRERERERERKXsqwBARERERERGRsqcCDBEREREREREpeyrAEBEREREREZGypwIMERERERERESl7KsAQERERERERkbKnAgwREREREZCwTjEAACAASURBVBERKXsqwBCRQcPMLjCzXw7V7YuIiEjvlDotL/X2RcqdCjBEhpiBThjNrMrMbjSz5WbmZnZ41vTPmtkLZrbBzFaa2SVmNiJOm2Jmv4rh683sITN780DFvb+Y2fnxWLyz1HEREREpViXlJeL0r5vZ38ys1cwuGKh497V8x0FkKFABhogUJTNDUIQHgQ8Dq1Km/R44yN3HAfsDs4BPx2m1wJ+Bg4FJwNXAH8ystgdx6KSH+9FrZrY7cDzwaim2LyIiUmoDnJcAWAZ8CfhDD7abU4nyEt0dB5FBTwUYIoOUmZ1tZq+Y2UYze9bM5pvZ0cC5wIlm1mRmT8R5dzSzW81srZktM7MzMtZzQSzt/6WZbQBOM7NhZvZlM3vezBrN7NdmNiktHu7e4u7fd/cHgbaU6c+7++vJ5oB2YI847QV3v9jdX3X3NndfAFQBe3Wz6zVmdkPc77+Y2ayMfVkej8tfgU1mNiJjPzaa2VNm9i8Z859mZg+a2f+Y2Toze9HM3p0xfYaZ3R+XvQuo7/6sAPB/wNlASwHzioiIlMxgyEvE6Ve7+x+BjQXuelnmJfIdB5GhQAUYIoOQme0FfAo4xN3HAkcBy939duCbwA3uXuvuSYL8K2AFsCOhdsA3zWx+xiqPBW4EJgDXEt5qHAe8PS6zDrisF/H9YMzQNBDemvwkx3wHEgowlnWzumOB3xBqbFwH/M7MRmZMPxl4LzDB3VuB54G3AuOBC4FfmtkOGfO/GXiWkKH4LnCFmVmcdh2wOE77OnBqnv08AWhx99u6m09ERKTUBmteokBlm5cQGepUgCEyOLUB1cC+ZjbS3Ze7+/NpM5rZLsA84Gx33+ruS4GfAadkzPaIu//O3dvdfQvwMeAr7r7C3ZuBC4Dje1qV0t2vi9U+3whcDqxOiec44BrgQndf383qFrv7je6+DbgYqAHmZEy/1N1fjvuBu//G3VfGfbsBeA44NGP+l9z9p+7eRmjCsgMw1cx2BQ4BznP3Znd/gFCFNVVs9vJN4LN5DoeIiEg5GHR5iSKUZV5CRFSAITIoufsywg/lC4DXzOx6M9sxx+w7AmvdPbNa5UvAThnfX85aZjfgZjN73cxeB54mZHSm9jLezwFPAj/KDDezUYQE/VF3/1ae1XTE1d3b2f42qMv0uO6PmNnSjH3Zn87VNzvamLr75vhvbVznOnfflDHvS93E60LgGnd/MU/8RURESm6w5SWKVK55CZEhTwUYIoNUfBMxj5BBcOA7yaSsWVcCk8xsbEbYrsArmavLWuZl4N3uPiHjr8bdX6H3RgC7J1/MrBr4XYzPxwpYfpeMZYcBOxP2MeEZ03cDfkqoIlvn7hOAvxPaz+bzKjDRzMZkhO3azfzzgU+b2SozWxXj+WszO7uAbYmIiAy4wZKX6IFyzUuIDHkqwBAZhMxsLzN7R/zxvxXYwvbOnlYD02OCjLu/DDwMfMvMasxsJnA6oX1qLpcDF8VEGzObbGbHdhOfajOriV+r4nYsTvsPM5sS/98XOAe4J34fSWgvuwX4SHwLks/BZvaBWAX1s0Az8GiOeccQMiFr4vb+nfDWJC93fwlYBFxoYVizecD7ullkflz3gfFvJaFApsftfUVERPrLYMlLxLCRcdlhwIi47PBu4laueYluj4PIUKACDJHBqRr4NqEjq1XAFEKP4RA6pQJoNLO/xP9PBqYTflTfDJzv7nd1s/4fALcCd5rZRkKi/uZu5n+WkPHZCbgj/r9bnHYY8Dcz2wTcFv+SuL4FOAY4EnjdQm/nTWb21m62dQtwIqEzsFOAD8Q2rF24+1PA/wKPEDJjBwAPdbPubB8k7Pda4HzgF7lmdPdGd1+V/BEygevcvamI7YmIiAyUwZKXgFBDYkuM41fi/5n9c2Qry7xE1N1xEBn0zD27NpeIiIiIiIiISHlRDQwRERERERERKXsqwBARERERERGRsqcCDBEREREREREpeyrAEBEREREREZGyN6LUESgX9fX1Pn369FJHQ0RE+tALazYB8IbJY0ock6Fj8eLFDe4+udTxKAXlJUREBh/lJUojV35CBRjR9OnTWbRoUamjISIifejEnzwCwA0fm1vimAwdZvZSqeNQKspLiIgMPspLlEau/ISakIiIiIiIiIhI2VMBhoiIiIiIiIiUPTUhERGRQWuH8TWljoKIiIhUMOUlyosKMEREZND6/klv6vR927ZtrFixgq1bt5YoRoNHTU0NO++8MyNHjix1VERERPpNdl4ClJ/oS8XmJ1SAISIiQ8aKFSsYO3Ys06dPx8xKHZ2K5e40NjayYsUKZsyYUeroiIiIDCjlJ/pGT/IT6gNDREQGrQt//yQX/v7Jju9bt26lrq5OmY1eMjPq6ur05klERAa97LwEKD/RV3qSn1ANDBERGbSeWrmhS5gyG31Dx1FERIaCtLwEKB3sK8UeR9XAEBEREREREZGypwIMERGRMrVw4UIefvjhXq2jtra2j2IjIiIilWgw5SfUhERERHL63ZJX+N4dz7Ly9S3sOGEUXzxqL457006ljtaAKfX+L1y4kNraWt7ylrcM2DZFRAarUj/TZegq9bU3mPITqoEhIiKpfrfkFc656W+88voWHHjl9S2cc9Pf+N2SV0odtYK9YfIY3jB5TI+W7c/9P+644zj44IPZb7/9WLBgAQC33347Bx10ELNmzWL+/PksX76cyy+/nEsuuYQDDzyQP/3pT5x22mnceOONHetJ3oY0NTUxf/58DjroIA444ABuueWWXsdRRGQwGQxpmpRGb/ISoPxEX1MNDBERSfW9O55ly7a2TmFbtrXxvTuerZg3Vt/6wMyc0y78/ZM5O+YCWPLP12lpa+8UtmVbG1+68a/86vF/pi6z747jOP99++WN15VXXsmkSZPYsmULhxxyCMceeyxnnHEGDzzwADNmzGDt2rVMmjSJj3/849TW1vKFL3wBgCuuuCJ1fTU1Ndx8882MGzeOhoYG5syZw/vf/351MCYiEg2GNE1Ko7u8BCg/MdBUgCEiIqlWvr6lqPDBJjuzkS+8GJdeeik333wzAC+//DILFizgbW97W8cY6JMmTSpqfe7OueeeywMPPMCwYcN45ZVXWL16NdOmTet1XEVEBoOhnqZJ6Sg/0bdUgCEiIql2nDCKV1IydjtOGFWC2PTMOTf9FUh/e5LvzcZh3743df93mjCKGz42t8dxWrhwIXfffTePPPIIo0eP5vDDD2fWrFk8++yzeZcdMWIE7e0hw+PutLS0AHDttdeyZs0aFi9ezMiRI5k+fXpRY6qLiAx2gyFNk9LoLi8Byk8MNPWBISIiqb541F6MHN65yuCokcP54lF7lShGxXthzSZeWLOpR8t+8ai9GDVyeKewvtj/9evXM3HiREaPHs0zzzzDo48+SnNzM/fffz8vvvgiAGvXrgVg7NixbNy4sWPZ6dOns3jxYgBuueUWtm3b1rHOKVOmMHLkSO677z5eeumlXsVRRGSw+eJRezFiWGWnaVIavclLgPITfU0FGCIikuq4N+3Ee/bfoeP7ThNG8a0PHDBk2gof96ad+NYHDmCnCaMw+m7/jz76aFpbW5k5cybnnXcec+bMYfLkySxYsIAPfOADzJo1ixNPPBGA973vfdx8880dnW6dccYZ3H///Rx66KE89thjjBkTOhX70Ic+xKJFi5g9ezbXXnste++9d293vyKY2XIz+5uZLTWzRTFskpndZWbPxc+JMdzM7FIzW2ZmfzWzgzLWc2qc/zkzOzUj/OC4/mVx2fJpBCwiRTnuTTsxb4+6ju9DLU2T0lF+om+Zu5c6DmVh9uzZvmjRolJHQ0SkrHzrtqf5yQMvcNCuE7jprMNKHZ2infiTRwA6qmg+/fTT7LPPPqWM0qCSdjzNbLG7zx6I7ZvZcmC2uzdkhH0XWOvu3zazLwMT3f1sM3sP8J/Ae4A3Az9w9zeb2SRgETAbcGAxcLC7rzOzx4HPAI8CtwGXuvsfc8VHeQmR8vbZ65fwu6UrecvudVx3xpxSR0cqRHZeApSf6GvF5Cf6rQaGme1iZveZ2dNm9qSZfSaGX2Bmr8S3JUtjhiJZ5pz4luNZMzsqI/zoGLYsZkaS8Blm9lh8Y3KDmVXF8Or4fVmcPr2/9lNEZDBb09QMQENTS4ljIlKwY4Gr4/9XA8dlhP/Cg0eBCWa2A3AUcJe7r3X3dcBdwNFx2jh3f8TD255fZKxLRCpQ46aQlq3eUF5t+kWkcP3ZhKQV+C933weYA3zSzPaN0y5x9wPj320AcdpJwH7A0cCPzGy4mQ0HLgPeDewLnJyxnu/Ede0JrANOj+GnA+vcfQ/gkjifiIgUqTEWXDTGgoxKs++O49h3x3Gljob0HwfuNLPFZnZmDJvq7q8CxM8pMXwn4OWMZVfEsO7CV6SEd2JmZ5rZIjNbtGbNmj7YJRHpL0lh/OoNlZmmSWkoL1Fe+m0UkphpSDIQG83saVIS/gzHAte7ezPwopktAw6N05a5+wsAZnY9cGxc3zuAD8Z5rgYuAH4c13VBDL8R+D8zM1d7GRGRojTEgotNLW1saWljVNXwPEuUl0LGUJeKdpi7rzSzKcBdZvZMN/Om9V/hPQjvHOC+AFgAoQlJ/iiLSKkkaVpTcytNza3UVmtARslPeYnyMiCdeMYmHG8CHotBn4odaF2ZdK5F8W9G6oDX3b01K7zTuuL09XF+EREpQkNTc8dIJA0VWgtDBi93Xxk/XwNuJrz4WB2bfxA/X4uzrwB2yVh8Z2BlnvCdU8JFpAK1tztrN7Ww88QwbKqakYhUpn4vwDCzWuC3wGfdfQOhhsTuwIGEGhr/m8yasnhP34wU9NZE1T5FRHJzdxqbWth9ci1QmQUYn71+CZ+9fkmpoyH9wMzGmNnY5H/gSODvwK1AMpLIqcAt8f9bgY/E0UjmAOtjbdE7gCPNbGJ8qXIkcEecttHM5sTRRz6SsS4RqTCvb9lGW7uzX2wKsHq9CjCkMMpLlJd+LcAws5GEwotr3f0mAHdf7e5t7t4O/JTtzUSKfTPSQOiAa0RWeKd1xenjgbXZ8XP3Be4+291nT548ube7KyIyqKzfso3WdmfvaWOByuzI89X1W3lVmdTBairwoJk9ATwO/MHdbwe+DbzLzJ4D3hW/QxhF5AVgGSH/cRaAu68Fvg78Of59LYYBfAL4WVzmeSDnCCQiUt6Svpz23WE8AKtUA0MKpLxEeenPUUgMuAJ42t0vzgjfIWO2fyG8LYHwZuSkOILIDGBPQobkz8CeccSRKkJHn7fG/izuA46Py2e/ZUnevhwP3Kv+L0REipPUuNhrWnhbVakdeQ52tbWhhszKlSs5/vjju533+9//Pps3by5q/QsXLuSYY47pcfz6i7u/4O6z4t9+7n5RDG909/nuvmf8XBvD3d0/6e67u/sB7r4oY11Xuvse8e/nGeGL3H3/uMynlJcQqVxJIXxHDQx15CnSSaXkJ/qzBsZhwCnAO7KGTP2umf3NzP4KHAF8DsDdnwR+DTwF3A58MtbUaAU+Raji+TTw6zgvwNnA52OHn3WEAhPiZ10M/zzQMfSqiIgUJsns7TWtcpuQ9IlXX4W3vx1WrRqwTba1tRW9zI477siNN97Y7Tw9yXCIiAwGSRq2a91oxtaMUB8YMvCUn+gT/VaA4e4Puru5+8zMIVPd/ZT45mOmu78/GeosLnNRfMuxl7v/MSP8Nnd/Y5x2UUb4C+5+aHxjckIcwQR33xq/7xGnv9Bf+ykiMlglmb2dJoxmbPWIimxC0ie+/nV48MHw2QeWL1/O3nvvzamnnsrMmTM5/vjj2bx5M9OnT+drX/sa8+bN4ze/+Q3PP/88Rx99NAcffDBvfetbeeaZMMDGiy++yNy5cznkkEM477zzOq13//33B0KG5Qtf+AIHHHAAM2fO5Ic//CGXXnopK1eu5IgjjuCII44A4M4772Tu3LkcdNBBnHDCCTQ1NQFw++23s/feezNv3jxuuummPtlvEZFSSmoR1o2pYuq4GlapSYAMNOUn+mS/NXaQiIikatgYMnv1tVXUj62uyBoYB+02sfsZDj+8a9i//RucdRZs3gzz58Pjj0N7O1x+OSxZAmeeCaedBg0NkF3FcuHCguL17LPPcsUVV3DYYYfx0Y9+lB/96EcA1NTU8OCDDwIwf/58Lr/8cvbcc08ee+wxzjrrLO69914+85nP8IlPfIKPfOQjXHbZZanrX7BgAS+++CJLlixhxIgRrF27lkmTJnHxxRdz3333UV9fT0NDA9/4xje4++67GTNmDN/5zne4+OKL+dKXvsQZZ5zBvffeyx577MGJJ55Y0D6JiJSzxk0tDDOYOLqKaeNqWL1RBRhSmLx5CVB+YgDzEyrAEBGRVElmb8LoKurGVFVkAcbZR+/duxW89BIk3R64h+99YJddduGwww4D4MMf/jCXXnopQEfi3tTUxMMPP8wJJ5zQsUxzczj+Dz30EL/97W8BOOWUUzj77LO7rP/uu+/m4x//OCNGhGR+0qRJXeZ59NFHeeqppzri0dLSwty5c3nmmWeYMWMGe+65Z0f8FixY0Cf7LSJSKg1NzUwaU82wYcaUcdU8+nxTqaMkFaLXeQlQfoK+y0+oAENERFIlmb3hw4z62mqWrRmEmb3u3nCsXw/r1nXOcKxbB0cfHb7X1xf8hiRb6Oe66/cxY8YA0N7ezoQJE1i6dGlBy2dz94Lmede73sWvfvWrTuFLly7Nu6yISKVpaGqhvrYKgGnjanhtYzPt7c6wYXreSR9QfmLA8hP9OoyqiIhUrjUbt2f26sdWVeQoJB+/ZjEfv2Zxzxb++tdDVc9MbW190nb1n//8J4888ggAv/rVr5g3b16n6ePGjWPGjBn85je/AULm4IknngDgsMMO4/rrrwfg2muvTV3/kUceyeWXX05raysAa9eGUUHHjh3Lxo0bAZgzZw4PPfQQy5YtA2Dz5s384x//YO+99+bFF1/k+eef74ifiEila2hqpr62GoBp42tobXcaNw3Rvp2kKL3KS4DyE32cn1ABhoiIpGrctD2zVzemmnWbt7GtrT3PUuVl3eYW1m3uYQb1kUegJWvZlhZ4+OFex2ufffbh6quvZubMmaxdu5ZPfOITXea59tprueKKK5g1axb77bcft9wSRgr/wQ9+wGWXXcYhhxzC+vXrU9f/H//xH+y6667MnDmTWbNmcd111wFw5pln8u53v5sjjjiCyZMnc9VVV3HyySczc+ZM5syZwzPPPENNTQ0LFizgve99L/PmzWO33Xbr9f6KiJRaY1MLdbFQfsrYGgCNRCIF6VVeApSf6OP8hGlI82D27Nm+aNGi/DOKiAwRb/3uvRy860S+f9KbuObRlzjvd3/nsXPnM3VcTamjVrATfxLeStzwsbkAPP300+yzzz6ljBLLly/nmGOO4e9//3tJ49EX0o6nmS1299klilJJKS8hUr72++rtnHTorpx3zL4sffl1jrvsIX72kdm8c9+ppY6alLnsvAQoP9HXislPqAaGiIikatjY0lEDY3J8a1WJHXmKiMjQtqWljU0tbR01MKbFgniNRCJSeVSAISIiXWxuaWXLtjbqkiYk8bOhSe2Fe2v69OmD4m2JiEilSArf68eEtKy+tophBqvXqwBDKtdQzU9oFBIREemiYWMoqOjoxDMpwNhYWTUwDtujvktYIT1qS35qgioilaKjAGNsSNNGDB9GfW01q9QHhhQgLS8Byk/0lWLzEyrAEBGRLtZ0ZPaSGhgh09e4qbIKMD49f89O32tqamhsbKSurk6Zjl5wdxobG6mpqZz+UERk6GqMtQfrYg0MCCORrN5QWWmalEZ2XgKUn+grPclPqABDRES6aMyqbju2egRVI4ZVfBOSnXfemRUrVrBmzZpSR6Xi1dTUsPPOO5c6GiIieSWF70mhPISRSFas21yqKEmFU36i7xSbn1ABhoiIdJEUVCTVbc2MybXVFdeJ56lXPg7A1R89FICRI0cyY8aMUkZJREQGWENHDYyqjrBp46tZ9NLaUkVJKkh2XgKUnyglFWCIiEgXSUFFZnXbutqqiquBsXVbW6mjICIiJdbQ1Ext9QhqRg7vCJs2robXN29j67a2TuEi2ZSXKC8ahURERLpoaGpm/KiRVI3YnkzU11ZXXCeeIiIiDU0tHZ1SJ6bEoVRfUz8YIhVFBRgiItJFY1NLR8edifraqorrxFNERKSxqbljOPDEtFiAoZFIRCqLCjBERKSLNU3NHUOnJupqq2lsaqG9XcNniohI5WhsaunU/wWEUUgAVqsAQ6SiqA8MERHpoqGpmX2mjesUVl9bTWu7s37LNiZmZQTL1fx9ppQ6CiIiUmINTc0cPH1ip7CpY1WAIYVRXqK8qABDRES6yNWEBMJwdJVSgHHm23YvdRRERKSE2tqdtZtbqM9Kt8aNGkHNyGGsWq8CDOme8hLlRU1IRESkk5bWdtZv2dalCUnyfc3GyhqJREREhq61m1pwh/qxndM0M2PauBpWq3NqkYqiAgwREekk6agzVwFGMsRqJTjxJ49w4k8eKXU0RESkRJI0LXNY8MSUcTWsVg0MyUN5ifKiAgwREemksSnUsMjZhKSCCjBERGRoy5WmAbEGhgowRCqJCjBERKSTNU3pNTAmjK5imEFDk5qQiIhIZWjIkaZBGIlk1fqtuGt0LZFKoQIMERHppCG2B56cldkbPsyYNKa6opqQiIjI0JYUuten1MCYMraa5tjvk4hUBhVgiIhIJ42bcle3ra+tUg0MERGpGA1NzYwYZowfNbLLtGnjk6FUVTAvUik0jKqIiHTSsLGZUSOHM6a6axJRX1tZNTCOmblDqaMgIiIl1NjUTF1tFWbWZdq0caEAY9WGrew1bexAR00qhPIS5UUFGCIi0klDUzP1Y7vWvoBQA2N546YBjlHPnTJ3eqmjICIiJdTY1JI6AgnA1FiAoZFIpDvKS5QXNSEREZFOGjflzuzV11Z39OheCba0tLGlpa3U0RARkRIJhfLpadqUcSF89QYVYEhuykuUFxVgiIhIJ2s2Nqf21g5QV1vNlm1tbGpuHeBY9cxpP3+c037+eKmjISIiJdLQ1EL9mPRahdUjhjNpTBWrVIAh3VBeoryoAENERDppaGphcjdNSICKqoUhIiJDk7t3WwMDwkgkqoEhUjlUgCEiIh3a2521m5q7bUICsKaCOvIUEZGhaVNLG82t7dTlqIEBYSQSjUIiUjlUgCEiIh3WbW6h3bfXtMiWFGBU0kgkIiIyNDXGtKouR7NICCORqAmJSOVQAYaIiHRoiE1DclW3TUYnURMSEREpd0lhe65CeYAp42poaGpmW1v7QEVLRHpBw6iKiEiHjrdVOZqQTIrVcCulBsbxB+9c6iiIiEiJdBTK56mB4R7StR3GjxqoqEkFUV6ivKgAQ0REOiR9W+TqxLN6xHDG1YyomAKME2bvUuooiIhIiTQWUoAxPkxbtX6rCjAklfIS5UVNSEREpEMhb6vqx1ZXTBOStZtaWLupMuIqIiJ9Kylsn9RNJ55TxtYAaCQSyUl5ifKiGhgiItKhsamZEcOMcTUjc85TP6a6YkYh+cQvFwNww8fmljgmIiIy0BqbmhlXM4KqEbnf2U4bnxRgVEa6JgNPeYnyohoYIiLSoaGpmbraKoYNs5zz1I+tqpgmJCIiMnQ1NLXk7JQ6MWl0FSOHm0YiEakQKsAQEZEODU0t3TYfgdC8pFKakIiIyNDV0NRMfY5OqRPDhhlTxtawer0KMEQqgQowRESkQ2NTM3V5CjDqxlSzfss2Wlo15JyIiJSvxk0tHcN/d2fquGpWb1QBhkglUAGGiIh0CDUwus/sJZnBxk1qRiIiIuWroak557DgmaaOq2GVamCIVAR14ikiIgC4O2uamplcQBMSCMPTlfuQcx+es1upoyAiIiWwra2d1zdvoy5PoTyEAow/PdcwALGSSqS8RHlRAYaIiADQ1NxKS2t73sxeUkOjEkYied+sHUsdBRERKYFk2Mt8/TpBGImkqbmVpuZWaqv180g6U16ivKgJiYiIAKH5COTP7CXTGzaWfwHGyte3sPL1LaWOhoiIDLBktKx8zSIh9IEBsFojkUgK5SXKiwowREQEyMzsFdiEZFP5j0TyuRuW8rkblpY6GiIiMsAaCyyUh9CEBNBIJJJKeYny0m8FGGa2i5ndZ2ZPm9mTZvaZGD7JzO4ys+fi58QYbmZ2qZktM7O/mtlBGes6Nc7/nJmdmhF+sJn9LS5zqZlZd9sQEZHcGmMBRr4mJKOrhlMzclhF1MAQEZGhqaEjTSugCUlSgKGRSETKXn/WwGgF/svd9wHmAJ80s32BLwP3uPuewD3xO8C7gT3j35nAjyEURgDnA28GDgXOzyiQ+HGcN1nu6BieaxsiIpLDmvi2Kl8nnmZGfW11R+ZQRESk3CQ1MArtxBNg1XqlayLlrt8KMNz9VXf/S/x/I/A0sBNwLHB1nO1q4Lj4/7HALzx4FJhgZjsARwF3uftad18H3AUcHaeNc/dH3N2BX2StK20bIiKSQ1KjYtKY/Jm9+trqimhCIiIiQ1NDUzNVI4YxtoBOOcdUj2Bs9Qj1gSFSAQakDwwzmw68CXgMmOrur0Io5ACmxNl2Al7OWGxFDOsufEVKON1sQ0REcmjc1MzE0SMZMTx/0lBfW8UaNSEREZEy1dDUQv2YKmIL87ymjq9RAYZIBej3AgwzqwV+C3zW3Td0N2tKmPcgvJi4nWlmi8xs0Zo1a4pZVERk0GnY2FJQZ2dQOTUwznjrGzjjrW8odTSkH5nZcDNbYmb/L36fYWaPxX6wbjCzqhheHb8vi9OnZ6zjnBj+rJkdlRF+dAxbZmZqjipSQRo3NVM/trA0DcJIJKtUgCEplJcoL/1agGFmIwmFF9e6+00xeHVs/kH8fC2GrwB2yVh8Z2BlrqTb0gAAIABJREFUnvCdU8K720Yn7r7A3We7++zJkyf3bCdFRAaJhqbmggsw6mqrWLuphfb2osqNB9w7953KO/edWupoSP/6DKGZauI7wCWxH6x1wOkx/HRgnbvvAVwS5yP2z3USsB+hL60fxUKR4cBlhD669gVOjvOKSAVoaGqmroAmkYmp42o0ComkUl6ivPTnKCQGXAE87e4XZ0y6FUhGEjkVuCUj/CNxNJI5wPrY/OMO4Egzmxg77zwSuCNO22hmc+K2PpK1rrRtiIhIDo2bWgrq7AxCDYy2dmfd5vKuhfH8miaeX9NU6mhIPzGznYH3Aj+L3w14B3BjnCW7r62kf6wbgflx/mOB69292d1fBJYROg0/FFjm7i+4ewtwfZxXRCpAY1NLQSOQJKaNq+G1jc1lXzAvA095ifKSv1ebnjsMOAX4m5klA+eeC3wb+LWZnQ78EzghTrsNeA8h47AZ+HcAd19rZl8H/hzn+5q7r43/fwK4ChgF/DH+0c02REQkh4aNhdfASOYLhR6FZxAH2rk3/Q2AGz42t8QxkX7yfeBLwNj4vQ543d1b4/fM/rE6+tRy91YzWx/n3wl4NGOdmctk98H15r7eARHpe+5OY1PhzSIh1MBobXcaN7UwuYimJzL4KS9RXvqtAMPdHyS9nwqA+SnzO/DJHOu6ErgyJXwRsH9KeGPaNkREJN3WbW1sbG4tONOW1NRo2NjMG6eOzTO3SN8zs2OA19x9sZkdngSnzOp5puUKT6ul2uXVrJmdSRjSnV133TVPrEVkIGzY2kpLWzv1BdYqhO1Dqa7esFUFGCJlbEBGIRERkfKWdMhZaHvhyfGt1pomjUQiJXMY8H4zW05o3vEOQo2MCWaWvKDJ7B+ro0+tOH08sJbi++DqRP1piZSfxpg2FVMDY9r47QUYIlK+VIAhIiI0bCwus9fRhKSpvPvAkMHL3c9x953dfTqhE8573f1DwH3A8XG27L62kv6xjo/zeww/KY5SMgPYE3ic0HR1zziqSVXcxq0DsGsi0ksNMW0qtF8nCKOQABqJRKTM9WcfGCIiUiEakrdVBVabHT9qJMOHWcdyImXkbOB6M/sGsITQoTjx8xozW0aoeXESgLs/aWa/Bp4CWoFPunsbgJl9itCZ+HDgSnd/ckD3RER6JKmBUTem8BoYk2urGWZoJBKRMqcCDBER6ahJUWh74WHDjLoxVWVfgPGf79iz1FGQAeDuC4GF8f8XCCOIZM+zlRyderv7RcBFKeG3EToZF5EKsr1QvvAaGCOGD6O+tprVG8o7XZOBp7xEeVEBhoiIdPRlUUx74fra6rJvQjJvz/pSR0FERAZY0oRk0ujCCzAgdOSpJiSSTXmJ8qI+MEREhIamZmqrR1AzcnjBy9TVln8NjCdXrufJletLHQ0RERlAjZuamTh6JCOGF/dTZ+q4GnXiKV0oL1FeVIAhIiI0NLUUNdwchPbCDWVeA+Nrv3+Kr/3+qVJHQ0REBlDDxpaiahQmpo2vVgGGdKG8RHlRAYaIiNDY1ExdkZm9+rHVNDQ1EwZyEBERKQ+Nm5qLGoEkMXVsDes2b2PrtrZ+iJWI9AUVYIiICA1NzUXXwKgbU0VzaztNza39FCsREZHiNTb1rAbG1PE1ALymjjxFypYKMEREJDYhKbIGRpy/3JuRiIjI0LKmqblnTUjGhQKM1RvVjESkXKkAQ0RkiGtta2fd5pYeNSGB0PxERESkHDS3trFxayt1Y3rQhCQWYKxarwIMkXKlYVRFRIa4tZtbcIfJPWhCApT1SCRfOnqvUkdBREQGUDK8d1LIXoyOGhjqyFMyKC9RXlSAISIyxDVsjJm9ImtgTB5b/k1IDt5tUqmjICIiAygpwOhJDYxxo0ZQM3KYCjCkE+UlyouakIiIDHGNm0INimKbkEyqgBoYi19ay+KX1pY6GiIiMkAaYprWkxoYZsbUcTWsUieekkF5ifKiAgwRkSEuKYAodhSSkcOHMWH0yLIuwPju7c/y3dufLXU0RERkgDRsjGnamOILMCD0g7FafWBIBuUlyosKMEREhriOJiQ9eFtVX1vdUV1XRESk1Bo3xSYkRRbKJ6aNq9EoJCJlTAUYIiJDXMOmZqqGD2NsdfHdItXXVpV1DQwRERlaGjY2M2rkcMb0IE0DmDqumlXrt+LufRwzEekLKsAQERniGja2UF9bhZkVvWxdbXVZd+IpIiJDS+Omlh7XvoDQhKS5tZ31W7b1YaxEpK+oAENEZIhraGruUfMRgMm11aqBISIiZaOhqbnoUbUyTRufDKWqtE2kHGkYVRGRIa5xUzOTe5jZqxtTxcatrWzd1kbNyOF9HLPe++r79i11FEREZAA1NLWw04SaHi8/dVxYdtWGrew1bWxfRUsqmPIS5UUFGCIiQ1zDxhb2mTauR8smNTcaN7Ww04RRfRmtPrHfjuNLHQURERlAjU3NzNyp58/+abEAQyORSEJ5ifKiJiQiIkOYu9O4qedNSJJquo1l2ozkwecaePC5hlJHQ0REBkB7u9O4qYX6sT3vA2PKuJCurd6gAgwJlJcoL6qBISIyhG3Y0sq2NqduTM8ye0lHaeXaD8YP730OgHl71pc4JiIi0t/Wb9lGW7tTN6bnfWBUjxjOxNEjWaUCDImUlygvqoEhIjKErfn/7N15eFvXfeD97wFBAgR3AlxEidRKSbbjeJHiJZLcWFnktE3sttmatvHMZOKZNp1O2xlP4z7vvJnG02k67kzmzSyZOI1TJ02axXEdJ02iuLEai14jRbYVx6RJidRCigvADQBJgADO+wfupSiJ4no3EL/P8/AheXlx75EX3cMffosReGhYQxNPyJehCCGEEG6KJfPPtNVmFZqaqoOSgSGER0kGhhBCFDEzc2K1HdvnMjCS3szAEEIIYZ0nTvTz0OEuBsanaakt5/5Du7jnpo1uL2vOiBFMj6wyq9CUD2DIc00IL5IAhhBCFLFYIr/ZMwMRKxUq8xMqK5EMDCGEWOeeONHPA4+fZHo2C0D/+DQPPH4SwDNBDDMDI7yGMaqQb+T5iwuTVixJCGExKSERQogittYMDPO1Xu2BIYQQwhoPHe6aC16YpmezPHS4y6UVXSkaN59pa8zAqAkSTaSYzeasWJYQwkKSgSGEEEUsmkjhU1AXWv1mL1JZNveul9f8l1+/3u0lCCHEujAwPr2i426IJdP4FNSu4ZkG0FQdQOv8M3JDjfdGhAtnyV7CWySAIYQQRSyaSFNfUUaJT636GuHKAGdjUxauyjrbGyrdXoIQQqwLLbXl9C8QrGip9c4v+PlnWmBNzzTIl5AADE7MSABDyF7CY6SERAghilg0kVpT+QjkS0i8moHxj78Y4h9/MeT2MoQQouDdf2gX5aUllxwrLy3h/kO7XFrRlfLPtLVlX0C+iScgk0gEIHsJr5EMDCGEKGJWBDAaKssYTabJ5vSa3/Wy2heOngbgHdc2ubwSIYQobPfctJHZbI77H3sVgJpyP3/23jd5poEnQCyRWnVT6vkuBjC8GZwXzpK9hLdIBoYQQhSxWCK95s1euDJATsNoUiaRCCHEenZja+3c179xc6ungheQLyFZa1AeIFxRRmmJYlAyMITwHAlgCCFEEbOqhATwbBmJEEIIa/RGkwD4fYqzo0mXV3OlWCJFuGLtAQyfT9FYFWRoQgIYQniNBDCEEKJITaUzTKWzFgQw8hkc0bhkYAghxHrWF8sHLW7eXMfZUW81b55OZ0mms0Sq1l5CAtBYHWAoLgEMIbxGAhhCCFGkYol8wMGKEhLIZ3MIIYRYv3qjU9SFSnnzxhrOjk6htXZ7SXPMZ1DEggwMyE8iGZQMDCE8R5p4CiFEkRoxNnsNa27i6d0Axmc+eKPbSxBCiHWjL5pkS6SCtnCImdkcI/EUjUbDS7fFktYE5U1N1UGOdkctuZYobLKX8BbJwBBCiCIVjRvvVq0xgFFd7qe0RBFNeK+EpKW2nJbacreXIYQQ60JfLMnWcAWt9SEAT5WRxBLWPNNMTdVBEqkMiVTGkuuJwiV7CW+RAIYQQhQpq96tUkoRrgh4MgPju68M8N1XBtxehhBCFLzpdJYLEzNsiVSw2QhgnIl5J4BhPoOsysBorskHQoZkEknRk72Et0gJiRBCFCkzA8OKzV6kqmzu3S8v+dsXzgDwnhtaXF6JEEIUtjPG1JEtkQo21pWjlLcyMMwsQCszMACGJmbY3lBpyTVFYZK9xMKeONHPQ4e7GBifpqW2nPsP7XJktLIEMIQQokhFEymqg34C/pI1XyufgeG9EhIhhBDW6DNGqG4NVxDwl9BSU845TwUwUlQG/ARL1/5Mg3kBDJlEIsQVnjjRzwOPn2R6NgtA//g0Dzx+EsD2IIaUkAghRJGKJtOWvVMVqfRmCYkQQghr9EbzwYotkXz5SGt9OWc8FMCIJdKWlY9AfgoJwOCEPNuEuNxDh7vmghem6dksDx3usv3eEsAQQogiFY2nrAtgVJURS6Q9NVJPCCGEdfqiSSKVZVQFSwFoqw95qoQklrTumQZQEfBTFfBLDwwhFjAwPr2i41aSAIYQQhSpaCJFpMqad6siFQHS2RyTM9KtXQgh1qPeWJIt4Yq57zeHKxiJp5hOZxd5lXOi8TThCusyMAAaqwMSwBBiAVebyuLEtBbpgSGEEEUqZmUJiREIiSZS1JSXWnJNK3zut/e4vQQhhFgX+qJJ7tjZMPf9/FGqu5qr3FrWnFgyxZ4tdZZes7kmyKAEMIqe7CWudP+hXZf0wAAoLy3h/kO7bL+3bRkYSqlHlFLDSqmfzzv2n5RS/Uqpl42PX573sweUUj1KqS6l1KF5x+8yjvUopT4x7/hWpdSLSqlupdQ3lFJlxvGA8X2P8fMtdv0ZhRCiUM1mc4xPzRKusK4HBuRrkL2kvqKMeovfkRNCiGKTTGUYjqfYGrmYgdE2L4DhtmxOM5pME7H47/um6iDDk9IDo9jJXuJK99y0kQfvvm7u+4215fzFr1/vyBQSO0tI/ga4a4Hjn9Fa32h8fB9AKXUt8CHgOuM1/0cpVaKUKgH+N/Bu4FrgN41zAf7SuFY7MAZ81Dj+UWBMa70D+IxxnhBCiHnMQINVJSRmIMRrjTy/dewc3zp2zu1lCCFEQeuLGSNU55eQGAGMM8bP3DQ2lSanIWxhDwzIBzCGJmfI5aS/UzGTvcTCrttYA8Bnf/Mmnv3EQUeCF7CMAIZS6v1KqSrj6/9HKfW4UurmpV6ntX4GGF3mOu4Gvq61Tmmte4Ee4Bbjo0drfVprnQa+DtytlFLAQeAx4/WPAvfMu9ajxtePAW83zhdCCGEwAw12lJB4yWPHz/PY8fNuL0MsYrX7DCGEc87ELp1AAlAbKqUq4PfEKNW5oLzFAYzm6iCZnCaW9FZ2oXCW7CUW1jUYB2C3wyVky8nA+I9a67hSaj9wiHxw4HNruOfvK6VeNUpMzEK1jcD8sNZ549jVjoeBca115rLjl1zL+PmEcb4QQgjDxQCGNRkY9aEylIKox0pIREGwep8hhLBYbzSfZbF5XgaGUoq2sDcmkZjPNCvHqEI+AwOQRp5CLKBzME5pibqktMwJywlgmJ05fgX4nNb6O8Bq/3b4HLAduBG4APw34/hCGRJ6FccXu9YVlFL3KaWOKaWOjYyMLLZuIYRYV6IWv1vlL/FRFyrzXAaGKAhW7jOEEDboiyZpqApQGbi0/39bfYgzHgpgWBWUNzVV55+REsAQ4kpdg5Nsb6iktMTZwabLuVu/UurzwAeA7yulAst83RW01kNa66zWOgd8gXyJCOQzKFrnnboJGFjkeBSoVUr5Lzt+ybWMn9dwlVIWrfXDWuu9Wuu9DQ0NC50ihBDrUsziEpL8tcrmrivECli2zxBC2KMvlmRr+Mp3WdvqQ5wfnXa9R4TVQXlTc00+A0MmkQhxpa7BuOPlI7C8DcIHgMPAXVrrcaAeuH81N1NKbZj37a8B5oSSJ4EPGRNEtgLtwEvAT4F2Y+JIGflGn09qrTVwBHif8fp7ge/Mu9a9xtfvA542zhdCCGGIJlIES32Eykosu2akMiAlJGI1LNtnCCHs0RuduqT/haktHCKdzTEUd/cX/Fgihd+nqA5aO8a7oTKAUjAkk0iEuMTE9CwDEzPsaq52/N7+pU7QWk8ppYaB/UA3kDE+L0op9XfA24CIUuo88EngbUqpG8mXdPQB/8q4x2tKqW8CvzCu/3Gtdda4zu+T39iUAI9orV8zbvEnwNeVUv8ZOAF80Tj+ReArSqke8pkXH1pqrUIIUWyiiTSRygBW9jgOVwZ49fy4Zdezwt/881uWPkm4arX7DCGEM+Izs0QTKbYsUOfeNjeJZIoNNeVOL21OLJEmXFmGz2dt335/iY9IZYChCcnAKGayl7jSG0PuNPCEZQQwlFKfBPYCu4AvAaXA3wL7Fnud1vo3Fzj8xQWOmef/OfDnCxz/PvD9BY6f5mIJyvzjM8D7F1ubEEIUu2giZXmqbb6ExFsZGOUWZpgIe6x2nyGEcIY5geRqJSQAZ0enuG2bez3zo4nU3DhvqzVXB6WEpMjJXuJKncYEkl0eLSH5NeC9QBJAaz0AOL9SIYQQlslnYFjb7CxSGSCRyjAzm136ZId85fk+vvJ8n8urEEuQfYYQHmZOIFkoA6OltpwSn+JszN1GntFk2vIJJKam6qA08Sxyspe4UueFSaqCfjYYfWKctJwARtroIaEBlFLOzkkRQghhObsyMABG4t6pFf7eqxf43qsX3F6GWJzsM4TwsD4zgLFABkZpiY+W2qDro1Sj8RQNFj/TTE3VAQlgFDnZS1zJbOBpZSnyci0ngPFNozt4rVLqY8A/kp8gIoQQogDlcprRZNqGAEb+erGkt8pIhOetap+hlAoqpV5SSr2ilHpNKfVnxvGtSqkXlVLdSqlvGE3AMRqFf0Mp1WP8fMu8az1gHO9SSh2ad/wu41iPUuoTFv+5hSgIvbEkzdXBq6bRb66vcDWAobUmlkzZloHRXB1kbGrWU9mFQrhJa03XUNyV8hFYRgBDa/1XwGPAt8nXp/6/Wuv/affChBBC2GN8epZsTlu+2TMDGFEPZWAI71vDPiMFHNRa3wDcCNyllLoN+EvgM1rrdmAM+Khx/keBMa31DuAzxnkopa4l3/D7OuAu4P8opUqUUiXA/wbeDVwL/KZxrhBFpS+aXHACiam1PuRqAGMqnWVmNmd5UN7UZKTIeym7UAg3DUzMEJ/JuDKBBJbRxBNAa/0U8JTNaxFCCOGAaCK/CbN6s2cGRMzrC7Fcq9lnGGUnCePbUuNDAweBDxvHHwX+E/A54G7ja8gHTP6Xyue+3g18XWudAnqNKWZmk/Aeo2k4SqmvG+f+YoV/PCEKWl9sikPXNV315231IUaTaeIzs1RZPMZ0OcxnTti2EpJ8AGNwcobW+qsHcoQoFl2Dk4A7E0hgkQCGUiqOUY96+Y/I7xvcCbkIIYRYEzNDQkpIhJus2GcYWRLHgR3ksyVOAeNa64xxynlgo/H1RuAc+YtnlFITQNg4/sK8y85/zbnLjt+69J9MiPVjYnqW0WR6wf4Xps3h/C/150anubbFjQBG/pljZwkJwKCMUhUCuDiBZGeTxwIYWmvpAC6EEOtQ1AgwWD2FJFhaQmXA76k022/8q9vdXoK4Civ2GVrrLHCjUqoW+HvgmoVOMz4v1GlML3J8oTLbKwIuSqn7gPsA2tralrFqIQpH3yITSEwXR6kmubbF+fc3zQwMu5p4mgEMaeRZvGQvcamuwTgtNUFqyp0PWMIyS0gAlFKNwNycFK31WVtWJIQQwlZ2ZWDkr1kmJSRiVdayz9Bajyul/gm4jXwzUL+RhbEJGDBOOw+0AueVUn6gBhidd9w0/zVXOz7/3g8DDwPs3bt3oYwSIQpWXywfwNi6SACjdS6A4U4fjJjNGRjV5X4Cfp8EMIQwdA2618ATltHEUyn1XqVUN9AL/AToA35g87qEEELYJJpI4fcpWyLnkcrA3GbSCx5+5hQPP3PK7WWIRax2n6GUajAyL1BKlQPvAF4HjgDvM067F/iO8fWTxvcYP3/a6KPxJPAhY0rJVqAdeAn4KdBuTDUpI9/o88k1/nGFKCi90SRKXcyyWEhNeSm1oVLOxNwKYBg9MCrsycBQStFcE2RwUoLzxUr2EhfNZnOcGkm41sATljdG9UHy72i8obXeCrwdeNbWVQkhhLBNLJGmvqIMn8/62d1hj2Vg/Pj1YX78+rDbyxCLW+0+YwNwRCn1Kvlgw1Na6+8BfwL8sdGMMwx80Tj/i0DYOP7HwCcAtNavAd8k35zzh8DHtdZZI4Pj94HD5AMj3zTOFaJo9EWTtNSUEyxdeISqqc3FSSTRRIrqoJ8y/3J+rVmdpuqgZGAUMdlLXHR6JMlsVrvWwBOWV0Iyq7WOKaV8Simf1vqIUuovbV+ZEEIIW0QTKdvGzUUqA7zUO2rLtcW6tap9htb6VeCmBY6f5uIUkfnHZ4D3X+Vafw78+QLHvw98fxl/BiHWpd7Y1KIjVE2t9SFe659wYEVXiibTtj3TTE3VQV49P27rPYQoBJ3GBBJPl5AA40qpSuAZ4KtKqf8PyCzxGiGEEB4VTaSIVNkXwBibmiWTzdlyfbEuyT5DCI86E0uyeZEJJKbN9SHOj0278nd/zMagvKm5OsDgxAz5qjMhilfXYBy/T7G9odK1NSwngHE3MAX8EfnUylPAe+xclBBCCPtEE2kiFfY0OzMnm4zKKFWxfLLPEMKDxqfSjE/NsnUZAYy2+hCZnOaCC6NGo4m0bQ08TU3VQVKZHJPTElsVxa1rMM62hgpbS7aWsuw7G7Wgz5NvrjVp14KEEELYR2ttewYG5DeUXhAsLVmydlt4g+wzhPCW3mWMUDW1hfNlJudc6IPhRAZGkzFKdVD6YBQl2Utc1DkYd7WBJyyvB8YzwAGlVB3wY+AY8EHgt+xcmBBCCOslUhlSmdxcpoTVzMCIVxp5PvovrmiFILxH9hlCeNDFEapL98Awp5ScGZ3irbau6lKz2RxjU7O2Z2A011wMYLhZ+y/cIXuJvPjMLP3j03z41jZX17GcDAyltZ4Cfh34n1rrXwOutXdZQggh7GCOOLVr3FzYKE3xSgBDFATZZwjhQb3RKXwq36BzKRtqyiktUY5PIhkzyhXDdmdgVOUDGDKJRBSzN4biAOxqcjeIt5wMDKWUup38OyEfXcHrhBBCeIwZWLCthMS4bswjJSSf/XE3AH/w9naXVyIWIfsMITyoL5qkpbacgH/p1PkSn2JTnfOjVM1yxQabMzAaq/PPtiEXenyYnjjRz0OHuxgYn6altpz7D+3inps2uraeYiJ7ibzOQSOA4XIW0nIyMP4t8ADw91rr15RS24Aj9i5LCCGEHeYCGDZt9qoCfsr8Ps9kYDzbE+XZnqjbyxCLk32GEB7UF0uydRn9L0yt9SHOxpwOYOSfNXZnYARLS6gLlbrWA+OJE/088PhJ+sen0UD/+DQPPH6SJ070u7KeYiN7ibyuwTiVAT+b6spdXceS73BorZ8hX59qfn8a+AM7FyWEEMIe5rtVdjU8U0oRqShjxCMBDOF9ss8Qwnu01vRGk9xz4/Lf4W+rL+eVc+M2rupKsaQZlLc3gAH5Rp5Dk+482x463MX0bPaSY9OzWR463CVZGMIx+QaeVSilXF2He/NPhBBCOM58t6repjGqkC8j8UoJiRBCiJUbTaaJz2SWNYHEtLm+gonpWSamZm1c2aWicbMHhr0lJGAGMNzJwBgYn17RcSGsprWmywhguE0CGEIIUUSiiRR1oVJKS+z76z9SGfBMCYkQQoiVW8kEEpPZ7NPJPhjRZIqyEh9VAfvb5jRXB10rIWmpXThl/2rHhbDa0GSKielZdhdCAEMptW85x4QQQnhfLJG2vVY4XFHmmQBGXaiMupD978yJ1ZN9hhDe0xvNByG2hFeQgRF2PoARS6SJVJY5ktLeVJ0PzmeyOdvvdbn7D+2i5LI/YnlpCfcf2uX4WoqR7CXg9cFJwP0JJLC8Lt//E7h5GceEEEJ4XDSRsq2Bp8ksIdFau14n+X9/Z4+r9xfLIvsMITymL5qkxKeWNULVZJ57ZjRp17KuEE2kbA/Km5pqgmgNI4kUG2qczXx47w0t/Onjr5IDZmZzVAb8/Od73iT9Lxwie4l8A0+A3c3VLq9kkQCGMdLsrUCDUuqP5/2oGlh6npIQQgjPiSbSXNdi78MnUhkgk9NMTM9SW+TvWIirk32GEN7VG0uyqa58ReWGlQE/4YoyzrmQgeGE5uogAIMTM44HMF4bmGRqNsdnPngDX3/pHIlURoIXwlFdg3Gaq4PUhErdXsqiJSRlQCX5IEfVvI9J4H32L00IIYTV8hkY9r5bZW4mvVBG8pc/7OQvf9jp9jLEwmSfIYRH9UWTKyofMbWFQ872wHAyA8MIYLgxiaTDGOG5b0eEA+0RXhuYJOaBZ2yxkL3ExQkkXnDVDAyt9U+Anyil/kZrfcbBNQkhhLDBzGyW+EzG/hISYzMZTaTZ0WjrrZb0szNj7i5AXJXsM4TwJq01fdEkb9lSv+LXttWHOO7Q37taa6OvkzMZGBcDGM438uzoGWF3cxWNVUH2tzfwVz96g2dPxXjvDS2Or6UYFfteYjab49RwgjvaI24vBVi8hOR/aK3/EPhfSil9+c+11u+1dWVCCCEsFUvmx83ZnYER9lAGhvAu2WcI4U0jiRTJdJYt4eX3vzC11Yf47isDzGZztk67AoinMqSzORocysAIV5Th9ynHJ5HMzGb5ad8Yv3PbZgCu31hDTXkpHd0jEsAQjuiLJklnc97PwAC+Ynz+KycWIoQQwl5muqnd6bZzGRhxCWCIRck+QwgP6jMmkGyOrKKEpD5ETkP/2DRbVvH6lTCfMU5lYPh8isaqgOMZGC/1jpLO5NhvvPtd4lO8dXuYju6SwP1jAAAgAElEQVSoJ5pli/Wv02jg6fkAhtb6uPH5J84tRwghhF3MjAi7S0jqQmX41MWMDyEWIvsMIbypL5afIrJ1NT0w6i+OUrU7gOFUVuF8TTVBxwMYz/ZEKSvxcevWiyU9+9sj/ODng5waSbKjsdLR9Yji0zUYp8SnPPPf2pJjVI1Z7P8J2GycrwCttd5m79KEEEJYKRp3ZrNX4lPUV5R5ooRkQ03Q7SWIJcg+Qwhv6Ysm8fsUm+pWPmljsxH0cKKR51wGRoVzAYzm6iBvDMUdux/A0e4oN2+uJVR28de2AzsaAOjoHvHML5XrWbHvJToH42yNVBDwe2NA2JIBDOCLwB8Bx4GsvcsRQghhl2jSzMCwf7MXqQwQTbifgfE/PnST20sQS5N9hhAe0hdL0lofwr+KHhaNVQHK/D5nAhhzGRjOjetuqg7S0R117H7RRIpfXJjk379r5yXH28Ih2upDdPRE+Wf7tjq2nmJV7HuJrqFJ3ryp1u1lzFlOAGNCa/0D21cihBDCVtF4moqyEsrL7I+g5wMY7mdgiIIg+wwhPKQ3OrWqBp6Q7xPRWlfO2Zj9AQyzr1N9hbMBjHgqQzKVoSKwnF+j1ua5UzEA9rc3XPGz/e0RnnzZmYaponglUhnOjU7zgT2tbi9lznL+az+ilHpIKXW7Uupm88P2lQkhhLBUNJEiUuVQt/ZKb5SQ/Nl3X+PPvvua28sQi5N9hhAeobXmTCy5pv4Vm8MVzmRgJFLUhUpXlSmyWs01+WeoU5NIOrpHqCkv5fqNNVf87MCOCIlUhpfPjTuylmJWzHsJs2TKKw08YXkZGLcan/fOO6aBg9YvRwghhF1iyZRjzc4ilQFiHigh+cXApNtLEEuTfYYQHjEcTzGVzrJ1DQGMtvoQL/WO2j4hI5ZIO9rAE6CpKt8LYWhyhu0N9vae0FrT0R3lrdvDlPiu/Of41u0RfCrfI+MtW+oXuIKwSjHvJbqMCSS7m6tdXslFSwYwtNZ3OrEQIYQQ9orG02xeZVrwSkUqA0yls0ylM5c0HhPicrLPEMI7eqP5CSRbVjGBxNRaHyKRyjA2NWtreUc0kXJshKqpqeZiAMNup6NJBiZm+L07Iwv+vCZUyvWbaunoHuGP37lzwXOEWKuuwTihspJVNfW1y3KmkPy/Cx3XWn/K+uUIIYSwSzSRYs+WOkfuZW4qo/E0bWEJYIirk32GEN7RZwQw1pKBsdkYpXomlrQ1gBFLpLmmxdl3hZuq8wGMwQn7SySf7ck3Cz3QvnAAA/JlJJ/7ySkmZ2apDpbaviZRfDoHJ9nZVIVvgSwgtyynaCw57yMLvBvYYuOahBBCWCyb04xOOZdu22Dcx5x8IsQiZJ8hhEf0xpKUlfhoqV39u61tRqaf3X0woonU3LPGKZUBP5UBvyMZGEe7o7TWl8+Npl3I/vYI2ZzmeaPZpxBW0lrTNRhnt4f6X8DySkj+2/zvlVJ/BTxp24qEEEJYbjSZRmvnxs2ZgZJo3N0AxraG1b+LKJwh+wwhvKMvmqS1vnzBngvL1VqXD2CcszGAkcpkmZzJEHZwAompqTpgewAjk83xwqkYv3pDy6Ln3dxWR6ishI7uKIeua7Z1TcWsWPcSI/EUY1OznmrgCctr4nm5ELDN6oUIIYSwjzkRxKkMjLkSEpcbef7Fr7/Z1fuLVZF9hhAu6YtOral8BKC8rITGqgBnbBylOprMP1ucmqw1X3NN0PYpJK+cHyeeyrB/x9XLRwDK/D5u3VpPh1FuIuxRrHuJzkHvTSCB5fXAOEm+GzhACdAASF2qEEIUEHMiiNMBjJgHRqkKb5N9hhDekMtp+mLJRXsuLFdbfcjWEpJoPP9McyUDoyrIi72jtt6jozuGUvDW7eElz93f3sCRrl9wfmyKTXXONOoWxcGLE0hgeRkYvzrv6wwwpLXO2LQeIYQQNjAzMJzq2B7wl1Ad9M/d1y0PPP4qULzvnhQI2WcI4QGDkzOkMjm2rDEDA/J9MF6wsS+D2V8p7HAPDMhPIhmanCGX07Y1NuzoGeH6jTXULSNAYwacOrqjfOiWNlvWU+yKdS/RORinoSpgazPe1ViyiafW+sy8j37ZVAghROFxuoTEvJfbJSSnR5KcHkm6ugaxONlnCOENVkwgMbXVh7gwOUMqk13ztRZiZhU63cQToLk6SCaniSXteb4lUhlOnB1fsnzE1N5YSVN1gKNSRmKbYt1LdA1Neq6BJyxvCokQQogCN5JIUVbiozro3EjTfABDSkiEEKIQ9Mbyv6BZkoFRH0JrOD82veZrLcTprML5mqrzQRO7Gnm+cCpGJqeXHcBQSrFvR4TneqLkcnrpFwixDJlsjjeGEuxqkgCGEEIIF8QSacKVZSjl3BzvSFWZBDCEEKJA9EWTlPl9bKgOrvlam81RqjY18owlUgRLfYTKSmy5/mKajH8+dgUwOnqiBEt97NlSt+zXHGiPMDY1y2sDk7asSRSfvtgU6UzOcw08wcYAhlLqEaXUsFLq5/OO1SulnlJKdRuf64zjSin1WaVUj1LqVaXUzfNec69xfrdS6t55x/copU4ar/msMnblV7uHEEIUs2gi5Wj5CEC4wv0SEiGEEMvTG51ic33Ikr4OrfVGAMOmRp6xRJpIZcDRoLypuSYfwLBrEklHT5RbtoYJ+JcfnNlnZGsc7RmxZU2i+JgNPK/Z4K0GnmBvBsbfAHddduwTwI+11u3Aj43vAd4NtBsf9wGfg3wwAvgkcCtwC/DJeQGJzxnnmq+7a4l7CCFE0coHMJxNtY1UBpiYniWdyTl63/mubanm2hbvPXyFEMJr+mJJS8pHIN+bory0xLYAxkgi5UoDT8AInMDQpPUZhhcmpukZTrB/x9LTR+ZrrAqyu7mKjm7pg2GHYtxLdA1O4lOwo7HS7aVcwbYAhtb6GeDyGUN3A48aXz8K3DPv+Jd13gtArVJqA3AIeEprPaq1HgOeAu4yflattX5ea62BL192rYXuIYQQRStfQuLsZi9SlQ+YjNrU6Gw5Pvme6/jke65z7f5CCFEIsjnN2diUJQ08Id+Xoa0+xBnbSkjSNLjQ/wKgtMRHpDLA0IT1GRhmAGL/joYVv3b/jgjH+saYTtvTOLWYFeNeonMwzpZIBcFS58u0luJ0D4wmrfUFAONzo3F8I3Bu3nnnjWOLHT+/wPHF7iGEEEVJaz2XbuukcEX+ftIHQwghvO3CxDTpbI4tYWsCGJAvIzlnUwZGNJGae8a4obk6aEsJybM9USKVZaua/LC/PUI6m+OlvsvfPxZi5bqG4p6cQALeaeK5UAGbXsXxld1UqfuUUseUUsdGRqRmTAixPk1OZ0hnc46XkDQYGRhuBjD+8Osn+MOvn3Dt/kIIUQj6ovlAw5ZIyLJrbg6HODs6RT5Z2jq5nGY0mXZlAompqTpgeRNPrTUdPTH27Yisqg/JrVvDlJX46OiW32msVmx7ial0hrOjU+xq8mbZjNMBjCGj/APj87Bx/DzQOu+8TcDAEsc3LXB8sXtcQWv9sNZ6r9Z6b0PDylO1hBCiEEST+QCCexkY7pWQXJiY4YINab5CCLGemCNUrSohgfwo1enZLCMWB7EnZ2bJ5LTjz7T5mqqDlgcwOgfjRBOpuYacK1VeVsKezXUclT4Yliu2vcQbQwm0xpMTSMD5AMaTgDlJ5F7gO/OOf8SYRnIbMGGUfxwG3qWUqjOad74LOGz8LK6Uus2YPvKRy6610D2EEKIoRePuBDAiVfn7xaSERAghPK0vmiRY6qOpau0jVE1txiQSq8tIzKw+dzMwgoxNzTIza12/CbP/xYH21QUwAA7sjNA5GGckLs9dsXpdg/lxvEVXQqKU+jvgeWCXUuq8UuqjwKeBdyqluoF3Gt8DfB84DfQAXwB+D0BrPQo8CPzU+PiUcQzgd4G/Nl5zCviBcfxq9xBCiKJkZkCYTTWdUlFWQrDUJz0whBDC4/qiSbaEKywZoWpqC+cDGFY38jSfaQ0uZmA0V+cDPVYGCjp6omxvqGBDTfmqr3HAaP75bI9kYYjV6xyMU15aMheE9Bq/XRfWWv/mVX709gXO1cDHr3KdR4BHFjh+DHjTAsdjC91DCCGKVcwoIXG64ZlSinBFwNUSEiGEEEvrjSXZ2Wjtu60ba8tRCstHqV7MwHCxhKQmH8AYnJyh1YJf8lKZLC/2xvjQW9rWdJ3rWqqpC5VytDvKPTdtXPoFQiygazDOzqZKSwOaVrItgCEK1xMn+nnocBcD49O01JZz/6Fd8pegEAUsGk/hU1Bf4Xy6baQq4GoGxs2b61y7txBCFIJMNse50SnedW2zpdcNlpbQXB20PIARM4LibjfxBBi0qC/C8TNjzMzmVt3/wuTzKd66I0JHzwhaa/KV9mKtim0v0TUY5+3XeHeQpwQwxCWeONHPA4+fZNqo6esfn+aBx08CSBBDiAI1kkhTX1FGiQuR9IbKMvrH3Wt89Sd37Xbt3kIIUQgGxmeYzWq2WjiBxNRWH+KsxSUksUQ+KF8Xci+AYZaQWNXI89meKCU+xW3b6td8rQM7IvzDqxfoGU7Q3uTNHgaFppj2EiPxFLFkml3N3pxAAt4Zoyo84qHDXXPBC9P0bJaHDne5tCIhxFrFEinHy0dM+RIS6YEhhBBeZU4g2RK2bgKJqa0+ZHkGhptBeVNNeSkBv8+yAEZHd5SbWmupCpau+Vr7jSagMo1ErEbXYBzwbgNPkACGuMzA+PSKjgshvC+aSDnewNMUqSpjNJkml9Ou3P9ff+U4//orx125txBCFIK+qPUjVE2bwyGG4ymm09ZN64glUq6OUIV8j6em6iCDk2sP0I9PpXm1f2Iu8LBWm+pCbI1U0CGNPC1TTHuJTmMCiVdHqIIEMMRlWmoX7nx8teNCCO+LJtKubfYilQGyOc349Kwr9x+bSjM2JU1EhRDianqjSSrKSmiosv45YTa4PDdmXRZGNJFytf+Fqbk6aEkGxnOnYmgN+9fY/2K+/TsivHA6RjqTs+yaxayY9hJdg3EilWWuBwkXIwEMcYl/986dVxwrLy3h/kO7XFiNEMIKrpaQGA9AKSMRQghv6osl2RyusKXhozmG0co+GLFk2rVn2nxNNdYEMDp6olQG/NzQWmvBqvL2t0eYSmf52dkxy64pikPXUNzT2RcgAQxxmc1GA6fy0hIAwhVl/MWvXy8NPIUoUNPpLMl01r0SEuNdMglgCCGEN/VFk2yxoYEnwGajr4aVfTBiLmYVztdUFWBwYgat11Yi2dEd5bZtYUpLrPu17PbtYUp8ig7pgyFWIJvTvDEUZ1eTdxt4ggQwxGWe7hymxKf4p/vfRsDv4703tkjwQogCZgYO3NrsNcxlYBRH6qUQQhSS2WyOc2PTtjTwBKgLlVIZ8FsWwJiZzZJIZbxRQlITJJXJMTmdWfU1zsamODs6xQGL+l+YqoOl3LCphqPSB0OswNnRKWZmc55u4AkSwBCXebpzhD1tdTRVB7l9e5inO4fXHFkWQrjnYgDDnc3eXAlJ3J0MjH07IuyzsK5YCCHWk/Nj02Rzmi02NPCEfLPLVgsnkZjPtAYvZGAYo1QH11BGcrRnBMCW59T+9gZOnh9nYsqdHlTrSbHsJboKoIEnSABDzHNhYprXL0xy5+5GAA7ubuRMbIrTRndqIUThMTMf3MrAqC0vpcSniCXdCWD8wdvb+YO3t7tyb2EvpVSrUuqIUup1pdRrSql/axyvV0o9pZTqNj7XGceVUuqzSqkepdSrSqmb513rXuP8bqXUvfOO71FKnTRe81llR5MAIVxk5wQS0+b6EGdi1uwlzWeaFzIwrAhgPNsTZUNNkO0N1v/zP9AeIafhuVOShbFWxbKX6ByMoxTsbJIAhigQ/9SVjwIfNAIYd+7Kfz7SOezamoQQa+N2CYnPpwhXlBGNSwmJsFwG+Hda62uA24CPK6WuBT4B/Fhr3Q782Pge4N1Au/FxH/A5yAc8gE8CtwK3AJ80gx7GOffNe91dDvy5hHBMrxHAsKuEBKAtHOLc2LQl47RjxjMt7IEMjGYjgLHaRp7ZnObZnhj7d0RsaaB6Y2stlQG/lJGIZeu8EGdzfYjyshK3l7IoCWCIOU93DrOxtpydTZVAfvRVe2MlT0sAQ4iCZW726ivce7cqXBlwrYnnvY+8xL2PvOTKvYW9tNYXtNY/M76OA68DG4G7gUeN0x4F7jG+vhv4ss57AahVSm0ADgFPaa1HtdZjwFPAXcbPqrXWz+t8LeWX511LiHXhTCxJZcBva5lhW32IdCbHsAWlhLG5rEL3MzAaq/NBlKGJ1QUwft4/wcT0LPst7n9hKi3xcdu2emnkaYFi2UsUwgQSkACGMKQyWZ7tiXLn7oZLosAHr2nkpd5R4jNSPydEIYom0lQF/QRL3YumRyrLiCbdycCYmc0yM5t15d7COUqpLcBNwItAk9b6AuSDHECjcdpG4Ny8l503ji12/PwCx4VYN3pjU2yJhGzJADCZo1StKCMZcTmrcL5gaQm1oVKG4qsLYHQYmRF29lbYvyPC2dEpS8fYFqNi2EtMp7P0xZLsavb2BBKQAIYwvHh6lKl0dq5sxHRwVyOZnJborRAFaiSRcr3ZWUNlwLUmnmL9U0pVAt8G/lBrPbnYqQsc06s4fvn971NKHVNKHRsZGVnOkoXwjL5o0tbyEbgYwLCikWcskaYy4G5Qfr7m6iCDE6t7vnV0R7lmQ7WtwZj97Q3AxWahQlxN93AcrfH8BBKQAIYwHOkaJuD38dbtl0aB92yuozrolzISIQpULJFyvdlZuLKMWDIlE42E5ZRSpeSDF1/VWj9uHB4yyj8wPpsPsPNA67yXbwIGlji+aYHjl9BaP6y13qu13tvQ0LD2P5QQDklncpwfm7K1gSfAxrpyfArOWRDAiHrgmTZfU3VwVT0wptNZjp8Zs3x86uW2N1SwoSYob0SKJXUOxgHvTyABCWAIw5HOYW7fHr6iaYu/xMcdOxs40jViSfMlIYSzoom066m2kcoAM7M5kun1nX4pnGVMBPki8LrW+r/P+9GTgDlJ5F7gO/OOf8SYRnIbMGGUmBwG3qWUqjOad74LOGz8LK6Uus2410fmXUuIgndubIqctreBJ+R7MbTUlnPGigyMZIqwiz2dLtdUHVhVAOPF3hjpbM720ZxKKfbviPDcqRjZdbyPf+JEP/s+/TRbP/EP7Pv00zxxot/tJRWcrsE4Ab/P9r8PrCABDMHpkQR9sam56SOXO7i7kWgixc8HJhxemRBiraKJlOsBDLNbvBtlJG+/ppG3X7Pw322i4O0Dfgc4qJR62fj4ZeDTwDuVUt3AO43vAb4PnAZ6gC8AvwegtR4FHgR+anx8yjgG8LvAXxuvOQX8wIk/mBBOMEeobrE5AwPyZSRWlZC4/Uybr7k6SDSRIpPNreh1Hd1Rykp83LKl3qaVXbS/PcLE9Cwn+9fnPv6JE/088PhJ+sen0UD/+DQPPH7S0iBGMewlugbjtDdVUuLz/rRwv9sLEO4zy0Mu739h+qWdDSiVP+/Nm2qdXJoQYg1msznGp2ZdT7c1u8XHkilHNsrz3XfHdkfvJ5yjte5g4T4VAG9f4HwNfPwq13oEeGSB48eAN61hmUJ4ljlC1e4SEoDN4RA/em1ozdeJJlLc1Fa39IkOaaoJktP5flMbasqX/bqOnih7t9Q5Mq7SzPLo6B7hxtb1t49/6HAX05c12JyezfLQ4S7uucmavsvFsJfoHIzztl2FUQYpGRiCI13D7GispNVosnS5cGWAG1trpQ+GEAVmNGmOm3O/hARgJO7OJBIhhBBX6oslqQ76qQuV2n6v1voQsWSaRCqz6mtkc5rRZJoGL/XAqAoCMDS5/AzDkXiKzsG4beNTLxepDHDthmqOrtM+GAPj0ys6Lq4US6SIJlIF0cATJIBR9BKpDC/1jl61fMR0cFcjr56fYHiVo6KEEM4biXtj3Jx5/2jC+RKSD37+eT74+ecdv68QQnhdXzTfwNPOEaqmzfX5LI+1NPIcn0qT0xfLEr2guSYfwBicWP7++FljfOp+m/tfzHegPcLPzo6RXEMAyas2GP8OLtdSu/yMmKWs971EVwE18AQJYBS9ju4os1l91fIR051GgOOfumQMkxCFIjaXgeH+FBLI1y4LIYTwht5o0rGyPnOU6pnY6gMYUeMZ4nZZ5HxN1WYGxvIDGEe7o9SGSrmupcauZV1hf3uE2azmpd7RpU8uMPsWyGQpLy3h/kO7XFhNYSqkCSQgAYyid6RzmKqAn71bFq8nvK6lmqbqAEekjESIghH1SAZGaYmP2lCpKxkYQgghrjQzm2VgYtqxiQNmAGMtGRixhDeeafOFK8rw+9SyAxhaa57tibJve8TRZolv2VJPmd+37spIsjnN8b4xNtWWs7H2YibGf7hrl2X9L4pB12Cc+ooyGjz0/9ZiJIBRxLTWHOka5sDOCKUli/+noJTi4O5GjnZHSWdW1mlZCOEOM2AQqXL/gRSuKJMAhhBCeMS50Sm0hi2RhfufWa0mVEpNeemaJpGMzAUwvJOB4fMpGqsCDC4zgHFqJMHg5Ixj/S9MwdISbtlST0fP+sqkfuoXQ5yOJvmTd+/m2U+8nY4/uROlYCwpGZ8r0TkUZ1dTlSPlZFaQAEYRe21gkuF4asnyEdOduxpJpDIc61t/6WdeIDOshdViyTTBUh8VDnQ5X0qkMiAlJEII4RHmBBKnMjAgn4VxZk0ZGN5oTH25pprgsjMwzAwIJ/tfmPa3R3hjKLGicheve/iZU2yqK+fdb2oGYFNdiF/a2cDXf3qO2RWOti1WuZymeyheMOUjIAGMomaWg7xtmQGMfTsilJX4ZBqJDZyYYS2KTzSeIlwR8EREPVIVcCUD41ffvIFfffMGx+8rhBBe1hdzboSqqa0+tLYSkmQKv09RHbR/aspKNFUFlz2F5NmeKJvDoatO/rPT/rlxquujjORY3yg/OzvOv9y/Ff+8TPLfunUzw/EUP37dut9X1vNe4tzYFFPpbMFMIAEJYBS1p7uGuWFTDQ3LTC+vCPi5dVs9T3dJAMNqi82wFmK1RhIpT5SPAEQqyubSf530O7dv4Xdu3+L4fYUQwst6o1PUhkqpDTlXjtEWDnF+bIpsTq/q9dF4mvqKMnwO9o5YjuaaIEPLmEIym83xwulRV7IvAK7dUE24ooyOnvURwPj8M6epDZXygbe0XnL8zl0NNFcH+dpLZy2713reSxRaA0+QAEbRiiVSvHxufG66yHId3N3I6ZEkZ4zIvbCGzLAWdogl0jR4pFY4UhkgPpMhlckufbKFptNZptPO3lMIIbyuL5p0tHwE8hkYs1nNhYnV7W1iyZTnykcgP4kknsosOaL05XPjJFIZDjjc/8Lk8yneuiNCR08UrVcXRPKKUyMJ/vH1IX7nts2EyvyX/Mxf4uODb2nlaPcIZ9cw9Wa+9byXMEeo7mySAIbwuJ+8MYLWLLv/hemgEfCQMhJrXW1WtZUzrEXxiSbyJSReYGaCON0H45996SX+2ZdecvSeQgjhdX2xpKPlI3BxEslqG3mOJNKeGqFqaqrOP9+W6i1xtDuKT8Ht29wJYAAcaI8wEk/RNRR3bQ1W+Oujpykt8fGRq2RFfOiWVhTwdz+1JgtjPe8lugbjtNWHqAj4lz7ZIySAUaSOdI0QqQxw/caVzaDeHK5gW0OFBDAsdv+hXVyeERks9ckMa7FquZwmlkwTqfLGZi9ckV+HTCIRQgh3zcxmuTAx40oGBrDqd8VjiZQnxzw2V+fHdy41ieTZnijXb6qlJuReDw8z+6OQ+2CMxFN8+2f9vG/PpquWwW+oKefg7ia+deycTE9cQufgZEGVj4AEMIpSJpvjJ13DvG1Xw6rqCA/uauTF06NLpsqJ5bu5rY6chuqgH/PfyG/s2SgzrMWqTUzPks1pz6TbupWBIYQQ4lJnjACCUyNUTRtqgvh9atUZGDGvZmDU5AMYi2VgTM7M8vK5cQ641P/CtKGmnO0NFXPTUArRo8/1MZvN8bED2xY977dubSOaSPPUL4YcWlnhmZnN0hebKqgGniABjKL0s7PjTM5k5spBVurg7kbS2dy6aQLkBY/97DxKwQ//8A5O/8Uvszkc4vSwNXV7ojiZmQ5hjwQwzHfN3GjkKYQQ4iJzhKrTJST+Eh+b6spXFcBIpjJMz2Y980ybr6naDGBc/fn2wqkY2Zxmv0v9L+Y70N7Ai70xx3tSWSGZyvCVF87wrmublvzv946dDWysLeerL55xaHWFp2c4QTanJQNDeN/TncP4fWrVf4nu3VJPZcA/N4ZVrE0up/n28fPs3xGhpbYcpRTv37OJ50/HLGs+JIqPGSiIeOTdKvNdM8nAEEIId5kjVLc4HMAAaK0PrSqAYT47vJJVOF9lwE9lwM/gIpNIOnqilJeWcFNbrYMrW9j+HRFmZnMcPzPm9lJW7JvHzjExPct9d2xf8twSn+I3b2nluVOxuaCduJQ5gUQyMITnHekcZu+WulXP0S7z+zjQHuFI13DBdzH2ghdOx+gfn+Z9ezbNHfuNPZvwKfjW8XMurkwUMnOz55V64VCZn1BZieM9MN63Z9Ml/28JIUSx64smCVeUrXofuBZtqwxgjMxlFXojKH+5purAoiUkHT1Rbt1WT8Bf4uCqFnbb9jB+nyq4PhiZbI6/PtrL3s117Nlct6zXfGBvK36f4u/WOFJ1ve4lugYnKfP7HO+Hs1YSwCgy/ePTdA3FV10+Yjq4u5GhyRSvDUxatLLi9a3j56kK+jl0XfPcsQ015dyxs4HHjp9f9bx0Udy8VkIC+XfOnA5gvH9vK+/f27r0iUIIUSR6o0lXsi8ANodDjE/NMjE9u6LXxcysQo9M1rpcU3XwqgGMgfFpTo8k2e9y/wtTZcDPTW21BVcK/g8nL9A/Ps19dyze+2K+xuog77w238xzZnb1JTPrdWx+MQ0AACAASURBVC/RORhnR0Ml/pLCCgkU1mrFmpllH2sNYLzNGL8qZSRrE5+Z5Qc/v8B7bmghWHppVP4De1u5MDHD0e4Rl1YnClk0kaLEp6gtd6/b+eXClWWOl5CMJtOMJqVsRQghTH2xpGvvuJqTSM6tMAsjZvw97pXJWpdrrg5etQeGmelwoL3BySUtav+OBk72TzBWIM9HrTUPP3OabQ0VvOOaphW99sO3tjE2Ncvh1wZXff/1upfoGowXXPkISACj6BzpHKa1vpztDZVruk5DVYAbNtXwdJcEMNbi+ycvMDObWzAt7R3XNFFfUca3jp13YWWi0EXjacIVZauaNGQXNzIwfvdvj/O7f3vc0XsKIYRXTaUzDE2m2OrwBBJTqzlKdYUBjGg8/+yor/BmAKPRyMDILZA1e7QnSkNVgJ1Na9t7W2l/ewSt4dlThZGF8dypGK8NTPKxA9tWvK/Ztz1CW32Ir764+jKS9biXGEumGY6nCq6BJ0gAo6jMzGZ59lSUO3c1otTaf6m5c3cjL58bn0vrEyv3rWPn2d5QwU2tVzZ1KvP7uOfGjfzoF4PrMuor7BVLpjxVPgL5hqJOBzCEEEJc1Bc1R6i6m4FxZoVNymPJNNVBvyd6SCykuTpAJqcZnbp0v5bLaZ7ribJ/R8SSvbdVbthUQ1XQXzB9MD7/zGkilQF+7aaNK36tz6f48K1tvNQ7SvdQ3IbVFSazgacEMISnvXA6xsxsjjvXWD5iOri7Ea3hJ29IicNq9EaTHDszxvv2tF71ofbBt7Qym9U8caLf4dWJQjeSSHtmAokpUhlgNJmWvi5CCOGSuQkkLpWQVAVLqa8oW3EGxkgi5ckJJKbmmvwo1csnkbw+OEksmfZM/wuTv8TH7dvCHO2Oer4h/+sXJnnmjRH++b4tV5RbL9f79myitETxtTU281xPugbzfQx3N1e7vJKVkwBGETnSOUywNP8XlhXe1FJDpDLAj6UPxqo8dvwcPgW/fvPVo8m7mqu4YVMN3zx2zvMPGOEt0XjKMxNITJHKADkNY1OSUSSEEG4wx0m6lYEB+SyMFffASKQ8O4EE8iUkwBWNPM0Mh30eC2AAHGiP0D8+Td8Ks2Gc9oVnThMqK+G3b9286mtEKgMcuq6Zbx8/v6ZmnutJ11CcmvJSmqq9tVdcDglgFAmtNU93DbNve2TV0cvL+XyKO3c18MwbI8xmc5Zcs1hkc5rHf9bPHTsbaDIeelfzgbe00jkY52T/hEOrE4VOa22UkHhrs2euR8pIhBDCHX3RJJHKAJUBv2traKsPcWY0uaLXxBJpb2dgzAUwLn2+dfREaW+snMvQ8JL9RlPRDg83ix8Yn+bJVwb44FtaqQmtrSn5b926mcmZDN979YJFqytsnYNxdjVXeaq0abkkgFEkTo0kODc6zdssKh8xHdzdSHwmw/EzY5Zed717tifKhYmZZc2Uzk8o8fHNY+ccWJlYD5LpLDOzOc9t9sz1ODmJ5Ldv28xv37b6d22EEGI96YslXWvgaWqrDzEwPrOiN7+iHs/AaKgKoBQMzsvAmJnN8lLvKPvbvZd9AbAlHGJjbTlHPdwH40vP9qKBj+7fuuZr3batnm0NFXztxTMrfu1620vkcpo3CnQCCUgAo2g8bdH41Mvtb49QWqJknOoKPXb8PDXlpcsaBVUdLOWX37SB77w8IGlvYlnMbu1eDWA4mYHxnhtaeM8NLY7dTwghvKw3OuVa/wtTWzhENqcZGJ9e1vmZbI6xqVnPPdPmKy3xEa4IMDSvB8bxM2OkMjkOeDSAoZTiQHuE50/FyHgwk3pyZpa/e+kcv3L9BjbVrT3oppTiw7e08bOz47x+YXJFr11ve4n+8WmS6WxBNvAECWAUjSOdI+xqqmJjbbml160KlvKWLfVzARKxtInp/Czq997QsuxynvfvbSU+k+GHP1/9DGtRPGLJfIDAa+9WmU1FR+LOBTAGxqeXvUkWQoj1LD4zSzSRcrX/BVycRLLcRp7mJDavTda6XHNNgKH4xQDG0e4ofp/ilq3W9J6zw/72CPFUhlfOe69M+WsvniWRynDfHdssu+Zv3LyJMr+Pr61wpOp620uYE0gkA0N41uTMLD/tG7Vs+sjlDu5upHs4seKGTMXqe68OkMrkeP/epctHTLduraetPsQ3fiplJGJpI/H8Zs9r71bVlJdSWqKIOTgW+I++8TJ/9I2XHbufEEJ4lTm6dGuBBTCiRtlhpMJbQfnLNVcHL5lC0tEzws1tda72G1nKvu0RlMJz41RTmSyPdPSyb0eYN22ssey6dRVl/Mr1G/j7E/0kU5llv2697SXMCSQ7mySAITyqoztKJqctLx8xmdc90iVZGMvx2PHz7Gyq5PoV/IXs8yk+sHcTz5+Ocdbj3aKF+8wSjYYqbwUwlFKEKwJzJS5CCCGcMzeBxOUSkubqIGUlvmXvZ8yswojHnmmXa6wOzk0hGU2meW1g0rP9L0x1FWW8qaWGjh5vNfL8zssDDMdT/Ks7tlt+7Q/f2kYileG7rwxYfu1C0TkYZ1NdOVXBtTVGdYsrAQylVJ9S6qRS6mWl1DHjWL1S6imlVLfxuc44rpRSn1VK9SilXlVK3TzvOvca53crpe6dd3yPcf0e47WF117VQk93DlMd9HNzW60t19/WUMmWcEjKSJahZzjOibPjvG/PphV3/f2NPZvwKfjWccnCEIszm2TWe/DdqnBlmUwhEUIIF/TNjVB1t4mnz6fYVF++ggwMoyzSg8+0+Zqrg4xNzZLKZHnuVBSt8XwAA/JrPHF2nMQKMhLslMtpvvDMaa7ZUG1L/5C9m+vY2VTJ115aWRnJetJVwA08wd0MjDu11jdqrfca338C+LHWuh34sfE9wLuBduPjPuBzkA94AJ8EbgVuAT5pBj2Mc+6b97q77P/jeFMup/mnrhHu2NmAv8S+f9137m7k+VMxptPSZHIxjx3vp8SnuOemjSt+7Yaacu7Y2cBjx8+TzWkbVifWi2giRW2olFIb/59frUhlwNESEiGEEHl9sSmaqgOEytwvadhcH1p2AMMMyns9A8McpTo8maKjO0pV0M+bLSx/sMuBHREyOc0Lp2JuLwWAf3pjmO7hBPfdsdWWEZ9mM89Xz09w0oO9P+yWymQ5HU0WbANP8FYJyd3Ao8bXjwL3zDv+ZZ33AlCrlNoAHAKe0lqPaq3HgKeAu4yfVWutn9daa+DL865VdH4+MEE0kbKtfMR0cHcjqUyO5055q4bOS7I5zd+fOM/bdjbQWLW6eeAf2NvKhYkZjnp4ZrdwXzSR8lz/C1OkUkpIhBDCDX2xpOvlI6a2+hBnY1Pkt+qLiybSlJX4qPJwLwmAxur8c3dwcoaj3VFu3xa29c1Dq+zZUkew1EdHjzf28J//yWlaaoL86pvtm/rxazdvIljq42svrXykakG6cAF+6ZdgcJBTw0myOc2u5mrLr+0Ut/6v0sCPlFLHlVL3GceatNYXAIzP5m/cG4H5OfPnjWOLHT+/wPErKKXuU0odU0odGxlZn78QPt05jFLwSzsbbL3PLVvrCZWVSBnJIp7pHmFoMrWi5p2Xe8c1TdRXlPGtY+eXPlkUrVgi7dlU20hlGdFEelmbVit87MA2PnbAug7mQghRqPqiSdcbeJpa60PEUxnGp2aXPDeaSBGuLLPl3XgrNdfk35x6qXeU/vFpz45PvVzAX8ItW8OeeHPslXPjvNg7yr/Yv9XWLNKa8lLe8+YWvvPyAPGZpf8bLPi9xIMPQkcHPPggXUP5Bp4rLiHJZCCRgFgM+vvh9On8sXnXdopbAYx9WuubyZeHfFwpdcci5y70t5VexfErD2r9sNZ6r9Z6b0ODvb/gu+VI5zA3ttbaPnoq4C9h/44IT3cOO/aLSaF57Ph56kKlHNzdtOprlPl93HPjRn70i8G5sWJCXC6aSHk21TZSGSCdzRF3qNb2Hdc28Y5rV///nBBueuJEP/s+/TRbP/EP7Pv00zxxot/tJYkCNTkzSyyZdn2EqmmzkQmynDKSmIezCuczS0i+fTz/JtP+9sL53eLAjginRpJcmHB3VOjDz5ymKujnQ7e02X6vD9/axlQ6y3deXrqZZ0HvJS5cgEcegVwOPv95dvz73+O/f/8z7PiDfwk9Pflzvvc9uP12uPlmuPZa2LYNWlqguzv/8898BkpLoaoKIhHYtAm2b4eXX4YvfSl/7S99ybEsDFcCGFrrAePzMPD35HtYDBnlHxifzbfyzwOt816+CRhY4vimBY4XnZF4ilfOT3DnLnvLR0wHdzdyYWJmbrawuGh8Ks1Trw1x940bKfOv7X+7D76lldmslo2suKqRRIoGj272IlX5zBCnykhOjSQ4NZJw5F5CWOmJE/088PhJ+sen0UD/+DQPPH5S/u4Xq9LnkQkkJnOU6pllBDCiiTThSm9mFc5XU15Kmd/H6WiSjbXlbAm72yx1Jcxmo0ddHKd6NjbFD35+gd+6dbMjo2dvbK3lmg3VfPXFs0u++VrQe4kHH4Ss0aMwm2Vnx4/Yd/41fK+8AnHjdzYzOLFpE7zpTbBvH/zKr0B5ef7nb30rfOpT8F//K3z2s/Dww/Doo/B//28+eGFc26ksDMcDGEqpCqVUlfk18C7g58CTgDlJ5F7gO8bXTwIfMaaR3AZMGCUmh4F3KaXqjOad7wIOGz+LK6VuM6aPfGTetYrKT97Ip4LZ3f/CdKdxHykjudJ3Xxkgnc3xvj2rLx8x7Wqu4oZNNXzz2DnJdhFXSGWyxGcyni0hCVfkAytONfL808dP8qePn3TkXkJY6aHDXUzPXtoYe3o2y0OHu1xakShk5ghV75SQ5H8xOreOMjC+8/LAXJP1san0st7Z94rOC5P4FPyHx151LdvrrztOU+JT/PN9Wxy5n1KK37q1jdcvTPLyufFFzy3YvcSFC/nMiMzFrFed0/yv//Jl6OyEm27KHzx0CH70I3jySfjmN+ErX4EvfCEf0AC49Vb4j/8R7r8f/s2/gY99DN75TvjqVyFt7OfSaceyMNzIwGgCOpRSrwAvAf+gtf4h8GngnUqpbuCdxvcA3wdOAz3AF4DfA9BajwIPAj81Pj5lHAP4XeCvjdecAn7gwJ/Lc450DtNYFeC6FouatCyhqTrIdS3VHJEAxhW+dfw8u5urLPt38f69rXQOxjnZX3zdk8XivN6t3dyESiNPIRY3ML5wKvfA+DTpTM7h1YhC1xfNBwo2eyQrIFTmp6EqwJlYctHztNZEk97PwDAzpswAxlQ6WzAZU0+c6OdP//7nmAPu3Mj2Gk2m+eaxc/zaTRtpql5do/vVuPvGFkJlJXztxXU6UvXBBy9mSBiUzvHBHz56lRes7dpOZWE4HsDQWp/WWt9gfFyntf5z43hMa/12rXW78XnUOK611h/XWm/XWl+vtT4271qPaK13GB9fmnf8mNb6TcZrfl8X4dvUs9kcz7wxwp27Gh1tenRwdyM/OzvGmPRnmNM1GOfV8xO8f2+rZf8u3ntjCwG/j28eO7f0yaKoRBP5wIBX362aKyFJSABDiMW01JYveFwDN37qR3z0b37K3zzby+mRhGTjiSX1xZK01AQJlpa4vZQ5bcsYpRpPZUhnckQqvPlMMxVyxpQX1v6V588wM5vjvjucbZRZFSzl7htb+O6rA0xML93Ms+A8//zFDAlDIJthc9crtlybdBqee27t116C92f7iFU51jdGPJXhzt3ONhA6uLuRnM5P3BB53/7Zefw+xT03WjcOqjpYyi9fv+H/Z+/O46Mqr8ePf072hGwEAoSEsEsAAYGwKC4VqqBWpa7VWpcubrW7Vmz91mq/VVt/rdbWb61t1bojCKh1wQUVF1BB9k12sgDZCNn35/fHvYNDyIQEMnPvnZz365VXkps7d04mNzNnzn2e8/Dy6kLqWr3oqO7NNwLDrVer0hJiELHmNCulArtt5gjiW73ZjIuO4HunDubiCVlsL67it69uZPqfPuDUP7zHHQvW8sa6vRzswKoOqvvZWVLtmgaePgPTEsgra79p5FejCt35mubT3ogpt3M69tqGZv6zbBczcvowrE8nV8boAldOHkhdYwsLvwjDFf5WrQJjDn089clOBt3+XyqXfdblxz70sWrV8R/7KNy9oLI6Zu9tKSI6UkLeAXlcViq9esSwZHMRF57U5uq13UpjcwsLvihgek6fLl8J5rLcASxcVcCb6/cxe7w+1spSbI9scGsTz6jICHomxOgIDKWOwve8/sDiLRSW19I/NZ7bZo447Pl+T2kNS7cWs/TLYv67Zi/Pf5ZHhFjN6U4bns7pJ6QzLiuFqCAuR6i8YVdpNeecmOF0GIcZkJbAwtUF1Dc1ExvV9sgQ32tFL5ePwOifGk9BG2/4A42kcpNAsRvgNy+v5/ZZOfQIYlPN+V/kU1bdEPLRFz5jslIYm5XCc5/t4ZpTBrl+ud7jsXlfJUlxUWSkhG6aTjBoASNMvbe5iMmD00LSxddfRIRwxoh0lmwuornFEBkRvk8CHbH0y2JKquq7pHlna1MGp5GdlsDcz/O0gKEOOZTsuXQEBkCvHqErYPxo+vCQ3I9SwTB7fGa7z+/ZvRK4qtdArpo6kMbmFtbklbP0y2KWbi3h4SVb+cu7W0mOi2LasN52QaM3WT2tHgiLVhW0WxxR4aO8poHymkYG93ZH/wuf7LQEjIGCA7UMSU9sc59Sl0+L9Llt5gjuWLDusKkY8dGR3DZzhINRdUxbscdFRzBlUBpPL9/Nks1F/PHisZwyrHeX33dzi+FfH+5g3IBUJg9O6/Ljd9SVk7OZs2AdK3YfYNKgI+MIl1xiy75Kcvoleb5IowWMMJRXVsPWoiounzTg6DsHwfScPiz4ooBVew6Q28aTQHcyb0U+vXrEHFqhpStFRAiX5Wbx/976kj2lNWS7pDGXclZpVQMJMZEkxLj36b13YuyhYcHB5lsaTqlwFx0ZQe6gNHIHpfHzs0dQXtPAx9tK7YJGMW+stzrDD+ndg8zUOD7deYCGZqsBm69pH6BFjDC002VLqPr4GoruKasJWMDwTTfs7eKiPHRsxJRbtRf7il1l3DZ/LVf+61OumprNnHNGdunF0bc27GN3aQ23z8px9E31+eP68/vXNvHcp3vaLGCEQy5hjOHLfZVcOL7rprQ7xb0Zrjpm722xVgEJ1fKprZ02PJ3ICGHJ5qJuXcAoq27g3c37ufrkQUQHafjuxROz+PPbXzJvZR6/ONv9VX4VfCUeWG6ud1Is6/LbX7Ksq2wotFbqGd0/JST3p5RbpCbEcN7YDM4bm4Exhu3FVSz9soSlW4t5f8uRfap8Tfu88IZLdc6uUnctoeqTnfZVASMQ32i9ni5dGtzf0UZMuVmg2HMHpfH6j0/jT29t4d8f7+S9zcX88ZKxTOuC0RjGGP6xdAcDeyUwc3S/4z7e8egRG8Xs8ZnMXZHHb74x6ojzLRxyiYLyWirrmxjRLzSrUwaTTooMQ0s2FzGwV4JjL1Qp8dHkDuzJkm6+nOrLqwtobDZBmT7ik5ESz+knpDN/Zf6hpbtU92YVMNyd6FlTSEIzAuOeVzdyz6sbQ3JfSrmViDCsTxLfPXUwT143mUDXOb3QcFB13s6SGkSsnhNukp4US1x0BHtKAxcwSqsa6JkQHbQLQero4mMiufMbo5h/48nERkXw7X99yq8WrqOy7vgaBn++6wCr88r5/qmDXTHl/Mop2TQ0tfBSG808wyGX2LKvEoCcfqFvlNrV9NkgzNQ2NLNse2nIl09tbXpOHzbvq2yzKVB3MX9lPidmJjMyI7iVzstyB7D3YB0f6sovCivZ6+qGsV0tPSmWqvomXUFHKYcEaiyYnuTu5w51bHaVVNM/Jd5VS6iCVVjLTktg91FGYLj9Na27mDgwjdd/cho3nD6EFz7bw8wHl7L0y2PPPR9bup20HjFcMtGZKe+tjcxIZkJ2Ks99ticsl6bebBcwTuirBQzlMst2lFDf1OLY9BEf3/2/101HYWwsrGBDYQWXTAje6AufGSP70DMhmnkrwnD5J9VpnphCYo8Q0ZVIlHJGW0u0AhysbeCznWUORKSCaVdpteumj/hkpyWQ104Bo7SqwfWjCruTuOhI7jh3JPNvOoX4mEiufvwz5ry0lopOjsbYVlTJO5uKuPrkgcTHuKewduWUgewormb5jvB7Htyyr5L+KXGkxEc7Hcpx0wJGmFmyuYj46EimDHG298SwPolk9YzvtgWM+SvziY4ULgjBUrKxUZF8c3wWb23cR1l1aIblK3dqbjGUVTeQ7vJkz7ccXqimkSilDjd7fCb3XTSGzNR4BMhMjeeu80eR2TOB7/z7U97dtN/pEI9q0aoCpt2/hMFzXmPa/UtYtKrA6ZBcyRjDzpJqBrlsBRKfAWkJ7CmrCXjFu6RaR2C40YTsnrz249O48YyhvLgij5kPLuX9LR3P+f+5dCdx0RFcffKg4AV5DL4xNoPkuCie/XS306F0uS37KhkRBtNHQAsYYcUYw3ubi5k2rHfA9bRDRUSYntOHj7eXdLth4g1NLSxaXcDXR/YlLURNpy6blEVjs9EErps7UNNAi8H1yV5ve5h6qY7AUMoxs8dn8vGc6ey8/zw+njOd66YNZt4NJzOiXxLXP72ShavcO6pv0aoC7liwjoLyWgxfraKir4FHOlDTSGVdk+tWIPEZmJZATUNzwIJ2SWU9vT3QwLM7iouOZM45OSy4eRqJsVFc+8Tn/HL+Gg7Wtj8ao6iijoWrCrh04oCQ5ckdFRcdycUTs1i8YV9YjRJtaGphe3FVWDTwBC1ghJUv91dRUF7r+PQRn+k5fahrbGHZjlKnQwmp97YUUVbdENTmna3l9EtmXFYKL67IC8t5e6pjfC+2OoXkK7+cNYJfztIVepTqiF6JsTz3g6lMGZzGz+au4YmPdzodUpseWLyZ2lYXR3yrqKjD+ZZQde0Ukl6BVyJpaGqhoq7J9a9p3d1JA1J59UencvPXhjJ/ZT4zH1za7gjsJz7ZRVNLC98/bXAIo+y4b0/JprHZMH/lV0Vcr+cSO0qqaGoxYdHAE7SAEVZ8y6eemZPucCSWqUN6ER8d2e2mkcxfmU/vxFjOOCG0f4dLcweweV8l6woOhvR+lXuUVFpXsNw+X9iXjIZiCsnEgWlMHNh9l3NWqrMSY6N4/NpJzBzdl7tf3cif39riqsL43oO1FJTXtfkzXUXlSLvsAsYgtxYw0qy42uqDUVptFbndPqpQWSMXfjkrh4U3TyM5PorrnvycW+et4WDN4aMxquqbeGb5bmad2I+BLh0VNKxPEpMHpfHcp3tosVf483ou4VuBRKeQKNdZsrmIkRnJZKS03V081OKiI5k2rBdLNhe5KvkJppKqet7bXMRFEzKJCvGSXxec1J/YqAheXJEX0vtV7uFL9nq7fCWBuOhIEmOjQjICY+XuMlbuDr9mXEoFU1x0JI9cOYHLcwfw8JJt/M/L6x1fqtsYw4Iv8jn7waUBl4ENtLpKd7artJoIgQE93dkDI6un9Tfb3cZSqqVV3ijKq6+Ms0dj3HLmMBauKuDshz5gyeb9h3rWnHjXYirrmlz/RvrbU7PZU1bDx9tLAO/nEpv3VRIVIQxNT3Q6lC6hBYwwcbCmkZW7DzDdJaMvfM7M6UP+gVq2FVU5HUpILFpVQFOLCen0EZ/kuGjOHZPBy6sLu13fEWUprrQLGD3cXcAAKyENxQiMP765hT++qcPKleqsqMgI7r94DDecMYRnlu/hJy+soqGpxZFYSqrqufGZlfz8xTWM6JvEr84decQqKlERwm0zvTvEO1h2llST1TOBmCh3pvxx0ZH0S45rcwqJr8itIzC8JTYqkltnjmDRzdPomRDDd59cwS9eXEOB3wipR9/f4eqeNbNO7EfPhGie+3QP4O1cYtGqAh7/aCdNLYYz/9/7rn7cO8qdz2aq05ZuLaa5xXDmCHf0v/DxxbOkG0wjMcaaLzcuK8WxNZYvyx1AZV0Tb67f58j9K2eVVDUQExlBcnyU06EcVa/EWG3iqZTLiQh3nDOSOefk8N+1e/n+UyuoaWgKaQxvrt/L2Q8u5b3Nxfzq3Bzm3nAyPzh9yGGrqMRHR9LcYhjYy52jDJy0q7TatdNHfLJ7JbCnrPqI7SU6AsPTxmSl8Motp5IUG0Vzq5HYbu9ZExsVySUTs3hr436KKtqesuYFvobH9XbxOVwaHmsBI0y8t6WI1IRoxmf3dDqUw/RPjSenXxLvdoMCxobCCjbvq3Rk9IXPlMFpZKclMPdznUbSHZVW1dMrMQaRQAOs3cMagaEFDHXsRORxESkSkfV+29JE5G0R2Wp/7mlvFxF5WES2ichaEZngd5tr7P23isg1ftsnisg6+zYPixf+sYLkxjOG8oeLx/DR1mKu+tenlNcEf/TUwZpGfvrCKm585gv6p8bx3x+fyvWnDyUywvoz+K+i8umvZ9A/NZ6fzV1NdX1oCyxuZoxhV0kNg11e2Mm2l1JtrdQjjalVYDFREVQF+J90e8+aKyZn09xiPD01+4HFW8Ky4bEWMMJAS4vhgy3FnHFC+qEXdjeZntOHlbsPHNHIJ9zMX5lPTGQEF4zLdCyGiAjh0olZLNtRyp425pOq8FZiFzC8oHdibEimkKiw9iQwq9W2OcC7xpjhwLv29wDnAMPtj+uBv4NV8ADuAqYAk4G7fEUPe5/r/W7X+r66lcsnZfN/357A+oIKLv/HcvYH8arke1uKOPuhD/jv2r389OvDWXjztHZHNibHRfPny8axu6yG/31tY9Di8pqSqgaq6pvcPwIjLYH9FfVHTH8tqaonLjqChJjIALdUXhCoN43be9YMSU/klKG9eP4zbxYw6puaD5u248/txaOj0QJGGFiTX05pdYNrlk9tbXpOH5pbDEu3FjsdStDUNzWzaHUBZ43uS0pCtKOxXJKbhQjMX+nNJ1x1nmI3+gAAIABJREFU7EqqGjxzpapXYiwHahpoanZmTr3yPmPMUqB1V7ULgf/YX/8HmO23/SljWQ6kikgGMBN42xhTZow5ALwNzLJ/lmyMWWasLtRP+R2r25p1YgZPXjeJ/AM1XPz3Tw6tcNFVquqbuGPBWq574nNS4qNZePM0fvr1E4juQFPsKUN6ceMZQ3n+szze3ri/S+Pyql2l9gokLl3twcc39af1SiSl9mtaNx78FBZumzniiJ418dGRnuhZc+WUbArKayn32EXYvLIaLn10WcCfu714dDRawAgD720uIkLg9OHuauDpMz67J6kJ0WG9nOqSTUWU1zQ6On3EJyMlntOHpzNvZb7jXeNVaJVW1XumgJGeGIMxUBbkoei/OX8Uvzl/VFDvQ7lKX2PMXgD7s6+ynwn4V3Xz7W3tbc9vY3u3d8qw3jx//VRqGpq55NFlbCjsmqW7l20vZdZDS3nh8zxuOGMIr9xyKmOyUjp1jJ99/QRG90/m9pfWUlTp3XnrXWWny5dQ9RmQZhUwWk8jKalu0AaeYWD2+MzDetZkpsZz30VjmD3e/U+pZ4/qR+/EGFIToj2TS7yzcT/nPfwhO0uq+e60QZ4tHrVHCxhhYMmWIsZn96RnD3cOHY+MEM44IZ33vywO2zfU81fm0zc51jVFpMsnDWDvwTo+2lbidCgqRIwxlFQ1eGoKCUBJZXALGKP7pzC6f+feBKmw1NYlXHMM2488sMj1IrJCRFYUF4fvSEN/Y7NSefGGk4mJFL71j+V8tvPYlxesa2zm7lc3cMU/lxMVIcy/8WTuOGckcdGdnzYQExXBQ5efRHV9E7fPX9ttlnAPZFdJNZERcmipUrcaGKiAUVlPb5fmtqpz/HvWfDxnuieKF2A9p4wbkMqnO8v4xsMfMe3+Ja5tgNnY3MJ9b2zi+0+tYEBaAq/96DR+c/5ozxaP2qMFDI8rqqhjfUGFa6eP+EzP6UNZdQNr8sudDqXLFVXW8f6XxXxzfJZrepDMGNmHngnRvKjNPLuNiromGppbSPfI1SrfVbXS6uA28vxoawkfbdVCXjey357+gf3ZN/QvHxjgt18WUHiU7VltbD+CMeYxY0yuMSY3Pd0dRexQGNYnkXk3nUJ6cizf+fenvLup89M2Vu05wLkPf8gTH+/impMH8vpPTmPiwLTjimu4vczqe1uKedZeArG72lVazYCe8R2aguOktB4x9IiJZHer3l2l1d4ZVajC06JVBYdyCIN7V/HYd7COK/+5nH98sIMrp2Tz0k2nkG1PzfJq8ag97n5GU0f1/hbrao/blk9t7YwT0okQwnIayaJVBTS3GFdMH/GJjYrkm+OzeGvjPsqqtVFid+C1bu2+ZfGCvRLJX5ds5a9Ltgb1PpSrvAL4VhK5BnjZb/vV9mokU4GD9hSTxcDZItLTbt55NrDY/lmliEy1Vx+52u9YypaZGs+8G05mRL8krn96JQu+yD/6jbD6Rj2weDMX//0T6hqaefb7U7j7whNJiOmaJaCvPnkgp5+Qzv++tpHtxVVdckwv2llS4/rpI2At1zsgLeGwHhjGGEo9NKpQhacHFm85tASpj9tW8fhoawnnPfwhGworeOjyk7j3m2OOaQSbl2gBw+OWbC6iX3IcIzMCd+d2g9SEGCYO7MmSMCtgGGOYtyKf8dmpDOuT6HQ4h7lsUhaNzcZ1VWIVHL4VPbyS7PVOCs0UEhW+ROR5YBkwQkTyReR7wP3AWSKyFTjL/h7gdWAHsA34J3AzgDGmDPgd8Ln9cY+9DeAm4F/2bbYDb4Ti9/KaXomxPPeDqUwZnMbPX1zD4x/tbHf/jYUVXPi3j3nkve1cPCGLN392OtOG9e7SmESEBy4ZS3x0JD+bu5rGbtgs2BjD7tJq1zfw9BnYK4HdfgWMg7WNNLUY7YGhHBVotQ43rOLR3GL4yztb+c7jn5LWI4ZXbpkWFqMrOkILGB7W0NTCR9tKODMn3RMdms/M6cOGwoqgLr0WamvzD7K1qIpLJw44+s4hltMvmXFZKby4Iq/bzwPuDko8NgIjKTaKmMgISoI8hUS1bdGqAqbdv4TBc15z9Zze9hhjrjDGZBhjoo0xWcaYfxtjSo0xM4wxw+3PZfa+xhjzQ2PMUGPMGGPMCr/jPG6MGWZ/POG3fYUx5kT7NrcYfSINKDE2isevncTM0X25578b+fNbW4543WlqbuFvS7Zy4SMfUVrdwL+vyeWBS8eRHBeclbv6Jsdx30VjWJt/kIff7X6jsIoq66lpaGawB0ZggLWUal5ZDS12rzRfUb63R4ryKjwFWq3DALfNW3OoUW6olVbVc+0Tn/HgO18y+6RMXr5lGsP6uPtidlfqmrF6yhErdpVRVd/k+ukjPtNz+vDHN7fw3uYivjU52+lwusS8lXnERkVw3tgMp0Np06W5A7hz0XrWFRxkbFaq0+GoIPJaAUNE6J0YoyMwHLBoVQF3LFhHbWMz8NWcXqDbXL1RXS8uOpJHrpzArxeu5+El21i5u4ydpTXsLa8jPSmW2KgI8g7U8o2xGfzuwhND0nh81okZXDoxi0fe28YZJ6STO+j4+mt4iVdWIPHJTkugvqmF4qp6+ibHee41TYWn22aOOOz1EiAuKoJJg9N4ZU0hL32Rz/nj+vPDM4dxQt/QFBBW7CrjludWUVbTwH0XjeFbkwZ44kJ2V9IRGB62ZHMRMZERXT70MlhG9E2if0oc74bJNJK6xmZeWV3IzNH9SIkPzhWk43X+uP7ERkXw4gpt5hnuSqoaEIGeCe48F9vSKzE26D0w1JEeWLzlsGQM3DenV3lTVGQE9188huk56Xy8vYzC8joM1miAvAO1XH3yQP525YSQrpp21wWjyeqZwM9eXE1lXWPI7tdpu+wCxmCPTCHJtuP0NfIsPTQCQwsYyjm+JWBj7Ea4manx3H/xWJ7+3hQ+vP1MfnDaEN7euJ+zH1zKTc+sZH1B1ywr3RZjDP9cuoNvPbac2OgIFtx0CldMzu52xQvQERietmRLEVOGpNEj1ht/RhHhzJw+LFxVQH1TM7FR3m4w886m/VTUNXFprnuad7aWEh/NuWMyeHl1IXeeNyrsm/p0ZyVV9aQlxBDl8m7z/nonxlAc5ALGvReNCerxvcjNc3qV94kIW/a13Tjz3U1F3HNhaONJjI3iwcvHcemjy7jn1Y08cOm40AbgkJ2l1URHCv1T45wOpUOy/ZZSnTw47dAKVV7p66TC1+zxmYzJspZjH5r+Vb+7Pklx3HHuSG48YyiPf7yTJz/exRvr9zEjpw+3TB/G+OyeXRbDwdpGbpu3hrc27mfm6L5BnX7nBd7JdNUhi1YVMOXed9hRXM3a/HJPzV2Oj4mkpqGZEXe+6dl51z7zVuSTkRLHKUPdPQLm0twsKuuaeHP9PqdDUUFUUum95eZ6J8YGfQrJ0PTEwxKO7qy5xfCPD7YTqJFDoLm+SnWW24pkEwem8cMzhzFvZT5vrNvrSAyhtrukhgFpCZ4pamemxhMhVgEDrNe0CIGeCVrAUM5rL5fo2SOGX5w9go/mTOcXZ53Ayj0H+Ob/fcJV//qUT3eUHvd9ry84yPl//Yglm4u487yRPHrVxG5dvAAtYHiOb+7y/gqrMn2wtsmV6xG3ZdGqAp5ZvvvQ925dS7kj9h2s48OtxVw8IYvICHcP3Zo6uBfZaQk6jSTMlVZ7b7m5XomxlFbXB7XJ7Dsb9/POxv1BO75X5JXVcMU/l3PfG5sZm5lMXPThL//x0ZHcNnOEQ9GpcBOoGOZkkezHM4YzNiuFOxauC6tm4m1ZtKqAdzbtZ0dxtWcuFsVERZCREs+eUmvqS0l1A2k9YlyfY6nuoSO5REp8ND+aMZyPb5/Or87NYfO+Si5/bDmXPbqMpV8WdzrXMcbw7Ke7uejvn9DY3MLcG6by/dOGdMspI61pAcMDGptbyCur4bOdZdz96gbPzl1+YPEW6hrdvZZyRy1YlU+LgYsnunf6iE9EhHDpxCw+2V7KntKao99AeVJJlRdHYMTQ2GyoqG0K2n3888Md/PPDHUE7vtsZY5i/Mp9z/vIhGwsr+NOl43j5llO5/6KxZKbGI1hXPu+7aIw28FRd5raZI4hvNWXR6SJZdGQED15+EnWNzdw6b82h1S7CjXWhay1N9u/npYtF2WkJh43A6NXDW69pKnx1JpfoERvF9acP5aPbz+S3549iT1kNVz/+GbP/7xPe2bi/Q4WM6vomfjp3Nb9euJ6pQ3rx2o9PY+LA7tOE+Gi80TzBYxatKuCBxVsoLK+lf2o8t80cETAxbGpuYX9lPfsO1lJYXsfeg7XsPVjHXvvrwoN1lFTVc7Rz3QtzlwPFWFBeyytrCjl7VF9P9GjwvSHIHdjTM8uTXZKbxZ/e/pLzHv6Qqvqmo56Xynu8OIUkPcmKt7iqnhQPNR/1irLqBn61YB1vbtjH5EFp/OmycQyw55nPHp+p//8qaHznVkdzoVAZmp7IneeN4s5F63lq2S6unTbY0Xi6Ul1jM9uKquwLXW1fLHL68T+agb0SeGeTdZW7tLqB3kneGlWolL+46EiunTaYK6Zk89LKAv7v/W18/6kVjMxI5kfThzFrdD8i2hhhtHV/JTc9+wU7iqv4xVkn8MMzh7W5X3emBYwu1tbydLe/tJZVew4wIC3BKk74FSmKKutofREgISaSjJQ4+qfGM6JfEv1S4umfEkdGajy3zVtDUeWRTe+8MHe5f2o8BW0UMSJF+PHzq0iOi2L2+Ewuyx3A6P7Jrhsi5V+YMsCkSV3XnCfYPt1RRoRAZb11pVuXTQwvtQ3NVDc0e28KiX11rbSqnmF9tE9FV3pvSxG/nL+W8poG7jgnh++fNkSHYquQcmuR7NtTslmyuYj73tjMtGG9GR6ipQ+7ijGGgvJaNu+tZMv+SjbtrWDzvkp2llTT3M6oEi9c6BqQlkBJVQPV9U2UVtXr8u8qLMRGRXLllGwuzc3ildWFPPLeNm5+9guG9UnkljOH0dLSwp/e3kpheS2pCdFU1TWRkhDNM9+bwikeWWky1LSA0cXaWp6uvqmF/yyzej/ERUfQPyWejNQ4pg3rTf/UODLs7zNSrK+T46ICvnn/1bkjj1iP2OlhmR3V1lrK8dGR3Dv7RNKT45i3Mo8XPs/jqWW7GZmRzGW5Wcw+KTOky60F0rowBfDy6kJOHtLblQlaaw8s3nJEocwrV2TU0fmWIk332AgM39W1kqrgNvLsTmoamrj39U08s3wPI/om8Z/rJjOqf7LTYSnlGiLCHy4ey6yHlvKTF1az6IfTiIkK7Yzqjo7Urahr5Mt9lWzaV8mWfRVW0WJf5aGLEQBZPePJ6ZfMrNH9yMlI4p5XN3r2QpdvJZK8AzWUVHmvr5NS7YmOjODiiVnMHp/J6+v28rcl2/jp3NUIHGqufaCmkQiBH00fpsWLdmgBo4sFqnALsOo3Z5ESH31cIwvcOiyzI44W+6nDe3NPTSOvrC1k3oo87n51I/e9vpmzRvXl0twsThue7tgVxLYKU3WNLZ4pALitI7zqWr4ChteG2/qmvJQEeSnV7mJ1Xjk/m7uaXaXV/OC0wfzi7BGemJanVKilJ8Vy/8Vj+cFTK/jz218y55yckN13WyN15yxYy/6KWvqnJrB5XwVb9lWyaW/lYaNWk+KiyOmXxOzxmYzol8TIjCRO6JtEUqvVCJqajWcvdA3sZRUwvtxfRVV9k+emRSrVEZERwvnj+nPemAxyf/8OZdWHX8RpMfDY0p1cc0r4THHralrA6GKBpkn0T40ntYuWgnLrsMyOOFrsKQnRfGfqQL4zdSCb9lYwb0U+C1fl89q6vfRLjuPiiZlcOnEAg4Lce6KxuYUdxdVs3HvwiCTCn1cKAIHOSwP8bO5qrpo6kAnZqa6btqM6ptQeweC1hmc9E2KIEGsKSbA8ePlJQTt20O3dC9/6FsydC/36BdytsbmFR97bxl+XbKNvUizPfn9Kx5Z37uDxlQpHZ43qyxWTB/CPpdv52oh0pg7pFZL7DXRB5L43rIbmkRHC0PQeTBjYkyunZJPTL4mcjGT6p8R16DXayxe6fCMwvth9ALAaPSvlBsHIJSIihAPVbY9A9cr7C6doAaOLBZom4YXKt9uMzEjmN+ePYs45Oby7aT8vrsjj7+9v55H3tjN5cBqX5Q7g3DH9SIg5vtO4vKaBjXsr2LTXmku6aW8FW/dX0dBsNcGKiYwgOlJobD5ybqkXhmRC2+dlbFQEkwen8c7G/SxcVcCojGS+c/JALjyp/3E/piq0vhqB4a0CRmSEkNYjhuIgTiHxyv9om373O/joI+vzI4+0ucuO4ip+9uIa1uSVc9H4TO66YDQp8R1siNqB4ysVzu48bxTLtpfyixfX8MZPTyM5LnjNhI0xfL7rQMALIgCv/fhUhvVJJDbq+EZOefVCV2pCDMlxUazKKwfQERjKNYKVS7R34VsFpu9SupiXK99uFRMVwTljMjhnTAb7Dtbx0hf5zFuRx63z1vDbVzbwjbEZXJo7gAnZqby8ujDgY9/SYthVWn1YoWLT3goKD361HnzvxFhGZiRx3bRBjMxIZmRGMkPSe/Da2r2eLky1d15W1zfx8upCnlq2izsWrOPe1zZx8cQsrpo6UBsreoSvgNHLBf1iOqt3YmxQp5C8uqYQgPPH9Q/afQTF3r3wxBPQ0gKPPgqrVkGM/fe97DLMTTfx/AdbGHbNZdwpwpD0HvRaHgN/B6691vooKYFLLjny2DfdBKefDo8/bh3/iSfgf/5HR2GobqdHbBQPXn4Slzy6jLte3hCUq6zFlfW89EU+L36ex46S6sPmu/vLTI1ndP+ULr9/r8nulcDGwoMA9NIChnKJYOUSeuH72GgBIwi8Wvn2gn4pcfzwzGHc/LWhfL7rAC+uyOPl1YW88HkefZJiKKtuPGzt89vmr2Huij3UNrSwZV/loScI3xDNSYPTDhUqRmYk0Scprs37DYfCVKDzskdsFFdOyeaKyQP4Ys8Bnl62m+c+3cOTn+zilKG9+M7UgXx9VF+iI0Pb5Ex1zKJVBfz9g+0AzPjTB546LxetKmBnSTWb91Uy7f4lQYn9meVWA2XPFTB+9zuruABgDOzeDcOHA1BZ28iPnvyc5evzWBgXxdD0xM43Ifzd7zi0Pndzs47CUN3W+Oye/Gj6MB56Zytn5vThgi54rmhqbmHp1mJe+CyPJZuLaGox5A7syU1fG4oxhrte2ahvWALITktgfUEF4M2ivApPwcolwuH9hRPEmMBLLnUnubm5ZsWKFU6HoY5BVX0Tr60t5H8WbTg07cOfAJMHpzGqv1WoGJWRzLA+idrcrh0lVfW8uCKPZ5fvoaC8lr7JsVwxOZsrJmfTN7ntIk8wdbRju1uPHyxtrY4THx3JfReNcX38oYr98n8sA2DuDSd32TGDbu9eGDIE6r4aHUZ8POzYwZslVoO+moZmfn3eSL4zdWDne9e0c/yuGIUhIiuNMbnHfSAP0lzCm5qaW7jk0WXsKK7izZ+efszDt/eU1vDiijzmrcxjf0U9vXrEcPHELC7LHXDYiEavvuaEwv1vbOZRuyi/6Z5ZxMdorqac58lcIgwEyid0BIbyvMTYKC6flM2cl9YF3EefcDqnd2IsN39tGDecPpT3txTx9PLd/OXdrfx1yTZmju7LVVMHcvKQXiFp+tlWx/Y7Flh/665I+IJ9/K5mjGF/RT3biqq465X1RzSD88ryuG01sqttbOb+NzZz4Un9u3dDWf/RFzbT3MzH1/yEG8dfzZjMFB68/KRjn+LVxvF1FIbqzqIiI3jo8pM49+EPuXXeGp753hQiOrjqWV1jM4s37GPu53l8sr2UCIEzTkjn7gsGMD2nb5ujo3SkbmC+Rp49YiK1eKGUapMWMFTY0EY4XS8yQpgxsi8zRvZld2k1z326h7kr8nh93T6GpvfgO1MHctHELJZsKurSq0nNLYaK2kbKaxv5/Wub2nyj+9tXNlDT0IzBYIzfnGJjMHw1Ot60/t7e5vPwu1vbPP4f3nT2jXRziyGvrIZtRVVsK65iW1EVW4uq2FFURWV9U7u39UL36kAx7quo48S7FjOwVw8G9U6wPvfyfe5Bn6TYDr+x8Kxly6Dh8Mam0tBAz9Ur+PEv7uFHM4Yf35SuNo5PQwN88smxH1MpjxvUuwe/+cYo5ixYx+Mf7+T7pw1pd/+NhRXM/XwPi1YXcrC2kaye8fzirBO4JDeLjBTNO45VXlkNANUNzUGbWqiU8jadQmLTYZ/e5+Xh9F5S19jMa2v38vTy3azOKyc6QmjBesPtEx8dyb3fPJFZJ2ZQXtvAwdpGymusD6sw0UB5TaO1vbaRg4e+trZX1rX/Bj1U4qIj6JccR5/kOPolx9E3OZa+yXH0TY6jX0ocfZPi6JMc2+50pKMNFa5vamZXiV2oKKpia1El24qq2FFSTUPTV1fJ05NiGZaeyPC+iQzrk8iw9ER+/uIa9lXUHXGfmanxfDxnetc+GF1s2v1L2iw4psRHc9GETHaX1rCrtJq8sprDVgCKi45gYFoPBvZKYFBvq6gxqFcCA3v3ICM57rDixqJVBfxy/loamlvI9NDUo0WrCpizYC11jV/9/QX48Yzh/OysE477+MGmU0g0l/AqYwzXP72SJZv20ysxluLK+sP+tyvqGnlldSFzP89jXcFBYiIjmHViPy6fNICTh/QK/+JqkC1aVcDtL62l3u+1T/M45QY6hcQZgfIJLWDYNOkIDzqvNLTW5R/k8seWUdPQfPSdW4mKEFLio0lJiCYlPprU+GhSE2KsbfHRpNrbf//aJkrbWCe7X3IcL98yDbDe3CEg1leIWNt8oyfk0DY7uZSv9jn7waXsPXhkESAlPopLJw5gf2U9+w/Wsb+yjn0H6w5LrHx6JkQfKmz0TY49VPTYVVLN08t3H3ab6Ejh9BPSiRBhe1EVu8tqDhV/RCCrZzzD0u0iRZ9EhvVJYlh6IikJRy7v5+WiXUdjb24xFJbXsqu0ml2lNewusT+XVrO7rOawIk9MVATZaQkM6pVAY3MLn2wvPaz4ERsVwW++MYqLJmQRGxVxXG82OvPY1zc1U17TyIGaBsqqGzhQ3UhZTQMHqu3v7e3lNY2UVTdQWF4bcJUCtxemQAsYmkt42zPLd3Hnog2HbYuJimBsZjLrCyuoa2whp18S35o0gNnjM0lN0EaTXSVQYdsrz30qfJXZeWiaNpYNKe2BoboFnVcaWmOyUqhtp3hx+6ycQ4WIVP9iRUIMPWIiOzQ9I0KkzTeKc87J6ZKGorfPymnz+HdfcOIR55IxhoraJvZV1LG/oo59FXUU2Z/3V9Szv6KOzfsqKK6spyVAbbix2fDupiKG9UlkRL8kzhubwbA+iQxNtz46M+fXy92rOxp7ZIQwIC2BAWkJnDb88GO0tBj2VdSxq7T60IiN3SXW5y37Ko8oAtQ3tfDrRev59aL1gDWaIy46kvjoSOIOfUQc+j6+rW0xkcRGRfC3JdvanHp0x4J1LFpdYBUnaqxiRVU7U36SYqPo2SOGnj1i6J0Yw/C+iSz4oqDNfb0wNUgpr/v7+zuO2NbQ1MLK3eVcMSWbb00awJjMlO7dpydIAj3H6XOfcpoWLtwlbAsYIjIL+AsQCfzLGHO/wyEpFZYC9R7JTI3npq8NPe7jB/tNemeOLyJWESYhmhH9kgIes6m5hdLqBqbe+26bV9IFeOfnZ3RZ/F4oWLTleGOPiBD6p8bTPzWeU1qdaoPnvBbwdrfPyqGusZm6xmZqD31uObStrrGZirpG6hpbqG1oPmzfQIUpn9rGZsqqG0hNiGFw7x707BFDWoJVoEjrEUPPBPtzj2hS42PabPD36Y4y7eejlEPae7N87zfHhDCS7kd7mSm3mrciD4BLcwc4HImCMC1giEgk8AhwFpAPfC4irxhjNjobmVLh57aZI9ocwdCVa9oH+016Vx8/KjKCvslxmow5KBiFNWMMjc2G2sZmZj64NGD/kVduOfWYju8Tiv8ppVTb9HnbOfrcp9xq/sp8QAsYbnEcbcxdbTKwzRizwxjTALwAXOhwTEqFpdnjM7nvojFkpsYjWG/gvNCDIRRumzmC+FYNPjUZC41gPPYiQkxUBCnx0cw5Jydof1v9n1LKOfq87Rx97lNKdURYjsAAMoE8v+/zgSkOxaJU2PPyNIZg8nKPCq/zPcbBWoUkFFOb9DxRKvT0edtZ+tynlDqacC1gtNVZ6YiZyyJyPXA9QHZ2drBjUkp1Q5qMOWf2+Eye/2wPEJylz/Rvq1R40v9tpZRyr3CdQpIP+E9SygIKW+9kjHnMGJNrjMlNT08PWXBKKaWUUkoppZTqnHAdgfE5MFxEBgMFwLeAK50NSSmlVKg9ed1kp0NQSimllIdpLuEuYVnAMMY0icgtwGKsZVQfN8ZscDgspZRSIRYfE3n0nZRSSimlAtBcwl3CsoABYIx5HXjd6TiUUko55+lluwD4zsmDnAxDKaWUUh6luYS7hGsPDKWUUor/rt3Lf9fudToMpZRSSnmU5hLuogUMpZRSSimllFJKuZ4WMJRSSimllFJKKeV6WsBQSimllFJKKaWU62kBQymllFJKKaWUUq4nxhinY3AFESkGdnfxYXsDJV18zFDycvwauzO8HDt4O36N3Tlejj8YsQ80xqR38TE9IUi5BOg55hQvxw7ejl9jd4aXYwdvx6+xH6nNfEILGEEkIiuMMblOx3GsvBy/xu4ML8cO3o5fY3eOl+P3cuzdiZf/Thq7c7wcv8buDC/HDt6OX2PvOJ1CopRSSimllFJKKdfTAoZSSimllFJKKaVcTwsYwfWY0wEcJy/Hr7E7w8uxg7fj19id4+X4vRx7d+Llv5PG7hwvx6+xO8PLsYO349fYO0h7YCillFJKKaWUUsr1dASGUkoppZRSSimlXE8LGMdBRB4XkSIRWe+37QER2SzCRboBAAAgAElEQVQia0VkoYik+v3sDhHZJiJbRGSmM1EfiqXDsYvIWSKyUkTW2Z+nOxd55x93++fZIlIlIreGPuLDHcN5M1ZElonIBvtvEOdM5J0+b6JF5D92zJtE5A6n4rbjaSv239lxrxaRt0Skv71dRORh+/91rYhMcC7yQ7F2Jv5v29vXisgnIjLOucg7F7vfzyeJSLOIXBL6iA+Lo1Oxi8jX7O0bROQDZ6L+SifPmxQReVVE1tjxX+dc5N2Hl3MJOx7NJxyguYRzvJxPaC7hHC/nE67LJYwx+nGMH8DpwARgvd+2s4Eo++s/AH+wvx4FrAFigcHAdiDSI7GPB/rbX58IFHjlcff7+UvAPOBWj503UcBaYJz9fS8PnTdXAi/YXycAu4BBLos92e/rHwOP2l+fC7wBCDAV+NSl502g+E8Betpfn+N0/J2J3f4+ElgCvA5c4pXYgVRgI5Btf9/HY+fNr/z+f9OBMiDG6d8h3D86+bzqqlziGOLXfMKZx11zieDH74l8opOxay7h3GPvqnyik7EHPZfQERjHwRizFOuP4r/tLWNMk/3tciDL/vpCrCfgemPMTmAbMDlkwbbSmdiNMauMMYX29g1AnIjEhizYVjr5uCMis4EdWLE7rpPxnw2sNcassfcrNcY0hyzYVjoZuwF6iEgUEA80ABWhirW1ALH7x9MDK2aw/l+fMpblQKqIZIQm0rZ1Jn5jzCfGmAP29sP+H5zQycce4EdYbxKKgh9d+zoZ+5XAAmPMHns/r8VvgCQRESDRvl0TKqi8nEuA5hNO0VzCOV7OJzSXcI6X8wm35RJRXXkwdYTvAnPtrzOx/vl98u1tbuUfu7+LgVXGmPoQx9MZh2IXkR7A7cBZgOPTRzrI/7E/ATAishirivmCMeaPjkV2dP6xz8d64d6LddXkZ8aYskA3dIqI/B64GjgInGlvzgTy/Hbz/b/uDW10Rxcgfn/fw7r64zptxS4imcA3genAJOeia1+Ax/0EIFpE3geSgL8YY55yJsL2BYj/b8ArQCFW/JcbY1qciVD58XIuAZpPOEVziRDzcj6huYRzvJxPOJVL6AiMIBGRX2NVm571bWpjN1cuAdNG7L7to7GG9d3gRFwd0UbsdwMPGmOqnIuq49qIPwo4Ffi2/fmbIjLDofDa1Ubsk4FmoD/WUOdfiMgQh8ILyBjza2PMAKy4b7E3e+b/NUD8AIjImVhJx+1OxHY0AWJ/CLjdyauDHREg9ihgInAeMBP4HxE5waEQ2xUg/pnAaqz/2ZOAv4lIskMhKrydS4DmE07RXMIZXs4nNJdwjpfzCadyCS1gBIGIXAN8A/i2Mcb3JJUPDPDbLQurMuUqAWJHRLKAhcDVxpjtTsXXngCxTwH+KCK7gJ8CvxKRWwIcwlHtnDcfGGNKjDE1WPP4HG8o2VqA2K8E3jTGNNpD3z4Gcp2KsQOew7oiCB75f23FP35EZCzwL+BCY0ypY1F1jH/sucAL9v/sJcD/2cO23ar1efOmMabaGFMCLAUcbXrWAf7xX4c1ZNUYY7YBO4EcxyLr5rycS4DmE07RXMIVvJxPaC7hHC/nEyHNJbSA0cVEZBZWhfIC+0XC5xXgWyISKyKDgeHAZ07EGEig2MXqBP0acIcx5mOn4mtPoNiNMacZYwYZYwZhVWPvNcb8zaEwA2rnvFkMjBWRBHv+5xlYTX1co53Y9wDTxdIDq3nVZidiDEREhvt9ewFfxfcKcLUd+1TgoDHGVcM9IXD8IpINLAC+Y4z50onYjiZQ7MaYwX7/s/OBm40xixwIMaB2zpuXgdNEJEpEErDe8GwKdXxH0078e4AZ9j59gRFY8/1ViHk5lwDNJ5yiuYRzvJxPaC7hHC/nE47mEsbhjqxe/gCex5rD1ohVKfseVkOtPKyhM6s5vBvur7E6hm8BzvFK7MCdQLXf9tU42A23s4+73+1+iztWIenseXMVVsOw9cAfvRI7VuOeeXbsG4HbXBj7S/bjuhZ4Fci09xXgEfv/dR2Q69LzJlD8/wIO+P1NVngl9la3exLnVyHpVOzAbfb5vh74qcfOm/7AW/Y5vx64yun4u8PHMbwmuCaX6Gz8aD7h5HmjuURw4/dEPtHJ2DWXcDB+XJRPdPK8CXouIfYdKaWUUkoppZRSSrmWTiFRSimllFJKKaWU62kBQymllFJKKaWUUq6nBQyllFJKKaWUUkq5nhYwlFJKKaWUUkop5XpawFBKKaWUUkoppZTraQFDKRUWROR9Ecl1Og6llFJKeZfmE0q5mxYwlFJKKaWUUkop5XpawFBKOUJEfikiP7a/flBElthfzxCRZ0TkbBFZJiJfiMg8EUm0fz5RRD4QkZUislhEMlodN0JE/iMi/xv630oppZRSoaT5hFLdixYwlFJOWQqcZn+dCySKSDRwKrAOuBP4ujFmArAC+Ln9878ClxhjJgKPA7/3O2YU8CzwpTHmztD8GkoppZRykOYTSnUjUU4HoJTqtlYCE0UkCagHvsBKPE4DXgFGAR+LCEAMsAwYAZwIvG1vjwT2+h3zH8CLxhj/JEQppZRS4UvzCaW6ES1gKKUcYYxpFJFdwHXAJ8Ba4ExgKLATeNsYc4X/bURkDLDBGHNygMN+ApwpIn8yxtQFLXillFJKuYLmE0p1LzqFRCnlpKXArfbnD4EbgdXAcmCaiAwDEJEEETkB2AKki8jJ9vZoERntd7x/A68D80REC7RKKaVU96D5hFLdhBYwlFJO+hDIAJYZY/YDdcCHxphi4FrgeRFZi5WA5BhjGoBLgD+IyBqs5OQU/wMaY/6MNXz0aRHR5zillFIq/Gk+oVQ3IcYYp2NQSimllFJKKaWUapdWE5VSSimllFJKKeV6WsBQSimllFJKKaWU62kBQymllFJKKaWUUq6nBQyllFJKKaWUUkq5nhYwlFJKKaWUUkop5XpawFBKKaWUUkoppZTraQFDKaWUUkoppZRSrqcFDKWUUkoppZRSSrmeFjCUUkoppZRSSinlelrAUEoppZRSSimllOtpAUMppZRSSimllFKupwUMpZRSSimllFJKuZ4WMJRSniUiXxOR/O56/0oppZQ6fiJiRGRYd71/pbxECxhKdXMi8lsReSaE9xcjIvNFZJf9gv21dvbb7OUCgYi8JyLFIlIhImtE5EKnY1JKKaW6mgO5xFQReVtEyuzX2XkikuH381gReVRE9tv7vCoimaGKr6uJyNdF5AsRqRaRPBG5zOmYlHKKFjCUUsdFRKKO4WYfAVcB+9rZ5zag6JiCCkBEIrvyeB3wEyDDGJMMXA88459gKaWUUuqYcomewGPAIGAgUAk84ffznwAnA2OB/kA58NfjDpRjznuO5/5GAc8BvwZSgJOAlaGMQSk30QKGUt2EiNwuIgUiUikiW0RkhojMAn4FXC4iVSKyxt63v4i8Yl+12CYiP/A7zm/tERTPiEgFcK2IRIjIHBHZLiKlIvKiiKS1FYcxpsEY85Ax5iOgOUCsg7EKHPd18Hf7lYiU2KM6vu23/UkR+buIvC4i1cCZInKeiKyyR0Xkichv/fYfZI8KuUZE9tjH/LXfz+PtYx4QkY3ApPbiMsasNcY0+b4FooEBHfmdlFJKKbdxUS7xhjFmnjGmwhhTA/wNmOa3y2BgsTFmvzGmDngBGH2UX+9cEdlhv/Y/ICIRdqzXisjHIvKgiJQBvxWRoSKyxI6zRESeFZFUv99vl4jcKiJrReSgiMwVkTi/n98mIntFpFBEvnuUuO4E/mH/zk3GmFJjzPaj3EapsKUFDKW6AREZAdwCTDLGJAEzgV3GmDeBe4G5xphEY8w4+ybPA/lYVy0uAe4VkRl+h7wQmA+kAs8CPwZmA2fYtzkAPHIcIf8VKxmq7cC+/YDeQCZwDfCY/fv6XAn8HkjCGvlRDVxtx34ecJOIzG51zFOBEcAM4DciMtLefhcw1P6Yad9fu0TkvyJSB3wKvA+s6MDvpJRSSrmKy3OJ04ENft//G5hmF1ESgG8DbxzlGN8EcoEJdmz+hYUpwA6gD1ZOIVgXWfoDI7EuTvy21fEuA2ZhFVPGAtcC2AWfW4GzgOHA148S11T7duvsosczgQo7SnUHWsBQqntoBmKBUSISbYzZFah6LyIDsN7A326MqTPGrAb+BXzHb7dlxphFxpgWY0wtcAPwa2NMvjGmHutF/JJjGWYpIt8EoowxCztxs/8xxtQbYz4AXsNKGnxeNsZ8bMdaZ4x53xizzv5+LVaCdUar491tjKk1xqwB1gC+ZOwy4PfGmDJjTB7w8NECM8Z8A6t4ci7W1aCWTvxeSimllFu4MpcQkbHAb7Cmnvp8CewBCoAKrCLDPUf5/f5gv77vAR4CrvD7WaEx5q/2CIhaY8w2Y8zbdu5RDPyZI3OJh40xhcaYMuBVrKkfYOUSTxhj1htjqjmy8NFaFtbjdjFWwSOeLpoOo5QXaQFDqW7AGLMN+CnWi2SRiLwgIv0D7N4fKDPGVPpt2401wsEnr9VtBgILRaRcRMqBTViJTt/OxCkiPYA/Aj/qxM0O2AmAf6z+v9thsYrIFPmqueZB4EasERz+/Htz1ACJ9tf9Wx1vd0cCNMY0GmPeAGaKyAUduY1SSinlJm7MJcRaueMN4CfGmA/9fvR3IA7oBfQAFnD0ERitX9/byyX62L9/gT0F5hmCl0vUYhU8vjTGVGGNdjn3KLdRKmxpAUOpbsIY85wx5lSsBMEAf/D9qNWuhUCaiCT5bcvGuopx6HCtbpMHnGOMSfX7iDPGFNA5w7Eacn0oIvuwEo4MEdknIoMC3KanXfjwj7WwnVifA14BBhhjUoBHsYaCdsReDu9hkd3B2/lEYU0/UUoppTzHTbmEiAwE3gF+Z4x5utWPxwFP2iMq6rFGLEwWkdZFBn+tX9/byyXus7eNtRt1X0Xwcom1bdy/Ut2WFjCU6gZEZISITBeRWKAOq5rva6C5Hxjka1ZlT434BLhPROLsoZnfw5qfGsijwO/tZAIRSZd2lgwVa3kzXzOrGPt+BFiP9aJ+kv3xfTu+kzjySo2/u8VadvU04BvAvHb2TcK6KlQnIpOxemR01IvAHSLSU0SyaGekiIjkiMg5duPPaBG5CmuO7geduD+llFLKFdyUS4i1JOoS4BFjzKNt7PI5cLWIpIhINHAz1jSQknbu/zb79X0A1iomc9vZNwmoAsrtWG5rZ9/WXsRqWjrK7s9x11H2fwK4TkSG2PvfDvy3E/enVFjRAoZS3UMscD9QgjWksQ9Wk0z46s1+qYh8YX99BdZIiEJgIXCXMebtdo7/F6xRDW+JSCWwHKvhVSBbsBKfTGCx/fVAe27pPt8HUAa02N+3uWKJ/fscsGN9FrjRGLO5nfu+GbjHjvM3WIlER92NNdRzJ/AW0PqKjz/BHmYLFGMlQ5cbY75o5zZKKaWUW7kpl/g+MAS4S6yVT6pEpMrv57diFVm2Yr0Gn4vVpLM9L2MtT7oaq5/Wv9vZ926sZp8H7X0XHOXYh9hTSh/CKsBssz+3t//jwFNYzcB3A/VYDU+V6pbEGB2RpJRSSimllFJKKXfTERhKKaWUUkoppZRyPS1gKKWUUkoppZRSyvW0gKGUUkoppZRSSinX0wKGUkoppZRSSimlXM9VBQx7eabVfh8VIvJTEUkTkbdFZKv9uae9v4jIwyKyTUTWisgEv2NdY++/VUSuce63UkoppZRSSiml1PFy7SokIhIJFGAtn/RDoMwYc7+IzAF6GmNuF5FzgR9hLY00BfiLMWaKiKQBK4BcwGAtiTTRGHMg0P317t3bDBo0KKi/k1JKqdDaUVwNwJD0Hg5H0n2sXLmyxBiT7nQcTtBcQimlwo/mEs4IlE9EORFMB80AthtjdovIhcDX7O3/Ad4HbgcuBJ4yVhVmuYikikiGve/bxpgyABF5G5gFPB/ozgYNGsSKFSuC9KsopZRywuX/WAbA3BtOdjiS7kNEdjsdg1M0l1BKqfCjuYQzAuUTrppC0sq3+Krg0NcYsxfA/tzH3p4J5PndJt/eFmi7UkoppZRSSimlPMiVIzBEJAa4ALjjaLu2sc20s731/VwPXA+QnZ3dySiVUkq5XUZKnNMhKKWUUsrDNJdwF1cWMIBzgC+MMfvt7/eLSIYxZq89RaTI3p4PDPC7XRZQaG//Wqvt77e+E2PMY8BjALm5ue5sBqKUUuqYPfSt8U6HoJRSSikP01zCXdxawLiCw/tVvAJcA9xvf37Zb/stIvICVhPPg3aRYzFwr2+1EuBsjj6aQymlVJhrbGwkPz+furo6p0PxvLi4OLKysoiOjnY6FFfTc67r6DmnlFLKdQUMEUkAzgJu8Nt8P/CiiHwP2ANcam9/HWsFkm1ADXAdgDGmTER+B3xu73ePr6GnUkqp7uPuVzcAcNf5owHIz88nKSmJQYMGIdLWbEPVEcYYSktLyc/PZ/DgwU6H42p6znUNPeeUUk5pnUsoZ7mugGGMqQF6tdpWirUqSet9DdYSq20d53Hg8WDEqJRSyhs2FlYc9n1dXZ2+kewCIkKvXr0oLi52OpQ2iUgq8C/gRKweWN8FtgBzgUHALuAyY8wBsU6Gv2BdEKkBrjXGfGEf5xrgTvuw/2uM+U9nY9Fzrmu4/ZxTSoWv1rmEcpabVyFRSimlupy+kewaLn8c/wK8aYzJAcYBm4A5wLvGmOHAu/b3YPXdGm5/XA/8HUBE0oC7sKaoTgbu8pua2ikuf6w8Qx9HpZRSWsBQSimlXOr999/nk08+Oa5jJCYmdlE03iAiycDpwL8BjDENxphy4ELAN4LiP8Bs++sLgaeMZTmQajcMnwm8bYwpM8YcAN4GZoXwV3GEnnNKKaXczHVTSJTzFq0q4IHFWygsr6V/ajy3zRzB7PGZToellFIh5/Tz4fvvv09iYiKnnHJKyO4zDAwBioEnRGQcsBL4CdDXGLMXwG743cfePxPI87t9vr0t0PbDdPWS7HrOKaWU6ipOv6YEg47AUIdZtKqAOxaso6C8FgMUlNdyx4J1LFpV4HRoSinVaUPSezAkvccx3TaYz4ezZ89m4sSJjB49msceewyAN998kwkTJjBu3DhmzJjBrl27ePTRR3nwwQc56aST+PDDD7n22muZP3/+oeP4rnRXVVUxY8YMJkyYwJgxY3j55ZfbvN9uIgqYAPzdGDMeqOar6SJtaWtegmln++EbjHnMGJNrjMlNT08/lngP0XNOKaXc53hyCSeF6/s6HYGhDvPA4i3UNjYftq22sZkHFm/xfLVOKdX93HfR2IA/u/vVDe025lq1p5yG5pbDttU2NvPL+Wt5/rM9bd5mVP/kDnUpf/zxx0lLS6O2tpZJkyZx4YUX8oMf/IClS5cyePBgysrKSEtL48YbbyQxMZFbb70VgH//+99tHi8uLo6FCxeSnJxMSUkJU6dO5YILLuiuPQPygXzz/9m79/goyzP/458758MEckYIgSBEQAVEQXHxjIqtWq3V6m4P9mhru7bb365t7W5/3Z62uu6v7dpta+nq1m1ttVo81VYr4LmewKAoBzklIRMkyWQSkszkfP/+mGdigEBOM/M8k3zfrxevZJ555pkrOIZ7rrnu67L2Fef2g0QSGAeMMdOd6ovpQMOg88sHPX4mUO8cP++w48+MJzC95kREks+x1hJeNlHf16kCQw5R3xIe1XERkYnq8DeSwx0fjTvuuIMlS5awYsUK9u3bx5o1azjnnHMGxkMWFhaO6nrWWr7xjW+wePFiLrzwQvx+PwcOHBh3nMnIWvsusM8YM985tArYCjwKXO8cux6Ilgw8CnzcRKwAWp2tJk8CFxtjCpzmnRc7x+JGrzkREYmVifq+ThUYcogZ+dn4h3hRz8jPdiEaEZHxuWXtm8DQn54M96n1yls3DPn7sCw/m/s/d+aYY3rmmWdYt24dL730Ejk5OZx33nksWbKEHTt2DPvYtLQ0+vsjb2attXR3dwNw77330tjYyKZNm0hPT6eiooLOzs4xxzgB3ATca4zJAPYAnyTyoc3vjTGfBmqBa5xz/0RkhOouImNUPwlgrW02xnwXeM057zvW2ubxBKXXnIhI8jnWWsLLJur7OlVgyCFuXj2ftJRDyz+z01O5efX8ozxCRMS79jR2sKexY0yPvXn1fLLTUw85Fovfh62trRQUFJCTk8P27dt5+eWX6erq4tlnn2Xv3r0ANDdH3ifn5eXR1tY28NiKigo2bdoEwCOPPEJPT8/ANUtLS0lPT+fpp5+mpqZmXDEmO2vtZqcvxWJr7ZXW2qC1NmCtXWWtrXS+NjvnWmvtF621c621i6y1Gwdd525r7Tznz//EO2695kREvGc8awk33bx6PumpE+99nRIYcogrl5axcHrewO2y/Gx+cNWipN4nJSIyFlcuLeMHVy2iLD8bQ+x+H15yySX09vayePFivvnNb7JixQpKSkpYs2YNV111FUuWLOHaa68F4PLLL+ehhx4aaKj42c9+lmeffZbTTz+dV155hdzcSFOxj3zkI2zcuJFly5Zx7733smDBgvH++OICveZERCRWrlxaxuqTpg3cnijv64y1RzTUnpSWLVtmN27cOPyJk8AlP36O7e+2UV6YzfNfvcDtcERExuzaX7wEMFB+v23bNhYuXOhmSBPKUH+fxphN1tplLoXkqqHWEnrNxZb+PkUk0Q5fSySTf35oC/e+UsuS8nwe+eJKt8MZlaOtJ1SBIYew1lITCGEM+INhunvH3zhMREREREREEivaAyPQ3uVyJLGjBIYcorGti3BPH6eU59NvYV8w5HZIIiJjduKMKZw4Y4rbYYiIiEiSSua1RF0wksBoau9iouy80BQSOUR1IJKwOPeEEqpqW6hu6mBuic/lqERExma4qQ8iIiIix5KsawlrLf5gmNQUQ2dPP6HuPnIzk//tvyow5BDVgUiH3XNPKHFuqwJDREREREQkmTR3dBPu6WP+tMiAhkB7t8sRxYYSGHKImkAHaSmGRWVTmZKVRnVT8o0MEhGJ+of7qviH+6rcDkNERESSVLKuJaL9L5aU5wPQOEH6YCiBIYeoDoSYWZBNWmoKFcW5AxUZIiLJaH9rJ/tbO90OQ0RERJJUsq4l/E7/i1PKpwITp5GnEhhyiJpAB7OLIjPeK4qUwBAR8TqfL9KnqL6+nquvvvqY5/74xz8mFBrd1sBnnnmGyy67bMzxycSj15yIiPdFG3gunhmpwAh0aAuJTDDWWmqaQlQU5QBQUZSjUaoiIvv3w7nnwrvvJuwp+/r6Rv2YGTNm8OCDDx7znLG8mRQX6DUnIiLj5G8Jk5eZxpziyIfTTW2qwJAJprmjm7au3vcqMIpzNUpVROS734UXXoh8jYHq6moWLFjA9ddfz+LFi7n66qsJhUJUVFTwne98h7POOosHHniA3bt3c8kll3Daaadx9tlns337dgD27t3LmWeeyfLly/nmN795yHVPPvlkIPJm9J/+6Z9YtGgRixcv5ic/+Ql33HEH9fX1nH/++Zx//vkA/OUvf+HMM8/k1FNP5ZprrqG9vR2AJ554ggULFnDWWWexdu3amPzcMgp6zcXk5xYRmczqgmHKCrLJSk8lLyttwlRgJP8cFYmZ6MSRimKnAsPJ1mmUqogkq1NnFxz7hPPOO/LYhz8MX/gChEKwahW8+ir098Odd0JVFdxwA3ziE9DUBIeXzz/zzIji2rFjB3fddRcrV67kU5/6FD/72c8AyMrK4oUXXgBg1apV3HnnnVRWVvLKK6/whS98gQ0bNvDlL3+ZG2+8kY9//OP89Kc/HfL6a9asYe/evVRVVZGWlkZzczOFhYX88Ic/5Omnn6a4uJimpia+973vsW7dOnJzc7ntttv44Q9/yFe/+lU++9nPsmHDBubNm8e11147op9JRkivOb3mRCSpDLuW8Ki6YIiy/GwAin2ZNE2QHhhKYMiAGqffxeAeGKBRqiKSvL52yYLxXaCmBqyNfG9t5HYMlJeXs3LlSgA++tGPcscddwAMvHFrb2/nr3/9K9dcc83AY7q6IguPF198kT/84Q8AfOxjH+NrX/vaEddft24dn//850lLi/wzX1hYeMQ5L7/8Mlu3bh2Io7u7mzPPPJPt27czZ84cKisrB+Jbs2ZNTH5uGQG95vSaExFPGfdawiX+ljBnzIn8Li7KzZgwY1SVwJAB1YEQKQZmFkQydQU56RqlKiIT27E+vW5thWDw0DeTwSBccknkdnHxiD/9PpwxZsjbubmRxHF/fz/5+fls3rx5RI8/nLV2ROdcdNFF/O53vzvk+ObNm4d9rIyDXnN6zYmIxFlruIe2zl7KnPd1Rb4M9jROjPd06oEhA2oCHczIzyYzLRWILFY0SlVEktnnf72Jz/9609ge/N3vRsr4B+vri0lfgtraWl566SUAfve733HWWWcdcv+UKVOYM2cODzzwABB54/fGG28AsHLlSu677z4A7r333iGvf/HFF3PnnXfS29sLQHNzMwB5eXm0tbUBsGLFCl588UV27doFQCgU4p133mHBggXs3buX3bt3D8QnCaLX3EB8IiJeMa61hEuiI1RnFkRaAxT7MidMDwwlMGRATSA0sG0kSqNURSSZBUPdBENj/Af7pZeg+7DHdnfDX/867rgWLlzIPffcw+LFi2lububGG2884px7772Xu+66iyVLlnDSSSfxyCOPAPCf//mf/PSnP2X58uW0trYOef3PfOYzzJo1i8WLF7NkyRJ++9vfAnDDDTfwvve9j/PPP5+SkhJ+9atf8bd/+7csXryYFStWsH37drKyslizZg2XXnopZ511FrNnzx73zysjpNecXnMi4jnjWku4xN8SSWBEe2AU+TIJhrrp7Uv+6ZLGRssUJ7lly5bZjRs3uh2Gq5Z+5y+8f9F0vv/BRQPHfvjUO/zXhp1s/+77yEhTvktEksu1v4h84nz/584EYNu2bSxcuNDNkDKwWE4AACAASURBVKiuruayyy7jrbfecjWOWBjq79MYs8lau8yl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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "num_samples = 6\n", + "min_week = 120\n", + "sales = pd.read_csv(os.path.join(DATA_DIR, \"yx.csv\"))\n", + "sales[\"move\"] = sales.logmove.apply(lambda x: round(math.exp(x)) if x > 0 else 0)\n", + "\n", + "result_df[\"move\"] = result_df.predictions\n", + "plot_predictions_with_history(\n", + " result_df,\n", + " sales,\n", + " grain1_unique_vals=store_list,\n", + " grain2_unique_vals=brand_list,\n", + " time_col_name=\"week\",\n", + " target_col_name=\"move\",\n", + " grain1_name=\"store\",\n", + " grain2_name=\"brand\",\n", + " min_timestep=min_week,\n", + " num_samples=num_samples,\n", + " predict_at_timestep=max(train_df.week),\n", + " line_at_predict_time=True,\n", + " title=\"Prediction results for a few sample time series (predictions are made at week 135)\",\n", + " x_label=\"week\",\n", + " y_label=\"unit sales\",\n", + " random_seed=2,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Reading\n", + "\n", + "\\[1\\] Rob J Hyndman and George Athanasopoulos. 2018. Forecasting: Principles and Practice. Chapter 8 ARIMA models: https://otexts.com/fpp2/arima.html
\n", + "\n", + "\\[2\\] Modern Parallel and Distributed Python: A Quick Tutorial on Ray: https://rise.cs.berkeley.edu/blog/modern-parallel-and-distributed-python-a-quick-tutorial-on-ray/
" + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "forecasting_env", + "language": "python", + "name": "forecasting_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/grocery_sales/python/00_quick_start/azure_automl_single_round.ipynb b/examples/grocery_sales/python/00_quick_start/azure_automl_single_round.ipynb new file mode 100644 index 00000000..e9df10f7 --- /dev/null +++ b/examples/grocery_sales/python/00_quick_start/azure_automl_single_round.ipynb @@ -0,0 +1,1790 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation.\n", + "\n", + "Licensed under the MIT License. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Automated Machine Learning (AutoML) on Azure for Retail Sales Forecasting\n", + "\n", + "This notebook demonstrates how to apply [AutoML in Azure Machine Learning services](https://docs.microsoft.com/en-us/azure/machine-learning/concept-automated-ml) to train and tune machine learning models for forecasting product sales in retail. We will use the Orange Juice dataset to illustrate the steps of utilizing AutoML as well as how to combine an AutoML model with a custom model for better performance.\n", + "\n", + "AutoML is a process of automating the tasks of machine learning model development. It helps data scientists and other practitioners build machine learning models with high scalability and quality in less amount of time. AutoML in Azure Machine Learning allows you to train and tune a model using a target metric that you specify. This service iterates through machine learning algorithms and feature selection approaches, producing a score that measures the quality of each machine learning pipeline. The best model will then be selected based on the scores. For more technical details about Azure AutoML, please check [this paper](https://papers.nips.cc/paper/7595-probabilistic-matrix-factorization-for-automated-machine-learning.pdf).\n", + "\n", + "This notebook uses [Azure ML SDK](https://docs.microsoft.com/en-us/python/api/overview/azureml-sdk/?view=azure-ml-py) which is included in the `forecasting_env` conda environment. If you are running in Azure Notebooks or another Microsoft managed environment, the SDK is already installed. On the other hand, if you are running this notebook in your own environment, please follow [SDK installation instructions](https://docs.microsoft.com/azure/machine-learning/service/how-to-configure-environment) to install the SDK." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Settings and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "System version: 3.6.10 |Anaconda, Inc.| (default, Jan 7 2020, 21:14:29) \n", + "[GCC 7.3.0]\n", + "This notebook was created using version 1.0.85 of the Azure ML SDK\n", + "You are currently using version 1.0.85 of the Azure ML SDK\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "import math\n", + "import warnings\n", + "import datetime\n", + "import logging\n", + "import azureml.core\n", + "import azureml.automl\n", + "import pandas as pd\n", + "\n", + "from matplotlib import pyplot as plt\n", + "from fclib.common.utils import git_repo_path\n", + "from fclib.azureml.azureml_utils import (\n", + " get_or_create_workspace,\n", + " get_or_create_amlcompute,\n", + ")\n", + "from fclib.dataset.ojdata import download_ojdata, FIRST_WEEK_START\n", + "from fclib.common.utils import align_outputs\n", + "from fclib.evaluation.evaluation_utils import MAPE\n", + "from fclib.models.multiple_linear_regression import fit, predict\n", + "\n", + "from azureml.core import Workspace\n", + "from azureml.core.dataset import Dataset\n", + "from azureml.core.experiment import Experiment\n", + "from automl.client.core.common import constants\n", + "from azureml.train.automl import AutoMLConfig\n", + "from azureml.core.compute import ComputeTarget, AmlCompute\n", + "from azureml.automl.core._vendor.automl.client.core.common import metrics\n", + "\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "print(\"System version: {}\".format(sys.version))\n", + "print(\"This notebook was created using version 1.0.85 of the Azure ML SDK\")\n", + "print(\"You are currently using version\", azureml.core.VERSION, \"of the Azure ML SDK\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Use False if you've already downloaded and split the data\n", + "DOWNLOAD_SPLIT_DATA = True\n", + "\n", + "# Data directory\n", + "DATA_DIR = os.path.join(git_repo_path(), \"ojdata\")\n", + "\n", + "# Forecasting settings\n", + "GAP = 2\n", + "LAST_WEEK = 138\n", + "\n", + "# Number of test periods\n", + "NUM_TEST_PERIODS = 3\n", + "\n", + "# Column names\n", + "time_column_name = \"week_start\"\n", + "target_column_name = \"move\"\n", + "grain_column_names = [\"store\", \"brand\"]\n", + "index_column_names = [time_column_name] + grain_column_names\n", + "\n", + "# Subset of stores used in the notebook\n", + "USE_STORES = [2, 5, 8]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Set up Azure Machine Learning Workspace\n", + "\n", + "An Azure ML workspace is an Azure resource that organizes and coordinates the actions of many other Azure resources to assist in executing and sharing machine learning workflows. In particular, an Azure ML workspace coordinates storage, databases, and compute resources providing added functionality for machine learning experimentation, deployment, inference, and the monitoring of deployed models. To create an Azure ML workspace, first you need access to an Azure subscription. An Azure subscription allows you to manage storage, compute, and other assets in the Azure cloud. You can [create a new subscription](https://azure.microsoft.com/en-us/free/) or access existing subscription information from the [Azure portal](https://portal.azure.com/). Given that you have access to your Azure subscription, you can further create an Azure ML workspace by following the instructions [here](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-manage-workspace). You can also do so [using Azure CLI](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-manage-workspace-cli) or the `Workspace.create()` method in Azure SDK.\n", + "\n", + "Once you have created an Azure ML workspace, you can download its configuration file (`config.json`) from Azure Portal as follows\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prepare Azure ML Workspace\n", + "\n", + "In the following cell, `get_or_create_workspace()` creates a workspace object from the details stored in `config.json` that you have downloaded. We assume that you store this config file to a directory `./.azureml`. In case the existing workspace cannot be loaded, the following cell will try to create a new workspace with the subscription ID, resource group, and workspace name as specified in the beginning of the cell.\n", + "\n", + "The cell can fail if you don't have permission to access the workspace. You may need to log into your Azure account and change the default subscription to the one which the workspace belongs to using Azure CLI `az account set --subscription `." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Workspace preparation succeeded.\n" + ] + } + ], + "source": [ + "# Please specify the AzureML workspace attributes below if you want to create a new one.\n", + "subscription_id = \"\"\n", + "resource_group = \"\"\n", + "workspace_name = \"\"\n", + "workspace_region = \"\"\n", + "\n", + "# Connect to a workspace\n", + "ws = get_or_create_workspace(\n", + " config_path=\"./.azureml\",\n", + " subscription_id=subscription_id,\n", + " resource_group=resource_group,\n", + " workspace_name=workspace_name,\n", + " workspace_region=workspace_region,\n", + ")\n", + "print(\n", + " \"Workspace name: \" + ws.name,\n", + " \"Azure region: \" + ws.location,\n", + " \"Resource group: \" + ws.resource_group,\n", + " sep=\"\\n\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create compute resources for your experiments\n", + "\n", + "We run AutoML on a dynamically scalable compute cluster. In the next cell, we create an AmlCompute target with a specific cluster name, VM size, and maximum number of nodes if the cluster does not exist. Otherwise, we will reuse an existing one. For more options of VM sizes, please check the information in this [link](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-general)." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found existing cpu-cluster\n" + ] + } + ], + "source": [ + "# Choose a name for your cluster\n", + "cluster_name = \"cpu-cluster\"\n", + "# VM Size\n", + "vm_size = \"STANDARD_D2_V2\"\n", + "# Maximum number of nodes of the cluster\n", + "max_nodes = 4\n", + "\n", + "# Create a new AmlCompute if it does not exist or reuse an existing one\n", + "cpu_cluster = get_or_create_amlcompute(\n", + " workspace=ws,\n", + " compute_name=cluster_name,\n", + " vm_size=vm_size,\n", + " min_nodes=0,\n", + " max_nodes=max_nodes,\n", + " verbose=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define Experiment\n", + "\n", + "To run AutoML, you need to create an Experiment. An Experiment corresponds to a prediction problem you are trying to solve, while a Run corresponds to a specific approach to the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SDK version1.0.85
Workspacechhamlws
SKUBasic
Resource Groupchhamlwsrg
Locationwestcentralus
Run History Nameautoml-ojforecasting
\n", + "
" + ], + "text/plain": [ + " \n", + "SDK version 1.0.85 \n", + "Workspace chhamlws \n", + "SKU Basic \n", + "Resource Group chhamlwsrg \n", + "Location westcentralus \n", + "Run History Name automl-ojforecasting" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# choose a name for the run history container in the workspace\n", + "experiment_name = \"automl-ojforecasting\"\n", + "\n", + "experiment = Experiment(ws, experiment_name)\n", + "\n", + "output = {}\n", + "output[\"SDK version\"] = azureml.core.VERSION\n", + "output[\"Workspace\"] = ws.name\n", + "output[\"SKU\"] = ws.sku\n", + "output[\"Resource Group\"] = ws.resource_group\n", + "output[\"Location\"] = ws.location\n", + "output[\"Run History Name\"] = experiment_name\n", + "pd.set_option(\"display.max_colwidth\", -1)\n", + "outputDf = pd.DataFrame(data=output, index=[\"\"])\n", + "outputDf.T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preparation\n", + "\n", + "We need to download the Orange Juice data and split it into training and test sets. By default, the following cell will download and spit the data. If you've already done so, you may skip this part by switching `DOWNLOAD_SPLIT_DATA` to `False`.\n", + "\n", + "We store the training data and test data using dataframes. The training data includes `train_df` and `aux_df` with `train_df` containing the historical sales up to week 135 (the time we make forecasts) and `aux_df` containing price/promotion information up until week 138. We assume that future price and promotion information up to a certain number of weeks ahead is predetermined and known. The test data is stored in `test_df` which contains the sales of each product in week 137 and 138. Assuming the current week is week 135, our goal is to forecast the sales in week 137 and 138 using the training data. There is a one-week gap between the current week and the first target week of forecasting as we want to leave time for planning inventory in practice." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data download and split" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data already exists at the specified location.\n" + ] + } + ], + "source": [ + "if DOWNLOAD_SPLIT_DATA:\n", + " download_ojdata(DATA_DIR)\n", + " df = pd.read_csv(os.path.join(DATA_DIR, \"yx.csv\"))\n", + " df = df.loc[df.week <= LAST_WEEK]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Convert logarithm of the unit sales to unit sales\n", + "df[\"move\"] = df[\"logmove\"].apply(lambda x: round(math.exp(x)))\n", + "# Add timestamp column\n", + "df[\"week_start\"] = df[\"week\"].apply(lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7))\n", + "# Select a subset of stores for demo purpose\n", + "df_sub = df[df.store.isin(USE_STORES)]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Split data into training and test sets\n", + "def split_last_n_by_grain(df, n):\n", + " \"\"\"Group df by grain and split on last n rows for each group.\"\"\"\n", + " df_grouped = df.sort_values(time_column_name).groupby( # Sort by ascending time\n", + " grain_column_names, group_keys=False\n", + " )\n", + " df_head = df_grouped.apply(lambda dfg: dfg.iloc[:-n])\n", + " df_tail = df_grouped.apply(lambda dfg: dfg.iloc[-n:])\n", + " return df_head, df_tail\n", + "\n", + "\n", + "train_df, test_df = split_last_n_by_grain(df_sub, NUM_TEST_PERIODS)\n", + "train_df.reset_index(drop=True)\n", + "test_df.reset_index(drop=True)\n", + "\n", + "# Save data locally\n", + "local_data_pathes = [\n", + " os.path.join(DATA_DIR, \"train.csv\"),\n", + " os.path.join(DATA_DIR, \"test.csv\"),\n", + "]\n", + "\n", + "train_df.to_csv(local_data_pathes[0], index=None, header=True)\n", + "test_df.to_csv(local_data_pathes[1], index=None, header=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Upload data to datastore\n", + "\n", + "The [Machine Learning service workspace](https://docs.microsoft.com/en-us/azure/machine-learning/service/concept-workspace), is paired with the storage account, which contains the default data store. We will use it to upload the train and test data and create [tabular datasets](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.data.tabulardataset?view=azure-ml-py) for training and testing. A tabular dataset defines a series of lazily-evaluated, immutable operations to load data from the data source into tabular representation.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Uploading an estimated of 2 files\n", + "Uploading /data/home/chenhui/work/forecasting/ojdata/test.csv\n", + "Uploading /data/home/chenhui/work/forecasting/ojdata/train.csv\n", + "Uploaded /data/home/chenhui/work/forecasting/ojdata/test.csv, 1 files out of an estimated total of 2\n", + "Uploaded /data/home/chenhui/work/forecasting/ojdata/train.csv, 2 files out of an estimated total of 2\n", + "Uploaded 2 files\n" + ] + }, + { + "data": { + "text/plain": [ + "$AZUREML_DATAREFERENCE_1f003008a69b4030b4c6165a27ca7f24" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "datastore = ws.get_default_datastore()\n", + "datastore.upload_files(files=local_data_pathes, target_path=\"dataset/\", overwrite=True, show_progress=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create dataset for training" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "train_dataset = Dataset.Tabular.from_delimited_files(path=datastore.path(\"dataset/train.csv\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweeklogmoveconstantprice1price2price3price4price5...price7price8price9price10price11dealfeatprofitmoveweek_start
297681113110.4010.030.040.040.030.03...0.040.030.020.020.0200.005.52330241992-03-12
297781113210.3910.030.040.040.040.03...0.030.030.020.020.0211.005.48323841992-03-19
29788111339.3710.050.040.040.030.04...0.030.030.020.020.0200.005.38117761992-03-26
29798111349.3410.040.040.040.030.03...0.040.030.020.020.0200.007.16113921992-04-02
298081113510.5110.040.040.040.040.03...0.040.030.030.020.0211.008.29368641992-04-09
\n", + "

5 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " store brand week logmove constant price1 price2 price3 price4 \\\n", + "2976 8 11 131 10.40 1 0.03 0.04 0.04 0.03 \n", + "2977 8 11 132 10.39 1 0.03 0.04 0.04 0.04 \n", + "2978 8 11 133 9.37 1 0.05 0.04 0.04 0.03 \n", + "2979 8 11 134 9.34 1 0.04 0.04 0.04 0.03 \n", + "2980 8 11 135 10.51 1 0.04 0.04 0.04 0.04 \n", + "\n", + " price5 ... price7 price8 price9 price10 price11 deal \\\n", + "2976 0.03 ... 0.04 0.03 0.02 0.02 0.02 0 \n", + "2977 0.03 ... 0.03 0.03 0.02 0.02 0.02 1 \n", + "2978 0.04 ... 0.03 0.03 0.02 0.02 0.02 0 \n", + "2979 0.03 ... 0.04 0.03 0.02 0.02 0.02 0 \n", + "2980 0.03 ... 0.04 0.03 0.03 0.02 0.02 1 \n", + "\n", + " feat profit move week_start \n", + "2976 0.00 5.52 33024 1992-03-12 \n", + "2977 1.00 5.48 32384 1992-03-19 \n", + "2978 0.00 5.38 11776 1992-03-26 \n", + "2979 0.00 7.16 11392 1992-04-02 \n", + "2980 1.00 8.29 36864 1992-04-09 \n", + "\n", + "[5 rows x 21 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_dataset.to_pandas_dataframe().tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Modeling\n", + "\n", + "For forecasting tasks, AutoML uses pre-processing and estimation steps that are specific to time-series. AutoML will undertake the following pre-processing steps:\n", + "* Detect time-series sample frequency (e.g. hourly, daily, weekly) and create new records for absent time points to make the series regular. A regular time series has a well-defined frequency and has a value at every sample point in a contiguous time span\n", + "* Impute missing values in the target (via forward-fill) and feature columns (using median column values)\n", + "* Create grain-based features to enable fixed effects across different series\n", + "* Create time-based features to assist in learning seasonal patterns\n", + "* Encode categorical variables to numeric quantities\n", + "\n", + "In this notebook, AutoML will train a single, regression-type model across all time-series in a given training set. This allows the model to generalize across related series. To create a training job, we use AutoML Config object to define the settings and data. Here is a summary of the meanings of the AutoMLConfig parameters:\n", + "\n", + "|Property|Description|\n", + "|-|-|\n", + "|**task**|forecasting|\n", + "|**primary_metric**|This is the metric that you want to optimize.
Forecasting supports the following primary metrics
spearman_correlation
normalized_root_mean_squared_error
r2_score
normalized_mean_absolute_error\n", + "|**experiment_timeout_hours**|Experimentation timeout in hours.|\n", + "|**enable_early_stopping**|If early stopping is on, training will stop when the primary metric is no longer improving.|\n", + "|**training_data**|Input dataset, containing both features and label column.|\n", + "|**label_column_name**|The name of the label column.|\n", + "|**compute_target**|The remote compute for training.|\n", + "|**n_cross_validations**|Number of cross-validation folds to use for model/pipeline selection|\n", + "|**enable_voting_ensemble**|Allow AutoML to create a Voting ensemble of the best performing models|\n", + "|**enable_stack_ensemble**|Allow AutoML to create a Stack ensemble of the best performing models|\n", + "|**debug_log**|Log file path for writing debugging information|\n", + "|**time_column_name**|Name of the datetime column in the input data|\n", + "|**grain_column_names**|Name(s) of the columns defining individual series in the input data|\n", + "|**drop_column_names**|Name(s) of columns to drop prior to modeling|\n", + "|**max_horizon**|Maximum desired forecast horizon in units of time-series frequency|" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Model training" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "time_series_settings = {\n", + " \"time_column_name\": time_column_name,\n", + " \"grain_column_names\": grain_column_names,\n", + " \"drop_column_names\": [\"logmove\"], # 'logmove' is a leaky feature, so we remove it.\n", + " \"max_horizon\": NUM_TEST_PERIODS,\n", + "}\n", + "\n", + "automl_config = AutoMLConfig(\n", + " task=\"forecasting\",\n", + " debug_log=\"automl_oj_sales_errors.log\",\n", + " primary_metric=\"normalized_mean_absolute_error\",\n", + " experiment_timeout_hours=1.0, # You may increase this number to improve model accuracy\n", + " training_data=train_dataset,\n", + " label_column_name=target_column_name,\n", + " compute_target=cpu_cluster,\n", + " enable_early_stopping=True,\n", + " n_cross_validations=3,\n", + " verbosity=logging.INFO,\n", + " **time_series_settings\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
ExperimentIdTypeStatusDetails PageDocs Page
automl-ojforecastingAutoML_45710381-d3fc-47c9-816d-9874c41b5355automlStartingLink to Azure Machine Learning studioLink to Documentation
" + ], + "text/plain": [ + "Run(Experiment: automl-ojforecasting,\n", + "Id: AutoML_45710381-d3fc-47c9-816d-9874c41b5355,\n", + "Type: automl,\n", + "Status: Starting)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "remote_run = experiment.submit(automl_config, show_output=False)\n", + "remote_run" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "remote_run.wait_for_completion()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Retrieve the best model\n", + "\n", + "Each run within an Experiment stores serialized (i.e. pickled) pipelines from the AutoML iterations. After the training job is done, we can retrieve the pipeline with the best performance on the validation dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('timeseriestransformer', TimeSeriesTransformer(logger=None,\n", + " pipeline_type=)), ('MinMaxScaler', MinMaxScaler(copy=True, feature_range=(0, 1))), ('GradientBoostingRegressor', GradientBoostingRegressor(alpha=0.9, criterion='mse', init=None,\n", + " learning_rate=0.1, loss='huber', max_depth=10,\n", + " max_features='sqrt', max_leaf_nodes=None,\n", + " min_impurity_decrease=0.0, min_impurity_split=None,\n", + " min_samples_leaf=0.15874989977926784,\n", + " min_samples_split=0.10734188827013527,\n", + " min_weight_fraction_leaf=0.0, n_estimators=50,\n", + " n_iter_no_change=None, presort='auto', random_state=None,\n", + " subsample=0.95, tol=0.0001, validation_fraction=0.1,\n", + " verbose=0, warm_start=False))]\n" + ] + } + ], + "source": [ + "best_run, fitted_model = remote_run.get_output()\n", + "print(fitted_model.steps)\n", + "model_name = best_run.properties[\"model_name\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Forecasting\n", + "\n", + "Now that we have retrieved the best model pipeline, we can apply it to generate forecasts for the target weeks. To do this, we first remove the target values from the test set" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate forecasts" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "X_test = test_df\n", + "y_test = X_test.pop(target_column_name).values" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweeklogmoveconstantprice1price2price3price4price5price6price7price8price9price10price11dealfeatprofitweek_start
85211368.5910.050.050.050.050.040.050.030.040.030.020.0300.0033.541992-04-16
86211379.1910.040.050.050.040.030.040.030.040.040.020.0300.0020.431992-04-23
87211389.7410.040.040.050.040.040.050.040.040.040.030.0311.0011.291992-04-30
195221369.1410.050.050.050.050.040.050.030.040.030.020.0310.0027.131992-04-16
196221378.7410.040.050.050.040.030.040.030.040.040.020.0300.0033.301992-04-23
\n", + "
" + ], + "text/plain": [ + " store brand week logmove constant price1 price2 price3 price4 \\\n", + "85 2 1 136 8.59 1 0.05 0.05 0.05 0.05 \n", + "86 2 1 137 9.19 1 0.04 0.05 0.05 0.04 \n", + "87 2 1 138 9.74 1 0.04 0.04 0.05 0.04 \n", + "195 2 2 136 9.14 1 0.05 0.05 0.05 0.05 \n", + "196 2 2 137 8.74 1 0.04 0.05 0.05 0.04 \n", + "\n", + " price5 price6 price7 price8 price9 price10 price11 deal feat \\\n", + "85 0.04 0.05 0.03 0.04 0.03 0.02 0.03 0 0.00 \n", + "86 0.03 0.04 0.03 0.04 0.04 0.02 0.03 0 0.00 \n", + "87 0.04 0.05 0.04 0.04 0.04 0.03 0.03 1 1.00 \n", + "195 0.04 0.05 0.03 0.04 0.03 0.02 0.03 1 0.00 \n", + "196 0.03 0.04 0.03 0.04 0.04 0.02 0.03 0 0.00 \n", + "\n", + " profit week_start \n", + "85 33.54 1992-04-16 \n", + "86 20.43 1992-04-23 \n", + "87 11.29 1992-04-30 \n", + "195 27.13 1992-04-16 \n", + "196 33.30 1992-04-23 " + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# The featurized data, aligned to y, will also be returned. It contains the assumptions\n", + "# that were made in the forecast and helps align the forecast to the original data.\n", + "y_predictions, X_trans = fitted_model.forecast(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need to align the output explicitly to the input, as the count and order of the rows may have changed during transformations that span multiple rows." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
week_startstorebrandpredictedweeklogmoveconstantprice1price2price3...price6price7price8price9price10price11dealfeatprofitmove
01992-04-16214075.571368.5910.050.050.05...0.050.030.040.030.020.0300.0033.545376
11992-04-16227212.491369.1410.050.050.05...0.050.030.040.030.020.0310.0027.139312
21992-04-16234075.571367.8510.050.050.05...0.050.030.040.030.020.0300.0032.552560
31992-04-16244011.431367.4210.050.050.05...0.050.030.040.030.020.0300.0034.981664
41992-04-16254336.831368.5910.050.050.05...0.050.030.040.030.020.0300.0028.805376
\n", + "

5 rows × 22 columns

\n", + "
" + ], + "text/plain": [ + " week_start store brand predicted week logmove constant price1 \\\n", + "0 1992-04-16 2 1 4075.57 136 8.59 1 0.05 \n", + "1 1992-04-16 2 2 7212.49 136 9.14 1 0.05 \n", + "2 1992-04-16 2 3 4075.57 136 7.85 1 0.05 \n", + "3 1992-04-16 2 4 4011.43 136 7.42 1 0.05 \n", + "4 1992-04-16 2 5 4336.83 136 8.59 1 0.05 \n", + "\n", + " price2 price3 ... price6 price7 price8 price9 price10 price11 \\\n", + "0 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", + "1 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", + "2 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", + "3 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", + "4 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", + "\n", + " deal feat profit move \n", + "0 0 0.00 33.54 5376 \n", + "1 1 0.00 27.13 9312 \n", + "2 0 0.00 32.55 2560 \n", + "3 0 0.00 34.98 1664 \n", + "4 0 0.00 28.80 5376 \n", + "\n", + "[5 rows x 22 columns]" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pred_automl = align_outputs(y_predictions, X_trans, X_test, y_test, target_column_name)\n", + "pred_automl.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Results evaluation & visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Test data scores]\n", + "\n", + "explained_variance: 0.187\n", + "r2_score: 0.172\n", + "spearman_correlation: 0.703\n", + "mean_absolute_percentage_error: 117.345\n", + "mean_absolute_error: 6624.722\n", + "normalized_mean_absolute_error: 0.046\n", + "median_absolute_error: 3048.760\n", + "normalized_median_absolute_error: 0.021\n", + "root_mean_squared_error: 16663.119\n", + "normalized_root_mean_squared_error: 0.115\n", + "root_mean_squared_log_error: 0.890\n", + "normalized_root_mean_squared_log_error: 0.140\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Use automl metrics module\n", + "scores = metrics.compute_metrics_regression(\n", + " pred_automl[\"predicted\"],\n", + " pred_automl[target_column_name],\n", + " list(constants.Metric.SCALAR_REGRESSION_SET),\n", + " None,\n", + " None,\n", + " None,\n", + ")\n", + "\n", + "print(\"[Test data scores]\\n\")\n", + "for key, value in scores.items():\n", + " print(\"{}: {:.3f}\".format(key, value))\n", + "\n", + "# Plot outputs\n", + "test_pred = plt.scatter(pred_automl[target_column_name], pred_automl[\"predicted\"], color=\"b\")\n", + "test_test = plt.scatter(pred_automl[target_column_name], pred_automl[target_column_name], color=\"g\")\n", + "plt.legend((test_pred, test_test), (\"prediction\", \"truth\"), loc=\"upper left\", fontsize=8)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also compute MAPE of the forecasts in the last two weeks of the forecast period in order to be consistent with the evaluation period that is used in other quick start examples." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of forecasts obtained by AutoML in the last two weeks: 124.10334037331717\n" + ] + } + ], + "source": [ + "pred_automl_sub = pred_automl.loc[pred_automl.week >= max(test_df.week) - NUM_TEST_PERIODS + GAP]\n", + "mape_automl_sub = MAPE(pred_automl_sub[\"predicted\"], pred_automl_sub[\"move\"]) * 100\n", + "print(\"MAPE of forecasts obtained by AutoML in the last two weeks: \" + str(mape_automl_sub))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Combine AutoML Model with a Custom Model\n", + "\n", + "So far we have demonstrated how we can quickly build a forecasting model with AutoML in Azure. Next, we further show a simple way to achieve more robust and accurate forecasts by combining the forecasts from AutoML and a custom model that the user may have. Here we assume that the user have also constructed a series of linear regression models with each model forecasts the sales of a specfic store-brand using `scikit-learn` package." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multiple linear regression models" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Create price features\n", + "df_sub[\"price\"] = df_sub.apply(lambda x: x.loc[\"price\" + str(int(x.loc[\"brand\"]))], axis=1)\n", + "price_cols = [\n", + " \"price1\",\n", + " \"price2\",\n", + " \"price3\",\n", + " \"price4\",\n", + " \"price5\",\n", + " \"price6\",\n", + " \"price7\",\n", + " \"price8\",\n", + " \"price9\",\n", + " \"price10\",\n", + " \"price11\",\n", + "]\n", + "df_sub[\"avg_price\"] = df_sub[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols))\n", + "df_sub[\"price_ratio\"] = df_sub.apply(lambda x: x[\"price\"] / x[\"avg_price\"], axis=1)\n", + "\n", + "# Create lag features on unit sales\n", + "df_sub[\"move_lag1\"] = df_sub[\"move\"].shift(1)\n", + "df_sub[\"move_lag2\"] = df_sub[\"move\"].shift(2)\n", + "\n", + "# Drop rows with NaN values\n", + "df_sub.dropna(inplace=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After splitting the data, we use `fit()` and `predit()` functions from `fclib.models.multiple_linear_regression` to train separate linear regression model for each invididual time series and generate forecasts for the sales during the test period." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
week_startpredictionstorebrandweeklogmoveconstantprice1price2price3...price11dealfeatprofitmovepriceavg_priceprice_ratiomove_lag1move_lag2
01992-04-1612507211368.5910.050.050.05...0.0300.0033.5453760.050.041.2712416.0028096.00
11992-04-2317664211379.1910.040.050.05...0.0300.0020.4397920.040.041.115376.0012416.00
21992-04-3021670211389.7410.040.040.05...0.0311.0011.29169600.040.040.949792.005376.00
31992-04-169551221369.1410.050.050.05...0.0310.0027.1393120.050.041.2111424.004992.00
41992-04-237452221378.7410.040.050.05...0.0300.0033.3062400.050.041.399312.0011424.00
\n", + "

5 rows × 27 columns

\n", + "
" + ], + "text/plain": [ + " week_start prediction store brand week logmove constant price1 \\\n", + "0 1992-04-16 12507 2 1 136 8.59 1 0.05 \n", + "1 1992-04-23 17664 2 1 137 9.19 1 0.04 \n", + "2 1992-04-30 21670 2 1 138 9.74 1 0.04 \n", + "3 1992-04-16 9551 2 2 136 9.14 1 0.05 \n", + "4 1992-04-23 7452 2 2 137 8.74 1 0.04 \n", + "\n", + " price2 price3 ... price11 deal feat profit move price \\\n", + "0 0.05 0.05 ... 0.03 0 0.00 33.54 5376 0.05 \n", + "1 0.05 0.05 ... 0.03 0 0.00 20.43 9792 0.04 \n", + "2 0.04 0.05 ... 0.03 1 1.00 11.29 16960 0.04 \n", + "3 0.05 0.05 ... 0.03 1 0.00 27.13 9312 0.05 \n", + "4 0.05 0.05 ... 0.03 0 0.00 33.30 6240 0.05 \n", + "\n", + " avg_price price_ratio move_lag1 move_lag2 \n", + "0 0.04 1.27 12416.00 28096.00 \n", + "1 0.04 1.11 5376.00 12416.00 \n", + "2 0.04 0.94 9792.00 5376.00 \n", + "3 0.04 1.21 11424.00 4992.00 \n", + "4 0.04 1.39 9312.00 11424.00 \n", + "\n", + "[5 rows x 27 columns]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Split data into training and test sets\n", + "train_df, test_df = split_last_n_by_grain(df_sub, NUM_TEST_PERIODS)\n", + "train_df.reset_index(drop=True)\n", + "test_df.reset_index(drop=True)\n", + "\n", + "# Train multiple linear regression models\n", + "fea_column_names = [\"move_lag1\", \"move_lag2\", \"price\", \"price_ratio\"]\n", + "lr_models = fit(train_df, grain_column_names, fea_column_names, target_column_name)\n", + "\n", + "# Generate forecasts with the trained models\n", + "pred_all = predict(test_df, lr_models, time_column_name, grain_column_names, fea_column_names)\n", + "\n", + "pred_lr = pd.merge(pred_all, test_df, on=index_column_names)\n", + "pred_lr.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's check the accuracy of the predictions on the entire forecast period as well as in the last two weeks of the forecast period.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of forecasts obtained by multiple linear regression on entire test period: 83.90865445283927\n" + ] + } + ], + "source": [ + "mape_lr_entire = MAPE(pred_lr[\"prediction\"], pred_lr[\"move\"]) * 100\n", + "print(\"MAPE of forecasts obtained by multiple linear regression on entire test period: \" + str(mape_lr_entire))" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of forecasts obtained by multiple linear regression in the last two weeks: 72.11741385279376\n" + ] + } + ], + "source": [ + "pred_lr_sub = pred_lr.loc[pred_lr.week >= max(test_df.week) - NUM_TEST_PERIODS + GAP]\n", + "mape_lr_sub = MAPE(pred_lr_sub[\"prediction\"], pred_lr_sub[\"move\"]) * 100\n", + "print(\"MAPE of forecasts obtained by multiple linear regression in the last two weeks: \" + str(mape_lr_sub))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Combine forecasts from different methods\n", + "\n", + "We can combine the forecasts obtained by AutoML and multiple linear regression using weighted average and evaluate the final forecasts. Usually the combined forecasts will be more robust as a combination of two methods can reduce the chance of model overfitting. Here we use equal weights which can be further adjusted according to our confidence on each model." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "pred_final = pd.merge(\n", + " pred_automl[index_column_names + [\"predicted\", \"move\", \"week\"]],\n", + " pred_lr[index_column_names + [\"prediction\"]],\n", + " on=index_column_names,\n", + " how=\"left\",\n", + ")\n", + "pred_final[\"combined_prediction\"] = pred_final[\"predicted\"] * 0.5 + pred_final[\"prediction\"] * 0.5" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of forecasts obtained by the combined model on entire test period: 87.2964359857758\n" + ] + } + ], + "source": [ + "mape_entire = MAPE(pred_final[\"combined_prediction\"], pred_final[\"move\"]) * 100\n", + "print(\"MAPE of forecasts obtained by the combined model on entire test period: \" + str(mape_entire))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of forecasts obtained by the combined model in the last two weeks: 84.39534839261313\n" + ] + } + ], + "source": [ + "pred_final_sub = pred_final.loc[pred_final.week >= max(test_df.week) - NUM_TEST_PERIODS + GAP]\n", + "mape_final_sub = MAPE(pred_final_sub[\"combined_prediction\"], pred_final_sub[\"move\"]) * 100\n", + "print(\"MAPE of forecasts obtained by the combined model in the last two weeks: \" + str(mape_final_sub))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Reading\n", + "\n", + "\\[1\\] Nicolo Fusi, Rishit Sheth, and Melih Elibol. 2018. Probabilistic Matrix Factorization for Automated Machine Learning. In Advances in Neural Information Processing Systems. 3348-3357.
\n", + "\\[2\\] Azure AutoML Package Docs: https://docs.microsoft.com/en-us/python/api/azureml-train-automl/azureml.train.automl?view=azure-ml-py
\n", + "\\[3\\] Azure Automated Machine Learning Examples: https://github.com/Azure/MachineLearningNotebooks/tree/master/how-to-use-azureml/automated-machine-learning
\n", + "\n", + "\n" + ] + } + ], + "metadata": { + "author_info": { + "affiliation": "Microsoft", + "created_by": "Chenhui Hu" + }, + "kernelspec": { + "display_name": "forecasting_env", + "language": "python", + "name": "forecasting_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/grocery_sales/python/00_quick_start/lightgbm_single_round.ipynb b/examples/grocery_sales/python/00_quick_start/lightgbm_single_round.ipynb new file mode 100644 index 00000000..3b9683d5 --- /dev/null +++ b/examples/grocery_sales/python/00_quick_start/lightgbm_single_round.ipynb @@ -0,0 +1,618 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# LightGBM: A Highly Efficient Gradient Boosting Decision Tree\n", + "This notebook gives an example of how to train a LightGBM model to generate point forecasts for product sales in retail. We will train a LightGBM model based on the Orange Juice dataset.\n", + "\n", + "[LightGBM](https://github.com/Microsoft/LightGBM) is a gradient boosting framework that uses tree-based learning algorithms. [Gradient boosting](https://en.wikipedia.org/wiki/Gradient_boosting) is an ensemble technique in which models are added to the ensemble sequentially and at each iteration a new model is trained with respect to the error of the whole ensemble learned so far. More detailed information about gradient boosting can be found in this [tutorial paper](https://www.frontiersin.org/articles/10.3389/fnbot.2013.00021/full). Using this technique, LightGBM achieves great accuracy in many applications. Apart from this, it is designed to be distributed and efficient with the following advantages:\n", + "* Fast training speed and high efficiency.\n", + "* Low memory usage.\n", + "* Support of parallel and GPU learning.\n", + "* Capable of handling large-scale data.\n", + "\n", + "Due to these advantages, LightGBM has been widely used in a lot of [winning solutions](https://github.com/microsoft/LightGBM/blob/master/examples/README.md#machine-learning-challenge-winning-solutions) of machine learning competitions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Settings and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "System version: 3.6.10 |Anaconda, Inc.| (default, Jan 7 2020, 21:14:29) \n", + "[GCC 7.3.0]\n", + "LightGBM version: 2.3.0\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "import math\n", + "import datetime\n", + "import warnings\n", + "import numpy as np\n", + "import pandas as pd\n", + "import lightgbm as lgb\n", + "import scrapbook as sb\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from fclib.common.utils import git_repo_path\n", + "from fclib.models.lightgbm import predict\n", + "from fclib.evaluation.evaluation_utils import MAPE\n", + "from fclib.common.plot import plot_predictions_with_history\n", + "from fclib.dataset.ojdata import download_ojdata, split_train_test\n", + "from fclib.dataset.ojdata import FIRST_WEEK_START\n", + "from fclib.feature_engineering.feature_utils import (\n", + " week_of_month,\n", + " df_from_cartesian_product,\n", + " combine_features,\n", + ")\n", + "\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "print(\"System version: {}\".format(sys.version))\n", + "print(\"LightGBM version: {}\".format(lgb.__version__))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parameter Settings\n", + "\n", + "In what follows, we define parameters related to the model and feature engineering. LightGBM supports both classification models and regression models. In our case, we set the objective function to `mape` which stands for mean absolute percentage error (MAPE) since we will build a regression model to predict product sales and evaluate the accuracy of the model using MAPE.\n", + "\n", + "Generally, we can adjust the number of leaves (`num_leaves`), the minimum number of data in each leaf (`min_data_in_leaf`), the maximum number of boosting rounds (`num_rounds`), the learning rate of trees (`learning_rate`) and `early_stopping_rounds` (to avoid overfitting) in the model to get better performance. Besides, we can also adjust other supported parameters to optimize the results. [In this link](https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.rst), a list of all the parameters is given. In addition, advice on how to tune these parameters can be found [in this URL](https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters-Tuning.rst).\n", + "\n", + "We will use historical weekly sales, date-time information, and product information as input features to train the model. Prior sales are used as lag features and `lags` contains the lags where each number indicates the number of time steps (i.e., weeks) that we shift the data backwards to get the historical sales. We also use the average sales within a certain time window in the past as a moving average feature. `window_size` controls the size of the moving window. Apart from these parameters, we use `use_columns` and `categ_fea` to denote all other features that we leverage in the model and the categorical features, respectively.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Use False if you've already downloaded and split the data\n", + "DOWNLOAD_SPLIT_DATA = True\n", + "\n", + "# Data directory\n", + "DATA_DIR = os.path.join(git_repo_path(), \"ojdata\")\n", + "\n", + "# Forecasting settings\n", + "N_SPLITS = 1\n", + "HORIZON = 2\n", + "GAP = 2\n", + "FIRST_WEEK = 40\n", + "LAST_WEEK = 138\n", + "\n", + "# Parameters of LightGBM model\n", + "params = {\n", + " \"objective\": \"mape\",\n", + " \"num_leaves\": 124,\n", + " \"min_data_in_leaf\": 340,\n", + " \"learning_rate\": 0.1,\n", + " \"feature_fraction\": 0.65,\n", + " \"bagging_fraction\": 0.87,\n", + " \"bagging_freq\": 19,\n", + " \"num_rounds\": 940,\n", + " \"early_stopping_rounds\": 125,\n", + " \"num_threads\": 16,\n", + " \"seed\": 1,\n", + "}\n", + "\n", + "# Lags, window size, and feature column names\n", + "lags = np.arange(2, 20)\n", + "window_size = 40\n", + "used_columns = [\"store\", \"brand\", \"week\", \"week_of_month\", \"month\", \"deal\", \"feat\", \"move\", \"price\", \"price_ratio\"]\n", + "categ_fea = [\"store\", \"brand\", \"deal\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preparation\n", + "\n", + "We need to download the Orange Juice data and split it into training and test sets. By default, the following cell will download and spit the data. If you've already done so, you may skip this part by switching `DOWNLOAD_SPLIT_DATA` to `False`.\n", + "\n", + "We store the training data and test data using dataframes. The training data includes `train_df` and `aux_df` with `train_df` containing the historical sales up to week 135 (the time we make forecasts) and `aux_df` containing price/promotion information up until week 138. Here we assume that future price and promotion information up to a certain number of weeks ahead is predetermined and known. The test data is stored in `test_df` which contains the sales of each product in week 137 and 138. Assuming the current week is week 135, our goal is to forecast the sales in week 137 and 138 using the training data. There is a one-week gap between the current week and the first target week of forecasting as we want to leave time for planning inventory in practice.\n", + "\n", + "The setting of the forecast problem are defined in `fclib.dataset.ojdata.split_train_test` function. We can change this setting (e.g., modify the horizon of the forecast or the range of the historical data) by passing different parameters to this functions. Below, we split the data into `n_splits=1` splits, using the forecasting settings listed above in the **Parameter Settings** section." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data already exists at the specified location.\n" + ] + } + ], + "source": [ + "if DOWNLOAD_SPLIT_DATA:\n", + " download_ojdata(DATA_DIR)\n", + " train_df_list, test_df_list, aux_df_list = split_train_test(\n", + " DATA_DIR,\n", + " n_splits=N_SPLITS,\n", + " horizon=HORIZON,\n", + " gap=GAP,\n", + " first_week=FIRST_WEEK,\n", + " last_week=LAST_WEEK,\n", + " write_csv=True,\n", + " )\n", + "\n", + " # Split returns a list, extract the dataframes from the list\n", + " train_df = train_df_list[0].reset_index()\n", + " test_df = test_df_list[0].reset_index()\n", + " aux_df = aux_df_list[0].reset_index()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Feature Engineering\n", + "\n", + "Next we extract a number of features from the data for training the forecasting model including\n", + "* datetime features including week, week of the month, and month\n", + "* historical weekly sales of each orange juice in recent weeks\n", + "* average sales of each orange juice during recent weeks\n", + "* other features including `store`, `brand`, `deal`, `feat` columns and price features\n", + "\n", + "Note that the logarithm of the unit sales is stored in a column named `logmove` both for `train_df` and `test_df`. We compute the unit sales `move` based on this quantity." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " store brand week logmove constant price1 price2 price3 \\\n", + "0 2 1 40 9.018695 1 0.060469 0.060497 0.042031 \n", + "1 2 1 46 8.723231 1 0.060469 0.060312 0.045156 \n", + "2 2 1 47 8.253228 1 0.060469 0.060312 0.045156 \n", + "\n", + " price4 price5 price6 price7 price8 price9 price10 \\\n", + "0 0.029531 0.049531 0.053021 0.038906 0.041406 0.028906 0.024844 \n", + "1 0.046719 0.049531 0.047813 0.045781 0.027969 0.042969 0.042031 \n", + "2 0.046719 0.037344 0.053021 0.045781 0.041406 0.048125 0.032656 \n", + "\n", + " price11 deal feat profit move \n", + "0 0.038984 1 0.0 37.992326 8256 \n", + "1 0.038984 0 0.0 30.126667 6144 \n", + "2 0.038984 0 0.0 30.000000 3840 \n", + "\n", + "Number of missing rows is 6204\n", + "\n", + "Maximum training week number is 135\n", + "\n", + " store brand week week_of_month month deal feat move price \\\n", + "19 2 1 59 4 10 1.0 0.0 8384.0 0.055625 \n", + "20 2 1 60 1 11 0.0 0.0 5952.0 0.055625 \n", + "21 2 1 61 2 11 1.0 0.0 6848.0 0.055625 \n", + "22 2 1 62 3 11 0.0 0.0 9216.0 0.060469 \n", + "23 2 1 63 4 11 1.0 0.0 12160.0 0.046719 \n", + "\n", + " price_ratio ... move_lag11 move_lag12 move_lag13 move_lag14 \\\n", + "19 1.279808 ... 8000.0 3840.0 6144.0 8256.0 \n", + "20 1.304536 ... 8000.0 8000.0 3840.0 6144.0 \n", + "21 1.257614 ... 8896.0 8000.0 8000.0 3840.0 \n", + "22 1.369765 ... 7168.0 8896.0 8000.0 8000.0 \n", + "23 1.130823 ... 10880.0 7168.0 8896.0 8000.0 \n", + "\n", + " move_lag15 move_lag16 move_lag17 move_lag18 move_lag19 move_mean \n", + "19 8256.0 8256.0 8256.0 8256.0 8256.0 7847.111111 \n", + "20 8256.0 8256.0 8256.0 8256.0 8256.0 7744.000000 \n", + "21 6144.0 8256.0 8256.0 8256.0 8256.0 7776.000000 \n", + "22 3840.0 6144.0 8256.0 8256.0 8256.0 7689.142857 \n", + "23 8000.0 3840.0 6144.0 8256.0 8256.0 7650.909091 \n", + "\n", + "[5 rows x 29 columns]\n" + ] + } + ], + "source": [ + "# Load training data\n", + "train_df[\"move\"] = train_df[\"logmove\"].apply(lambda x: round(math.exp(x)))\n", + "print(train_df.head(3))\n", + "print(\"\")\n", + "train_df = train_df[[\"store\", \"brand\", \"week\", \"move\"]]\n", + "\n", + "# Create a dataframe to hold all necessary data\n", + "store_list = train_df[\"store\"].unique()\n", + "brand_list = train_df[\"brand\"].unique()\n", + "week_list = range(FIRST_WEEK, LAST_WEEK + 1)\n", + "d = {\"store\": store_list, \"brand\": brand_list, \"week\": week_list}\n", + "data_grid = df_from_cartesian_product(d)\n", + "data_filled = pd.merge(data_grid, train_df, how=\"left\", on=[\"store\", \"brand\", \"week\"])\n", + "\n", + "# Get future price, deal, and advertisement info\n", + "data_filled = pd.merge(data_filled, aux_df, how=\"left\", on=[\"store\", \"brand\", \"week\"])\n", + "\n", + "# Create relative price feature\n", + "price_cols = [\n", + " \"price1\",\n", + " \"price2\",\n", + " \"price3\",\n", + " \"price4\",\n", + " \"price5\",\n", + " \"price6\",\n", + " \"price7\",\n", + " \"price8\",\n", + " \"price9\",\n", + " \"price10\",\n", + " \"price11\",\n", + "]\n", + "data_filled[\"price\"] = data_filled.apply(lambda x: x.loc[\"price\" + str(int(x.loc[\"brand\"]))], axis=1)\n", + "data_filled[\"avg_price\"] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols))\n", + "data_filled[\"price_ratio\"] = data_filled[\"price\"] / data_filled[\"avg_price\"]\n", + "data_filled.drop(price_cols, axis=1, inplace=True)\n", + "\n", + "# Fill missing values\n", + "print(\"Number of missing rows is {}\".format(data_filled[data_filled.isnull().any(axis=1)].shape[0]))\n", + "print(\"\")\n", + "data_filled = data_filled.groupby([\"store\", \"brand\"]).apply(lambda x: x.fillna(method=\"ffill\").fillna(method=\"bfill\"))\n", + "\n", + "# Create datetime features\n", + "data_filled[\"week_start\"] = data_filled[\"week\"].apply(lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7))\n", + "data_filled[\"year\"] = data_filled[\"week_start\"].apply(lambda x: x.year)\n", + "data_filled[\"month\"] = data_filled[\"week_start\"].apply(lambda x: x.month)\n", + "data_filled[\"week_of_month\"] = data_filled[\"week_start\"].apply(lambda x: week_of_month(x))\n", + "data_filled[\"day\"] = data_filled[\"week_start\"].apply(lambda x: x.day)\n", + "data_filled.drop(\"week_start\", axis=1, inplace=True)\n", + "\n", + "# Create other features (lagged features, moving averages, etc.)\n", + "features = data_filled.groupby([\"store\", \"brand\"]).apply(\n", + " lambda x: combine_features(x, [\"move\"], lags, window_size, used_columns)\n", + ")\n", + "train_fea = features[features.week <= max(train_df.week)].reset_index(drop=True)\n", + "print(\"Maximum training week number is {}\".format(max(train_fea[\"week\"])))\n", + "print(\"\")\n", + "\n", + "# Drop rows with NaN values\n", + "train_fea.dropna(inplace=True)\n", + "print(train_fea.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Training\n", + "\n", + "We then train a LightGBM model to predict the sales. After the model is trained, we apply it to generate forecasts for the target weeks." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training LightGBM model...\n", + "Training until validation scores don't improve for 125 rounds\n", + "[50]\ttraining's mape: 0.311722\n", + "[100]\ttraining's mape: 0.285767\n", + "[150]\ttraining's mape: 0.274155\n", + "[200]\ttraining's mape: 0.265833\n", + "[250]\ttraining's mape: 0.260146\n", + "[300]\ttraining's mape: 0.255795\n", + "[350]\ttraining's mape: 0.252398\n", + "[400]\ttraining's mape: 0.24973\n", + "[450]\ttraining's mape: 0.247442\n", + "[500]\ttraining's mape: 0.245553\n", + "[550]\ttraining's mape: 0.243832\n", + "[600]\ttraining's mape: 0.242123\n", + "[650]\ttraining's mape: 0.240704\n", + "[700]\ttraining's mape: 0.239503\n", + "[750]\ttraining's mape: 0.238308\n", + "[800]\ttraining's mape: 0.237258\n", + "[850]\ttraining's mape: 0.236335\n", + "[900]\ttraining's mape: 0.235512\n", + "Did not meet early stopping. Best iteration is:\n", + "[940]\ttraining's mape: 0.234885\n", + "\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 137 9151\n", + "1 2 1 138 24055\n", + "2 2 2 137 4879\n", + "3 2 2 138 12035\n", + "4 2 3 137 2156\n", + "5 2 3 138 2414\n", + "6 2 4 137 3531\n", + "7 2 4 138 9902\n", + "8 2 5 137 16393\n", + "9 2 5 138 6252\n", + "10 2 6 137 2911\n", + "11 2 6 138 1499\n", + "12 2 7 137 2902\n", + "13 2 7 138 2266\n", + "14 2 8 137 1217\n", + "15 2 8 138 1317\n", + "16 2 9 137 684\n", + "17 2 9 138 846\n", + "18 2 10 137 11737\n", + "19 2 10 138 4769\n", + "20 2 11 137 4041\n", + "21 2 11 138 4094\n", + "22 5 1 137 8838\n", + "23 5 1 138 24861\n", + "24 5 2 137 6825\n", + "25 5 2 138 12805\n", + "26 5 3 137 2810\n", + "27 5 3 138 2870\n", + "28 5 4 137 3099\n", + "29 5 4 138 6092\n", + "... ... ... ... ...\n", + "1796 134 8 137 614\n", + "1797 134 8 138 531\n", + "1798 134 9 137 1023\n", + "1799 134 9 138 1031\n", + "1800 134 10 137 7678\n", + "1801 134 10 138 3857\n", + "1802 134 11 137 9551\n", + "1803 134 11 138 9781\n", + "1804 137 1 137 15409\n", + "1805 137 1 138 27916\n", + "1806 137 2 137 13290\n", + "1807 137 2 138 19984\n", + "1808 137 3 137 2825\n", + "1809 137 3 138 2975\n", + "1810 137 4 137 3550\n", + "1811 137 4 138 6959\n", + "1812 137 5 137 24446\n", + "1813 137 5 138 11950\n", + "1814 137 6 137 6522\n", + "1815 137 6 138 3812\n", + "1816 137 7 137 4839\n", + "1817 137 7 138 3211\n", + "1818 137 8 137 1363\n", + "1819 137 8 138 1540\n", + "1820 137 9 137 443\n", + "1821 137 9 138 459\n", + "1822 137 10 137 14673\n", + "1823 137 10 138 7523\n", + "1824 137 11 137 6825\n", + "1825 137 11 138 6676\n", + "\n", + "[1826 rows x 4 columns]\n" + ] + } + ], + "source": [ + "# Create training set\n", + "dtrain = lgb.Dataset(train_fea.drop(\"move\", axis=1, inplace=False), label=train_fea[\"move\"])\n", + "\n", + "# Train GBM model\n", + "print(\"Training LightGBM model...\")\n", + "bst = lgb.train(params, dtrain, valid_sets=[dtrain], categorical_feature=categ_fea, verbose_eval=50)\n", + "print(\"\")\n", + "\n", + "# Generate forecasts\n", + "test_fea = features[(features.week >= min(test_df.week)) & (features.week <= max(test_df.week))].reset_index(drop=True)\n", + "idx_cols = [\"store\", \"brand\", \"week\"]\n", + "pred = predict(test_fea, bst, target_col=\"move\", idx_cols=idx_cols).sort_values(by=idx_cols).reset_index(drop=True)\n", + "print(\"Prediction results:\")\n", + "print(pred)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Evaluation\n", + "\n", + "To evaluate the model performance, we compute MAPE of the forecasts below." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/scrapbook.scrap.json+json": { + "data": 35.58242942761259, + "encoder": "json", + "name": "MAPE", + "version": 1 + } + }, + "metadata": { + "scrapbook": { + "data": true, + "display": false, + "name": "MAPE" + } + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of the forecasts is 35.58242942761259\n" + ] + } + ], + "source": [ + "# Evaluate prediction accuracy\n", + "test_df[\"actual\"] = test_df[\"logmove\"].apply(lambda x: round(math.exp(x)))\n", + "test_df.drop(\"logmove\", axis=1, inplace=True)\n", + "combined = pd.merge(pred, test_df, on=[\"store\", \"brand\", \"week\"], how=\"left\")\n", + "metric_value = MAPE(combined[\"move\"], combined[\"actual\"]) * 100\n", + "sb.glue(\"MAPE\", metric_value)\n", + "print(\"MAPE of the forecasts is {}\".format(metric_value))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Result Visualization\n", + "\n", + "In the next, we plot out the feature importance learned by the model and the forecast results of a few sample store-brand combinations. Note that there could be gaps in the curve of actual sales due to missing sales data." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Plot feature importances\n", + "ax = lgb.plot_importance(bst, max_num_features=20)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Plot sample forecast results\n", + "num_samples = 6\n", + "min_week = 120\n", + "sales = pd.read_csv(os.path.join(DATA_DIR, \"yx.csv\"))\n", + "sales[\"move\"] = sales[\"logmove\"].apply(lambda x: round(math.exp(x)) if x > 0 else 0)\n", + "\n", + "plot_predictions_with_history(\n", + " combined,\n", + " sales,\n", + " grain1_unique_vals=store_list,\n", + " grain2_unique_vals=brand_list,\n", + " time_col_name=\"week\",\n", + " target_col_name=\"move\",\n", + " grain1_name=\"store\",\n", + " grain2_name=\"brand\",\n", + " min_timestep=min_week,\n", + " num_samples=num_samples,\n", + " predict_at_timestep=max(train_df.week),\n", + " line_at_predict_time=True,\n", + " title=\"Prediction results for a few sample time series (predictions are made at week 135)\",\n", + " x_label=\"week\",\n", + " y_label=\"unit sales\",\n", + " random_seed=2,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Reading\n", + "\n", + "\\[1\\] Guolin Ke, Qi Meng, Thomas Finley, Taifeng Wang, Wei Chen, Weidong Ma, Qiwei Ye, and Tie-Yan Liu. 2017. LightGBM: A highly efficient gradient boosting decision tree. In Advances in Neural Information Processing Systems. 3146–3154.
\n", + "\\[2\\] Alexey Natekin and Alois Knoll. 2013. Gradient boosting machines, a tutorial. Frontiers in neurorobotics, 7 (21).
\n", + "\\[3\\] The parameters of LightGBM: https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.rst
\n", + "\\[4\\] Anna Veronika Dorogush, Vasily Ershov, and Andrey Gulin. 2018. CatBoost: gradient boosting with categorical features support. arXiv preprint arXiv:1810.11363 (2018).
\n", + "\n" + ] + } + ], + "metadata": { + "author_info": { + "affiliation": "Microsoft", + "created_by": "Chenhui Hu" + }, + "kernelspec": { + "display_name": "forecasting_env", + "language": "python", + "name": "forecasting_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/grocery_sales/python/01_prepare_data/ojdata_exploration.ipynb b/examples/grocery_sales/python/01_prepare_data/ojdata_exploration.ipynb new file mode 100644 index 00000000..5daedf4f --- /dev/null +++ b/examples/grocery_sales/python/01_prepare_data/ojdata_exploration.ipynb @@ -0,0 +1,1254 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Orange Juice Data Exploration in Python\n", + "\n", + "In this notebook, we use Python to explore the Orange Juice (OJ) dataset. The OJ dataset is from R package [bayesm](https://cran.r-project.org/web/packages/bayesm/index.html) and is part of the [Dominick's dataset](https://www.chicagobooth.edu/research/kilts/datasets/dominicks).\n", + "\n", + "## Dataset description\n", + "\n", + "This dataset contains the following two tables:\n", + "\n", + "- **yx.cs.** - Weekly sales of refrigerated orange juice at 83 stores. This table has 106139 rows and 19 columns. It includes weekly sales and prices of 11 orange juice\n", + "brands as well as information about profit, deal, and advertisement for each brand. Note that the weekly sales is captured by a column named `logmove` which\n", + "corresponds to the natural logarithm of the number of units sold. To get the number of units sold, you need to apply an exponential transform to this column.\n", + "\n", + "- **storedemo.csv** - Demographic information on those stores. This table has 83 rows and 13 columns. For every store, the table describes demographic information of its consumers,\n", + "distance to the nearest warehouse store, average distance to the nearest 5 supermarkets, ratio of its sales to the nearest warehouse store, and ratio of its sales\n", + "to the average of the nearest 5 stores.\n", + "\n", + "Note that the week number starts from 40 in this dataset, while the full Dominick's dataset has week number from 1 to 400. According to [Dominick's Data Manual](https://www.chicagobooth.edu/-/media/enterprise/centers/kilts/datasets/dominicks-dataset/dominicks-manual-and-codebook_kiltscenter.aspx), week 1 starts on 09/14/1989.\n", + "Please see pages 40 and 41 of the [bayesm reference manual](https://cran.r-project.org/web/packages/bayesm/bayesm.pdf) and the [Dominick's Data Manual](https://www.chicagobooth.edu/-/media/enterprise/centers/kilts/datasets/dominicks-dataset/dominicks-manual-and-codebook_kiltscenter.aspx) for more details about the data.\n", + "\n", + "\n", + "## Global setting and imports\n", + "To run this notebook, please ensure to run through the `SETUP.md` guide in the top-level directory, which will create and activate `forecasting_env` conda environment, as well as, register that environment as a Jupyter kernel.\n", + "\n", + "You can then launch the Jupyter notebook by running `jupyter notebook` and select the kernel named `forecasting_env` in the list of kernels under Kernel tab." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# import packages\n", + "import os\n", + "import math\n", + "import pandas as pd\n", + "import numpy as np\n", + "import itertools\n", + "import matplotlib.pyplot as plt\n", + "import statsmodels.api as sm\n", + "\n", + "from fclib.common.utils import git_repo_path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dataset\n", + "\n", + "Let's read in the OJ dataset and look at what it contains." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [ + "# Data directory\n", + "DATA_DIR = os.path.join(git_repo_path(), \"ojdata\")\n", + "\n", + "sales_file = os.path.join(DATA_DIR, \"yx.csv\")\n", + "store_file = os.path.join(DATA_DIR, \"storedemo.csv\")\n", + "\n", + "sales = pd.read_csv(sales_file, index_col=False)\n", + "storedemo = pd.read_csv(store_file, index_col=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweeklogmoveconstantprice1price2price3price4price5price6price7price8price9price10price11dealfeatprofit
021409.01869510.0604690.0604970.0420310.0295310.0495310.0530210.0389060.0414060.0289060.0248440.03898410.037.992326
121468.72323110.0604690.0603120.0451560.0467190.0495310.0478130.0457810.0279690.0429690.0420310.03898400.030.126667
221478.25322810.0604690.0603120.0451560.0467190.0373440.0530210.0457810.0414060.0481250.0326560.03898400.030.000000
321488.98719710.0604690.0603120.0498440.0373440.0495310.0530210.0457810.0414060.0423440.0326560.03898400.029.950000
421509.09335710.0604690.0603120.0435940.0310940.0495310.0530210.0466480.0414060.0423440.0326560.03820300.029.920000
\n", + "
" + ], + "text/plain": [ + " store brand week logmove constant price1 price2 price3 \\\n", + "0 2 1 40 9.018695 1 0.060469 0.060497 0.042031 \n", + "1 2 1 46 8.723231 1 0.060469 0.060312 0.045156 \n", + "2 2 1 47 8.253228 1 0.060469 0.060312 0.045156 \n", + "3 2 1 48 8.987197 1 0.060469 0.060312 0.049844 \n", + "4 2 1 50 9.093357 1 0.060469 0.060312 0.043594 \n", + "\n", + " price4 price5 price6 price7 price8 price9 price10 \\\n", + "0 0.029531 0.049531 0.053021 0.038906 0.041406 0.028906 0.024844 \n", + "1 0.046719 0.049531 0.047813 0.045781 0.027969 0.042969 0.042031 \n", + "2 0.046719 0.037344 0.053021 0.045781 0.041406 0.048125 0.032656 \n", + "3 0.037344 0.049531 0.053021 0.045781 0.041406 0.042344 0.032656 \n", + "4 0.031094 0.049531 0.053021 0.046648 0.041406 0.042344 0.032656 \n", + "\n", + " price11 deal feat profit \n", + "0 0.038984 1 0.0 37.992326 \n", + "1 0.038984 0 0.0 30.126667 \n", + "2 0.038984 0 0.0 30.000000 \n", + "3 0.038984 0 0.0 29.950000 \n", + "4 0.038203 0 0.0 29.920000 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# First few rows of sales data\n", + "sales.head(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
STOREAGE60EDUCETHNICINCOMEHHLARGEWORKWOMHVAL150SSTRDISTSSTRVOLCPDIST5CPWVOL5
020.2328650.2489350.11428010.5532050.1039530.3035850.4638872.1101221.1428571.9272800.376927
150.1173680.3212260.05387510.9223710.1030920.4105680.5358833.8019980.6818181.6005730.736307
280.2523940.0951730.03524310.5970100.1317500.2830750.0542272.6363331.5000002.9053840.641016
390.2691190.2221720.03261910.7871520.0968300.3589950.5057471.1032790.6666671.8204740.441268
4120.1783410.2534130.3806989.9966590.0572120.3909420.3866289.1987341.1111110.8393030.105999
\n", + "
" + ], + "text/plain": [ + " STORE AGE60 EDUC ETHNIC INCOME HHLARGE WORKWOM \\\n", + "0 2 0.232865 0.248935 0.114280 10.553205 0.103953 0.303585 \n", + "1 5 0.117368 0.321226 0.053875 10.922371 0.103092 0.410568 \n", + "2 8 0.252394 0.095173 0.035243 10.597010 0.131750 0.283075 \n", + "3 9 0.269119 0.222172 0.032619 10.787152 0.096830 0.358995 \n", + "4 12 0.178341 0.253413 0.380698 9.996659 0.057212 0.390942 \n", + "\n", + " HVAL150 SSTRDIST SSTRVOL CPDIST5 CPWVOL5 \n", + "0 0.463887 2.110122 1.142857 1.927280 0.376927 \n", + "1 0.535883 3.801998 0.681818 1.600573 0.736307 \n", + "2 0.054227 2.636333 1.500000 2.905384 0.641016 \n", + "3 0.505747 1.103279 0.666667 1.820474 0.441268 \n", + "4 0.386628 9.198734 1.111111 0.839303 0.105999 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# First few rows of store demographic data\n", + "storedemo.head(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of stores is 83.\n", + "Number of brands is 11.\n", + "Number of time series is 913.\n", + "\n", + "Lenth distribution of the time series:\n", + "count 913.000000\n", + "mean 116.253012\n", + "std 4.730982\n", + "min 87.000000\n", + "25% 115.000000\n", + "50% 117.000000\n", + "75% 119.000000\n", + "max 121.000000\n", + "dtype: float64\n" + ] + } + ], + "source": [ + "# Check number of time series and lengths\n", + "print(\"Number of stores is {}.\".format(len(sales.groupby([\"store\"]).groups.keys())))\n", + "print(\"Number of brands is {}.\".format(len(sales.groupby([\"brand\"]).groups.keys())))\n", + "print(\"Number of time series is {}.\".format(len(sales.groupby([\"store\", \"brand\"]).groups.keys())))\n", + "print(\"\\nLenth distribution of the time series:\")\n", + "print(sales.groupby([\"store\", \"brand\"]).size().describe())" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total number of rows before filling gaps is 106139.\n", + "Total number of rows after filling gaps is 110473.\n" + ] + } + ], + "source": [ + "# Fill missing gaps\n", + "store_list = sales[\"store\"].unique()\n", + "brand_list = sales[\"brand\"].unique()\n", + "week_list = range(sales[\"week\"].min(), sales[\"week\"].max() + 1)\n", + "item_list = list(itertools.product(store_list, brand_list, week_list))\n", + "item_df = pd.DataFrame.from_records(item_list, columns=[\"store\", \"brand\", \"week\"])\n", + "\n", + "print(f\"Total number of rows before filling gaps is {len(sales)}.\")\n", + "sales = item_df.merge(sales, how=\"left\", on=[\"store\", \"brand\", \"week\"])\n", + "print(f\"Total number of rows after filling gaps is {len(sales)}.\")\n", + "\n", + "# Fill the missing `logmove` with zeros\n", + "sales[\"logmove\"] = sales[\"logmove\"].fillna(value=0)\n", + "\n", + "# Merge sales and store demographics\n", + "sales = sales.merge(storedemo, how=\"left\", left_on=\"store\", right_on=\"STORE\")\n", + "\n", + "# Compute unit sales for later analysis\n", + "sales[\"move\"] = sales[\"logmove\"].apply(lambda x: round(math.exp(x)) if x > 0 else 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualize sample time series\n", + "\n", + "We look at some examples of weekly sales time series for sample store and brand." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Plot sample time series of sales\n", + "sample_store = 2\n", + "sample_brand = 1\n", + "sales_sub = sales.loc[(sales[\"store\"] == sample_store) & (sales[\"brand\"] == sample_brand)]\n", + "plt.plot(sales_sub[\"week\"], sales_sub[\"move\"])\n", + "plt.plot(\n", + " sales_sub[\"week\"].loc[sales_sub[\"move\"] > 0],\n", + " sales_sub[\"move\"].loc[sales_sub[\"move\"] > 0],\n", + " linestyle=\"\",\n", + " marker=\"o\",\n", + " color=\"red\",\n", + ")\n", + "plt.gcf().autofmt_xdate()\n", + "plt.xlabel(\"week\")\n", + "plt.ylabel(\"move\")\n", + "plt.title(f\"Weekly sales of store {sample_store} brand {sample_brand} \\n missing values are filled with zero\")\n", + "plt.grid(True)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Weekly sales of all brands in store 2.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Plot sales of all brands in a sample store\n", + "sample_store = 2\n", + "brand_list = sales.loc[(sales[\"store\"] == sample_store), \"brand\"].unique()\n", + "fig, axes = plt.subplots(nrows=3, ncols=4, figsize=(15, 15))\n", + "print(\"Weekly sales of all brands in store {}.\".format(sample_store))\n", + "\n", + "brand_num = 0\n", + "for row in axes:\n", + " for col in row:\n", + " if brand_num < len(brand_list):\n", + " brand = brand_list[brand_num]\n", + " sales_sub = sales.loc[(sales[\"store\"] == sample_store) & (sales[\"brand\"] == brand)]\n", + " col.plot(sales_sub[\"week\"], sales_sub[\"move\"])\n", + " col.set_ylim(0, 150000)\n", + " col.set_title(\"brand {}\".format(brand))\n", + " col.set_xlabel(\"week\")\n", + " col.set_ylabel(\"move\")\n", + " brand_num += 1\n", + " else:\n", + " col.axis(\"off\")\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Impact of demographics, brand, and store\n", + "\n", + "In this section, we plot the boxplot of the sales across different stores, brands and different values of the demographics variables. There are variations of the sales observed across these variables. We also observed through our modeling experience that once we included the store and brand variables, the contribution of the demographic variables seems to be limited. However, submitters are encouraged to make the decision of whether to include these variables or not according their own judgement." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Correlation between unit sales and each demographic feature:\n", + "AGE60 0.047409\n", + "EDUC -0.026599\n", + "ETHNIC 0.074581\n", + "INCOME -0.050484\n", + "HHLARGE 0.000940\n", + "WORKWOM -0.063461\n", + "HVAL150 -0.026362\n", + "SSTRDIST 0.032859\n", + "SSTRVOL -0.027255\n", + "CPDIST5 0.006355\n", + "CPWVOL5 -0.078144\n", + "dtype: float64\n", + "\n", + "Correlation between log-scale sales and each demographic feature:\n", + "AGE60 0.034674\n", + "EDUC -0.012200\n", + "ETHNIC 0.044293\n", + "INCOME -0.023183\n", + "HHLARGE -0.026629\n", + "WORKWOM -0.023059\n", + "HVAL150 -0.002460\n", + "SSTRDIST -0.006033\n", + "SSTRVOL -0.071799\n", + "CPDIST5 0.026050\n", + "CPWVOL5 -0.059456\n", + "dtype: float64\n" + ] + } + ], + "source": [ + "print(\"Correlation between unit sales and each demographic feature:\")\n", + "print(sales[storedemo.columns[1:]].corrwith(sales[\"move\"]))\n", + "\n", + "print(\"\\nCorrelation between log-scale sales and each demographic feature:\")\n", + "print(sales[storedemo.columns[1:]].corrwith(sales[\"logmove\"]))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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3p577jlcfvnliMfjICKcOnUK8+bNwzPPPIOqqircddddABLtzydu4gSuednzaek0m0iIApIxpo8ZuZ7kvORrvHxEhH379qVMFIPBICKRCDRNMwhUr9f+KwvN924EAEyfPh3BYNB0HMXjcVthX1FRge9973sYHBzU++Itt9wCv98Pn89nOWl1yzOsUDZCgjeqGwZ/2223IXznv+SLJADAzp079c7gBmYdY+/eva6EYDoEAgEsXrxYn7HaDUQZbW1tqKioQFtbGxhj6OjoMKRhNhiBhDbGhYOZ9icOwqVLl2akIYro7+/HJZdcos/sjh07hs9//vOO3mWMIRwO60zmRz/6Edra2gAkvvnR0tKS0h7t7e3o6+tDe3t72rRzORHhtIr/+XcVrJ7JJN1QKKT/5xMYj8cDr9eL73//+wAS47CpqQlr165FOBzGyMgIOjs7sWvXLkQiEf29P/zhD/D5fGCMGdqYTyDMJhlWEMupaZqBWQKJPrBq1SqcOnVKZ5h2dSEKUP5sdXU1hoaGdAEfDoct33/44YdNhZec7+zZs/HOO+/g3HPPNWifIsRvvphhcHAQP/nJT/SJGwD8/Oc/N0wy+WRwcHAQr7zyStbjSkTZCAkz2DG+NWvW4OCP/7JA1CTgtHGspH8umUswGMSFF16YEfPo6+vTf2+//XasWrXKcN/v96cIOq7e8o5sVka35XMyy9q2bRsmTpwIIGHGWbNmTfpEmYZoNIpnn30WBw4cwMjICHbu3KkLCI5NmzYhHo/r/czv9+PFF19EKBTCiy++mDYLOzNab29veholiB/TsqrDdGZQwLwuxbTuvfdexGIxg8mFaxbc9OT3+3H69GkcP34cH3zwARhjuPHGG3HkyBEMDw/r/f/06dM455xzdHMTB59cWE0y7BCPx1FRUWGg2+fz6R/zAYB169bZmvuAhDYm1sHp06fh8/nwxBNPAABWrFihCxMxv6uuugrr1q1DTU2NIT1N0zBhwgTDte3bt2P27NnYuHEjGhsb9et8TPLfdONi5syZuPHGG3H55ZejoqICmqahr68P48eP102DIyMjqKysxNDQEN59990UK0U2KGshIWLChAlgjBkaSRzghYKTzglYM79cCQk+o3711VcNXyNzivPOOw+apuG8887D3LlzU+4PDAykMCXRzh4MBm0ZfG9vb9blbbr7Of2LfHw2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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEECAYAAADd88i7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOy9aZRcxZUu+sXJzMqsSTWoitJQUqVskC1SwgbUw5V8DWpByaa5ZbUbD7JowwUsU1Cyl7EbAaLfda82GHgWr2lhEBYIEKbUq9u+BrUMRtgC+4Iw/YTt1oCwEc8qLBVDaSgNiWpQ5X4/MvdRnMg4mSfnzKr41jor80wx7NgRe8feO+IIIoKBgYGBgYEOVqkLYGBgYGBQvjBCwsDAwMDAFUZIGBgYGBi4wggJAwMDAwNXGCFhYGBgYOAKIyQMDAwMDFxhhIRB3iGE2C+EuKTU5SgEhBAXCyEOlLocBgbFghESBgYlghDiMSHEd5RrYSEECSH8uTyjPC+EEP+fEOJ1zb0XhRBDQoiTQohDQoj/LYSYqjxzjhDiX4UQA0KI40KIN4UQa4UQ7Yn7FwshYok05OO/ZU8dg3KBERIGBuMfnwRwFoAPCSH+THO/h4jqAJwNoA7A9/iGEOJsAK8C6AdwPhFNArAQwFsAPiGl0U9EdcrxSoHqY1BEGCFhUFAIIYJCiH8WQvQnjn8WQgSl+zcLId5J3LsuoSGfnbj3mBDiASHEswnN9GUhxJREGkeFEG8IIc6X0pqT0IwHhRB7hBBdiet/KYR4Vwjhk579GyHEzsR/SwhxixDiLSHEYSHEvwkhmtPU67aE5r1fCLE8ce3PhBDvsYafuPa3Qojf5YueWeIqAE8DeCbxXwsiGgTwFICPS5e/DeBlIrqJiA4knnufiP6ZiP61cEU2KBcYIWFQaKwG8JeIDzwfA/DnAG4HACHEpwDcBOASxLXYizTvfz7xfAuAYQCvAPhN4vxHAO5NpBUA8B8AtiKuNa8E8KQQ4iNE9GsAUQB/JaX7JQC9if9fA7A0kf80AEcBfD9FnaYk8p+O+KD7g0Q+/y+AwwAulZ69EsATKdIqKIQQNQCuAPBk4viiEKLK5dnJAD4LYJ90+RIAPy50OQ3KGERkDnPk9QCwH8Alif9vAbhMurcEwP7E/w0AvivdOxsAATg7cf4YgPXS/ZUA9krn8wAMJv7/dwDvArCk+5sAfDvx/zsANiT+1yMuNDoS53sBLJbemwpgFIBfU7eLAZwGUCtd+zcA/5D4vwrAk4n/zQA+ADDVhU6PARgCMCgdxxM08Gf4zHdc8rgSwAAAP4Bg4v2/ke6/mCjjsUSavwMwU7p/GsCnpPOeRBonuW0SNIkpZRyUaWSOyj3MTMKg0JgGoE8670tc43t/ku7J/xnvSf9Pac7r5LSIKKbkNT3xvxfAZxOmrs8C+A0Rcbk6APwkYaYaRFxojAFoc6nTUSKKutTphwD+hxCiDvFZ0P8hondc0gGA7xFRIx8AzsvyGTdcBeDfiOg0EQ0D+N9INjl9jYgaEuk2AWiX7h1GXGgCAIjo/kQZ/hlAQHquXy5j4pBpZFChMELCoNDoR3wQZsxMXAOAd+AckGbkmM8MIYTM0zMBHAQAInod8cH803CamoC4cPq0MsCFiOigS15NQohaJZ/+RD4HETeJ/Q2Av0NpTU3tiJvYrkz4ZN5F3PR0mRCiRX2eiHYhPuP6vhBCJC7/AnGhajBBYYSEQaGxCcDtQojWxMD0fyGubQNxM83/TDicaxL3ssWriJuQbhZCBIQQFwP4HwBk52ov4v6HTwL4d+n6OgB3CCE6ACBR1s+kye8fhRBVQoj/DuByJb2NAG5G3Bz2k+yrlBF8QoiQdFQhLqT+AOAjiPuEPg5gNoADAJa5pPM44j6drsT5twH8dyHEvUKI6QCQaMc5BauJQVnBCAmDQuM7AHYA2AlgF+JO5+8AABE9C+BfALyAuLOUQyaHM82EiEYQH9g+DeAQgAcAfJmI3pAe24S4/XwbER2Srt8HYDOArUKIEwB+DeAvUmT3LuLO7X7EncHXK/n8BAkTVhFNLrcgbn7jYxviZqUHiOhd+UBcKGqjnBJ0/BcA/5A4/wPigQftAP4rQZ+XEa/7P0ivTtOsk/jbgtTUoKgQROajQwblASHEHAC7AQSJ6HSpy5MLhBBvAfgqEf281GUxMMgFZiZhUFIk1itUCSGaANwN4D/GgYD4W8QjhbaVuiwGBrnCCAmDUuOriIdovoV4RFF3aYuTG4QQLwJ4EMCNSqSVgUFFwpibDAwMDAxcYWYSBgYGBgauMELCwMDAwMAV/vSPlB4tLS0UDodLXQwDAwODcYvXXnvtEBG1qtcrQkiEw2Hs2LGj1MUwMDAwGLcQQvTprhtzk4GBgYGBK4yQMDAwMDBwhRESBgYGBgauMELCwMDAwMAVRkgYGBgYGLjCCAkDAwODEmLTpk2YO3cufD4f5s6di02bNpW6SA5URAisgYGBwXjEpk2bsHr1ajzyyCP4xCc+gZdeegnXXnstAGDZMrdPfhQXFbF30/z588mskzAwMBhvmDt3LpYuXYqnnnoKe/fuxZw5c+zz3bt3F7UsQojXiGi+et3MJAwMDAxKhNdffx3RaBQbNmywZxLXXHMN+vq069pKAiMkDAwMDEqEqqoqLFy4ECtXrrRnEgsXLsQ777xT6qLZMELCwMDAoEQYHh7Gpk2b0NraCiLCoUOHsGnTJsRi5fMpEhPdZGBgYFAi+P1+VFdXo7q6GkII+7/fXz76uxESBgYGBiXC6dOnUV9fjw0bNmBoaAgbNmxAfX09Tp8uny/4GiFhYJADyj3G3aD8cfXVV2PlypUIhUJYuXIlrr766lIXyYEJIyS4EYQQdmMYGOQCjnFfu3YthoaGsHbtWqxevdoICgPPaG9vx2OPPebgocceewzt7e2lLtoZEFHZHxdeeCHlgp6eHvL7/bRmzRqKRqO0Zs0a8vv91NPTk1O6BhMbkUiEtm3b5ri2bds2ikQiJSqRQaWht7eXqqurCYB9VFdXU29vb9HLAmAHacbfCTGTWL9+Pb7whS/Y9r4NGzbgC1/4AtavX1/qohlUMPbu3YtPfOITjmuf+MQnsHfv3hKVyKDSzH/bt2/H8PAw2traIIRAW1sbhoeHsX379lIX7Qx0kqPcjlxnEgCoo6ODtm3bRiMjI7Rt2zbq6OigePUnNnp7eykSiZBlWRSJREqiwVQqIpEIrV692kE/Ph9vqAQ+6e3tpVmzZjn6+axZs8qyrIxgMEhr1qxxXFuzZg0Fg8GilwUuM4mSCwAvR65CQghB3d3djmvd3d0khMgp3UpHJXaqckJPTw9ZlkVtbW0khKC2tjayLGvcmTErhU8q0fwHgDZs2OAQwBs2bCiJAjuhhQQArU9ios8kKrFTlRPa29upsbGRwuEwWZZF4XCYGhsbqb29vdRFyysqhU8sy6KRkRHHtZGREbIsq0QlSg+/30+1tbUUDodJCEHhcJhqa2vJ7/cXvSwTWkhEIhFaunQpBYNBAkDBYJCWLl1adCYvtyl7JXaqcgIA2rp1q+Pa1q1bx53yUSo+ybS/VIowk1FbW0sAqLu7mwYHB6m7u5sAUG1tbdHLMqGFRG9vL7W2tjo0vtbW1qIO0uU4ZffaqcpNuJULshESlUjLUgy+2fTZcujnmQIAdXV1ORTYrq4uY27K9MinkOApXbGZpxy1HC90KUfhVi5ob2+nhoYGx6DU0NDgam6qxEGMqDQ80N7eTlOnTnXkOXXq1JSmvN7eXpo0aRIFAgECQIFAgKqrq6m9vb1shbJO0bj11lsJQNHLPOGEhKyxBYNBWr16teN+sQdoy7Jo48aNDi1y48aNJTXteBm0ylG4lQtkxzWAtI7rbAa+ckGxZ0DZzNJUod3S0uJYfxAIBKi+vr6sBIXs1xJCUEtLi132Qgrknp4ex+ylp6dnYgkJVfNhossaRbEH6HIcILwIAOO3OAN1oGxvb88oBLaSfRiVICQA0JQpU+w+Vl9f7xASHIXW3Nxc0LJnAlY0pkyZQpZlkd/vJyGEQ9HIt1LmtrgYwHs0UYSEOvi1t7dTc3MzhcNhe4CeMmVKUQfo9vZ2BwOXogwqvMxuJtJagFTQmVzY4eh1dlipQkJX99bW1oKacbLpLwBo2bJldnvw7AGAnUZTU1NG9NZp3PlEJBKh+fPnkxDCFmYXXHCBo3/lWykLBoO0fPlyB98uX76cAMRovAiJzs5Om6hCCOrs7HTcV7VfZjghRMm0+HyZm3LV6OT3/X4/1dTUOHwSagin2dIkDt2sq7W1lXw+n+eBrBwVBS9Q697b20tTp051KF3ZmERS8XI2fkQA5PP5bF6VZxGM7373u56FRDF4Xwhhr7Hh8nOZC6WUAaCWlhaHmZlNczQehERnZ6c2ZEwWFCpTW5ZFXV1dtmAJBoPU3d1dVJNJPmz7uToQ1Y7H2hb/MoPK03Ezk4hDZ3abPn06AXB0tpqaGvL7/a4Dn7pPTyAQKGvHKlFy3SORiB2Bk21IuRd/WKZavLzmgHma+TubmUQxVkPL/U89ZDNUZ2dn3sx9AKi+vt4xjrBpjsaDkPCyelplQJ/PR0IIWr16dclmEvmIbMlV0KiarMqUTCe5E5Wjw12HQtvMdbQXQpDP50tyOsrmDVmIq/bnhoYGAkBLly4t68gxte7MK21tba6LU9O1RzofXTYKkRCC6uvrbROTfMgr4r36JIqxGprL19XVRQMDAxQKhRxlZsWD/+cjKo4FkDxDYr6l8SAkANDDDz/saLiHH344iUFljVknJNRpfqEHmXyE52XjRJbrBYBuueUW+x4SO07Kg5qkURBRvDPX1NQ4yl1TU1NWJpJihGi6+SQWLlzoiKJrb2931bBVW3AwGKTFixc7NNNyjBxT6w6AQqGQg3cXL15sK2pe2gMA3XrrrY4+x6GfRNkpRCqvyqYbt+gmtd/PmzfP4R/gQZl/870amh3qPGOS+ySXiftkvoJeePYr04bPabwIiRRTJSLK3NxUjEFG1eJXr15tm3y82lwzNf3oOndbW5udB9NC1VpkWpbTilA3FMskpg4oOhMBH6yhsYJCFKd3XV2dQ9Nl+jLKJXIs3eAJwKGJ8oBM5K091EgkVtw4jWxmsM3NzQ77Pv/Kmrlsllb7x/z58wmA3QfkGTYA21SVT97nPDht+ZCVEXX2kstaCrc+DWCMxoOQ4Aqq9nS54bw4ruWZRKHWAqTS4tvb223G8Dq76ezsTHKk8fRZxyy6KC8epFRtic0gKkMCoHPOOccRKMDPlYsdnQWcPODwLDITZGoDZ5qoHVzOVzaF8j1uP5nenOf8+fMpGAyWlLaqaZSVsIaGBgffyHwnzySEEFqlS6aL3++npqYmxzNNTU22lp7pQkWiOH0nTZqUVG7Vvs/tqjOjBQKBpP4hz0RYy0+FTPiI02ZzncpHssbPYwHTRh47MlFq/X4/1dXVOYIC6urqCOMluknXeDIjcPx6qsFRjeKxLIu6u7sdDZurY9uLFq9GWsjaQXt7O7W2tjo6USAQsM0X/AxPr3WzEVVYsk1cFq7MjLLGJIRwCDcuuxCCJk2alKTplNqOng8Ho5dIFt1MIhgM2p1NpwVK0/gkzVQ3KACg+fPnp6RtPiPc3PwF8gIvLh8v8JLLq/NJeGkPIYRjVhUIBKiurs4WJDwr4IGdlbxU/gQAdM8999jnfr+fqqqqHANuXV2dLYjU/gHAFixqCC3jnnvuSSkkMo2IchvLdLyiRkDJtMhEqQVAK1ascIx3K1as4HqNDyEhO657e3vthpVjuOUBlsPMWltbHSFfMkPKoXM8fc5l0U26tRqsgcqOOtYsR0ZGKBwO05QpUxwd2LIsOvfccx1pZjJDikQitHDhQldBKzOk6txevnx5kvbLgwxvnlgq7deL5poO6QY2N5+EGpnCtJXjzzkNvu8mJOR2YKidPx8Rbl78BWqAQ2Njoz04RiIROvvssx11nj9/vl1OLzO79vZ2qq6u1vrouAw8wPPB527g2Y5OaHO/ZyWH6yGbxVijl/topjOJTBWWVHygziRUvvH5fFkFk6hRYOxrGTczCdZouIKBQMDR8ETxjtXe3m43vhDC4WBUO6/f76fm5mYHUzc3N2fsoFLNSxs3bnTcU1eAys70cDhMzc3NjtnN1q1bHQPEueee6+horDnJz8iLs9QBgX0gLCC5U3B5gsGgPTOR83Ab2Ni3wvUt5b5YufokgLgfQQbH2nMeqkmS6cC23blz5zroo27TAcQdvrroMvZFqE7LjRs3OmZ2uW4x49VfIGvkAOiyyy6zaSHPSHXaspc80ilmTBd5JsHX3NDc3KwdbOvr6+1+nTCr2PWQtX65H+jCUr34JNJo6drnAdjl0gk2PlejNWXFOBNHdtn4JABsAPA+gN3Stf8bwBsAdgL4CYBGL2nJQkK1p3GjyQO66vxTBzo11BMAnXvuuY4G4nOvUAdkdSbQ29tLjY2NFAgEHAM1z25Y+PHzkUiEtm7d6qjH6tWrKRAIuJqwiJJX8KqCq7a2NmmQks0GakcE4NAauZz8THt7ux12WKoFYvkIPNBpgMuXL3esJ1FXV8uDh2VZdueTNU85msZNI5RpqUabNTY2OhbsMe9ku8WMl1kX85Vuewu1H+mEACtE8ixBjSoC4j46mZ633HKLo09yOeTfVH1SpX+qgyj5EwKpDq/RTUwT1W8ozw5lyPVUZz/qTILBfU7mk3T+zJ6eHsc4cMEFF7jtPFtUIfFJABcoQqITgD/x/24Ad3tJSxYSagSDm31OnkmonZN/uWNx46iSVe446ZxRqqaprkrVmY9Wr15tay2qhui2qlVubL/fT42NjSlD41QhEQqFHIuNeCbBzNTQ0OCYSaiBAioTA3FnoUyrUmw1kaudXtUqE9sUUH19vUN7k8OoZRrIgoH/qyGwfr9fKyBYSLMzUu78fr+fWlpa7HLmusVMMBikhQsXOniZz+U8ZJ+EOgPWlf+SSy6x+5OXL/YBqbcoceuzqfiKy6IbcHVCgte26MxTbgcrB25gy4Vcd1Y03Mp80UUXJZm8ZB7gvOV+y+spdIqCqjTxbF9WSFWf5AUXXFB8IRGvP8KykFDu/Q2AJ72ko/ok3CQ/S/v6+nqHT4Lvs11dWTxiE0qW/vJMQ10EpUZJMHOoIXssbNw0Ufm+zkbLsehcfp0DM9UCPfU+pyObm9QBjplPp0WqtOY0g8GgY5WxHO/uhnyvS8lHerIiAMRDIZkO3MHk3Tn5OVYuVBrx4Mi0UKf5bnwsa+jsT2N42WImFS3UMkumBsf7Mt9wxI8agcN1U80wboLI7/c7FBxOl3lP9UmkGuB1AEBz5sxxpatcfqLkCKtUebopj7oyqLModUDXtYfbISsdLHBYYZEVY1XhlANc/H6/NnpKcxTfJ5FGSPwHgCu9pDNr1ixXk8nq1auTKssan9wQF198scO5+sUvftEhJK677joHU1933XUOZtI5euRpZ7oVpOp9XifBA4IaZihrXx2rttj5qPtWzZgxw3WGo35eMx2TsLZWW1vroLebliULkUmTJnl2+mdjHvK6z49OWHpNU52SyyHLlmXR+eef7+AxlW7qABoOh+0BgvlMXcSkO+Q25DTk/MLhsIOXU2mRKm3ZvyHzDAsjN9rwwOdF4+Z6qv4Gfk9dkyA7+pn3dJF3cr5u4PuphLZaTtlBr+6blK6eOngJrJHbI1U+zENcd3mRIM+CeCzx+/32LFcN1JHTVPe0Apz+ECoXIQFgNeI+CZHi3RUAdgDY4fP56N5776Xnn3/eZhgeTGXmefbZZ21pX1dXRy+88AK98MILdmdgwk+ZMsU+5/vq3vN8zvdra2sdU0jWCjmP1tZWam5utst57733Um1trS0EfD4fBYNBexYiT/tkJmhpabHT7O7upkAgQB2rttALL7yQ1LH4mD17tp3n1KlT6fbbb7fLLZdJZUD5nGnHaauCRTc4cL1kLcXv91MwGKTW1la7HuoRDofp3nvvdVy79957KRwOa5+//fbbqbGx0TGTa2xstOvZ0tJCtbW1jvu1tbUOWurSnDp1qk2bK6+8knw+H1155ZU2rZqamuw86uvrbRrIfJaqg8vrJ7g9Uj3PPN3Q0GC3Jw9cCxYsoJ/85Ce2z2LWrFla2oXDYbryyisdApPPuQyWFQ/55npwO7vRyufzUX19vZaPVF7iPM455xxHGTgySeYrN/7SXVfz0B2p6Mv9i4W2XE5dXXT8rgpqrhvzCKfp8/ls+rK/Si633F6pyiub1QE4xh9165HZs2c7aFtVVUVtbW2OMVOun2xGDofD9LGPfax8hASAqwC8AqDGazqzZ892aAtu0le2qycqTETJDi2ZUERnoiIikQj19fXZdkc50kKevWzbti1ppaxqbuJ1DmwWSKWB8VT3rLPOcqTJUp9nEtzYqRZjyTZwIHnrZHmdAwCaPHmyg3aXX345AckhsLwKVaY9/1fXasix5jrTj2Vltr2IaiNX17kAqVfv6qALD+aIN56i8+xR1jJZqMszglRTedWs6TYAMdSN8wDQ4sWLHXwla7yqUzidYzrbmUR1dXXK9SDyimu+pzNpeTHtuIWfqmsWVKRKU0dv7sO61c6pBm65HurMQOcMZyexbuYHgL71rW85aC0LANXHxfwWDAbtYBG2SPBMQuY7lZa6mUQwGKSPfvSjTJfSCgkAnwLwOoDWTNK54IILbEaQmXRgYCCpAcPhsK1tsWR1G6BZCAghkhilqanJ7jh8LZUTTWUOOezWKwN3dHQ40uT4allI/Pmf/7nW5uq2DYTb1sm6IxgM2rTzEvEhH0wT2f7pZvpRaZVuF1EgtRAAnCGbRGcWPaUyJ8khyjx957ZTZ5ZqPXWbyKmHPI2XhatuUJL9UjLtANAPfvADu5xy+Cng/JAO8/ry5csdtFCjtAD9AC4LIjYvye/ozBc6v4YQgtrb21OailLRTb2vatRuyoeal9vB/YPbkmeg6d6Tn3EL71XNfUwzt33jgHjILEPuP6oywnyjKmpCCFuR4DTVaE23GVJ/fz8tWLBApn3xhASATQDeATAK4ACAawHsA/AnAL9LHOu8pKXOJNwWI6lhnGpHlju4vCiGO7S6+lNlWN00maFuYc6NwXvFpGNAeVBWneNuMwm1YxE5t4GQNY50+TMN+L/XjsNHVVUVDQ4OOmZtchin7NieN2+edqBSvwsit7mbEOD7vB2DqijIPiDZbitv8yBrcHKIste6exlUZA2P83SjrxzXD8RnaoxgMGibSDgt5l2dVsn15jIEAgE70ID5bvbs2Q5a6cKzs6mzrr94mUkQpd5ZIdUiQDU/t7Lx83//93+fFAXp5VC/xSDPxGS/IfcNWcGR+4McWanLJ53DWTUjqcEm8jihmuddaF/cmUS+DpnI6RhUNsGomhD7B9SN7NIxLHAmdJQHIdkhyZ1X3eGTp/FeGFDXeNXV1dTb2+sQEoBeE+VyyWsYmCl0IYGyINMdXumtY1SeEfEgpu4zAyDl4kadkJD35FFXzsph0bLWWV9fb6cRiURozZo1trbV09Pj2O5aprk6oMh0CAQCSdqXW3vygKzyWboV1/JiLQ5NVA/euiMcDtv15XrKZjM50ojrpObP7acLw8z00PkW5Py8DMhehAhR8iJCL/RVzX/qosF0jmS1f6gLb9XvnvPBMz3VDM0BLNnQmmkVDoeT2oujx5gP1Xqp59J3NipTSKjRTV4Pt2gM1VzE/+WOpd5P8SUn+5lHH33ULicPXGqDqB+dcWNGWdNVhUSqd1T/ixyKCCRvdeB2eBESOvu0XF9mYPVDL0A8VFGGvLpZBdNSXQzJ5sL29nZtvaZPn26nYVkWRaNR2xYsh+rqZhK6+sl7/Xs1x8lbSWTCuyw8eYGZXBY53NWyLFqxYoWtybK5Q/aFyTMo9XsF3DZCCG2bqzPWVAMa+5r4XA4XZr5U89CZcOU8dLH9TBs5hFxe3Kg7BgYGHP4e5ise0DMdqN1Mn2pYrbpflKqsEJ0JX4VINknKCiGbwFP1w2g0aiuHXD95LJKf5fFOzkM3/pZcAHg51G05uEPrtGN52pZJyJ76HJ8TuX8TVtZ81ZXg6bTFVAfPClgDl4WE7MBTO7McftqxaovdgbKxuXoZBKPRqOvulWz+sCzL4fSORCIOUwf/zp492551qf4DLpfbZm+p2lie2akadVdXl+OcB3SVVrqBMl0oq1xunhmk0s516ybUhaLcpvKiv3Q7yao+CrV+Mi/Jz8iOejceScVDHITB9OLwYVXZ0w2GcnvoeJ3NgcwvXtoDSA6B7enp0T7nRZFKtVJcNmGpfibAubMC0ZmgDW5fmf7yOOIWaq3jq9mzZ9uCqL29nWpra113t1XMcJUpJLzOJGRnn8oUKYiSMk1mJlnj0K0gVRdK8fuhUCitRu5WD05TFhKyI1on2Hjla8eqLRn5JFRNSw7dy+bgzqvbZ4aZnX0gPDgyE/MX3uRojUmTJjm2otBt4aBzxjKtFi5cSEB8ZiWvbuavwqWqS6btpx7y7qkZLGxKWqTWsWoLRSIRmjVrlpbeslYorzdoaWnRzhJU86yX2aN6eNHA5dkKQzVFqbsg8LtuK9T5fdV/w2noyqFaENSPFKm8m6pO8kyioaHB9jEAzkWYsjmJlaeGhgaHkGCzmSwkVNOpV96UdwuQ78v9J1V6FSskeGdGLwwpa2NeNGgPRPO8F80FF1zgKOO0adPsNDLpeDKTAE4hoeYh/5e/GicznNfDq4Pb68FajhxKKndmt3dk5yq3D4fyMtQtHOQtu2VecZtJyDM/1uTyTSt1tS0Auummmxw8k4oOkUiEvvSlL9n17Fi1xQ6QUP1SvOBOdrjzoKQOtDU1NQ5asqabjUk308Mt1FM+l8vA24fLz/G5uiOrTDu3/GULAeDcoyqTejCPuTn52WemLtCTw7lVB3w2fZbzlH1fLABV2rrVU5lhVa6Q8OpIlWcSXjqyFyHhFrKp7g/V0NCQFcPpDlnbZCHhtsslRxbJX43LhuHUMMNM3xdCJK3DAJC0IZ3a0XTtIc8+5A6ohhHK9JKFuNx+RMk+Ccuy6Ktf/WrW7ePVhs2LDXlQqqur8xzhQ3PCUBIAACAASURBVET0zDPP2Oc8O1TNMCz0eHDQzVRqamq0q5B1zthM6+iWnu6QI6iypT3TctGiRXaeMl+l6/fy+if1+xNey+C2f1qqd5h3ue5cblY2cxESPCMaGRmhpUuXattDXhCagraVKSSmTJniWcuRNSwvMwmv4XjpthmQl8p7CTVLd+hmEun8BMFg0I66kRlOdlbyoTNXyYeXmZtKW9WcBKHf2lrOQ5eGGqLc29trm6Z4psBrL+R66uzb8kyC/Uo8mKrf93A7+vv7k+qdjaPUbRbgxpfbtjm/1sZ1lSO9AHf/Qbr2kg8hkj80lc2hvq/6Cxip9q1Kt6ZH7V+q2ayrqytpDZVbOeVFgpn0WbftW9y29pB3gXX7vkQ2QkL2C7KjOlVbj1tzk8/ny2inRj68zCTkQSsVURcvXuxoUDViJ1eh4NYZAHiKbuL6skDIhuHkI50t1O2QB8COVVtcP9YD6PfYcRM82Wpf6q6u7INQFzll2i5e6BMMBh0x68FgkGbMmJERr8i+L66rl/dlX5ibEHHbtI7v8w64anukytfrDCldndPRX7bze2kPoriykS9zmtt2/cAZXxtHl6mzYLcPYqVTeGQlVaWXjgbV1dUZj0sVKyQA74u7Mo0qypVhC2XHlbV/VUi4TYvlcuQydc2GjrqDy6377KdbHdTIMH7H7SNC6eopmwjlqB8ANHfuXE+dSNe+uo/EqO/I4c7qx3nkcusc7lxmOThCfiedAsQOXTVwQNtOiXUtXr+rkAtPyP3lQx/6kGOVsLzS2EsZqqqqHIs03XYs5pBhORQ0Go3mxOOyuSkdTdTB2+1Ljty+6b6LoWt7n8+XdF2nAOlmaTK9K1pIZNOgXt7JVTNSbZG8G6r8jM4WnK4ThMNhu/yqkHBjSnngynUmoXMYejnkSJZUQsItTFh1vjIt6uvrHX4N3UyCNV95sJBnMLpBJNsZU7pDpR1D3mqF7/HgqPNDuQnEfAhxNZ1C0SIVvXXRZV757vzzz7d9TERnvhEfN2+dSWPx4sVJfZD7U7YWAHkbdd39pqYmGhwcpEsuucS+NvNbTyV928HNdLpgwYKkRZtx2okkfxSPB+oOurxQNJ2vRfHhVaaQ4CgNL40na+Buexa5RQfpDnlwBkD79u1z2FhlIZHtKlVd+cLhsL35niokdD4GPuSw2XyUJdvycxnkbby9xrOrabHQkLdV4eiydLHlDA5jZpu3bnGRV57Qaf3pDoa8aWOq51MJCbfN9rINNtDxcib0yOTQ7S6cafpyCLMcAjtlyhRqbm6OKyJCv34AAM2YMcPuT9xfMjU56miVth6JMtXU1DgW5vJmlel4QlUMdO2drgzp/D0VKyQyaTxZmOSDuVUhoR46c5OXzfRSHawt85YMXn0Scn1zFRJevkGho6/qk+BtObIREryNiloOecV1unpyZw4EAtpNG7M5khz0GbQpL8LkSCXds36/P6WQcFOY1K/byXln8jEf9brDtCZS80S69mCwEz9b+qvrD9SNJJl+M2bMSOLZfEQgykJa/WZIOtrIazM4bN0L7byYA5nXdfdk/4hsChVC2JGCuvHXQoXAsrwVdXR01P4vhEj7/MjIiOf0dOnu3r0bY2Nj8Pl89rXa2lovRXXFe++9hw9/+MP4zW9+g3nz5uWUViGh0ndkZAQ//vGPEQqF7GsHDhxgQZ/0vK59otGofT0Wi2FoaAixWCzpOSLCkSNH0pbx05/+NKqqqjA6OopJkyY58mWeSscDKkKhEK655ho0NjYCAILBYNp3jhw5gk9+8pN48skncdFFFwEANm7c6OAbAPD5fNi4caNrOsFgEKOjo6irq0u6V1tbi2PHjiVdr6qqwsGDB7W87AUnT560/3fcvDmrNBhz586Fz+fDwYMHEQ6Hk+53d3djcHAwZRqhUAhPPfUUvvKVrwCIt2dtbS3uu+8+LFu2zPHs22+/DSJCx6ot6OnpgRACy5YtQ1VVVU71OHjwoM3XmfLPBx98gObmZgBAc3MzPvjgA0/vDQ0NoWPVFvtcxwOhUMi1nYUQGBoawvz583Hq1CkAQPvX/hXXX389Dhw4AADHde9VjJDQDRTpwI2YCvKApoNuAJDTraqqghACY2NjGZfPDa2trdi8eTPmzZuHnTt3en7Pi1DMBOnop7ZJVVUV/uqv/grDw8OO6z6fDxs2bMDQ0BA2bNhgX29ra0sS/vX19QCAiy++GESEQCDguG9ZFlpbWz3XgQdyAOjr68OCBQsQjUbt8gshsho8a2tr8fGPf9zueHLn1bVDY2Mj1q1bh/nz5+PgwYMAgGXLluGJJ55AJBIBhIVIJIInnngiaaCT8eijjyIQCDgGbsBdifL5fBgaGoJlWWkHxnvvvTdpwLIsy5MQ9Io33ngDsVgMb7zxBvbv34/m5mabdsFgEM8++6w9gKZDNBpFMBjE2NgYdu/enZJuALB27VrccMMNaYWQF9x1112IRqMIBAJ2P5AFtBAC/f39WLBggfb9m2++GdFoFDfffLP2Po9LqcYnlQeA5D5pWRYCgYBdzqqqKuzYsQOzZs0CABz4ly9i3bp16OzsBIA3dflUjJDQdYJ0g6IXIZHumUwHynygY9UWEJGrgHCrNw96+cD+/ftBRFkNECrN3Mo0MDCQRL9YLAYiwiuvvAJAP5PLBNXV1Q7e2b59u2OmR0QZz/x4VvCLX/wCl156qeNeIBBAR0eHll/9fj9+//vf4/XXX7evLVu2DLt370bHzZs9DXTLli3D448/bgsWxllnnZWUp2VZtrYZi8Uw81tPpUz7lltuSaJFLBZLEvq5gHmDf+W0h4eHsX///rR9iojQ39+PJ598EiMjIxBCIBQKYeXKlWnzX7BgAc4++2zPlgk3MK3kssoKCRFh2rRpeOWVV2zFh1FbW4u1a9eirq4Oa9eu1fLf0NCQ49cr1Hpxf2LM/NZT2LZtGwCgt7cXHau2IBaL4bnnnnNPM6MSlBBuJodcMTw8jKVLl2rv1dfXpx10Z8yYkdQw+dBU3FBTU5NSI8wHTTidjlVbMDQ0lLPJa2hoCEuWLEFVVRWWLFliX9fNvizLgmVZ9uAh19WyrJSDFs865NnHO++8Y/OOECIv9OFZQWdnZ1LnCgaD9qxJ5h0hBJqbm3Hy5MmcBbksWDhtIkrqI0SEpqYmVFdXg4jw9prPpkw3V4HsBTNnzoQQAjNnzkRtba09q8sERISjR486rjU2NuKBBx5IKSg2bdqEr3/964hGow4+yEZgTJ8+HZZloampKW1ZT5w44Xpv//792ntsduvu7s6oXCoPDAwM4LLLLrPb9u01n8XKlStxxx13pFVIGBUjJPIF1X4YCoXwu9/9LsmsUVVVhcmTJ3tKUx14vE6Xs8EHH3yAJUuWYGBgoGB5qNi5c6ctNDIF21yZSdMNRLFYzMHo8oDKdHbrdDzrkWc/p0+fTnp/ZGQEq1evzqQaSSAirfZ18uRJfOlLX0IoFHLwBRHh0KFD2sE8V3zxi19ES0uLPdix5kpEeOedd2zTQjp/gtrGbW1tEEKgra0tb2X94x//iFgshj/+8Y+4/fbbc06PiGBZFqqrq1FdXY1169a5PnvzzTfbpk9Z0cimPQ4ePIhYLIZDhw4BiAsaL74J7g9DQ0OAsDBlyhSHj4Kxbt06WxnJBKoCwqZr9n15nbHKGNdCQqexqeYT7sg85eNO0tTUlMRMOrBZRobbIJYvbN68OSO7fCGwbds2bacIBoOOaXe2pgoe8NSBVr0mg220sq1W92xVVRUefvjhMxcks40XLZ/NgSqYh95//33twNPS0pI27WzwzDPPOLRjmf+Gh4cd5q1MMDAwACJyVUi4jdw0caalTNNZs2bB5/Nh1qxZ+Kd/+qek9FRlDQB+9rOfpSwn+7rq6uocSoGKAwcO4Oqrr8bKlSvT+iJ1kIMM1FlwLBbzlOb999+Puro6HD58GKAYDh8+jLq6Otx///2O59Lxuhvc+lsuPtOKERJeHDkq/H5/0jWV6MPDw9iwYQMsy3I8/81vfhOLFi3SMq2MSCSCvr4+x7Vco5vckHAuJYE7Ybqy5hNLlizR+iuGh4cd5jaOVvKqlfKAw4PsyMhIkkAcGxtDTU0N2tvb05azoaFBO4gdOXIE1dXVAJwadi7mqPXr1yMUCiUJiNbWVlvbzXcbNTc349ixY44osnyB6+Gmaae7rxvo2Oewf/9+fPDBB46+UlNTox3kP/WpT6UsJ/sjIpFIyueAuON/7dq1Gdv6gTMDbSgUss1mMtzoIJtMly1bhoceegizZ88GhIXZs2fjoYcesjX79vZ21NTUOPjEK6+reeULFSMkuIFkiZjO/DF9+vS0miHbyUdGRhxp33HHHZg1a1Zae+Uf/vAHdHR05D2ySIfnnnsOnZ2dSXmde+656OvrizNegcH0GB0d9TwoXXvttXj33XcRi8Xw7rvv2tc5MkyGHNYqhEAgEMB9990nDSYC4XAYtbW1uOeee9LmPW3aNO310dFRjI6OahWJbLFs2TJs2LAhyal8+PBhxGIxvP322wWz+7tp0Lk4aLO1i6eCOvuQy33y5MmsyhuLxbB3717bIesGv9+PwcFB2z+WCeTZo9u7br5IdcadKljhnnvuQW1tLaZPnw4IKyNeLxQqRkgEg0EIIVyjbXROSzYFTZkyJeU7QFz4TJ8+HUBcOzt+/HiS81EHFkQdHR1Za4lCCG3Msw7PPfccYrGYQ0Du2bMHHR0d2LNnj/Yd3WCcLW644QYIIZLi+1Nh06ZNDjMDw+fzJZVLjRAZHR3FlClTzgzmKWLideaPPXv2aDU8IQROnz6d0jyRDVSnMpBe484F6daK+Hw+7cA7ZcoUWJbl2jcA4MEHH0RjYyMefPDBnMvJkGcX06dPTzKP5BpKnorPT58+jeHhYdTV1WUkjNTAjWg0qjUzp3Nie8GyZcscSpEbr7sjuf65RnJVjJA4efIkiEgbGwycYQ5ZU2PivP/++wDi5pqOVVvQ3NwMn89nxzrfddddGBkZsWPEa2pqMGnSJE+mLR2zZOrgTVWvfGBkZCRvpoi1a9fixhtvdGjgPp/P4TSWTQhCCESjURw7dgxE5IglP3XqlDau2+/32+nzTG90dBTt7e0pHW+6wdhNmPn9/pw7j1fw4JGPQSRTjI2NaYWTbmbHCAaDWLhwoaNN5fOenh5tXm7XZXzve99DNBrF9773PW3e2YCjpWpqalLyuRAC7e3tGBwc1NJE1z66tUpjY2NapS5ffSzTsGilFADidWW/4c9//vOczJwVIyRULVG1z+ucqLLWIocrHjlyBDfffDM2bNiA+vp6bNiwATfffLOtlfX397vGL6tgZjl06BBGR0eLukK6vb0dDQ0N9nk4HEZDQ4Nn+2W2YJsuC8OxsTHceeediEaj9i+DO97Ro0e1oYsqYrEYLr/8coeGPzo6ig8++MA1VDkbjI6OZqTZu/FdOpxzzjm2GWJwcBDnnHNORu97RVdXl9bBrNZxxowZ2vfl61/5ylfw6quv4s4778SMb/wId955J1599VV7hfPatWvR09PjECI9PT1Yu3Zt2nLK6wN0Wn9dXV1GM2vgTChpumAOIsKBAweSVtwzBgcH0dnZaUd5pVqrVEilzisWLFiQtGCP+yQRYdmyZQgGg1i2bFlOZs6KEBKTJk1yHfDdwk2bm5tts4xusciiRYvsLTV2796NRYsW2ffmzJmD9vZ27N69O+1AIkfUZLpCWodMzEL33HMPqqqqEtsbxN+rqqqy7ZdumrJlWehYtcV1wMt0IATi4YW1tbX45je/6bh+9OhR1NXVac2BunIBAk8//TSA+FRbjkV/9NFHMy5Xpj4HXUQOkMx3XvHmm286ePfNN7WLWnOCz+fDzp07cdZZZ6V99u23304SFDNmzMDbb79tn69duxbXX389brvtNvzp/7kCt912G66//nqHEJAVhaGhIa2AYMHV1dVlXzt8+DCEEDh8+LDW1KezGKSbmXMeagCJG3Rt7GVRWSYQQiTVPd949dVXMW3aNLz66qva+xxy/d577+WUT0UIiXPOOcd1wD98+HCSoGhubo6HmLmgvb0dX/7yl/HCCy9gdHQUL7zwAr785S/bGvjq1atx7bXX4oUXXki7StWL1pEJbrzxRs/POuyXGls9+w94oPT7/RBC4IYbbgCQ7AgXQmQ8EPKAIy9Yk69XVVXB5/M51knIsx9Gc3Mz5syZAyQWhi1atAgnT57E2NgYjhw5ghUrVmS18ErdMkOnfcnQReRkO4C4Cfx8BzmMjY25+s8CgUCSH0/ez4iIHAKC4UUIpAOHam/efMY/c/LkScRiMZw8eRLt7e15ocVZZ53lOlDqMGnSJFiWZe/llQ3S7TFFREl1zyfknQQ4co7BSh7zcLazYEZFCIl0OHz4sIPpUwkIIK6Bj42N4ZprrkEwGMQ111yDsbExWwNftmwZ7rjjDqxcuRJvr/ms62zFiw1WBy5ntlN2Gansl+w/YLu8z+fDjTfe6MhDdoRnMxCyZioPrrJmOjw8jGPHjtmhwpFIxPZLqG0mO3yrq6sRCoXsLRcSG5ClhNssQMb27dsxbdo0bN++PaN6ZgM3G3W+Q1WBMz4GFfmO4MoVXHf2Sai0yCbUnYgwODiI6667Lu2zvO8VC6psbfXs1C8VOKgDiAfPyHRk5c/N+pIpxoWQyBSsgbPTWRdBIA++hw8fzsuAriIf2lo55JFOM+UZGkc2efGZPPPMM47ZxzPPPJP2HVkY6hAIBBAOhyFEPIy2WOtK0i06ywVu2mG8bvF1KboVvYVEqnpyH7rttttw+eWXJ61tyGbPIsuycPbZZ+OPf/xj2pnJ6OioYwfWbG31xQp60KGzsxNDQ0O2GfbYsWMYGhpy8EKuyp+MCSkkgLgQ4IHN6w6ShR5sxzOYfpnQLdPQUd1aGhmjo6O2nZYDDYqBQobA6tbOnBGS8e3UdSt6C4kf/vCH2sG6tbUVzz77LGZ+6yk8++yz+K//+i/H9ijqRnjquRtisRj6+vrwi1/8AnPnzk37PNvoc7HVuy3SdENvb2/WeangNpcDInKZKaTDhBUSxUIhtchKAa+IlX8LgVRbGbBpUN26I1uTYTlB1hqJCE888YTrit5iYNmyZXjyyScdW6D39vbivvvus0246iZz8+bNw4kTJ9DV1YXpN/4QXV1dOHHihOdoQd44MV30XL5w9OhR1/U3Z07O1D3f9M/nTCEdJu7IVSQUUousBMyYMQP79u1DQ0MDYrEY9uzZg3379rmGYmYDL3H7XsM2OfQykxDMckNucfaFK0Oqcu3cuRPz5s3D5s2bcfD7V2b8PRWePXnxXeUCIUTK7T/8fn9Om+mVI4yQKBBShZ9OJLBjW3YUqyGXucKrAPBiMtRtEmhQHMi7DWcaLTg2NuY5IMDLanM3XHrppdizZw+6u7vR/rV/ta+zf4tD78cTJtaIVUSkCz+dSPAScpkrjM9o4iKT9Qi8RiMWi9lrNjIB+wPWrVuHA//yRfs6CyiOtMxk25pyhxESBYKX8FOD8oHbnmD5/HSnQfZINZi3tbVh586dngZmOXQ0k00qZcj+AP5utuwPE0LkdVPEUsMIiQLCaLeVA/52tIxAIJDVKm+D/MNtkWl1dTVisRhOnTqV1+/MewUrg5y33+8fd8pgwYSEEGKDEOJ9IcRu6VqzEOJ5IcSbid/i73hmYKCB+u3oSCSCxx9/vOKdjuMFqt+JwbOCXLeeyAVr1651fO53PAkIoLAziccAqF8LuQXAL4joHAC/SJwbGJQFyiEqyMAd8sycF46xkzjXrScM3FEwIUFEvwKgbnb/GQCPJ/4/DiB/23oajDt42RSw3KHayceTQ7OUyGXriXQr8w2cKLZPoo2I3gGAxG/6bSsNJizGQ2ceGxuLh1omPnpfCrv5eEW2C8qy/X70REX57PylQAixAsAKIB698OKLLwKA/ctId57NO+WYx3itl9s1wH0fn0qpx/z587Fjx464vVzasnn+/PkYyFMe46XNi8lXbgtcy7EepaKdA0RUsANAGMBu6fz3AKYm/k8F8Hsv6Vx44YVERNSxagvJSHeezTvlmMd4rZfbM52dnYT4J7YcR2dnZ0XVg4ios7OThBAEgIQQ1NnZmfc8ilGP8ZCHjqf4KMd6FDtPADtIM/4W29y0GcBVif9XAXi6yPkbVADy8Z2LckEx99gxSA23LdPLaSv1ckQhQ2A3AXgFwEeEEAeEENcCuAvApUKINwFcmjg3MEiCGVwN8o2NGzdqAwk2btxYohJVBgoZ3bSMiKYSUYCI2onoESI6TESLieicxK8a/WRgYGBQECxbtgxPPPGEYy3ME088YUKd08DMswwMDCYMeDfa8C0/xe67/rrUxakIeJ5JCCE6hBCXJP5XCyG8fRHEICd87B+3AgDCt/zU/m9gYGBQLHgSEkKIrwD4EYCHEpfaATxVqEIZnMGxU6PYf9dfY/9df41jp7x9SY2FiREqBgYGucLrTOJGAAsBHAcAInoTZiFc2YIFi1ehYlD+MILfoFTwKiSGiWiET4QQfsTjiw0MDIoAI/i94WP/uBXhW35q/zfIHV4d178UQtwGoFoIcSmAGwD8R+GKZWBgYJA5WJgCsIWFQW7wOpO4BcAAgF0AvgrgGQC3F6pQBgYGlYdyNYmVa7kqBV6FxGcAbCSizxHRFUS0PrGM28BAC9MxJx6yMYkVg0+MqS43eBUSXQD+IIR4Qgjx1wmfhME4Rq6d13RMdxgBegaGT+IoZ57wJCSI6H8COBvAvwP4EoC3hBAPF7JgExXlwixq5y2Xco0HmIHROyYK35WCJ7yuwfK8mI6IRgE8C+BfAbyGuAlqXKEcGLJcB5ByLVexoeORcuCbYqAU9TR8dwb5pr/XNVheF9N9SgjxGIB9AK4A8DDiW32PKxiGNEgHHY/kyjdq5y9XoTNR+0e5tEep6O91JnE14iusZxPRVUT0DBGdLlyxDFKhXJi21BgvdFA7v5fBYLzUvRIwUYUjw6tP4ouIb/t9qRDiciFEyVdbT+ROUijNtdL2h5rInTfTuk/k/mKQG7yamz4H4D8BfA7A5wG8KoS4opAFS4dKHSDKobO6aa6VSM9cUQ7tUQwUYnYyUWiXD1Qyrbyam24H8GcJU9OXAfw5gH8oXLGSUSlETlfOShVuKiqlPdIhXXtkU89KpU2mvDleeFlFIdqvkmnlVUhYRPS+dH44g3fzgkw7cyH2cPHCPKUwA6hp1M+5BfMen4f6ObdknWY65IPpK2EwzaaelTAgFIL26fiuUvZVqoT2Kya8DvQ/E0I8J4S4WghxNYCfIh4OWzbwYkIpxwVi+UhTTePE3ruw66pdOLG3vL8Oa+zqpUMheDkd301ks2amKCc/oVfH9d8D+AGA8wB8DMAPiOjmQhasEJioGsJ4GVzLYduHYszSxgvGC9+VAoX4jky27ZHJYrofA/g2gH9CfFfY5oxyGocYz9Pn8TIY5lsxqJRZWjmgFEoZ863Mu17MYPJvpSIdvbNtD6/RTV8VQrwHYCeAHYivuN6RUU4VCK9O6EJ2BB3TFwOlGAzHS2c1KB2Yb2Xe9WoGK8WWGIXk9Xzl4XUm8S0AESIKE9GHiGgWEX0op5zLAOUYiaRqPTqmLwUqxRk+XjFeZnYq0tWrUutdjLGlWOOXVyHxFoAPcsqpDFGMQSlTaV6u5ox05TKzgMIiU76olPZIV69y7A9ezMzFGFuKpVR5FRK3AtguhHhICPEvfBSyYKVAIbSWStCO82HSKod6VsrAWAioda/UEOVKaMOJFqXlVUg8BGAbgF8j7o/gY1yhHLWWQqAYJq1SmAnKQVB5QSmUkWzyLAU9y7ENK9XklQ5elUOvQuI0Ed1ERI8S0eN85Keo4wuVwFDFEIblKnALFSaYCUpBGy95ZuofyJTX8zFjLcVMo1x5OVd4VQ69CokXhBArhBBThRDNfOSnqNmhXAfjYjBUudY9U5TjbCMfmmyu9fLyfiFol6l/IFNez8eMtRxnGl5QyX3Wq5D4EhJ+CZwxNZU0BLZSpXs+mKUS667TACuxHl6g1iud9utm/ktFl0qgXSUPjPlGJbSXG7yuuJ6lOSo+BDZTFGKAz0ealdAZy2G1dDbIh1afru6lGECKwTPFqFc58EixUKp+7nUx3Wc1x+JiflciW3tpPolaCKbPR5qVrKWkQjmYFsaLVq+iEsusQznwSLFQqjbzam66FvFPli5PHOsB3ATgZSHE3xWobA5kay9N9U6+bMflrsUXAqXQarLJc7wu1jJwR/iWnyJ8y0/RUB3I6v1seKIUM5pcAwm8wquQiAGYQ0R/S0R/C+BcAMMA/gLAqryWqIjIVTKXy2poHXLpJF5QDhE6XjpFJS7WMnAiE17m9QsA8F//qzOr/LLhiVxnNNkM8LkGEniFVyERJqL3pPP3Ef/e9REA43aeV6n+ArWTVIq2nGk5zQA//pHrgO8F5dA/CsHL+aqXVyHxf4QQW4QQVwkhrgKwGcCvhBC1AAYzzVQI8Q0hxB4hxG4hxCYhRCjTNLJBKQahchjIKiUstxxoVakoh4EOKPwMNlvI5VJNQ5nyXTHMzPnII1/9yauQuBHAowA+DuB8AI8DuJGIokS0KJMMhRDTAXwNwHwimgvAB+CLmaSRLcwglBky6fCGtoVHqvYoRNRcpshW6y+0YFHLlatpqBhm5nIyZXsNgSUALyG+NcfPAfwqcS1b+AFUCyH8AGoA9OeQ1rhHro64bFCMaX6lohTacqbtUSlCu1JNoxMJXkNgPw/gPwFcAeDzAF4VQlyRTYZEdBDA9wC8DeAdAMeIqGyCnMthuiyXgTvR/rv+uqADthdBVA60yRW5RjsZ4VlYpBNupRIimfJ+OUbVZZun3+NzqwH8GRG9DwBCiFbEZxQ/yii3+LtNAD4DYBbi/ox/F0JcSUQ/VJ5bAWAFALS1tSEE4MUXXwSyyJRFJQAAIABJREFU+PX67GOfqsXVP4vivouqCpZHNmVQ88m0PF7zfOxTta7vZUOb8C0/RW0ge5rFmfoW1M8BXnyxNu3zXvI4sfcuuy66d9LdV9P0Uo98/OryLUQe+Uwjm+fSPeu1fdKdZ1KvVLzv9k4++CzfbZ0qz5QgorQHgF3KuaVe83oA+ByAR6TzLwN4INU7F154IXWs2kJElPFvts8WKo+OVVuoY9UWOu/bz3kqg9t5JmmkK4Muj3TlyJWWXtLI9HfuY3Pto1B5pKJLvnhAl6dbGQpRr3zRJtPncknTS5/Jtp65lKcc2iUdHzIvAthBmvHXq+P6Z0KI54QQVwshrgbwUwDPeHxXxdsA/lIIUSOEEAAWA9ibZVoVh3yYK3JNY7yaTEpph09ljlCn+ZVMf7WemZphSuFfM9DDqynbq+P67wH8AMB5AD4G4AdElNUiOiJ6FXEz1W8A7EqU4QfZpFUKZitEnhOh01SyQzJd+6Qb9L0Ir3LkgXTCLVNhl4+FbhMdpeATrzMJENGPKf5NiW8Q0U9yyZSI/hcRfZSI5hLR3xHRsJf3dA7dYjKb1zwzXSHqJc10KHeB6TZQluPgKKMYfFauoaP5mJkVuoyFUj7KkS9LJWBTCgkhxAkhxHHNcUIIcbxYhQS8EagcGrachVe55Wm0yuyRD9oVe31CIVAIE6PhSydSCgkiqieiSZqjnogmFauQXqBrWGP/NPCCcjQhFrpMbgOh6S8GKjybmyoNxv7phOn8ehSCR8oxsMBLmqa/lBbl2kfHrZAwOIPx1Pmz6Ujl2vkMSoNC+DFyTbOcLSETTkjkGsKnS28irFQuB7h1pFwijwwmHvLlkJd5L9++kXzttJCPsWdCCYlsQvhSEdmLScsMUpmhFJFhBgaF+GZFvhXSTPPIV/+YUEIiU5hBqLgw9M4vzAzWG4rhA6rUPAAjJAzyiHIYlPJRhnKoR64wAtdAh2x42wgJg7ygUINSsc1P5VCPcs6jGDA+vsIgW942QsKgbDFetOFyXrVdbjA+vvKDERIGEw5GEzUoB1QKHxohYTChYDTRzFAJA1kllFFFJfGhERIGBgZaVMJAVgllrHQYIWFQNFSixmdgMNFhhIRBUWA0PgODyoQREgYGBhMOZlbrHUZIGBgYTChU8lqYUsAICQMDA4McMZ7NqUZIGBgYGBi4wggJAwMDAwNXGCFhYGBgYOAKIyQMDAzKEjNnzoQQAn13Xw4hBGbOnFnqIk1IGCFhYGBQdpg5cyb+9Kc/Oa796U9/MoKiBDBCwsDAoOzAAmLBggXo7+/HggULHNcNigd/qQtgYGBgoEMwGMT27dsxbdo0+3x4eLjEpZp4MDMJAwODssTw8DC6urowMDCArq4uIyBKBCMkDAwMyhaHDh3C6OgoDh06VOqiTFgYc9MER11dHaLRKABA3A3U1tbi5MmTJS6VgUEcsrnJC8477zzs2rULQJyf582bh507dxaqeBMCZiYxgcECIhwOY9++fQiHw4hGo6irqyt10QwMMgYLCNlEtWvXLpx33nmlLlpFwwiJImLy5MmOuO/JkyeXtDzRaBSWZWH//v04++yzsX//fliWhWg06iin6WRxnHfeeYYuOWDJkiWwLAt9d18Oy7KwZMmSvKa/a9cu1NfXY/PmzWhtbcXmzZsRCoWwa9cu9N3Thblz52LTpk15zXMiwAiJImHy5Mk4cuSI49qRI0dKLihisZgjzDAWiznuG20sDllLZRi6eMeSJUuwdetWEBEA4Prrr8fWrVvzLihOnDhhzyQuuOACDA0NxW9QDGvXrsXq1auNoMgQRkgUCUeOHEEkEgER2UckEkkSHMVGIBDAyy+/jKlTp+Lll1+2r3MZn376aVtQTGSwgHj66adt2hi6eMfzzz+P7u5um3YPPPAAuru78fzzz7u+Ew6HHf0lHA6nzaetrQ1PP/00WlpaMDw8jKamJgBxfl60aBEeeeQR3HHHHfmq1oSAERIJpDMl5MNUdOTIEQgh7OPNN98EADvNurq6nM0ZK1eudKSxcuVK13oAwOjoKGbNmoW33noLs2bNsp+zLAtCCFiWhR07dtjlDIVCSWlOFDzyyCMpzycyZFOSECJphkBE+O53v+u49sYbb4CIXM1P+/fvR3NzM4QQaG5uxv79+9OW47333rP71549e3D06FEAsHn5zjvvxN69ez3Xy5gYjZAAkN7hxaaiSCSCvr4+ewaQqaB45513bNNOQ0MDRkZGAACDg4Nobm5GNBpFS0tL1k63lStXYt26dVizZg2i0SjWrFmDdevW2YO6Wg+G7JNgXH/99RgcHEQkEkF/fz+AuA/jzjvvdKQ5kXDttdemPJ+oYFMS80x3d3eSKUkIgVtvvdXxzgsvvAAgzv8685NlWfYgf/ToUVhW9sMV5/Hzn/8c1dXVnt4xjvA4SiIkhBCNQogfCSHeEELsFUL8t1KUgyGbElpaWpJMLDyw7t69GzNnzsTu3buzNhUdO3YMo6OjOHbsmH2toaEBR44cQTgcxuHDh7Vl8IL169fj7rvvxk033YSamhrcdNNNuPvuu7F+/XptPWbMmGG/K299AAAHDx7E6OgoXn/9dfuaLs2Jgnnz5mHz5s34zGc+g0OHDuEzn/kMNm/ejHnz5pW6aCUHm5IeeOABNDQ0aE1Jl156KR588EHccMMNOHbsGLZu3QoA6Ozs1L4TDAYRi8UcA3QsFkMwGExbHn5HRk1NDT73uc+hvr7eDvlOh3TjwkRBqdZJ3AfgZ0R0hRCiCkBNqofffPNNWJYFIoK4G2hubsbRo0ddzzs7O/Hcc89lVKDnn38eQgj7XNU2jh496rifSew2w7Is7NmzBx0dHY7rnC5r8nze2NiYlIYuDlxm2t///vcIhUIYHh5GMBjEVVdd5VipevjwYUc9dPVpbGy0I0QAwOfzYWxszJ7GL1q0KOfVr6x9AoB1j8Cll16acZsVGitXrsT69evtutbW1jroMmPGjKLF4NttdhcVJb90UGkzOjrquC+bkrhPNjc348EHH8SDDz4IIN7HDh48CJ/Phzlz5uDrX/+67djm9GR66/JR8ZGPfMTxjmVZiMViqKqqAgBMnz4dJ06c8FzPHTt25NzvKx1Fn0kIISYB+CSARwCAiEaIaDDVO8ePH7ensu3t7Thy5AimT5+uPddNdb3g1KlTjvUCp06dctxnTVv+zRSxWAzd3d0YHHRWV9V62KSlPuc2/Z03bx6ICJZl4eGHH8add95pm4YefvhhxzT93XffdZi8GEw7/s8mKwAYGxuzr19//fXYtm2bVtB4BQsIpkWhIl1yAZvumJbLly9HNBrF0qVLMTIygm3btsHv9xctUoadt+UAlTYA8PDDD9smSNWUxH3yyJEjDv4/deoUqqurMTQ0hLVr1+Kb3/ymnQdH2bW1tWHv3r1oa2tzXHfD5MmTHbTi57m/HDx4MKO65qPfVzpKMZP4EIABAI8KIT4G4DUAXycixxxQCLECwAogrnF8/vOfx29/+1scOHAA4XAY+/fv155//vOfx8GDB7F582a8+OKLAGD/MtRzxrRp07Br1y5MmzZN6yTr7+/HL3/5SwejZJrHr371q6SIjl//+teO89/85jeOAZzT27VrFxYsWIBvfOMb2L17N77xjW/g0KFD2L59u50fEWHfvn341a9+hX379sVnV8qAzvWQTV5MO9byfvnLX2L27NmO91555RX7P3fCdPXWnW/duhVdXV12m8pt1nH+17JKM9V5Nu889NBD+MpXvoILLrgA//mf/4mXX34ZXV1d+OlPf4qXX37ZDgq47bbbMHXq1LyU0ysPFTqPTGkzf/587NixA9///vcdM8T58+cn8RW3eSgUwtDQEHbs2IHnnnsO69evx4kTJxAKhRx5rVq1CgcOHMCqVatw0003pSxja2srtm/fjrlz5+Lb3/62fS8UCiX1Ma+0YLz66qvaZwvd5vng5Zz5TA4xK8YBYD6A0wD+InF+H4B/SvXOxz/+cWIAoL6+PooXPfmciGhwcJAA2IeMjlVbks4B0OzZsx3v8Dnfb2hocNznczVNNU/5nWnTpjnOA4GA4zwYDDrOzznnHLsMnNbAwICj/AMDAw5arFixwk4nGAzSihUrHGk2NjY6zuvr67XlFULY/6dOneoo43XXXeeJtuozcj0GBwcdz8pt5va+W/ulOs/mHW7zaDRqX7Msyy4jY2RkhCzLyqrcbrRJVY9U73utVy5pyHwj04aIaPHixY77F198ccq8LMuiiy++2MFvl1xyCVmWZdP/nnvuoUgkQpZlUSQSoXvuucfRH3RlnDFjhqMcfr/f5mUhBF100UVp05DL+9GPftSRnnrulXb5OC9EmnI9AOwgzfhbCsf1AQAHiIhF848AXJDqhTfeeAOhUMjWiNmmrzsXQmD69OmO97181Wrfvn0pzz/44IOU50B8ms1lsiwLPp/PcV+dqqr2VdXOL0cgMebMmeMIT2XnM+f7xBNP2OkMDw8nhWkeP37cMbNgc4HP58PcuXPte2zDBYD333/fUcYnnnjCPteFxHI4JJdLNSNxCLEcDsznlJihbNq0CZFIBJZllWSlbDAYxIoVKzB37lz4fD4EAgG0tLTY5deFQfN1+Vx9huspn6fDpk2b7HIwLbgDZ4NsyqD2n8bGRrtPhkIh7Nmzx3H/xRdfdLQvg3k3Fos5tPuqqirU1dVhzpw59rXvfOc7jjTVcx1UP57f78e5554Ly7Jw7rnn4vjx4ynfl3kXiI89Mt566y3HeaWGxabrozKKLiSI6F0AfxJCfCRxaTGA11O8gqGhIVx44YVJg+xrr73mOGfbJQ98si0x3VetYrEYAoEAXnrpJQQCAYft07IsjI6Ooq6uDq+99hrq6uowOjrqYCY1DNDn89nRGKrAUeO0Vecn5zEyMuLIo7a2FocOHUJHRwf27duHuro6DA0NIRAIIBqNorq6GqdOnUJTUxP6+voQDAYxNjYGv9+PgYEBu3MKIbB37167jEIIvPfee/jwhz9sDzxLlizBwMCA7bT2+XzYt28f6uvrMTw8bOephsSqdND5G4QQGBsbc9CTHeNAfFBcvXo11q5da9uri71S9qKLLsKTTz6JT37ykzhy5AjGxsZw+vRpuz3D4TBOnDiBWCxmhxTLnU4XKp1NKHW+aZFNGfgrcdyfqqurMTo6CiEEBgYGMHXqVLz77ruYMmWKI3LI5/PZ7cs499xz0dfXh9raWgwNDaGqqgqDg4O45ppr8NRTT9kKnt/vx/Hjx9Hf34/f/e536O/vx/Hjx+H3u1vIVZ8dm7TeeustHDhwAA0NDfjtb3/riOqTofIuw7IsR78HUNFhsW59FMA52hd004tCHwA+DmAHgJ0AngLQlOr5YDDoMH+kOuTnZCxYsMB1mqm+J5/zfdU0xOechhCCuru7HdO4uro6EkI4pnWZHJwHl1kIQc3NzY5nqqurHXk0NTU57odCIbucQgiHeUSttxCChBBUXV3tMH35fD7HOzU1NQ76rlmzhoLBoJYORETd3d0khHCYm+Q2FULY+RERRSIR2rZtmyONbdu2USQSKdoUPRKJ0NKlSx10CAaDFAwGbfOHymcqX3BdZD6KRCKOvOT7ujKlokU29UxVhlTvLFiwwL4WDAZtMyUf4XCYgsGgTQeZZ1Qek3kXgE3P5cuX23wUiUS0fS4VDwCgrq4uR704Dz5mzZrlmoauD7uNOzK6uro8mbDKxdzk1kcT9Uoer3UXy+04//zz7coAoJ07d8p2NHrppZeSOqvakP39/dpOzUd/f7/r817uA047OwB67bXXXMupuy/Xi+iMvyFVHlwOPlf9NXv37nWc79u3zz63LMvh09DRTpem6gOKRqOOgdDN3yB35n379jmeUcs1MjLiuO9m/09nZ9fxQiofknxNLgOX2bKslHmpvMi04qOvr8+Rl3pfLWMqWqjwSguvZeA0Vf5X+QhAkm9M5WVdWWTeJXLyUTY8wOVgWJaVlAen4SYM1f4l9x9dPYjO9NN0fJWrzyhT3tY9k66Pkmb8rYgV12qI6EUXXeRYVLNo0aK0aVxxxRUAwDMZ+z+f832351PdJ6KkFaVcTtkeq5bzoosuSnnOK3rd8ggGg7jiiisceVx22WUO2lx88cX2fyEELrnkEvt8zpw5uPbaax3vBwIBO9xQl2YwGMRll13muL9u3Tr7vo4Ot956a1KElVwO9XzOnDl46aWXHPdfeuklzJkzx9FmOqj3M32er0UikaQyXHLJJQ6buQ5qGzOtOA+VdvJ9XTlT0SIddLTIpgyAk/+DwaCjvYLBIK699loH36l9VIWOd2U+ypYH5FXwc+bMSeq3qWin492LL744bbi3buV9Or7zgnS87CUP3TNufTRtIuV8QNGmy/lQzTn5TKe2ttbTu+FwmAYGBpJMAurBU+lQKESWZVE4HKZQKERCiCQTU7qjp6eHOlZtoc7OTu39zs5OW8vxWo9U5e7s7HRoTj09PY6orp6eniTTXHNzs+Mdv9/viZaWZdm0mjZtGvX19TnMTfk81DL29vZq24LLznWV31Hp68VUqz4zY8YMO001YsjtWLhwIUWj0SQzUTZ81NvbS62trRQOh0kIQeFwWNsf5HrPmzcvbX2FENTb26vV4pl3s+nD8+bNc6W/Wk45T9257n2Vv1XenjdvXto03Oop1feYbvytiJkEgJz2bZHR39/viEBSncoq9u7di0Ag4HqfF+DV19cDSL/Yxys4nXA4bDvI0m0nwE69/fv3o7W1Ne3K0oQARiAQ0GqcXsC0/OUvf+n5nVRpqcEJcrtblqV1hquLu+68807cf//9KR20gUAAp0+fRlNTU1LgwL59++xIpv3794OI7Ai6/v5+dHR0YM+ePSmdqDLa2tpsh68OgUDA1Ym8atUqjI2N2esHOGKutrZWGzigfkiK29ayLNuZqwMRuQZ66Fb+y+A22r59O2pra9Ouik6Vxh/+8Ieke0IIe93S5MmTXT+QxTNxlX857aqqKhARenp6tGXgdUHZ9GF2dOf6IS+39++//36bv5uamuxtfHTO83RlmD17th3EwvVN9OMhbaGKPSvI5mhtbbWlLRB3zsrOWtk5y9fUc5aWfC47GHX3WRshijt80+URDAZtpzHfb2trczjz6urqHGmydsTvL1iwwFGvSCRiv+8lT6IzTmQ5Dfn5trY2+/lIJELd3d2OPAKBALW1tdnnQghasGCBI03W7hiy486r4zocDjvqpbYHa89u9JfTDAaDtGbNGkeeKq24vlxO5iP1eZk2Mq2Ikh3Gal11bag6dFUekXlCLSM/ozqNZb4hcgYO6Ggr004tgxut5EAPwOkQVnlXbg9OT35el0eqNNhxLTvsuT/J9Of3mVYqH6h9UEdfho6PdO97oZVMf1055TzVc937uvFMHRvkPpiuDLr+smbNGgIQI50lR3ex3A51MZ3quP71r3+dVkj8/Oc/d7yjOpHV+z/72c8yzkMtl+o0Vh3VqvMvlRPaS55EZ5x/chry83KZdAvEdHmo5ZLLTZTsYM/Uca1rjxdffDEl/eU0geTFXbrOrDpod+7c6Xh+y5YtDtqoTkvVYazWNR2tdDwi84SujJymnIdKf25zPlTayrTT8YyOVlwPpq/sENaVQeYj9XldHqnSAJDkuGbelenP78uHzAcqv6v0Vcvm5X0vtHILyvAqJNT3deVVxwa1D6Yqg66/SONGZQoJM5PwlidRaWcS/Hy5zyT4fjnPJORyeZ1JuNG20mYSTAevMwmZNl5nEjqMh5kE359wMwkA1N3dTYODg7bzpqamhvr6+mwHHoe7cYNxZ9i5c6fDkdXf32+fW5aVpI2o53v37rUHMNa8OaaYG2Pfvn22kzgQCFA0GrXjs5uamqivr88ut9/vp4GBAWppabHvDw4O0ty5cwmIbwcSjUZpypQpdvoDAwM2E6TKc82aNeT3+21HJju3IpEI9fX12efV1dUUjUZp+fLlBICWLl1KIyMjtG3bNqqvryfLsmjNmjUUjUbt7UkikQgNDg7aabS0tDjKxY4zdopxezGtdI5rrgcLBCGEI7RYCJGS/pxmT08P+f1+u8wJhnfUnQcHdgwz3zCPqDzA7RMKhWzazJo1i3p7e+2OpdZVbUPeuqWtrY36+/ttngiFQjQwMGDXKxAIaMtIdGabiQULFlB/f7/NFw0NDdo2V2kr025gYMAWGKFQKKm/cB58bcaMGdSxaovtEO7q6tLyrtweRJT0vMy7XtPo7e2lWbNm0bZt22hkZMQu9+TJk2nfvn32oMcOWSJK4gO1D+roK8Pr+6lopdJfLqcXIeH2PgC7XG5jA/fBdGXQ9ZdEf3hPO/6WWgB4OTKNtMk1esbL0dzcrI2CkBeIZZqml3fSReSoHSBdmrxAjP/39PQkRVKoe0plQyu1U+RKfzn6hig+YMu07+zsTKKVvGjPa53kvYN6enoc5729vUmRP+oiwUzrpe411NnZmTaPXNvH7X2Zvun6lMp3aplnzJiRNmpIpZff78+ovfx+fxIfZBLZJYRI27/8fn9SPdgEJs+UU9EylZAgIm36XiPMUh3p+gvKaO+mjDE2NmZvMTx37lwAcQ99NBrFwoULAQALFy60v8bGUUDs3ZcjQ3Rp8I6rHIXC4O0rOLqJo2u6u7tx5MgRx9bfHDd+4YUXYmRkxI6OOfvssx3bctfW1tpfogNgf4kunPieL29twFEsoVDIsVXy6dOn7TpOmTLFridHORw5csSOcpg5cyaI6P9v7+xi67qyOv5f9/jWl/FH6zimwTjGloqYwR9pi5FQKlGYFF9ERk4lhGAmfRgqMZVRrQqYIJB5GImIkSgGVZonJAqIKi5SHqoKKxDJ1qgv44da41qoeWiZ1m2TVkoljIJp7NhePPjuM3v/7z4fN9PEcbp+kpWcz7322vvcffbea/9PIKfg7uk+FL+1tYX+/n5sb2/j0qVLWFhYwMmTJ3Hz5k2oKp588klsbW1l+t9FN1WrVaytrQURP76vfFkOFzXj7HJ5TZIklWwAkEo2cJpzc3P4+OOP04ie+fl5vPPOO1hcXMT29jYWFxfxxhtvYGdnJ7BbdT9KaXNzEzs7O4F/fZaXl9M68/bbb2N3dxezs7NYWFgI5DGee+45XL16NS2Ps2fPYmtrC2fOnEm/OgjsrwnIkpBxx1UVk5OT2NnZaZJL8NcGXLhwAf39/Wle3becXT1jX7ryqFQq0Xo4PT2dan350TAA0miYer2Ozc3N1JcDAwMAgIGBgWgZz8/Po62tDUtLS6ms+kcffRRImLh7dHV1YXt7G7VaDaqaRi8dPXoUOzs7EBFsb2+n9cwd91lbW0NPTw92dnZw+fLl1DdnzpyBqqYy745KpYLl5eX0nqqKjY2N9B7umXTPcE9PT5rPnZ0d7O3tBZFge3t7aZ12kWl+VJ2/v4h6vR78rkxPT2Nvbw8ffvhhuo9/O9zvk4uS89d1xMoz9rw0PqV8JGrUQfQMWv3z5yR43Le9vV2npqZyxw1FJBj7LTN2XDQmzmmMjIzo1NRU05yCG0MVkWCM26Xp54PHzDs7O3Pz5dLIG5v0x7OBcDx6ZGQk7S47bmfcvVarpTaISJM0RWxOgu1i+RDfTk5TNYzoiUlXuLzm2e371/nWt9u3KZYGz9/wHI/Ll/NnLA2/TuTN5/hp8Fi9X8/YlzHf8lwL26QajmGzXSKiIyMjgV158wkujWq1GuTDn1MAwjkHnhPi4zFf+vOKqvtlPj09HVyTJElQV3ku0n8mY/MmMV/xnESr0iv+dqwOxJ57305Xl/18+L9fqmF5Zkm9APhMI7+/B94AlPnj6CaOICkjLcGRRUVRKEXRNbEKytIE6+vraVcUyJfIcOf72xz5EstXVpSDn0//fD+yJU+2wL+mKIKHo2dYmoKl22N25UXgcJqqzRE9LOEQ8xXbzXXi1VdfDa7xbYrJRMTqAEf5LC8vB3Xg4sWLwTVcJ3LkEqJ2xOoZ+5K3y0Ts8Nwc14Esef5WfMX1349e4ugyPg6E0WjuGs7XxsZGcA0/1xzVyDZxBFbMVyzRU1b2JGub60DsPLaT67KfT9Xm8oxJnjTOP5yNhPUk4mm6NA5LT8K34/PqSbh8WE/izvQkYnZZTyL0lf8MufLwyYuoYu50T8LZc9/1JIDsCJInnnhCgR9LAviRLW523z0kSZKUikJx1xdF1/h2PfXUUwpAJyYmdHt7W/v6+hSAPvLII3rt2rU0jY6OjmiUkCvEY8eO6ebmZlrItVpNr1y5kj4wQPkoB46M4eiaxx9/XIF9ZczbjeBxk1/ValXX1taCib9Y1ErMLpfXJEl0fX09nSR94IEHomlyRA9HwiwtLaVlnmU3+9f/0VleXk6vdw9iLA2OBONoMeeb9vb29E3P/fll6n608iLDHGwH1zP2JUf/cT2MRepx5BDbNTAwoAB0YGCgVGTS0tJS6gsXbebu0dXVFY1e4ugyPu77cm1tLVA/duk+/fTTCkDPnj0b9DwrlYouLy8Hk9qxZzIrAsuvu350k2pzRGFRRBWTVQf8fWwnR8n5+YqVZ6x8hoeHFcCPDm0j0d3dHczEHz9+PIh6GBsba4rQ4WgMX38ndo+i6A0/UsJFA3CEwNjYWBD9wvoqHJXCaR45ciSwiaMcXN7KaLjwD7L74+iN48ePN0XsxCpunu9iESTsK4btikW25KXpGgjHhQsXmvJRZHeZaJuiNLg8Jicng3PKRJfl+TrmO7aD6wCnydtcDycnJzO1frLsOnLkSK6dMV+xnR0dHcE5HMHketdZx/mvra2tKd3JycnCCKm8Z7Kjo6Mw2sw1EI4szbCyxOoA74v9vuX5hsszVj7IiG4S3X9Tv6eZmJjQN99886DNMAzDuG8RkRVVnWg6EGs57rU//nAIvy3HFECL3vJjMe95rXnsTZbfGLg1557B8ePHc9/G2EZ+YxkbG2vKSTgNAAALZElEQVR6A+B8tJqv2Jsq0+paAJe2+5d7L84X/r6Ojo7cnl2rx59//vkmX8XeAPPeyPkNsQycZpmeRN6bL/eYYvWd61VRTzvW+3QL4LLqMr/130494zTY/2NjY7l1s8jG2Bs7+yqvLFw+W+nBqjava/CfC5HmdSz8PPB2rC4X9Vi5PNiXsTTK9iQOvAEo8wc0r950DUXeatus+YLZ2Vlta2vT2dnZ6Fh80Th8bEUvr6jmOQZeuczjumxjY4xQH3vssSDf1Wo1HUvkfLSar9iYN8PzBzym7SpikiS6traW/ni7CBc3Xtrd3d00t5K1ipjniFo9Pjc3p5VKRbu7u1NfsT95PobH9nmsuQw81ps3JxEbd+cxdJ57idV3rldFc3Z5K/ndM8Zj3Dx/cLv1zE+D/T8xMaEA9NSpU6VWcZdZrc6+cjYkSaIrKytBA15GBSFWHq6B6Ozs1JWVlaDB2NjYSJ+H7u7u6Lwgr4CP1WU31J0198Xlwb5klQouz/tiTuLBBx8MHkY/gidLt8cP4+TIo5GREZ2bmwuiEPyonqKIHpeGs8FtcwSVH9UgEmogcYRILDrq5MmTgY1OhsPPl5+PVvOl2hw9wzg7HLEorWq1GuSDIy16enoCm9h3rEfkfsScr1o9rqp67NixIJqG/cmRXe6H1reTI7+KiEUe5UU3cQQPR+OohlFc7hy/vnO9Kor+c/ksiprzy5AjkW6nnnEa7H8R0ampqeCeeXpQbKO7J9cr1mKqVquBL/zoJo5mKoqq8+3wy8OPLHIvM34+WL+LI/m4Lre1tWmSJEE+/Sg6Lg/2pUvDf0Y5jUMf3XTixAn14bUARQqgvIahUqno5uZm0JD46wPcW4B/P47Tjz1YHKvM6x7yVF5j6yyuXbsW2MghfpyPVvOl2hyHzzg7/G2OX/fXRVQqlehnWYs++5kXn97qdsxX7E9eI+LKw7eTy7yI2BoGXifx2muvBb6KrZPwbfBVfd05rFTK+chbR8T1zu3Lq8u8puF26lnsmYzZ6d8zT1mWbVTVaL7YV0Xqz3nKzFnlsbKyEmzzWgwuY14DxNtFazN4PQ6XB/uS0+DyVL0P1klYT2If60mUO65qPQnrSVhP4gvVk3AVxOYkbE7C5iRsTsLmJGxOounPopssusmim7Lru0U3WXTTnYxusnUShmEYRuY6iUMhFW4YhmEcDNZIGIZhGJlYI2EYhmFkYo2EYRiGkYk1EoZhGEYm1kgYhmEYmVgjYRiGYWRyKBqJ1dVViEj619vbGxyfn5/H6OgokiTB6Ogo5ufnm/bNzMwE2/V6HbVaDSKCWq2Ger3e0vkzMzOYmZkJ9vX29gZ2umPub3BwsPCePnz/mZmZaF7ziN2jVer1OiqVCkQElUoF4+PjgQ2cz87Oztzr6/U6BgcHm65pxU5Os1arNZ3DvhofHw/sGBwcDNL07yciSJKkZV8V+S5JklxfcR3iuh6Dy7izszPXt4ODg03lESujPF/y81FUDwFgfHw8sGt8fDz3fE6T81WtVnNtjt2D60BRPsvki+tOpVIJ0ujt7c19fsqk0ar/i/LRUj5jK+zutT8g+3OAsU/x9fX1aV9fX6Z8BcsfFC1zj8kl8FJ5ljtwOkudnZ1RGYIiCYaY3AhLTcQ+N8qrTfkeLCtQBEsssHwIf1ay6NOXsU9AxqQI8ux0K08ffvjh6GdAY/WCpQpYcsHZ5CQbnC6QrwHWKpx3t+q1vb096qvb+fQll3GRZAnLeMQ+j1n0OdIiWY4YLKvB8joMp+mep/7+/ugnbst86rVI+iPrs555+eK6yJ86LpLfKZNGq/4vysd9+fnSWq0WOM0X8mJRNdX9j34PDQ0F5/sCWCykViSYFRNeY9Et9+D54mG+eBsLmhWJucWEC1m0TjUUVmNi92CBsiJYrC0mROh/oF41/Oh6GbG3mKhZnp0uTR/f185Ov16w6BmLtwGh+JuqNgnItQrn3b00+IJxLFzIZcmidUxMxC5P/JAFAd01nIYvrse+LBL4i+EaCB9fqJOJiSUODQ0FIna+MB7bHLtHkYhg7LekTL78uigi6YuT284T8iyTRqv+L8pH1nHcawJ/ABIAPwTwb0Xn8tsGS2z78sxun18IMSldX5K5jPQuSzjzgwU0S4P7EsExaeQ8WWigWQKd5a9VQ4lmJnYPljouwtnp28DS01euXAlsYLnlItlooFkeOc9Ol6aP72tnJ8t2s3wyl4cvI62qTVLUrcJ5B5rlrdlX6+vrwT1Y/jqWBsthF8mqF8neq2rT8+D7skgqPMtOX+pbNZT8Z2Ll9+6772bKX7PNWffIkyOP/ZaUyZdfF4F9eXguUz8NzndRGq36vygfWccbNt1TjcQfA7hQppGwnsQ+1pP48fXWk9A0H9aTaLY5dg/rSRyingSAAQCLAL5appFwD4/NSdichKrNSfjYnITNSdzpOYkDUYEVkYsAvgugC8C3VfVrkXO+BeBbjf//km9nV1cXXn/99XR7cXERr7zyCj744AMMDg7imWeeAYBg36OPPorV1dV0++jRo3jrrbdw69YtVKtVnDhxAp9++mnp80+fPg0AWFhYSPfVajXcuHEjtatareLWrVvpdl9fHzo6OnLv+cILL6Tnv/TSS8H9T58+jdHR0aa8njp1KtPXsXv4aZTh3Llz8FV4h4eHoaqpDVevXg3yWavVcOnSpczrJyYmsL6+juvXrwfX7O7ulrZzcnIySLNareLy5cvBOVwvRATvvfdeeryvrw8bGxtpmv79AEBEsLS0VMZFmXDeRQR+XWZfTU1NBXWI63oMLuMkSXDz5s0gDd+3Dz30UOD7iYl94U8uoxdffDHdZl/y81FUDwHg2WefDfw/PDyMl19+OfN8TvOTTz4J8pUkCXZ3dzNtjt2D60BRPsvki+si09XVFZQpPz9l0mjV/0X5iB0/f/58VAX2rjcSIvI1AL+lqn8oIr+GjEbCx6TCDcMw7iz3klT4EwCmROR9AK8C+KqIvHIAdhiGYRgF3PVGQlX/XFUHVHUIwO8BWFLVZ+62HYZhGEYxh2LFtWEYhnEwtB1k4qr6fQDfP0gbDMMwjGysJ2EYhmFkciAhsK0iItcBrB+0HYZhGPcxP6eqfbzzUDQShmEYxsFgw02GYRhGJtZIGIZhGJlYI2F8YRGR/6Xtb4rI9xr//46IfJuOvy8iR2PX0nlvicg87fsnEXlPRFYbx095x9pE5K9E5J3G8VURmfWO73r7V0Xkz36ynBtGeQ40BNYw7jdE5CvYf/n6VRHpUNVN7/A5Vb0oIr8O4O8B/Hxj/3kAxwCMqepNEekC8CfedZ+p6qN3w37DYKyRMIzPl28A+BcAXwEwBSD2XcgfAPhZABCRLwH4AwBDqnoTAFT1BoDv3A1jDaMIaySMLzI/JSKr3vYRAL7k6h+JiC8Z01/inr8L4DcA/AKA5xFvJH4TwGuN/z8C4INGw1DWzu+q6r+WsMUwfmKskTC+yATDOCLyTQC+CubfqerfeMffz7uZiPwygOuqui4iHwF4WUR6VPW/G6e8KCJ/DeCnAfxKxj1+H8ALAHoBnFTVD9lOw7ib2MS1YXx+fB3AlxuNyX8B6Abw297xc9jvOfwFgH9u7HsXwGBjHgKq+o+NBuF/sP+JX8M4UKyRMIzPARGpAPgdAOOqOtRQOT6D/YYjRVX3ALwEoCIidVX9PwD/AOB7IlJr3CsB8MDdtN8wsrDhJsO4Pb7UGFJy/C2Aq6p61dv3BoBfFJGf8S9UVRWR8wD+FMB/AJgF8JcA/lNEbgD4DPs9jWuNS3hO4t9V1cJgjbuCyXIYhmEYmdhwk2EYhpGJNRKGYRhGJtZIGIZhGJlYI2EYhmFkYo2EYRiGkYk1EoZhGEYm1kgYhmEYmVgjYRiGYWTy/4E5T/UKILMdAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEECAYAAADd88i7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOy9eXxcxZn3+6vTLbVWa0FCNpZtOR/iuVg2BOxkwOYNuwSBUTyZQHDIJcQQg4ycXEJYnbmZ3Axm9bzDmBdMDGIZkD0zSYZ4AIMB4eH1sORCSLzgCfFcEGMbJ95kbNmWZHXdP7qrXaf6qXPq9N5SfT+f8+nu6nNqr3qqnnqqDuOcw2KxWCwWCiffEbBYLBZL4WKFhMVisVi0WCFhsVgsFi1WSFgsFotFixUSFovFYtFihYTFYrFYtFghYckKjLGPGWMX5jse2YAxdi5jbHu+42Gx5AIrJCyWPMIYa2aM/YIxtocxdoAxtokxdo30/7WMsf9kjB1kjP2RMfYCY6yaMbaWMXYofg0zxoak3yvigiwa/32QMfZ7xth3JH//kzG2gIjP9xlj70q/L2OM/ZoxNsAY28sYe5Yx1iz9fw1jbEMWs8iSZ6yQsFjyyz8C+G8AUwCcAOBqAH8EAMbYOQCWApjPOa8GcAqAfwYAzvklnPMqznkVgGcB3Cd+c85viPu9M/7/OAA3AVjJGPuz+H9PxcNS+T/j/4Ex9nUAPQAeBNAAoBXAIIANjLG6DOaBpYCxQsKSdRhjEcbY3zPGdsavv2eMRaT/b2WMfRr/7zrGGGeMnRz/70nG2MPSyPk/GGPj437sj4+IT5f8OoUxtp4x1s8Y28IY64i7n8kY28UYC0n3/iVjbGP8u8MYu50x9l/xEfM/M8bqfdJ1Z3wG8DFj7Kq42xfjI/6wdN9fMcZ+q/HmiwCe5JwPcM6Pcc7f55yvlf57i3P+PgBwzvdxzp/inB80z32Ax3gRwD4Ap8ad/xHA2YyxKVI8T4n/v4oxxgAsA/C3nPNnOedHOOe7AFwH4BBiQscyBrBCwpILlgA4E8AXAJwG4EsAfgQAjLGLAfwAwIUATgZwDvH8FfH7GxAbyb4F4Dfx3z8H8Hdxv0oA/BuAdQBOBLAYwLOMsT/jnL8NYADA+ZK/30RspAwA3wMwLx7+SQD2A/hfHmkaHw9/IoBvA/hZPJz/F8BeABdJ934LsU6Z4m0A/4sxdiVjbLLy3zsA2hljP2GMzZUFaxDiArAjHt9tAMA53w7gdcRmDoKrAbzIOd8D4M8ATAbwL7JfnPMogF8o6bOMZjjn9rJXxi8AHwO4MP79vwB8RfqvHcDH8e/dAO6W/jsZAAdwcvz3kwBWSv8vBrBV+j0TQH/8+/8AsAuAI/2/CsDfxL//LYDu+PdqxITGlPjvrQAukJ6bAGAYQJhI27kAjgGolNz+GcBfx7/fBuDZ+Pd6AIcBTNDkUx2AewBsATAC4LcAvij9fwligq8fsRH83wEIKX48idiIX41jNP7cYNzv/0u551sAfh//7gD4BMBfxn+fHS+HMiLONwD4Q/z7NQA25Lu+2St7l51JWHLBSQD6pN99cTfx339L/8nfBX+Uvh8hflfJfvHYaFcOa2L8ew+Ar8VH5F8D8BvOuYjXFAD/GldT9SMmNEYANGnStJ9zPqBJ0zMA/oIxVoXYLOh/c84/pTzhnO/nnN/OOW+Nh/VbAM/F1T3gnK/lnP8FYsLmq4h1ytdp4qSyk3Nei9iaxD/APYsCgF8CmMAYOxMxoVIB4IX4f3vinxMIfydI/1tGOVZIWHLBTsQ6YcHkuBsAfAqgWfpvUprhTGKMyfV6MoAdAMA5/wCxzvwSuFVNQEw4XcI5r5WuMs75Dk1YdYyxSiWcnfFwdiCmEvtLxNQ5OlWTCx5T8zyAmLCpV/6Lcs5fA9ALYIaJf9Kzg4jNbmYyxuZJ7ocRU9ddHY/nas75UPzv3wPYDuBy2a943v4VgNeCxMFSvFghYckFqwD8iDHWyBhrAPB/IzbaBmJqmu/EF5wr4v+lyjuIqZBuZYyVMMbOBfAXAFZL9/Qgtv7wZbj17SsA3CUWcuNx/apPeD9hjJUyxv4HgMsU/54GcCti6rB/1XnAGLuXMTaDMRZmjFUD6ASwjXO+lzH21fhaRR2L8SXE1kze9ssIlXjnvwzJ+fsUgG8g1vE/Jd3PAfwQsXL7JmOsnDE2HsBjiM1M/qc7GaxMvoLGz1K4WCFhyQV/C+BdABsBbEJs0flvgZg6BTFVyOuILaq+FX9mMGgg8Y6wA7GZwh4ADwO4mnP+n9JtqxBTrfTGR+6CBwGsAbCOMXYQsY74zz2C24XY4vZOxExQb1DC+VfEVViKWkqlIn5vP4D/L/5MR/y//QC+C+APAD5DTLDezzl/1sM/L7oBTGaM/YXk9gaAAwB28NiiewLO+T8hNsO4CbH8/ABAOYC5nPO90q1zEFP7JS7ZustS3LDYgMFiKQziZpibAUQ458fyHZ90YIz9F4DrOeev5jsuFkuq2JmEJe/E9yuUxjdo3Qvg30aBgPgrxKyDevMdF4slHayQsBQC1wPYjZip7AhievmihTG2HsAjAG5ULK0slqLDqpssFovFosXOJCwWi8WixQoJi8VisWgpCjO1hoYG3tLSku9oWCwWy6jlvffe28M5b1Tdi0JItLS04N133/W/0WKxWCwpwRjro9ytuslisVgsWqyQsFgsFosWKyQsFovFosUKCYvFYrFosULCYrFYLFqskLBYLBYfVq1ahRkzZiAUCmHGjBlYtWpVvqOUM4rCBNZisVjyxapVq7BkyRI8/vjjOPvss7FhwwZce+21AID58+fnOXbZpyjObpo9eza3+yQsFks+mDFjBubNm4fnnnsOW7duxSmnnJL4vXnz5nxHL2Mwxt7jnM9W3e1MwmKxWDz44IMPMDAwgO7u7sRMYsGCBejrI/eejTqskLBYLBYPSktLMXfuXCxevDgxk5g7dy4+/fTTfEctJ1ghYbFYLB4MDg5i1apVaGxsBOcce/bswapVqxCNjo1XhVjrJovFYvEgHA6jvLwc5eXlYIwlvofDY2OMbYWExWKxeHDs2DFUV1eju7sbR48eRXd3N6qrq3HsWFG/YdcYKyQsFktRkM+9Ctdccw0WL16MsrIyLF68GNdcc03Ows43VkhYLGMM0dkxxhKdXqEj9iosX74cR48exfLly7FkyZKcCIrm5mY8+eSTrrCffPJJNDc3Zz3sgoBzXvDXrFmzuMViSZ+uri4eDof5smXL+MDAAF+2bBkPh8O8q6sr31HzpLW1lff29rrcent7eWtra9bD7unp4eXl5RxA4iovL+c9PT1ZDzuXAHiXE/2vnUlYLGOIlStX4hvf+EZCr97d3Y1vfOMbWLlypdHz+VL5bN26FWeffbbL7eyzz8bWrVuzHvabb76JwcFBNDU1gTGGpqYmDA4O4s0338x62AUBJTkK7bIzCTc9PT28tbWVO47DW1tbR92IxpI9APApU6bw3t5ePjQ0xHt7e/mUKVN4rCvwpqenh0+dOtX17NSpU9Oufyb1ubW1lS9ZssR1n/idbSKRCF+2bJnLbdmyZTwSiWQ97FwCzUwi7wLA5LJC4jjZaqiWsQFjjHd2drrcOjs7OWPM99lsqHxM63NXVxd3HIc3NTVxxhhvamrijuPkRE0GgHd3d7sEVHd3t5FgLSaskBgl5FM3ayl+AJBrEiYdnuM4fGhoyOU2NDTEHcdJOT6m9bm5uZnX1tbylpYW7jgOb2lp4bW1tby5uTnlsE0Jh8O8srKSt7S0cMYYb2lp4ZWVlTwcDmc97FxihUQOyIUaKBsN1TJ2aG1t5fPmzeORSIQD4JFIhM+bN89okJENlY9pfQbA161b53Jbt25dTkbzlZWVHADv7Ozk/f39vLOzkwPglZWVWQ87l1ghkWVypQayMwlLOvT09PDGxkbXiLyxsZF3dXX5DnC6uro4Y4yHQiEOgIdCIc4YS0vlY1qf8ykkAPCOjg6XYO3o6AgUdjGsI1ohkWWCdN7pVBi7JmFJB1lICNVJdXU1r66uThIcap2qr68nhUR9fX3KdZqKDxV2c3Mzr6mpccWxpqYmJ+qmdAVUsbRZKySyjOM4vLOz0zXa6OzsTJo29/T08Orqal5SUsIB8JKSEl5dXR1YUBT6qKRY6erqcpVhoe8fCAo1mGloaODhcNjViU2YMCGpAxYqFrmjFqqYVDtB3czGa+EaQE4XruX1ECHIgqyHFMvsf1QKiULqLOvr63koFHItCIZCIV5fX590n7DOEJVdjMZMKaR0jyaKdaNZEBzH4U8//bSr/iC+QUyGGikD4HV1dS5hUFdXxwGk3AmadqD5NIEVAmr8+PGuT9N6USzriKNOSBTaFC4cDpMNSLWA8GpoJhRauosZddYQCoX4VVdd5eqIrrrqqlFlD9/c3MzHjx/vqj8A+AknnOC6TyckwuGwaxYsLKNS7QQpofX0008nPWt6XzZobW3ls2fP5owxDoAzxvjs2bONBVQ+BVwQRp2QKLQpHAC+cOFCV6ezcOFCsqHdfffdLre7777bWEgUWrqLFbEIK0bR4opEIi7VR0NDQ1YWR/M1G2xubuYTJkxwCQnHcbjjOC638ePHk+omALyqqsr1CcC4E1TTXV9fb6TKoYQbFcdswBgjZ/8me0s4L54Z6qgTEoU2hTO1pU53JlFo6Q4C1THmq7MUAkI1axSqE1E21dXVHEBG45jP2SC1dnbhhRcmCUvqbCL1HvkyUcdQ6w+iHOTFcABJ6td87pMQ6VPTG2RgZ2cSORASamfS3NxcUCNqsYAnKo/4VG2p6+vryZ2jpmsSxTqToDqI6upq3tjYmJfOEgA/99xzSd28POITnVgm45jLMqRG7upMoqKiggPw7eRF/shqF+FmOhtQwxbPqxZTagfMGCOtoExH8+kg4tjR0cF3796dMH8NMrDLl6osCEUtJKZOnZo08mpsbCQ7mLa2trxYp3iNsmTStW7K1Si0ra3N1Rm0tbWl5R/VQYTDYV5dXZ2XERYAXlpa6ioHquyEeyqbz3TkajZI1ZVQKMRramqSOury8nLftRivOn777be7nr/99ttJVesdd9xBCmZq9iYTiUTytl4kVExyHRCqJxOam5t5RUWFq65VVFTkZBYUhKIWEmVlZeR0rbm52eXW1taW1/NdGGPkKFQl3Q440x045b9Qi8mf6YQDJNua60bpuRwdUvp1SgWlWq2lE8dcqR+ocBhjvK6uztXhqQKxpKQkkR8yXjOJpqYmVzlSnaiYrVAzCXmGIGY2VNh+gzBBJtWYIhy1PZgKiXzv2DbNi6IWEgBthw1FVyxMTuX76uvrc3LGihiZypW9tLQ0qSLpzOna2tqMCjLdg85MKgwAXlZW5kpLWVkZB5By46NGm0LFIHdYc+fOzdnoUHfJ6aY6A9MD8XTkaiFTpEGdSaiC2UvNJuOVZybrcZQFoHhebg9Unov4qB01VQ662bbJrnIKER9hySU+TYUEAP75z3/eJVw///nPGz+fzt4d3T4USuNS1EJCjNBlrrrqKrKynn766a7EX3bZZcaFoctkQylsVNnD4TCvqqpyNSgRXxMVUjgcTlkQmqqqACTtwBUqgFQbH7U/ROSPuo6TTnl5pZ1Sc1AXNcqW0yyER6rkaiZBHXFdU1OjFYTq4rFOSFCzL2onNtXRV1VVkSo+NWzq7CZheaa2GxVqzWfJkiW8pKQkJTVt0FmM7nl5YKd7Xq2nbW1taQ0oqI2AYvBKHPL4R16sQkJUarmAvaxTTFQ+JgTR/wdpaOPGjXN1wJSlhG4hEwB/8cUXXW4vvviiURpNOycAvKKiglzcTLXxUUc6pNv4TKHKUXRsVIcll41wy6QuPFdrEowxMt26NPp18l7lpQ58qqqqkgYuzc3NvLy83FdI6MJW143EbxVqoXjixIlJsw7TY3MyJSTkfol6XldPr7rqKtd9Qd5lIQauVB1Q/QQQ5cUqJKg1CSBmUeFXGOkICS8rlFQrkmhQVKGp1g+MsaQROgB+3333ufy87777jNJIqR9Ew6bysa6ujjuO49LBqp3b9OnTk+KuEzyqcBR+UoI+k1DlKI+A5U9dfDJ5HESurJuoQUEoFOLjxo3zXTwW6kUZrzqulu24ceOSnqdOJRCCwU/lGKSu6Kyo6urqfC2MqLOkZEEofwYREtQ+C/V5XT2tra313X/lFbbaX1BxHxgYEG65ExIAugH8CcBmye1+AP8JYCOAfwVQa+LX1KlTkyyCAPCvfOUrvh21GKGkgs50zWuEZjJt1l2yfzU1NTwUCiWN0CsrKxMVTv40MaE1fcOWXxxlxGjcb/HZq7LKDUD3lrR0FiKpkbuuvNT4nHHGGa46l8pZW1RaMqkzDxKOV7pN1U1eQkJ0rEJIqO1TXZcSz/u938Jr4KJCbbyjNgxS51PpdqTLnbuXuogCMFuToOqp0DLI+eM4Dg+FQsZhq0YFVNzzMpMA8GUAZyhCog1AOP79XgD3mvjV2NiYtFhLVS5dRUp1kVG3y1MchqYWhomA8mpociNzHIc3NDS4nhXrD6bHNasLXgCMbM3D4XCSeWhpaSl3HIfsdKZNm2Y0ElRP8ZTLS1jdUBU4XbNfr5kEdcmNWYyoM2kCK9Ikd5ZdXV1GB92lG45u8xpVd6mNoLpLXScTFj1qed9+++0uP0UdMzG/FbvfxaXbDU8N7uQzpvx2latWeCI82b9zzjnHWEiIvFAX3VXrJqqeivJSB4WmqsmCX5MA0CILCeW/vwTwrIk/jLFExyMaqmztoI4s/BaPTaGmrRMmTOAAtIekURd1H2UpQV0yQ0NDHIDRS2MoKyrguAWW165VXUfCGNOq2ahykO+rrKzUCnq/dKe70EvtTfEKm7pUdVOqdUpHtmzpqfJyHIccXKmqnEgkYlzH1fylzJtFvlHloM7U1IGLbg2SqpPURlvHcfjEiRN91U2Afi+HXz3VUV9frxWsalmpAwVRDmr+mIZd8NZNPkLi3wB8y9AfUpdpclG6VVN06iYA2p2j1KWbusqfoqOVP0UjEJ+zZ8/mAD0bUDtlx3GSjnWmGi41mpKPGBHP6l7XKCquXIkpM8tQKJR0n2njY4zxhoaGpDOVgpydE0RAUbpnOd66BdMgqHtdqDou8jFVFZSu0znzzDN9O0ExSjet49QsUZ0JC9UdZc3mdyyH+r88cDHZaFtSUsKXLFni8pNaB9Ktm1CX6WheTav8Wy2v8vLypHAuuOAC131eJtimR99QbjohEUYeYIwtAXAMwLMe9ywEsFD8/tznPofly5fjlltuweTJk8EYA+ccVVVVGBgYQGVlJQ4dOpTkz+DgIABg/fr1geM5efJk7NmzBw899FDC7f3330coFMLg4CB++9vfYmRkBJs2bZLjLWY/QsCBMYb/+I//AGMscd++fftcnwBw5ZVXoqOjA2vWrMEjjzwCADjrrLNwyy234P7778ebb74JADh69CjuuOMOzJw5E5s2bcKdd94JALj22msTbj/4wQ9w7NgxHDlyBJzzxCcALFiwAJ988gkmT56M73znO7j33ntd+XPs2DFEIhHXs8L9r//6r/HMM88knhfuN9xwQ1Lc5XBGRkYQjUZx4okn4k9/+hPq6+vxxz/+MSnPRb7J8XEcB4ODg7jzzjsT6fvxj38Mx3GMyvXRRx/F9ddfjyuuuCLhdt5552nvb2howOHDh9HQ0JCoUyMjI4nPaDQKILU6BQC33HIL3n33XVd9AICysjJXHW9ubkZfXx/27t0LANi7dy8WLVqEDz74ABdccIFvON/73vdw5MgRhEIhALF6AwBvv/02xo8fn/CTYs+ePQDcZejFyMhIUn0ZHBx05dH7778PAIl0y+lfuHBhov6sWLEC+/fvdz07MjKCUCjkKgfxe+7cua54tre341e/+hXa29sxPDyMkpISnHbaaeju7sYJJ5yQqEP3338/rr32Wlc4oVAI4XAYt912G26++WaEw/ouMhqNGteBaDTq6htEHZo6dWoi3rt27cLQ0BA6Oztdbem1117DokWLEm4/+9nPktoIALz22mt4/PHHccsttyTSePPNN+Paa6919WG6+wDUk5GnJEemLhAzCQDfBvAWgIoA/pBTTd3V0tLCt23bpt0MZYruCA3GWCB1k4zXfZR9vhzGBRdc4Bq1yesXunAos2ETSyTVVFGMcKg1CbGmALithKhRKJVGv52sQLIZn1Cf6cpNLZuBgYG0ysGvXIMg8okarVJufoutXuHoFmGp0bxpGVKXibpJ3EvNJuXyuvXWW7X1mVLTUjMJNWzTI3uoM6KoOP7whz80rgNe9VzNn7POOssVjtjXYrImprOaU0+maG5uJtW3AI7wfKubAFwM4AMAjQH94c3N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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEECAYAAADd88i7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOy9e3xV1Zk//H32OScn5EIgEsPlQA5TSwcO0VaZ+U2hvyqiobY2taPVRtpqsbVGoe9brYKm87bzTtXKDO/v5+AULAWVapjOdKZK8YJKio7Q2ldrh4tMLZ2ChggCIQKBXEie3x8na7v2Omtfzsk5OSfJ+n4+65PsffZe61m351nPZa1NzAwDAwMDAwMdrHwTYGBgYGBQuDBCwsDAwMDAFUZIGBgYGBi4wggJAwMDAwNXGCFhYGBgYOAKIyQMDAwMDFxhhIRBTkFE+4nosnzTkQsQ0SVE1JpvOgwMcgkjJAwMCgRE9JdE9AwRdRBROxH9hoi+OvDbJUTUT0SniOgkEf1e+i1ORDzw2ykiOkxEm4nociV/W2ATURERrSSi1oF3/kRE/2vgt1NS6ieiM9L1IiK6kYj6lOcuGeLmMhgiGCFhYFAAIKKPA2gB8BKA8wCcA6ARwBXSY23MXAZgLIBlANYS0Szp93EDv18A4AUAPyeiG12KvBvAHAB/CaAcwHwAbwAAM5eJBOBtAJ+V7j0x8P6v5OeYedsgm8CgQGGEhMGQgYiiRPS/iahtIP1vIopKv99FRO8O/Pa1gdXxeQO/PUpEPySiZwdWrtuJaOJAHseJ6L+I6GNSXjOJaNvAqnwPEdUP3P8rIjpERCHp2c8T0c6B/y0iWk5EfySiY0T0L0RU6VOve4jo6MBKfdHAvb8YWNGHpeeuJqLfuWTz9wAeY+YHmPkoJ/E6M1+rPjjw25MAjgOYpfn9EDM/COB7AB4gIt08/wsAP2fmtoH89jPzBq96GoxOGCFhMJRoAvBXAD6K5Gr3LwF8BwCI6FMAbgdwGZIr6Ys171878PwEAN0AfgXgtwPXPwPw/w3kFQHwCwDPAzgXwFIATxDRR5j51wA6AVwq5Xs9gOaB/78J4KqB8icjyYj/yaNOEwfKnwLgBgA/Gijn/wdwDIBs8vkSgJ+oGRBRCYCPD9TBFwOC7PMAxgHY5fHovyNZ/49ofvs1gNuJ6FYiqiUiClK2hI8NCMa3iOhvZGFoMMLAzCaZlLMEYD+Aywb+/yOAT0u/LQSwf+D/9QDul347DwADOG/g+lEAa6XflwLYK13XAugY+P9/AjgEwJJ+3wjgewP/fx/A+oH/y5EUGjUD13sBLJDemwSgF0BYU7dLAJwFUCrd+xcAfzPw/zIATwz8XwngNIBJmnymDNT1zz3a8RIA/QA6ALQD+B2ALw78Fh94P6y8Uzxwf56mL0IAbgOwHUmB2wbgBq/+k+79GYDpSC4yawG8CeDufI81k3KTjCZhMJSYDOCAdH1g4J747R3pN/l/gcPS/2c012VyXszcr5Q1ZeD/ZgB/PWDq+msAv2VmQVcNkrb8DiLqQFJo9AGodqnTcWbudKnT4wA+S0RlSGpB/8HM7+ryQFIATHIpQ6CNmccxcyUzf5SZ/9nneVHfdvUHZu5j5n9i5nlIaiT3AlhPRDN98gQz/zcz/4mZ+5l5F4D/F8A1fu8ZDE8YIWEwlGhDkgkLTBu4BwDvAohJv00dZDlTFVv8NAAHAYCZ30SSmV8Bp6kJSAqnKwaYsUjFzHzQpazxRFSqlNM2UM5BJE1inwfwZWhMTQPPnR547ur0qumLzwN4D8DvvR5i5jPM/E9w8XEEAANI11xlMExghITBUGIjgO8QURURTQDw/yC52gaSZpqvDjicSwZ+yxSvImlCuouIIgPhmZ8FIK+8m5H0P3wSwL9K99cAuJeIagBggNbP+ZT3twMhpf8TwJVKfhsA3IWkWebnHnncBeBGIrqTiM4ZKPsCIvLTFlJARNVEtATAd5E0A/Vrnvm/B8JqxxBRmIhuQNL09kaA/K8gouqB//8cwN8AeCpdOg2GB4yQMBhKfB/AawB2Iulw/e3APTDzswD+EcAvAexDcmUNJO3laYGZewDUI6kpHAXwQwBfYeb/kh7biKSdv4WZj0r3HwSwCcDzRHQSSQfv//Ao7hCSK/A2AE8AuEUp5+cYMGEpZimV5h1IOtMvBfDfRNQO4EcAnvGt8AfoIKJOJNv20wC+wMzrXZ49A2DlAP1HkfRPXM3M/x2gnAUAdg6U9QySDvL70qDTYBiBmM1HhwwKDwO28d0Aosx8Nt/0DAZE9EcA32DmF/NNi4FBujCahEHBYGC/QhERjQfwAIBfjAABcTWSNvuWfNNiYJAJjJAwKCR8A8ARJENl+5DccTxsQUTbAKwGcJvOL2BgMBxgzE0GBgYGBq4wmoSBgYGBgSuMkDAwMDAwcMWwOG9lwoQJHI/H802GgYGBwYjF66+/fpSZq9T7w0JIxONxvPbaa/kmw8DAwGDEgogO6O4bc5OBgYGBgSuMkDAwMDAwcIUREgYGBgYGrjBCwsDAwMDAFUZIGBgYGBi4wgiJPGLjxo2YPXs2QqEQZs+ejY0bN+abJAMDAwMHhkUI7EjExo0b0dTUhHXr1uETn/gEXnnlFdx0000AgIaGhjxTZ2BgYJDEsDi7ac6cOTzS9knMnj0bV111FZ588kns3bsXM2fOtK93796db/IMDAxGGYjodWaeo943mkSe8Oabb6KzsxPr16+3NYnFixfjwAHtfhYDAwODvMAIiTyhqKgI8+bNw9KlS21NYt68eXj33XfzTZqBgYGBDSMk8oTu7m5s3LgRVVVVYGYcPXoUGzduRH+/+eyAgYFB4cBEN+UJ4XAYY8aMwZgxY0BE9v/hsJHbBgYGhQMjJPKEs2fPory8HOvXr0dXVxfWr1+P8vJynD07rL/WaWBgMMIwYoXEcNiDcOONN2Lp0qUoLi7G0qVLceONN+abJAMDAwMHRqSQEHsQVq1aha6uLqxatQpNTU0FJShisRgeffRRB42PPvooYrFYvkkrSAhhSkS2UDUwMBgCMHPBp4suuojTQSKR4JaWFse9lpYWTiQSaeWTSzQ3N/OYMWMYgJ3GjBnDzc3N+Sat4LBkyRIOh8O8cuVK7uzs5JUrV3I4HOYlS5bkmzQDgxEDAK+xhv+OSE1i7969+MQnPuG494lPfAJ79+7NE0Wp2LFjB7q7u1FdXQ0iQnV1Nbq7u7Fjx458k1ZwWLt2La677jrbb7N+/Xpcd911WLt2bb5JMzDwxXAwfXtCJzkKLWWiSTQ1NXEikWDLshzXhYJoNMorV6503Fu5ciVHo9E8UTS0aG5udvSPlwYFgGtqarilpYV7enq4paWFa2pqODl8DQwKF83NzTx9+nTH2J0+ffqQWwyCzDe4aBJ5FwBBUrpCYsmSJWxZFldXVzMRcXV1NVuWVVDmCQC8fv16R8etX79+VDC+dCcOEXFjY6PjXmNjIxPRUJBrYJAxCsH0HXS+jSohEYvFeNy4cRyPx9myLI7H4zxu3DiOxWJp5ZNLhMNhLi0t5Xg8zkTE8XicS0tLORwO55u0nCPdiQNA65MYDQLVYHjDsizu6elx3Ovp6WHLsoaMhqDzbVQJCQD8/PPPO+49//zzBcVUSktLGQA3NjZyR0cHNzY2MgAuLS3NN2k5R7oTJ5FI8FVXXcXRaJQBcDQa5auuuqqgzIcG2Uc6JslCLbMQNImg880IiQIQEvIABMAXXnihg/HV19fnncahQLoTp7m5mauqqhyaYVVVlYkEG8HIhy0/F+NMl2d5eTnHYrEhE35Gk9AgFotxRUWFo2MqKiryam5SBz0Arq6udgyQQhBk2YDfaixdBiBPNGGaM0KisDASVuCxWIwnTZrkGJeTJk0aFN9obm7msWPHciQSYQAcCoUYAFdVVQ3Zgifo/BlVQkJ2XAtmnAvHdToTQx30sViMy8rKOBKJ2B1XaH6TTBBUAAym7ZgLb99LIWHJkiUODTXXARvNzc1cXl5uM8JIJMLl5eWDYnyWZfGGDRscY2TDhg05teXnwgKhLlhDoRATEU+YMCFrgsgPQTWkUSUkhiIENt3VsGoXFIIMAFuWxRMnTiy4CKxMEJShpyMk8sEwhivysfGwsrLSjiIUizIi4srKyozzzMWq3g+5EBIAeOLEiQ4Lwvjx4x155sKCIM+vaDTKTU1Njt9HvblpKJhKuqtbVXBFo1GeOHGivduaiHjOnDlZXx0P9aoyiJMsXQEbi8UcE62lpYUnTpw47LWuXCAajfKiRYscY3/RokU53X8jGJ/cPyojTBf56PNMy/Ra8ADghoYGhy/ykksuyamQUOeXZVk8YcIEhx9Exw9HlJCoq6tjIrKZa11dneP3oRhg6UboqCs8IRzE0Rxi9ZXN2P9MV5WDsS8H0eLSFbD5WFXmCrmO2AHAEyZMcJgWJkyYkFNfFwC+//77Hffuv//+QZWZq4WeV/tn4vvyW/AIP4SYgxUVFfbczxVvytS0PWKERF1dnTZ0VBYUQ7FPYrCahBgochL3s4VMdnUHmSheE02Y0YT5TGdGS1fAWpbFjY2NDo2osbFx2JmbhiJiBwCXl5c7yiguLrbHV64EU7Y1iVz4oYLY5tPVvP3Cs+X9UGJFr877bJzZpkZObtiwwf6tsrLSUZ5wnqvmwBEjJILsviUiLaMbzCpdZYxLlixJK1xOXRnJnXbkyBE7/DWbQiKTXd1+Wpgfo5MFtNuqZbRqErp6NzU1cTQazRoDF8JArFwXLVqUsnLNtmCqrKzUnnAwGJ9ELsJR/cZRJkLcb6MnETmc+sICkk1fpNpWkUiEKyoqHNqMKiQEHUpdRoaQAMA//vGPHYzvxz/+saPCQeyyfiYrtRPUwVNVVcVjx44NrJrGYjEuKSmxB4uaotGo7fjLFtRVTJBd3X7OO7+VEwBevny5o+2XL1/uqFc2fBIVFRUcDoeHdKPVYKFqUKIdiChrDBwAx+Nxx9hSx1W2I8NyEd2kho5GIhEeO3bsoNvm7rvvdozNu+++2zG209VeiIgXLFjgyHPBggX2glQ37y3LcoxdlTfpNHXdIlVch8NhHjdunD0/mpqaOBQK2RFUgsc1NTXZ46y8vHxkCwlVnVYrrGPC8ipdmKyESiz+ugkKnZ1dSG4ZXgNK3WGt0iVo8BMS6di0RZlqPb12dfsJCSJy2FhXrlxpr0zE+9XV1Y7+0Qm/dIS0am4Kh8NcXl6eVeY6FNAFL8ybN8+hSQw2Ck8dZ6KN5T7PxbEQ6fRnEOTCrwhAm6cYm5n4QVSfg5gPIk818ktNkUiEy8rK7Od15t7y8nKuqqpyCIFwOGwzfTHn5PEvhJ+wWhQVFTnyLCoqSjFBDmshMX36dLvjxECUw0fVSSCeUZmjzMiKi4sdjSbstjoQUcrKV8fQvSYfAP7whz/sUDflJFRULyGhW4GXl5fb76o2VGHvlFdjwlHuBp25qKSkxF75AOAFCxY43pHNfUHOpEr3AEaVYcTjcR4/fryDYQRZHefjmAcZaiCBGAtXXXWV3Z/CZp0OjbIdXfSzaP9IJGIzLZ3m54Z02iqIHypd+C1WMkE4HNb6TsTYzGQTrp8mAcC2OKhmZiFUZNOPTjiGw2GeMGGCXWYikeCVK1c6tPeGhgbHYkPW3kV5ol9k57lsygPw3zxchURRUZEjzliXZH+DmAwyoxKTSPxeXl6eslVeNYnIgmnRokWOwTFx4kSORCKOeyqjUp1JQuK7CQo/IaGqw0uWLOFQKMTV1dXa6CUAvGLFCkceK1ascK1nIpHguro6x0QXA0owMiHQZNVVmDdEmULbEKsseUAmEgkOhUJcWVnpmAiVlZWuZjBVcAFImbx+q+NCOLJZ1SRkBiNorKys5Egk4qBRNi3oAgV0UXOi3dWxJsain3k1nSifcDjMZWVljufLysoGdVhlLoQEEdlRPvIqXvAOseqXhZ3ffg8xH9x8EuocVOe6PD/c6q0GtFiWxTfffLMr/xBaSygUcvAeuSyZbwq/IYAeHq5CYsaMGY6Orq+vdzBj1XEtBoCq1skdUVJS4mAYJSUlDpVPZiiC6cmMUaz43JiO7hgOALxo0SLHZE5HSKjqMBFxQ0ODgznK0Ut+moSOcUYiEZ4zZ44tVImIZ8yYYa9SiIgTiYRj1SLbVFWGMWHCBCYi2x4vtLA777zTUbdnnnnGU5OTwzqFfVrucz9NIoi9OdeahuqTEBNUmM3i8bjNmASampo4Eom4jjM1gi0cDtv9rYuiEwwsFAq50pmuqUddLcfjcR47duygGHoughVisZh2Pog8AdhmGJHEtRsSiQTPmTPHYWqT9zuJBY28wFGFhKxJ6ISE+HaKGJtiHorFofqFS5FfeXm5g/foxoPG7DY8hcSFF15oNxgAh0quiwMXDaCGycodASTNUJZlpfgDgtqOY7GYK1NRmZK6wlaTsEvKK26VSakTB4BtJgOS2pNYYTD7+yR0jFPQKA9q8benp4evuuqqlFWLbFpQGUYkEnEIYPFMdXW1o1xVw5GhBiLIcd9BtQI/e/NQnA+ltrcsYMUEFk5/gVmzZqVE5cnCDUiaLQREnwNw+L6Ki4vtthpYNbrSme4qXoxfmaHLdnaBdIRwLpzhlZWVWv+B0BREW8mahN/CzW8vkhp+KpJg4HKIMrNeOIr5I8oQY0XW7mXeoc65aDTKs2fPdgipmpoah7Ncmn9DJyQArAfwHoDd0r2/B/BfAHYC+DmAcUHykjWJcDhsrwbcVFs/IeC3ild9EE1NTY4GDjJg1VUjAD7vvPO0ZRKRvfKSpbvK+NQVnhgsY8eOtQeoZVn2KlEX3SQ0BPFuY2OjY+KK+6IMsdoS7dvc3Jxi/5bbQhYS8opGnmiiP2SfhJdarwpYnQnLj3n4rUxzsdtW96w6rmTTndAk5Dwsy+JZs2Y58pFNa6omAYBnzZrlGF9Tp051tP/Xvva1rAsJr/mkq7ufYM9FCKwshL1s9/LxIn5CQhfUIgcfyEJbl9SxHIvFUkzhoVDIod3Lc0qkc88916bTsiy+7rrrHPNc/FWtGJrgkiEVEp8EcKEiJOoAhAf+fwDAA0Hykn0SonEEU9UxGAApm1ZkbSMcDnNRUZFjlaKqghMnTkxhqIJZidVzXV1dYE1CDBZV5ROmmGg0yueff75jQKrmEK+9FjKzFQwESKqoukEphIkaGieekx1tskYRiUQcpjzd5iHZ3yD8PbIQF9qIzPSJyNXRKegYrJDwEgLpMkbmzPwcXqGMsVjMEcUizH9e5+64+SR0SV5IeNUrXVNPECGRbnhpLjbT+fWxOkdUf4EOlmXxZZdd5pgjl112mWMOynPTq61k/6h8hIZsblXzUCMl5XkthEAkEuHi4mI7+EQ2SebdJwEgLgsJ5bfPA3giSD4iukk0hBwJJBiVupkOSDU3iWfE7zrTj8x8E4kEd3R0pDDkaDTKM2bMYMDbJyGvhPwGiEpDIpGw6RbXsVgsxYQl2yPFYFDrIdpBXtX09PTwhAkT2LIsx4mUspBQzWOqsAScjnjxu2z3VQeszu8RjUbtax3TF3nrNogFXWX6mZsA7xh6HfxWkUHgJTTEtZ/ZRY1uCpK8nLFBVvG6oAwxL3WReqpmzey/yz7bx3IE8Un4CTsVfiZdADxz5kxt/6hzUtBUVFTk2EcRCoUcUVnyHFR9EmKRCHxg0lJ5jzqn8xrd5CMkfgHgS0HyEfskapZtTlmptrS0OFbpQvLKjSH/ZU41w7gJCV0SqzHd4JFXOs3NzSkOpSBJODHVDTFiA5+80gSStmBZMAlNyysSTNBtWRbfddddjrYT9Vcd/2KSywNNCBhZCIid7fJ5+cJcJcoA4LD/C2ElCxL1/JsvfvGLjs1DsnM2yLErupWpvNtZJDd7tQ6qQ134x7x29sv7CUQ7+x0TYVne4cI6hi18AuqCSowxv/BU9XgKWWtWNR6Rr6zdy+NGLHC8HLwqcuG4FvujVBOMiPSS20f+6yUk/OaY+N9tf5TKW3QLICDp/JbbWxU6br5OXZL5obwog8s+iTDyACJqAnAWwBMez9wM4GYAqK6uxrZt2wAAZ8+eRXd3NxoaGvDee++hvLwcp0+fBgBs2bIFu3btwu233w4iQl9fHwCgr68PoVAIfX192LZtG86ePYtoNIozZ84IgWVDvX722WdxxRVX2Nfl5eWYNm2afS3oEuXs3bsX27Ztwze+8Q10d3ejsbER9fX1jjy8wMx46aWXsG7dOkQiERw/fhzFxcWYNm0aFi5ciKeeegoLFy5Eb28vAKCzsxP/8R//gfHjx+O2225DZ2cnAGD79u2e5Wzbtg3Tpk3D+++/DwDYunUrAGD+/PkAgOLiYvT19aG/vx8A0N/fj+LiYkddLctCe3u73Wbbt28HM6O4uNi+f+bMGfT399vPdHZ2wrIsdHV14e6770ZtbS2+/OUvIxQK2WVMmzYNn/jEJ3DPPfdg0qRJAICf//znGD9+PIDkGBAQff79738fra2tjv6Q8fnPfx6LFi3CnXfeidraWjz22GN44oknMHbsWLst+/v7ceedd+KOO+5AOBxGOBxGKBRyzdOyLHR3d+Oee+5BbW0tdu3ahe9+97uwLMt+Z+vWrXj88cfx9ttvo6ioCF1dXSAiO4/e3l60tbUBALq6unDixAl8+ctfxpe+9CVMmzYN77zzDr7xjW/g2muvtd/5l3/5Fzz88MO4+uqrsXXrVqxbt86u1+WXX45wOIwxY8bg9OnTYGZYloX+/n5YloVzzz0XJ0+exE9/+lNcffXV2npt3boV//Zv/4b7778/pa0A4NChQwiFQrjuuutw7NgxAEAoFMKJEycAAEePHgURgZnt/rnzzjvR2tqKuXPn4s4778Tf//3fY8eOHZg+fbq2fbu7u3H69Glcf/31eO+992y6S0pKXPvDD1u3bkUkErHHNBEhEolg69atjjwF7eIvAN8y5TYW+cvvrF69GqtXr/bMo7y8HERk8yoxfwDg1KlTuPTSS+1n5TkAwOZ1YmwJumX+VVRUhKeeegqbNm3CmjVr0N/fj5aWFk+a7MxylaDRJADcAOBXAEqC5iNrEtBITdXGKu67qb+A0yQiJ78VuC5aSkCNOlGPCHZL4vcrrrjCcS1WpbImAXxg4pJX6SIvOTxY11ZyPZuamhz3RHvEYjFHCKwcTSbuedVDjrjSmZtE++tsrPLeC7Ei9/PnJBIJbmho8FzxMaeaZeRdqHJ+cnSTl1YAeO/gTScMWtYe1bZav369o1zxLrP+4EgR7y/yjsVijrbx87UkEs6jV4AP9h0J84VspvQa23JblZSUuG46U0FEnuMskxBldd6rIeHinvy7HDrvlmcoFHKMAXnHtVfbqMnNqSyu5QAckQ4cOKBtJ3Wuyr7IRCLBV155ZUpbIh87rqEICQCfAvAmgKp08pGFhKh0fX09HzlyxMEw5I7zGrSqI9Qr6VRE4SgH4DAVyA4nwSzd4qNVmhKJhB0PLVIikXCo4xMnTuRQKORQ+8UmMzehodKtu9aZCfySKEPOs6enxxYKgtnqdvyKwSmb+9Qd7/J+D7cwwjFjxmiPQhCQzTBq1IigXTjtdQ55Efasy0+Yzerr612/U65j4JMmTXK0mRx5lEgkHCHMzMyRSCQlXHjRokUptmfdOGtra9MyV/UsLRXCFyU7wwXTZuaUUGu38a2bkzLEmWtufii35Obg9RMa4n03x7T4XzbtqW2nliF+9wq3D+qP1D0nC2oRmht0jrrlHQ6H7fmbV58EgI0A3gXQC6AVwE0A9gF4B8DvBtKaIHmpmoRskxYVlQegV2PJv2fa4PJ7qoNWPk8FCLZ5Tk6hUMghmObMmePqVI7H41ptKIj9Ux4w8kQbTNv4rSotyxl7rvtd1ZpkH4nb4YiRSISj0agjgkpdxU+YMMGxIRJI2u11TkvdZNdFMgnG6ebHUH0WchnqmHALFxZ0uO2AV7+ZHGR8eYUbC7rlk5YB8JVXXukI/BD9GKTPxbgaP368o39k/5nOD+U1znQ+O7/P5Ir3hb9G3psk6uVVpq6MoHxC1zc6zVh9RtYevHyG6SS5HNmnh+G841oVEm4NpDJTXRId68Z0gkh9eQUibxorLS11MB2xIgvKcMWK17KSIbHCCS87lS3LshmVurFNJHF0s99EE2Xqopt0gsZtUHvt8E23f3QakvhNxwjl8EJ55arbzLhixQqHKU5sOFIdmTpziM7xLTvnhdCWjwtRgyy8xpq6D0TQcNVVV6WMyaKiIgczVaPQgiS/Qx7lkEvVZCjvt/FLaqCHSHIUkC4yzGs+ivnx8Y9/3NFfamSZukFSHcdumoQuCahhuDqNWpShRiL58RK/3+X+CZpUbVKXlM13I0NIeDEYdV+ArrPF/zqzjDCT6DpX3rUq7qnnCcllqOYj10TJQXvzzTenRJCIiSnKdBNuYkCKI7SDDib53CW/yek20NUjT+SJqNIot51g7upGQnVTmV8ddKYhNeQSSB4FImhzE2jyTljVFyN/yEWUAcBhglLDatXvGwdJgj6xWhe+E1GeHC0mfte1uZ/QdoPXh3KIyNYAVC05Ho/zkSNHHBu9ZAZeWlrqGENjxoxJCSEXQlkeI7pxJAtG3fvMqXtjdONW9R/I0WYyjxCQN7EC7kxeRFIG7XOv+aXOF68+TifUHtBGa44cISE2wMkMU2YIXhND/K9zBPk5Z9Xf3E7blMvwM/2I0F71kDTZfi+En1D1dQyBiHjy5MmBB4fXYNHVpbOzM8XMJ5zKso1cN3hFklegsj9H1UbkneBe9RDMVN6rIUIuZX+A22RW6db1s+hf+UMuzMzxeDzluHg5rBb4IJBA1VaCJLmt/fatBNFYvYIuZOiOr5C14mg0ajNkOX+3fUeq8KxZttn3q4le9VA3iOneF3nIO6x1c1NuCyA1oEV1+MraisyPdHX3q4fbeMtm8stTzD/pANSRIST8oh78GkX8LySzuhlF/F9SUuI7uMRKR+cjAZLah9/krVm2OeU7APIGQLle8rc01Ikzffr0wINHrNizNRhVDayiokK76tEJZrndmfVnVHkleSKLVWV5eTlb1gf7HkT/qAe4ifZ1c/ZXVVUF3rfS1NRkr7ESwcQAACAASURBVLxlM43qpxLHqMjlqAsJtx3wblpu0KRbVKmwLP9dxEF3eet2t4sAlHg87tAk5Ig2rzxluuQy5PfdmL7buJHLdFsgqecyCX4kR8lFIpGUU2D90jnnnGPTEbTvMk1ysI9cX2n+jQwh4TV4/BifbrXrdoSuWDV6TUbdql4NO/NLol4XXnhhShSCWi81QiebyY2B+6WgPokgSTBsdfNQOu8nEsmPQk2YMMGxipw1a5ZjlT9//nwxMRz9piYB+UMuItJF3RwnDkeUhYXM3P20FrcgDJ3ZZbArTxmyg1d3bI28CxhwflPEqwzdRriaZZs5kfA/PdWrj4N8sClI+xQXF6cIJnF8uMorvDQJ2cci192rr0SZ4sBFv7GeyXwIkhS/x8gWEkEco3JESDaSTjVlTtp1dUdk6JKol2w/Ff4INY0ZMyaQGWawq8x020h11Hk959c/gsHK4cRBkzoGZEa2adMme9UYi8Xsia0ep6zTgHTHdKgf2xHPCy1GhCSLPNJtU7k/dJqOHzMNmtyOkFmwYAF3dHTwZZddpn1PaEjqYXNqikaj3NjY6DA3id3Pquas7n72Sup3TdRvb4jnxowZ4zqOQqFQWsdyyEeJBPGR6vpSHqvymNDNWTUCK1t97kbniBcSQR3XfnH3fv4IWVvx8g8E7SSdT0J9Rl7lq18205nF/JirLoZerpfOlKDmeeTIEXWAeZaptp1bGHMikfrlraBJQP0olPjkqYiYkk/2ldtbx/hkv4ccOhoOhzkajboeYaIeGTOYyZsLTaJm2WZbYKrmPTfzW2dnp+ObFEGEvk6T0H2Hft68eZ4+IjuR+zlX6uZFIvJdbATxg/hpEm5jUfwv9nWpB4+KVFRUpKVRjaRMt8/THXcjXkgEMTf5DQZmp5rq53TOhp1Q3iToNdGEZqLuGtapoUH3SWSS1IEnmEYQTUJmdvKR57qPPhFR2uq1GpnkFi4snx4s10dnclM3Vql94BZ1op5rle1+yJaQAJyno4pxpSvLsizXRZaw1cdiMXteuPkkAPAjjzziiOaTd+oHoVuFLuxZRGnp2l/ua3kM6M698vJJuCU/XiNSRUVF2gc0uiXd/hsvn4xlWY4F0YgSEm6RFF6btQo11SzbbNdHXcHJq1Jhu5SZg7CfplumboWRrsBzc/h65SP3m9DC5DzEik0cC5HuSkhe8akfhaqrq3Psjla/B+6Vp3zUhRwJZlmWVkh7RSJlknQMNN081egmLyHhlohIuxqWfXjqPFQd37qDOgWjIiJfZ7igWz2EkIhcj9JXk1iM6PxpXpF58rH4QSwbwr8j3xcnz8qbg4MEAeQi+knTLiNHSLilbPobgqRslCfqJUfjqM/IjFd8TElcx2KxrGgO6dZF3eMw7dtP2v+fd955KSYtInLYWN2S2yo/CFMUZrOqqipXoSCYjG43rqpJCKemehSFzEzVL4aJ91S6/OiWr1WGnq1gBVkgy+amoPs5vISfCPdWV8XqN19qlm22ha6qoalfidOlmmWbHafjijIA52eJ3aL9pk+fbu/CD6rp6fZiyPxItIO6aU+UkRSszi8eCrObcMD79V2wRdzgFoyjQkj4NaSfNN63b19aDRzEdu+XRL3+6q/+ynWwyMw1GyYuXbtkEhLrqCsF31muuy92MOuigoL0nVwPEXqs+6xkzbLNKZ/H9EqCgZx77rmOo6rTaadMzE06e7TcBm5He6Qz7oSw1O1MDjpugu4aFhvMhHlVfIJWPFdUVBQoBFZoIvI3FsQxKYDzGy9ue5fUevqVKSDvxQiiScTjcS4pKUkKZ3Ke/5SuJpFudJP4Hk4642xUCAmvJH+HOVtJN6nSOatJDHqRlxgsYvd2ISWv/SlyPfwmjahbIpGwBcvy5cvtiRiLxRyb9NKhUZiWQqFQysF4YoLLK1k3BieHMgoaioqKUr4YFoTGdAMZdEm3IW8wfo5wOOyw7es+XBSEZpVBy8ntID3dZjr5s8R+9RLj7JlnnnH0r2gX3Q54OaJKTUEiqnR7MYIuWoW/TfWl6Bz4fnml079BhYoSQZXCfy2MMFjWB1WKRqP2/4lEAqtWrcp6eSR9G0CgtLQ07XxCoRCYGXfccQdKS0vt7zzoyikrK0uf0ADwy1dXVyD5HQa339wQi8Wwe/du1Ny1yb43e/ZshEIhtLa2oqenx7NMN3R1dWHVqlXo6+vD4cOHUVxcDCJCcXExfv/736O7uxsAHN/BUNHT04Nf/OIXiEQiNg2lpaXo6enBZz/7WbS3t+OTn/yk/b6aDxHZ3/UA4PieRqb40Ic+hMOHD9v5RaNRx/c9dIh9859x2WWXpdwPhULYsGGDfb1x40Y8/fTTePbZZ+12B1LrBQAdHR2O6+LiYixevBjl5eUAgJplm+37L7zwAnp6evDCCy+k0NrT04OHHnoIv/zlL9Hb24srr7wSZ86cQW9vL4qKijzrJbB7927HdVVVlX2/r68Pu3fvRiwWw8yZMwEkvz1SV1fnGFNFRUVYvny5/U0RNxQVFeGKK67ARz/6UcyaNSsQfQBQWVlpf+9Gh56eHmzfvh2rVq1CV1eXZ17qNyR0EO1fUVGBxYsX+44RIPmtCk/kW0vIpSYh3lF3M6eTh1/KhjMpSL38jvHWhbRms55B6i/XQzha5dWPMAXJX18Tq3og1ScizlFKt8+ZP4hQk81NYq+CTKfX8cvyLnDd5i/xnOwvUB2hsrM7W21eUVERaOUpyq+trbW1NtXcIeqmHmnultx+F85ZnX9N/a622Ewnf89EbV+vJMaM7ugQuQ/kT73qVvHpmtnUrwL6zVv1qBsdDXLbD2ZMyNo8EfGCBQsC96esQer4b94FQKZCwu3D4mrcvhgMubDjpzuRdKm2tjaQmSbnUVvkv8dER5d87lJQIS6ffyQLcbXdxIGK6dCkO0RQHi/C9CB+T+eMfvWDNOK+PMnUKKRsCWvRVsJkorOrq0nHlHTXwrGaaRy+cPYTkd228v4RcZS7XA/56PVp337SPuYkyAZKnU9J9I1sQhTHTQg/lK7uQb8PLptK1VBetyQWRWJ8uwkquR0yGRtq+6sbFdMcZyPH3PTee+9p1WHx6UAVxcXFtvkg13CjQUVtbS127tzpuNfY2Jii0jNzILVxMKi5a1OK+u6Hrq4urF+/3mHWExD1aGxs/KCMZZvBzGhoaHA829nZidLSUkybNs1hCujq6gpsehAQZgEBYaI5fPgwioqKUvqmu7s7cH/19vYiHA6DiFBZWWnfX7hwIY4cOWJ/lhX4wOwp8pbNoEERCoVS7r355psIhUI4fvz4oE1Ycjl9fX1Yv369bY4Liv7+fhw/fhwAbHoqKyvR29trt1Fvb6/jGgAaGhpw7733YunSpXh75V/jK1/5Crq7uxEOhwPVq6GhAQ8//DBmzJhhl9Hf34+SkhJMnToVlmVh6tSpKCkpwZo1a7R5bNy4ET/96U8xadIkX7Nmf38/3n33XVx88cVobW31bxipPfzqIbeDF3TjAQCOHz8OIsJtt90G4AOz2po1azBu3LhAtHph2AqJdCbIXXfdhbKyMmzZssVhc80V/BiCYJaqgLjgggvw8ssv25NJMEhmxrvvvpsbYgeB4uJiXH/99VqbphigbhNUxXe+8x386U9/Qn9/v4OZyCgvL/ftPyKyJ0YkEkFLSwt6enrQ0tKiFTgnT570pU3uT/Fd9KNHj9r3Nm3ahKqqKoewUQWPen3kyBHfcsV3i2W0traiv7/flWFkgrNnz6K/vz+wDVsGEaG6utrBZB966CGUlpaivb0dQLIfSktL8dBDDznebWhocPilSkpK0hJU9vsD80l8yx74gD+EQiFXW/5dd92VFj84e/YsNm3a5P+gACUXDadPn3Yd04563OWdt248AEnf62233ebwuW7ZsiXQ4kf0nxeGnZCYOnVq2u+0trbihhtuwNKlS7OyIpcnhG4FkukKb9euXVi8eLHNuOQBnO4KLxfo6elxtF9/fz/ee+89AKnOetEGQdvi7/7u7zB9+nR7lazDyZMntVqLWq5gTr29vWhoaEBRUREaGhq0wiwIfTqH4oQJE3zf84JwsmYCwRB1SNfRr76X7tjt7u7Gxo0bHePCsconCzNmzMDDDz+cokHKaG1txY033jjoOXrixAns378fzIz9+/fjxIkTnmUWFxdrBdNzzz2X8rxX24iFhKP9uR/Hjh1DWVlZioDMBCJvuYyaZZvtYA0dhCPbDczsu2AZdkLi7bff1goKMbDcBtiDDz6It956K7BpwQvyYAmHw56/B4VlWejv78ddd92VUXTUUCAajaZEgfT396O4uBhr164FkIxaKikpcZj2SkpKEIvFXPMtLS3F6dOnsX///pRIIJXp+bVtT08PtmzZYl8LgdHe3u4YG4JON2YrQx1TlmVhzJgxnu+o2qSIsMoW3EynmYy9cDgMy7IyMjcVFRXh0ksvxZkzZxz35dXx7t27PQWEwCOPPBIoyscPiUQCBw4cQCKR8H32jjvuwPz581Pa81Of+pTj2rIsVFRUuOYj+Iqj/QMKyKA499xzHX+zBT+eOOyEBJAUFMzskJJisusmPRHhzJkz+NrXvpZi7x8spkyZAiLKeAUncOutt3rmk65Nm4gc5hW/FUUQpKxgyUIikcD69evtSbBixQqUlpZiypQpAFmIx+MoLS3FihUrXPMV5gC1jtFoFP39/WkJzUgkgvnz59vtKISasIsLoS7ojMfjAPzt0er122+/7fmOEE4yJk6cmDUzUTYWOwJ9fX3o6enBwoULU0xyBw4c8H0/EokgGo1qF0xBEQ6H0dHRoaUhHRAR3nrrLdTU1OCtt97ynZf33nsvpk+fHmh+TZ48GR/96EcD05KOgAwCYeKUTZ2Dheo31GFYCgkdotEoiEhrjmBmlJaW4tlnn8X48ePTcmD7DR6h2vqt4PzKXLVqFW677bYUJiLeS5e5EFFW7dYCoVAIRIQlS5ZoJ0FDQwMefPBBm7GXlpbiwQcf9Jwo3d3dmDJlSkobdnd3IxQKuZpmioqKUphAb28vfvnLX9p5ySr62bNnbYHkoDMDAS8zad0YUR2GwvwhIAvtTJza2XJaA8mFjptGVVNT4/M22Y7qW265JWMazp49i+7ubpSVlWXUHgJlZWX2wm3KlCmee38qKytx4sQJdHV1BXJc79mzJ8WPmCuUlZWBiBz0iz6yLGtQAlnGuHHjsHr1as9nRoyQOHXqFJjZdWPI/Pnz8e677yZDuizL3vzjB19VLOCADqJpCFU7qIbkhf7+/hQTgICXo2rJkiXa+0LghMPhFCeZikxMDYcOHcI//MM/ODahAUlmKDYWEpGjbXp6elKYZVFRERYuXGhfi8kkTCpudAJJgaZbZOj6bvz48fb/L774YsrmP924KCsr0/ZjJlpBNjWJ06dPo6enBz/4wQ9S2t8fjI6ODtx6662D2qxKRIjFYujo6BhU3bq6uuyFm7h2Q0lJCcaOHRvYDBgKhVKCBtzmi9v9oNDxMzHmysrKcPbsWdTV1Q2qDIFoNIp58+YByTDYFAx7ISEaSkxK8VduwFAohM2bN9uryLNnz+LkyZMIhUKDNsOoTKq+vl7rCMo0qkpMGHnizJ07F21tbWnnJdpE0Kdrq1WrVmHJkiU2s4xGo1iyZAnOnj3r6yQbDIgIq1atSllJMrPtyJYZsxdkv4lsbvJjPp2dnbjvvvu0ggpwanOy2bKhoQHRaBSWZdnP6sry3dmaJ7S3t+Ouu+7C+vXrUV5ejnA47BogoK5uszUmmBmtra2DMtvW1tait7fXpu/o0aPo7e1FbW2t9vm2tjasWrXK1nrdfBhyvxORwzzjNl9yMUfEmOvo6EBdXZ3D95Yppn7rZ7jvvvvw6quvAoDWgz3shYSICZajadQGFKtJdVWersomBEB9fb19r7+/3xY0oVAIO3fuxLnnnus62L1C4YLi1VdfxeTJkx33jhw54roiEo7+IG0FODWaXAkFFWfPnsWxY8dARCkMNhKJoKyszBYWXtqbZVmBhYkOusABIVRlLUBeHBw+fFhjchycjypTZMpk58+fbx9nsWHDBskxnxo4kEth50e/1/zZuXMnamtrbfpOnTql3YskMHPmTMRiMezZs8c2J7W0tCCRSNhhtUuWLHFoozotOpvzxa3+Yl7ULNuM/v7+tASEm8ZBRHjnf12De+65R5gK39E9N+yFBPBBTLBbA7pFbASJ5JA1DREP7xYr3dfXZ9s3dSadyspKHDt2zLdMgWg0avskZJ+GjklWVVVpVeupU6c6nKx+bZUPCFPDqVOntCvw3t5ehEIh26EpnPyqkF+yZAn6+vocTmOhdc2dO9eTBiFI1fIty/KNJlHDH1U/h25jYa6Qia8iFovhK1/5in2O0sSJE8HMyfYdZEBGuhg7dqyroA8yf3bu3GkHtej2IsloamrCTTfdhJaWFkz79pNoaWnBTTfdhKamJvuZoV4wiQ1xQe8HgXpmFRGhrq7O5gN+9RoRQiIIQqGQg+Hmyq546NAhx/4B4IPNc+kICCC5cpkyZQoAvQnFC6JMvyicQgAz49ChQ1oGJ0IZ33//fVuo65z806ZNw9q1a1NCTXfs2IHJkydjx44dnjSI0GqZBhHK68d4Vc3s1KlTjo1Rq1ev9nQQDjYybrBYsWIF+vr6sHjxYkSjUSxevBhFRUXYsGGDox5+YeaDRSQSsRcKp06dsudrpvPHD+pu56VLl+Lee+/NWjRSJsiV+Wowi8NRIyT6+voc5ibZdODXMW7mDfm+qtKJFWmmziVxemTS+ezUTAZjTilEJBIJXHnllQ47eDQaRTQaxfTp0wEgZZ+F6uR/++23Hf4HgXg8DiJCPB73jTCTQ6uJCB//+Mdx3nnnaftfvuc3+VR/mYpcRKGlAxHpJRy+bhFpQlMd7D4GN8hHd4iIqVwjkyCLXCMf5l4vjBohAeidwAJeHfP444+nrPaICI8//rh97abSZWrOeeihh1BWVjZgOknuIi4vL0dtba3vXo/m5uaMyswXmpqa8J//+Z949tlnMe3bTwJImgK//e1vpzVJdP179OhR+xiNdJjO7NmzsXXrVhw4cEA7XtKJwKmoqPDcjJVu5Fou0NDQYAtIHbNUowGDRgemC/msLYPCwKgSErpt7UHQ0NCAJ554Ihn9MLCB7IknnkiZSNm097sdbbBz5067DGZGc3Ozg67m5uaCWA2lA90hZ9XV1XjyySdRXFw8qKMaZCcmENyEKA5Ny4aT9vjx446D8FS4mbMGs18gm6itrcXJkydRX1+PKbc9jvr6epw8edI1ashgZKEwRuEQIBQKOaIU0lXx86GWBimzENXlTCDXY+rUqTh8+LAddVJRUYF9+/ZldG5XprZdcdLnYExBROQIq4xGo0gkEvYixU9gZbJfIBcfpBJRQ5s2bcLBf/oSNm3a5Bk1ZDCyMGqEhHy6aGVlZVY3IxlkF+r5XDt27EiJ0gqKwdh2vQ7SC4LLL78ce/bsQWNjI2Lf/GcsXrwYe/bsweWXXw4g1RfmhnQ0ilyFp6YTNTQYTJw4EZZlYeLEiTnJ3yB9jAohIT4NKqIjjh07BmbOu8PQwB2yEzmfUVpumyODQD7Xv/Ufv4g1a9ak+KlkX9iSJUscob3i2xW33nprVupS6CAiHDt2DP39/faeGYP8Y1QIicbGRhCRI1RR3TlpYKBCbI70O2/fC+n4qdTQ3lAolLJ5Kyjj9NNOChHM7IhQy+b5VAaZY1QICTH55J3WfucPGRj09fXhzJkzQ2qa9At/DLKpKhKJ4JFHHskViQajDDkTEkS0nojeI6Ld0r1KInqBiP4w8HfIAv5XrVplmy8KIfbYYHgg2xu4Bgvdnp66ujpHhNtjjz02bAMYDAoPudQkHgXwKeXecgBbmfnDALYOXBsYFBzEJshCDHBQtY0tW7aMiAg3g8JEzoQEM78MQP3yyucAPDbw/2MArspV+QajD7pzrjKFehiiDibwIfuQ/TEGhYGh9klUM/O7ADDwN7vf4TMY1cg2g5GdzgITJ04EKBmiWQg7pUca0v02ukHukZ3PG+UARHQzgJuB5O7bbdu2AYD9V8DvOpN3CrGMkVqvbOUB6M8WynTcqNdz5szBa6+9ljwugtk+NmLOnDlZK2Ok9EcmZQi4HZ0zXOoxEspMgTgHPxcJQBzAbun69wAmDfw/CcDvg+Rz0UUXMTNzzbLNLMPvOpN3CrGMkVqvbOVZV1fHSH5Vy5Hq6uqySnddXR0TEQNgIrLzz2YZbtcjvQxd/4k0nOoxnMsE8Bpr+O9Qm5s2Abhh4P8bADw1xOUbjEBk+3BFr3IK7VscIwVuHwDL1recDTJHLkNgNwL4FYCPEFErEd0E4AcALieiPwC4fODawGDQMAx8eGPDhg0pvqRQKIQNGzbkiSIDgVxGNzUw8yRmjjBzjJnXMfMxZl7AzB8e+KtGPxkYGIxCNDQ04Cc/+Yljv8dPfvITE85bADC6nIGBQUGgoaEBDQ0NiC9/Grt/8Jl8k2MwgMCaBBHVENFlA/+PIaLcfHXEBRf87fOOvwYGBgYGuUcgIUFEXwfwMwAPD9yKAXgyV0Tp8P6ZXuz/wWfw/pncf9LQwMDAwA0X/O3ziC9/2v5/pCOoJnEbgHkATgAAM/8BZiOcgYFBGhgpzFUsWEfLojWokOhm5h5xQURhJGOYDQwMDAJhtDFXGcPZXB5USLxERPcAGENElwP4VwC/yB1ZBgYGBiMHw9lcHlRILAdwBMAuAN8A8AyA7+SKKAMDg+GHQl0tFypdwwVBhcTnAGxg5i8w8zXMvHZgG7eBgYEBgKFZLWfC8FW6jNBID0GFRD2At4joJ0T0mQGfhEEWMFoG7Gipp0FukQ1BVAimn+E0HwIJCWb+KoDzkPRFXA/gj0T041wSNlKhDo5CGLBDgdFSz1whXaYynJhQoWEo2m44zYfAm+mYuRfAswD+GcDrSJqgChaFGm43nAZHrmEYWXCkO27MOMscw6Xt1Pnj9zdTBN1M9ykiehTAPgDXAPgxkkd9FyxGc7idikJlxvmYjIXaFrnGaK33SIY6f/yuM0VQTeJGJHdYz2DmG5j5GWY+O6iSDYYMfoNFMI748qdHPBMphFViPhi2cd4aZIqgPokvInns9+VEdCUR5X23tRnk2YNO6zLtmzsUgqAqBBoAM86GEpm2dVBz0xcA/AbAFwBcC+BVIromPRKzi0IZ5CMV6bavmewGKoKMiaBarlsehTLuCoUOL2TKM4Oam74D4C8GTE1fAfCXAP4mTRpzikw6qRA7dihoykZbjdYoLYPgGIpw1UIZd4VCRy4QVEhYzPyedH0sjXeHBJl0kp+dNsgqxi+CKl2GnI3B5ldmNtoqF5OiEIX2aMZI6Y/ymctR+1gtymcuz2p+2cxTRSH5CYMy+ueIaAsR3UhENwJ4Gslw2BGFdBlhkAiqfKwwCmFVk42dsdnI0w8jhRHmAoUwjrKBk3t/gF037MLJvdn5WrLIL5t5qiik6Mygjus7AfwIwPkALgDwI2a+K5eEFSIMQwmOXDCYXETojBRGmA+MlvlQqCZgP2RLg0pnM92/AfgegL9D8lTYykGVPAxhGErmyLbKD5j+yDfU9s9FH6eLXGyizcY482ubIGWkK0iypUEFjW76BhEdBrATwGtI7rh+bVAlp4lCGIAGmSPbKn8hIVc7XYcbCqGPMzHTDIUZMxttk69FUVBN4tsAEswcZ+Y/Y+bpzPxnuSRMRSEMwGwgG8LOMKXCwlA49YdikZTrcTQUDt906BA05EIjGklablAh8UcAp3NJyGhBusJOF+UwFExptKIQnOO654dikZTrcTQUDt906HCjYaQsSLOFoELibgA7iOhhIvpHkXJJ2HBFtplMIUU5jAYMhcNdxXDZc2I01sJCuhqP+nzQMNugQuJhAC0Afo2kP0IkAwWFOMEzUZ+ND2joMFzMU4VA50gZl9moR7oaj/p80AVoUCFxlplvZ+ZHmPkxkQK+a5AGcjEJMlGfh0LlVuuai7qP1NWvn19quJhMBsvoCkVopEvHcOkfILiQ+CUR3UxEk4ioUqScUuaDQhkc2UY2Bk+mq7PBrOgy6Q+1rrmYOIUYppkLx2gharBDgUJhtoVCRy4QVEhcjwG/BD4wNQ1pCKyKfHRKITCYIMh0dTaYFV0u+iMXWsBg6cwGTWbsBsdwpXskIeiO6+maNKQhsOkiF6vjkbJaGC4TrxBOoh0uTmU/ZDJ2C2GcjJQ5ly6ywb+yhaCb6f5akxYUwnclBNwYei5Xx0E6shAmmoqROvHyEZk0kjFSx8lwQDb4V7YQ1Nx0E5KfLF00kNYCuB3AdiL6clYpyhBBGkhdFQ6WgQfpyFx0XD4ETyEKu2xgpNYrE2Q70iif4zQXp74ONr/48qdRMSaSFZqGEkGFRD+Amcx8NTNfDWAWgG4A/wPAslwRl22oq8JCWCllw+E7FCiEtsoFRmq9/KAbd4ONNEr391wgWxv2ZIauq0d8+dNpMf39P/gMAOA/v1uXMU35QlAhEWfmw9L1e0h+77odwOjTw7OI0cqksoFC0QKyHco7FPUy4+4DqO3tx9DF3gKvZ3KBfI33oELiP4hoMxHdQEQ3ANgE4GUiKgXQkW6hRPQtItpDRLuJaCMRFaebR6GiUBhXvpGLdhiKQIJchPKO5Bh6FYM1qeRqX4sXXcOlvfNFZ1AhcRuARwB8FMDHADwG4DZm7mTm+ekUSERTAHwTwBxmng0gBOCL6eRRyMh2RxbKoWjpwk1FHwwDGYpJkosyhgsTGiyCrK79zDS5CBTQ0TVc/QP5QNAQWAbwCpJHc7wI4OWBe5kiDGAMEYUBlABoC/LSaOzYQjkUbbAYzjZZgyQGqx3my0yjoyPfNAwVssEzg4bAXgvgNwCuAXAtgFeJ6JpMCmTmgwD+AcDbAN4F8D4z++qWI6ljsy3sgkze0ShggZFl/pP70C9vsAAAIABJREFUcCiONFExWjSibGCozqTymtfZ0qDCAZ9rAvAXzPweABBRFZIaxc/SKi357ngAnwMwHUl/xr8S0ZeY+XHluZsB3AwA1dXV2LZtGwDYf+X//f6m82ymf4M+++inSnHjc5148OKirJVxcu8P7HwHW+ZQtVEuykpOtOUonwls21YKAL5tk+165eqv2odqvbJRz2y3hdvvgy0zvvxplEYypyUonYOph64/0n3er42CzGv5f6/nPcHMvgnALuXaUu8FTQC+AGCddP0VAD/0eueiiy5iZuaaZZtZQPzv9zedZzP9m+mzQ1WPoPmo92qWbebzv7cl62002PoM1753a9vZj862k1sZmZSZTv9luy1yVY+g73v9H4TObNdD93+Q/smkjunWW/wP4DXW8N+gjuvniGgLEd1IRDcCeBrAMwHfVfE2gL8iohIiIgALAOzNMC9PpBvLbPABhsq8p/ZPofdXNsw6atvmwowzUsyzw6keI3XfRFDH9Z0AfgTgfAAXAPgRM2e0iY6ZX0XSTPVbALsGaPhRJnn52eMy6YhCZ1LZQiHUU+0f9boQ/QnD2S5fCH0+UpELpp/JIjed54NGTgbVJMDM/8bJb0p8i5l/HvQ9l7y+y8x/zsyzmfnLzNydbh7ZcsrI7wQN4cv1RMtGGZk4tPzKHWomUwgMuRAFVSbIlIkZwZIfiP7a/4PPBO6zdPs4aOSkp5AgopNEdEKTThLRiUCUDBEymQTpCoWhmGjZWJGkm0eQATmc1ONsohAEVb4wWvvcwAlPIcHM5cw8VpPKmXnsUBGZL2Rjc9BInmjDdZU5XOkejgjS1oPtD9OfuUVgc5NBKrK1OWg4DvJCEX7ptl2h0D0aEKStB9sfpj9zj1ElJArRvjySB3muhV+22m44CumRikKco8DoHiOjSkiMZvvyUCNXwi/bk3WoBE0uo1Qyha6MfDPDbMzRbIe+j+SFXBCMKiExklCI+wuGi+aQbfhF2mUaSJDLeurKGAkh4yM99D0fdBohMQygroz89hfkA4VAQ6FgtLTFSKnncKlHvugMenaTQZ6w/wefQXz50/YAMcg98rFay/XeGIPCR6H2n9EkcoBC7ezRgMG2fT42VGZj/02+jlExyA4KWZsxQiLLKOTOHunIly0/H8gHHYVSd4OhhRESBiMeZvVrkA+MlHFnhITBiMZo3exokF8MF60rSLiwERIGBh4YLpPdwCBdBD1E0AgJg4KGWcUbGOQXRkgYFCzMKt7AIP8wQsLAwKCgYLTHwsKoExJmABoYFC6M9lh4GFVCwgxAAwMDg/QwqoSEgYGBgUF6MELCwMDAwMAVRkgYGBgYGLjCCAkDAwODAUybNg1EhAMPXAkiwrRp0/JNUt5hhISBgYEBkgLinXfecdx75513Rr2gMELCwMDAALAFxNy5c9HW1oa5c+c67o9WmI8OGRgYGAwgGo1ix44dmDx5sn3d3d2dZ6ryC6NJGBgYGAygu7sb9fX1OHLkCOrr60e9gACMkDAwMDBw4OjRo+jt7cXRo0fzTUpBwJibDAwMDCTI5qZs4Pzzz8euXbsAAPQAUFtbi507d2Yt/yAoKytDZ2enTUNpaSlOnToV6F2jSRgYGBjkCEJAyCasXbt24fzzzx8yGoSAiMfj2LdvH+LxODo7O1FWVhbofSMkDHKO888/3xF7rpsgCxcuhGVZOPDAlbAsCwsXLswDpQaZYuPGjZg9ezYOrKjH7NmzsXHjxkHnec455zjGzTnnnJMFSocWu3btQnl5OTZt2oSqqips2rQJ5eXltmaRK8hzTmgQ+/fvx3nnnYf9+/fDsiz7vh+MkDDIKeSVlIC6klq4cCGef/55MDMA4JZbbsHzzz9vBMUwwcaNG9HU1IRVq1YB3I89e/agqalpUILinHPOQXt7OxKJhH2vvb19WAqKkydPOjSJkydP5rQ83ZwDgOLiYju0t7+/P3B+RkgY5BRisD711FNgZjCzrXILvPDCC2hsbLR//+EPf4jGxka88MILeaTcICjuvfderFu3DvPnz7f7cN26dbj33nszzlMIiN27d9t5JhIJtLe3Z5HyVMTjcbs8ZkY8Hh90ntXV1XjqqacwYcIEPPXUU6iurh48oR5Q55xAV1cXJk2ahO3btyMSCf65BCMkBjAUqu3SpUsdZSxdujTrZagIYupRke22eP/992FZFogIlmXh/fffd/zOzLj//vsd9+6//37HAB/NyKQPhxJ79+7Ffffd5+jj++67D3v37h1Uvu3t7SAiO2UiIBYuXGi3nWVZjrGtM2vu378flZWVICJUVlZi//79KXnK87i4uNh3Hh8+fNhRj8OHD/vSLEyvRKTVqP3GxLp167R5//GPf8T06dPR29vrSYMMIyTgVG0PHDhgr1iyKSiWLl2KNWvWYOXKlejs7MTKlSuxZs2anAqKTJxmuWiLl156Cbfccgs6Ojpwyy234KWXXnL8TkS4++67HffuvvtuEFHGZY4UFILj0w9jxozBiy++6OjjF198EWPGjBlUvu+++65j9/O7776b1vvCjNnY2IiOjg5MmTIF7e3tiMViNp2qWdOyLBw/fhwAcPz4cViWk0Wq8/i+++7L6jwWNIu2bGxsTKExyJi46aabtPkLn0Q6cysvQoKIxhHRz4jov4hoLxF9PB90CMiq7bRp07B79+6sq7Zr167FAw88gNtvvx0lJSW4/fbb8cADD2Dt2rVZK0OFrHYKVVc19ajIVVscPHgQvb29OHjwYMpvl19+OVavXo1bb70V77//Pm699VasXr0al19++aDKHAnIpA+HGp2dnSgvL8cXvvAFlJSU4Atf+ALKy8sDO0a98P7776O3tzdF+wwCYcb84Q9/iIqKChw8eBCJRAIHDx5ERUVFilkzGo2iv7/fwXz7+/sRjUbtPDOdx3Ke6dCsM736jYna2lps2rQJn/vc53D06FEUFxcDcPokmBlTp04N1I750iQeBPAcM/85gAsApKWXqurYOeec46ue+eH48eMOlVCsJtzKDFKGrOp2d3fj3nvvdajkTz/9dNZ3dMplAsBzzz3nqNeLL74IAJ4mr2PHjjneOXbs2KBoGjdunCO6Y9y4cY7ft2zZgsrKSqxevRrjxo3D6tWrUVlZiS1btgyq3EJEJqajl19+2dEfL7/88hBQCsc48sPYsWNx6aWXoqioCJdeeinGjh076Dwty8KePXtQU1ODPXv2pKzq/aCaMZkZt9xyC5gZoVAIs2fPxsc+9jHbrClMMPJYle8DyR3Zv//971FcXAwiQnFxMdatW4fu7m5X89NHPvIRR54f+chHPGnetm2bo7+3bduWYnp94YUXHM/IQmTnzp2YOnWqXWZXVxeApE9i8uTJ2LFjB6LRKN5+++1A7TjkQoKIxgL4JIB1AMDMPczcEfR9VR2LxWJob2/HlClTXNWzIBASVv7rVmaQMlRVF4CDzltuuQUtLS1ZNanoyuzp6cHYsWPR1taGiRMn4vTp0wDgafI6dOiQoy0OHTo0KLo6OjocZjZBm0x3e3u7TXdjYyPa29tHXHRTpqajjo4Oh/lPbb9cQThvg+DgwYOOeuk0xnTz7O/vd4yJdCJyAL0Z8/bbbweQZJirVq3CHXfc4SgPSDqa9+7dazuY5XIty8KPf/xj3Hfffejs7MScOXPw5ptvAoCr+emcc85xOMP9TLd79+51tKXOt3PmzBnHvoczZ87Yv23cuBHhcBgtLS3o6enBnDlzAAALFiyw27K7uzvw/MrHjus/A3AEwCNEdAGA1wH8X8zs0E2J6GYANwPJTtu2bRsA4Pnnn0d9fT2uvfZavPHGG2htbUU8Hsf+/fvxxhtv4Nprr8XBgwexadMm+x3xV0C9Fmhra8NLL73kEBC6MoOUob4j0Nrail/96lf2tZgwfjTqaA5a5okTJ/Dqq686HGa/+c1vcOGFF+LrX/86Hn74YUy+/VOO/NzaIhM6gaRfYsaMGQ5/hFufyu1b87Fvpl1mkLbK9nWQZ3bt2oW5c+fiW9/6Fnbv3o1vfetbOHr0KHbs2IGaT3u/X1FRgd/+9reoqKgY8nqk8/uvf/3rtPPzeubll1/GCy+8kKI9BanHRRddhNWrV+PgwYP4+te/jlAohN7eXkyYMAFbtmzB2rVrcfLkSdscI7Bs2TK0trZi2bJltlCRy2Bm7Nu3Dy+//LI9ly3L0s6pqqoq7NixA7Nnz8b3vvc9fO9738OePXtQVVXl2zZqW6rPTp48Gbt27cLkyZMdDvZ77rkH3/zmN0FE2L59O1577TXMnTsXf/zjHwPNrxTIEm4oEoA5AM4C+B8D1w8C+Duvdy666CJmZq5ZtpkBcEdHBwsA4AMHDnCyKkl0dHQwADvJqFm22fGuSBUVFZ7XcplBytDRecMNN9jPR6NR/trXvsYAHDTJdOlodrvnVuaHP/xhB50zZsxw5N3Z2en4HQCPGzfO9dqNRi+aFixYwETEAJiIeMGCBSllurWvLk+vtgpKVzav1XtuNAHgI0eOON47cuSI5xjQ9aG4Trdt0q2HDm59fPHFFzv6+OKLL9bSmE6ekydPdtRbvQ5Sj7q6OpsuAFxZWemg87LLLmPLsuwyV6xYwYlEgi3L4kQiwStWrHDUAwDffPPNHI1G7TwXL16snVPinalTpzronjp1qp2XWg+vtpSfEfNYndc1yzazZVnc09Nj5yvGnWVZ9j3d/ALwGmv4bz58Eq0AWpn51YHrnwG4MOjLwgchbHEAUFNTY/9WXFyMefPmad+RIWz3AqpjTL0eN26cwwY4YcKElDLkj5MQEaZMmeKg87HHHrN/7+7uxr//+787aBB+D/F+uuYWXdv84Q9/cDwjroVN9uabb0Y0GnWYAfr7++33icjhgCwuLnasvPxCZKPRKLq6ulBUVAQAKCoqsm2kMsaPH+/w18yePdvTFCds+wLTpk3D7NmzYVkWEolEVnb8Zgq5LVVTUnV1taOeM2fOdPxeVlaWUu8DBw54XqsY7DgCklE8st3dL3rnxIkTmDVrFizLwqxZs3DixImUZ8SubDH2vPqIiFLmoGz2DFqvGTNm2GOPiFBRUeEYi2VlZY4++P73v+94X72ORqPYtGmTw5f4k5/8xM6/uLgYdXV1Dme36oM7ePCgo4/V+fPqq6/a44eZ8eqrr0LFvn37XK9nzpyZwgeqq6sRiUTstr/66qsDm7qHXEgw8yEA7xCR8N4sAPBm0PeJCH19fSgrK8Prr7/u+K2trQ0XXXQR9uzZAwCuYZyqj0HAsqyUPNUJ+frrr6OsrAxnz54F4PxAifwVq6KiInR2dtr2TRnCjtje3o6SkhItTZnsOvZqm9dffx2WZdmDr729HZ/85CfxxBNP4OKLL7afi0ajOHHiBM4991zs3bsXxcXF6O3tRSgUQmdnJyzLQnd3N8aPHx8oRHbGjBnYvn07Fi5ciCNHjmDhwoXYvn27o+1CoVByxWJZOHDgAGbNmoXW1laMHz9em6dq27/wwgvxzjvv4PTp07atebA7frMBlc5QKIT+/n5YloV9+/ahpqYGR48eRWlpKQD9GTtA0q8k+rSsrAw9PT2uTtxsjCMR5ins7n5hnlOnTsUbb7yBiooKtLa2oqKiAm+88YYjekbelR2kj9T5E4lE7LYLWi+1Hh/+8Ifxpz/9Ceeddx46OjqwePFiPPnkk5gyZQoAIBwO48SJE2hra8Pvfvc7tLW14cSJEwiHP7DKl5aW4tChQzZviUaj6O3tRTgcdozvGTNmAEgdA6IekUhEO3/C4TC6urowfvx47Ny5E+PHj0dXV5eDBgB2Hq+88oqdp8D+/ftx8uRJexyJ33t7e3H48GF86EMfwtatWzF79myvYfABdOpFrhOAjwJ4DcBOAE8CGO/1vGpuKi4udqiQcpLvy0gkErZ6RUTc2NjoUMfc8pPVQr8y5s6da5cBgMeOHetJ54QJE1xpYmZubGxkIkrL3BSNRl3LVFM0GuWrrrqKE4mEnQ8RcWlpqeO5SCTCRGS3RXV1NUejUW3bqjRFo1GeN2+erZ7LarpcZiQScbRNLBbT1l3Us76+3lG+aHuBlpYWu15DbW4SUOlU6wnJ/CHqFY/HU/JQk8hDR1c648itHtFolFeuXOm4v3LlSo5Go9o8EokET58+3UHj9OnTOZFI2M8nEgluaWlxvCv6yK2P1fkj6u1XL7d6RKNR/tjHPsZEZJuTFi1aZNcrkUik9E8kEnHQKPpIHsdFRUWOOSXGu26sAuCysjJHPeT5A4DHjBnjoEFcy22jznFxLZvqhNksGo1yOBx2PDtnzpyUtoeLuSkvQiLdJISEqOS+ffscjb5z505Ho+sYuPBbuNnu9+7d6xAKv/71rx3X27Zt8y2jra3NUUZbW5snnbI9WqWJ2d3v4Xata5tXXnnFftayrBT/TU9Pj8NWqWsbUS9dW6ltK0PQ1NnZqb0vX6t5uvkkxLuybd+yLAeNar28mKOuH7PhBxH3ZTpF/+jqqes/t7zFuHEbA0HHkZcfRO0z1c4u56HawJk/aH+Rn9szbu2vmz9uY8SrLeR6iP6Qn1V9cn710PWpOqfkttI9//rrr7vOH7XezOwY237PiHTgwAH7N8uyUsadqFeh+iQyRrIewGWXXWbfi0ajDnOJGz796U/b/+tC4y655BKHje6SSy5x/L5gwQLfMq655hrPa5VOeVek165j0VkCXtdy2wDA/Pnz7f9nzpzpaAcAeOWVVxw2WZWOaDSKa665JqVtZJurmqdMVzQaxZo1a7S/y2Wq7e2241rUU267mTNnprS1Wi83qG0ZBH79IUPtY7V/5D4GUvvPK08dDemMI7d66fpszZo1jj6XMXPmTLzyyiuOe6L9RZ5uzyQSCVea5D71GiNu/aHWIxqN4qabbnLUQ9SLOXk2lF89AGefRqPRlPGvtpW6+1nlA+r7fnzE6xlBo5znzJkzU8ZV0PlhZ1roSVW/Mk2VlZVcs2wz19XV2aubbOQrp6lTp3LNss0pEQ1uqba2VkuTjrbS0lKura113AtqWpJTKBRiy7I4Ho9zcXGxrYpGo1Gb7nTbRrQtM6eYq0SZ8t8gqa6uzjVCJEhqbm62V18ydJEvRMR1dXWez+uiVHR1TTcF6UOvcZHu85WVlSn19OszIuIlS5Zo26a5udm3DpZl+fZ9bW2tnWcm/e3WHytXruTOzk6eN29eoHzi8TgTEcfjcdd2ra+v5yNHjmifkdtKzFe/9hHzx63eIiIqnbZJJBJ84MABjsViNu1i3ldVVXFzc/PI0STOnDnjcPx4wWtXpthUIpxK6W7OCYJ0z5eZNGmSTRMR2TSJv2VlZY4PhaiOUObk7lE12sELovOPHTuGrq4uXHfddbaDsrW11VF+UFx//fU2vbLztby8HADQ19eXVn7AB205bdo0vPPOOw5Htxssy7J//+pXv+r6XLoOXpUGEagg11WUS0Roa2sLfNJmOBxGZ2en51lHbuNChtze6vNegQZ+feYXBbNkyRIwsx01JEM4X/v7+9HX15eyJ6G4uFi7sVCNCHKD2Ciq6w/h+L/jjjtQWlqKHTt2AEjlEZFIBHv37rV3iYuzjUTQyuTJk+22E85zsZtZ7E8QeYrgkLfeegvAB1qDWOG7QTjP3Vb38n23I3IikYi9YRWAvVu9tbXVjr70o0OLfGsJQVJFRYUs7RyOHyLi8ePH29fiGfma2enkUh1aRMRz5861nbFA0jkrO2uDlCGeEXbDuXPnOsqorq52vONFkyhTdhCrZQJJJ764B2mlI67F6o056SATKx/mpCOvsbHR4bgOh8McCoUcZSQSCZuOaDRqO9oEZKcm4HS+RqNRbduJtpXbW36mvr7etS396s3Mjvyy4eBVaRDlqvWSnavqWFV/V9tGtIPc52IFKpchjwu17kHyVAMNgvSZl+NajBGZRh3dunp49bnq9JfHrjpHdWUws+MdXcCKCIIR7aK2XTwed9RNHft+40g3r+X5pNbbKz+5vYP2l6A5SNAAhrPj+oILLnA0suz4AYI5rmVHKJDq0PJyzgYtQzwjUlDHmxtNfmUCqQ72F1980XEtO9xVBxaQdHKqjmu1DNkxp14zpzrq0g0s0LWN6tRX29Kr3sxs56crS6R0AwVUZ6HuOTlQQDdW1d/lttG1g64M9R21z/3yVAMNgvSZ7ODVtYHsKAXAzz33XFr1YHY65AFvp3+QtmJm7XiXn5fHkWVZKW23b98+x/xQx77XOHKb12oe6QawpNNfol5uDvkRIySGmyYhfjeaRGFoEjr4rdhUqDSIe2q9Rrom4dY22dQkxO9Gk3DmJ+dhNAmVSHzgKBKTLBKJ8IEDB2xHVVFR0f9p7+pi66qy87fu9dW9zrUNdrBwwXbsmZC2+IdEdV+MWg1DZEMZGY80DyMZqRVSh6ZKSjsCqVXe+tIHGk3pFGnUh1StkBNR1KqITNSHGPrQKqrwEJK2VkkYhoReKoIiS+SqieOw+uC7T/b5zj4/Nz84hvVJV8nxOWfvtdde++yz9/72d3R1dVX37dsXBcu+fftif3MLofv379eOjo5oQcttaR8bG9PV1dUozZ6eHm00GhFPuVar6cWLF6NKdYF++vTpqJI6OjpU9cYi5/T0tDYajUjmo16vF7LJlbOrq0vPnTsXWyBzvvAXFt0bk/+m4S+W+QtY3d3dura2pvPz8wpAFxYWtNls6qFDh1REVEQiOwYGBqKg9BfqBgYGons6OjqihTrnu5GRET137px2d3dH9eWu53K4a7q6umL+dYv67Eu/3O6tzP1WVlaiDiLtoaaqEVEgFCMhsA1uX4ZfVmeXiGij0YjFaqPRiOrDjejYNy7Oent79aOPPooeSABS44LrvGiaIaJBVp25Og6hr68vaj9cH37b8P2X1qbc4rVb8HUx4vYU9fb2BttoqD5crNbr9WCdu861UqnoysqK9vT0RMdra2uRHx544IGE74rEUahdc3viWC8Sl+3W1+Lioo6OjurS0pKura3p0tKSjo6OFl643vQOoMjPD7oiv76+vlS9FOcUF9g3+7sZ9kXITt8mZtuE7vE38dzMz20icv9OTEwkGD55vuno6MhkBYUYNf5muv379+eygniPQ7vldgwTP9+hoaGY3bfqy9v1y6pzEUkw2tpN099IFYo7VU1ccyd+t6PN5P049vypIr/zyfr5McN14l4CfXB7uZl27V/PbaNerxdKg23w2/nMzEyiDXIMYCuzm4Ab8r2OAeJkIhxTyUkoO5npjz/+OCZP/cknn0SyApOTk7h06VLEEnI6TL29vZH8OIDoC1aOYzw1NYW1tTUsLS3hwoULAJDKbBkYGACwod6ZZadj0xw5cgRnz57FiRMnIhkGIM6sADY0n5jp5bb4u637pVIJjUYjUgyt1+sxueUHH3wQ169fx8GDB3H58uUozxMnTuCtt96K+cYxRAYGBtBsNrGwsID19XU8/fTT0T1nz56N5BVmZ2cTEs/ABstDVXHlyhW8//77aDab0TWOU75t27YYi8SXUbl69Wp0vZOxcMyWUDlVFa+88kokybBjxw5cuHABDz/8cCS9ffXqVezatQvNZjNi8FQqFZw+fToWe3zs5DEcXAz4LKBQfXBMLCwsAEDkSxeHO3fujH0c5syZM1EsuzoPsZtOnjwZnVfVqH6GhoawuLgYNXr+PohrFy4PZ+fIyEjEogMQsei4nH19fQA2vlDXbDaj62u1Wkxy+9NPP41scJIdLMvvyuHnEWqTzrfVajXGZArJi/tt7PLly5GEtvNVT09PjN30xRdfYG1tDRMTE1DVmMT2+vp6jAGXJ3PP7drZ7fJ0vnGsr8nJSTSbzZhUeLPZjDHxnJRPWvzv3bsXly5dQmdnJ65cuYL5+XksLS3hhRdewNraGo4fP45jx44Vl63Z7FFCkZ/fe1er1cSahL+eoKqJ+WnV5Lx51nyniOjY2FhsrnJubi4xL8hz9zzfzGmynf7cJc8bAsn5UHhvHe6Y57z9ufqsdRBXLp6rdGn6/vbnYcfGxnTfvn2xcvjzm0XmVENzw729vbFr8mRU/PnoUDk5Btj/1WpVp6enY+tOtVotNtfv+5uP0+rDXwPi+uCYYF8CG1M2LJPCefCahG+HLy3B9cPwR2lZ8+ZcDi5ntVqN+d/FkB8jXD9Acp3JL4eTzkhrky6PvDWJrHh3vnS+4TUJEdG5ubmY7/Ji2b8mrV37efq+CT2bQuXKi39+Xo2NjemhQ4dieX7l1iT4QcmMEZZkCAULb7/PY074DIRSqZTYzh+qOGaucJpsJ7MWWN6XmRWhPNkXzPpJY1S5cjHrIZQH+8JPQzUpXZDGzvDTZJYJszN4bjtPRqUIK4gZbHzMvnv99ddjx0ePHs3Nw2eThdL0Y4J96XydV+fMwPHtLJVKsTj064fh+zeLgRMqB5eT64OlJ0L1w4y1N998M5YGs7bYJs4j1O6z4t350vkmxG5Kk9j208hiI+Xl6fsm9GwKlSsv/vl5VSqVtNlsxvLkNttKZ+t2ErdzJOGcejeNJFweW30k4fK8nSOJtOttJHHrIwkHG0ncmZFEkTzZN/xsCpUrL/7bGUlQPlu3k3BOWVlZiVgR5XI5yExybACfocOr/XnMCccCGhwc1NXVVd27d68C0KmpqYgd4CoujdniWAz33HNPpp1u0ZcZCGnMCt9uZnq5xUcneJfFqArlubS0FKXJsgOOzbSwsKAAdH5+PsGUUC3GGuJr3ILatm3bgiwSvp6ZLWnl9GOA/T8+Pq7Axsdams1m9DCuVCqJ/S58vLy8HHXOfgwwm4zrg2OCfdnf368AdOfOnQnGThF208mTJ2MqpqH6CSGPgcMsOi6nW7jt7OzUZrMZXV+r1VLZZswW43L4eYTapC8lw+y/tNjjeHe+6unpCbKbpqamFNj4aFbRWG43T/YNP5t8JmXR+Ofn1cGDB7Wjo0MPHjyYGRNbupPg1XwScX/7AAAMfUlEQVQnf+ucy6yVmZmZBLOF6XvMcqjX67E0+AtWExMTMbbA4uJiLkOnXq/n2uljcXExlgen39fXl7Cb2RzsK5+hUSTPxcXFRB59fX2xcszMzCTu8ZGmiZR1TRoDJ+16ZiaFypnHbhoaGspksuT9SqVSbgxwmhwT7EtmygwNDSXKUYSJlFU/IXAebEeeb6rVaux+jssQHbkI2ymrTXIeIRZQXryzLzs6OnLZf3mx3G6e7BtufxMTE23HPz+v9u/fnxsTSOkkZOPc3Y2pqSl95513NtsMg8Fg+MpCRJZVdSpxItRz3G0/VoF1G26yel5GiLuf9VbJb1I80piZmUn07vymw2nyWyfbFHqb5tEQv5Xwmw6/YfCbK4+oQiOuvHLxW0rIV1l5ht6u8t4q+Q2P34RC+2LyRkQTExO3PJJgX3Gdc9m53MxfZ5tCdc5lDcVN1ltkaLTCefA9HGccA1yOvNFmKPZCPs7Kk/0wMTGRumchzf95I4XQSDvPVyG7fOSNPkP7kPKecXkzJ4yQn7CVp5uA5Bxd2s5MPq96o4Po6urS5eXlBBOH56d5TpbXLEK7unnOlNN084b3339/cDcu70AN7WwulUra09MTzW/ynCnPVfIcOK/N8Fy0vxs6rVw838nz6Hl5uobnz9O6r5rt2bNHL168GDWQUqkUnCvmOdWs3dBpaytONvrRRx/NXZNgphWvSThfcZ3n7XzlHe9sU6jO2VduQblWq2mj0dCHHnpIAWh/f39wPjpt3aNcLkd58D0cZxwDXI68datQ7DlflsvlYBvlPNkP/ty92/nNa1vs/7w1h9CaXX9/v/b396f6Ks0u9zzi3dK8vpOlIJH2jAu143Z2yHvrnde2bCfhazepZmu88Hl3jc/YEZEEO4OZLj67g9lP7hr/mNkXoTTdZw99m/xy+MyKkEbSwMCAViqVWJ4++8J1Qr4NbLfP8mJWi0vDp8rlMb2cr5wNeXm6NJjxMT09HSuHz9Bh1olqnJ3h7udy+NezP6vVqs7NzSUYPP6xzyzyO4msPPw657JzuavVuHYW26SarPOQr3zfuLrwj31mC9eXqsY+jxm6h+OMY4DLkceAc/cwo6pSqcTaHOuOcdz5fgjVh7vPT8P3fx57KcT+GxkZiekmhfzLdvHzyr/fdYzuvEgxLTo/zVA7bkdri/y0NTsJXwVWVWMcYCDJKw7taVheXo4dM8+bOfPMyebP/4UeGHwPp8n7JrLUbDk91SSt05XdPdSBJH+a7fbVIYFinxbN2jPizvs2ZOXp0mDueKPRiKXBn13lfRQ+99/d3045nO/8Y94L4CuZAnEef1oevBcmS40TiKvwsk3unlAe/j2+b0r0iVrmyHN9hfII3ePHWSgG/HJk7aXxy8F7M3ifESsYc56+H0L1oaoJX7D/s/ZBhPYRlUql2EtAyFdsF9vNCq78LCqiOM1ppn1uNgQXAyl+2pqdhI0kNmAjiRtp2kjCRhI2krgRy1/7kYTrCGxNwtYkbE3C1iRsTcLWJBI/YzcZu8nYTcZuMnbT5rCbbJ+EwWAwGFL3SWwZqXCDwWAwfPmwTsJgMBgMqbBOwmAwGAypsE7CYDAYDKmwTsJgMBgMqbBOwmAwGAypsE7CYDAYDKnYEp3E+fPnUavVICKo1Wo4cOBA7Pz27dshItFv+/btiTTc/e5XqVQwPj6OcrmM8fFxzM7OxvIYHh5GqVSCiKBUKmF2djaR5pEjRzLTmJ2djZ2fnJzMTHNycjJho388PDycyJPT5HIODw/fsv85zyNHjsTOz87O5voqL83h4eGY3V1dXbE0JycnM33NMRGyi/3JcdLV1RU7Xy6XY/dv3749Uc68GGC78nzJMTA5OZkoF8c7/0qlUmYeHCPOzjx/tlOfReqH8+Q2x3VeJO7aLQfbfeDAgcxjtqFIGnwPx1lXV1emX0JlaDfPW0Joh93d9gOQuuU8bYu5v9PS7UR0n0BlmQeWFcj71KjbiZklscDSBHkSACwvwnILIfmEPFkOd8/Q0FDm7ssshKQJ2v1caV6aLGXAMih5MhAhGYJ2P5HKcgnO/+VyOShP4srZ2dmZGgN5shzsyyISMxzv8HbNLi8vR+UUkWAe3Bbc5zOz2li7MVKkflhKgttc6JPBReJOJP2zxXl2s8RGkc9+5qXB93CcObmYer0e9EsRWZuinyfNA7by9yQGBwdjhfHFq1xg+WBhPNco/PMspucLlImITk9PxwSy+APoeWJtLHKWJybmHg6+zSz0xUJseQJ/qhp1FDeLkMiZL9Ymkv0h+CJpAnFRNBZUzBOUU00KmrFdzp9chy4P13D9+30BRhY6VNVE/eTZledLjgHVsFhlSNTO95Xr4NLy8NuCn4aPLIE4Rl5bCKXHonTc5rjOuRyhuGM127xysN0s1sfHbEORNPgejjNVjcV6EbG+dvMsiruukwBQBvAugDfzrt2zZ0+sMCx3nSF7G12zsrISHbP0NJCUbGbJZ5Y+zpN9ZrlkIFuW2J3302PJ4HalwlU1UY52EZJLZpnu1dXV2Hn2VV6azt9pcuN50tSqSWlktivkz5AcvH89S7kXkW7PsquIL4vI3vvxDsQlzEulUkzyPJSH3xbc37i+sqSmGXltIZQekJQK92OV6zxUDo67dsvBdrPsNx+zDUXSCNntx5mqJj4hkCf73W6eRXE3dhI/BLBYpJOwkcQGbCRhIwkbSdhI4msxkgAwCOAEgG8X6SQAW5OwNQlbkwjFu99J2JqErUnciTWJTVGBFZHXAfwZgG4AL6jqdwLX/ADADwCgs7Pz19bX13Ht2jVUKhU89dRTeP7556Nr5+bm8Pnnn0fH3d3deOONN2LpzczM4Nq1a9FxuVzG0NAQzp8/j+HhYdx333147733ojzuvfdeXLx4Mbp+amoKL730UizNEydO4NVXX01N45FHHsFnn30WnRcRfPjhh6lpPvvss7Hz5XIZ169fj477+/vx3HPPxfLkNCuVSqyc/f39eO2115KV0Aa4nM888wwef/zx6PyLL74IX6U35Ku8NJvNZszftVoNV65ciY5HR0ehqqm+5pgI2cX+5Dh58sknY3mKCPz20d3dHYuzqakpPPHEE5kxwHbl+ZJjYHR0FIcPH46Vi+M9hJGRkdQ8uC04O48dO5bpzyzktYVQei+//HIsT25zXOdF4m5wcLCtcrDdu3fvxqlTp1KP2YYiafA9HGe1Wg3Hjx9P9UuoDO3mWQSPPfZYUAX2S+8kROQ7AH5LVX9fRL6FlE7Ch0mFGwwGw53F3SQV/iiAORH5BYCjAL4tIq9ugh0Gg8FgyMGX3kmo6p+o6qCqjgD4PoAlVX3my7bDYDAYDPnYEjuuDQaDwbA56NjMzFX1bQBvb6YNBoPBYEiHjSQMBoPBkIpNocC2CxG5COCjzbbDYDAYvsLYoar9/Mct0UkYDAaDYXNg000Gg8FgSIV1EgaDwWBIhXUSBgMAERkQkaMi8oGI/JeI/FREdonI/4nIqdbffiIiJREZaf39XRFZEZF/F5Hf9tL6HRH5q9b/f1lE3m6lsSIify0is63jUyJyWUT+u/X/v/PSdud/snleMRg2mQJrMNwNEBEB8I8A/lZVv9/6224A9wP4QFV3i0gHgCUA8wB+1vr7nta13wDwDyJSUtW/oeT/EsCPVPWfWtdOqOoZAP/cOn4bG9I077SOR1yed7DIBkNh2EjCYAAeA3BNVaO3dlU9BeCCd7wO4N8A7OSbVfXn2JC+/4NA2r8E4GPv2jO3z2yD4c7DOgmDARgHsJx1gYhsA/A4gLSH/M8A/Erg7z8CsCQix0Xkj0Tk3gL2jLamsv5FRH6jwPUGwx2DdRIGQza+KSKnAPwrgGOqejzlOgn9sTX99KsA/h7AtwCcFJFqRn6fABhuTWX9EMCiiPTcrPEGw63C1iQMBuA/AXwv5VzR9YE9AFZCJ1S1AeAwgMMi8h/IGLmo6lUAV1v/XxaRDwDsAmBa+YZNgY0kDIaNBemqiPyu+4OI/DqAHUVubi02/zmAHwfOPSEildb/BwBsB/A/GWn1i0i59f9vAHgIwM+LFsRguN2wkYThaw9VVRH5LoC/EJE/BnAFwC8A/GHGbd8UkXcB1AB8DuDHAWYTAMwAeFlE3KfIXlTV/81I9zcB/KmIrAO4DuD3VPVSeyUyGG4fTJbDYDAYDKmw6SaDwWAwpMI6CYPBYDCkwjoJg8FgMKTCOgmDwWAwpMI6CYPBYDCkwjoJg8FgMKTCOgmDwWAwpMI6CYPBYDCk4v8B+bvevK1ryKsAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEECAYAAADd88i7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOy9eZxU1Zk//H1uV3VV7wvdNktDF1GZdAo0QWYmA0aTAI0a03FGR23JYjQSGiH5RBNByO9N5p1xY4b3jcOMYlBUos0kEz9RhmggsQeJEsmrWYCWMZIRkEVla4SGXut5/6g613NP3Vt1by1dVd3n+/ncT9Xdzvqc5znPcs4lZoaGhoaGhoYdjFwXQENDQ0Mjf6GFhIaGhoaGI7SQ0NDQ0NBwhBYSGhoaGhqO0EJCQ0NDQ8MRWkhoaGhoaDhCCwmNjIKI9hHRnFyXIxsgok8T0cFcl0NDYzihhYSGRo5ARH9FRM8TUTcRnSCi3xLRV2P3Pk1EESI6Q0SniehN6d5mIrpLSmcCEbHDtQlENEhE59vk/zMi+pfYfyKi7xDRW0R0jogOENH9RBSQnn+CiP7JoS77Yu+diR1bMtdSGrmEFhIaGjkAEf0NgE4ALwG4AMAYAO0ArpQeO8zM5QAqASwFsJaIPgZgG4DLpecuA/A/NtfeYuZDAF4E8CUl/1oAVwF4MnbpXwEsAPBlABWxcnwWwE88VOvzzFweO1o8vKeRx9BCQiNrIKIAEf2AiA7Hjh8oM9O7iOhI7N7XYjPfC2L3niCih4johdjM9BUiGhtL4yQR/Q8RfUJKq5mItsZm5V1E1Bq7/kkiepeIiqRn/5aIdsb+G0S0jIj+TETHiegnMQaaqF7LiehYbPY8P3btL4noPSLySc9dS0R/cEjmnwE8ycwPMPMxjuJ1Zr5efTB271kAJwEIITGLiMT4/RSAHwCYoVzbFvv/JBQhAeBGAF3MvIuILgSwCMB8Zv4NMw8ycxeAawFcQUSfTdQeGiMbWkhoZBMrAHwSwMcBXAzgrwB8FwCI6AoAdwCYg+hM+nKb96+PPV8HoA/AbwD8Lnb+UwD/TywtP4D/ArAFwHkAlgB4moj+gplfBdCD6KxY4CYAHbH/3wBwTSz/8Ygy4n9PUKexsfwnAPgKgB/G8vn/ABwHMFd69osAfqQmQESlAP4mVoekiAmyvwVQDWAXgN8CCCDapkBUa/glgL3KNSEkfgagjogulZL9EoD1sf+zARxk5t/K+TLzOwBeVeqUCE8T0VEi2kJEFyd/XKMQoIWERjYxH8D/zczvM/NRAP+AD2e01wN4nJm7mPls7J6Kn8Vm172IMrpeZl7PzEMAfgxAaBKfBFAO4H5m7mfmTgCbALTF7m8Q/4moAlEzy4bYva8DWMHMB5m5D8D3AVwnawQ2+D/M3MfMLwH4eawuQHTG/sVYPrUA5uFDYSSjBtGxdyRBHgAwnoi6ARwD8D0AX2LmN2Pl3AHgslg+1cz8vwB+LV37GKKmLDDzOQD/iagpCTHN4RKpbHUJynIkdj8Z5gMIAWgC8N8ANhNRtYv3NPIcWkhoZBPjAeyXzvfHrol770j35P8C70n/z9mcl8tpMXNEyWtC7H8HgL+Lmbr+DsDvmFmUqwnAz2Jmqm4AewAMAWhwqNNJZu5xqNNTAD5PROWICo5fM7Md8z0JIAJgnEMeAoeZuZqZa5n548z8H9K9bYhqC58C8HLs2svStXekOgJRAXY9EQURFdS/YOb3Y/eOJSjLuNj9hGDmV5j5HDOfZeb7AHTHyqFR4NBCQiObOIwoExaYFLsGRGeojdK9iWnmM1Gyx4u8DgEAM7+BKDO/ElZTExAVTlfGmLE4gjGHrx1qiKhMyedwLJ9DiJrE/hZRRhxnaoo9dzb23LXeqmnBNkSZ8GWIahAA8AqAWbCamkSev0bUHPYFRLWd9dLtTkTb76/kd4hoIqJa2osplI8BUArvaeQZtJDQyCY2APguEdUTUR2A/wvR2TYQjZr5aszhXBq7lyp2IOp3uIuI/ET0aQCfByDPvDsQ9T9chqjpRWANgHuIqAkAYmX9QpL8/oGIionoUwCuVtJbD+AuANMQNZE54S4AN8fCTsfE8r6YiP4jwTsytiPqo/giYkKCmU8COBq7ts3mnfUAHoi991/iIjP/CdF2eDrm6C8iojCAZwD8ipl/JaVRRERB6SgmoklENCv2P0hE30HURPWKy7po5DG0kNDIJv4JwGsAdiLqcP1d7BqY+QVEwy7/G1GH629i7/R5zYSZ+wG0IqopHAPwEIAvM/P/SI9tAPBpAJ3MLJtPHgSwEcAWIjqNqKP2rxNk9y6i5qLDAJ4GsFDJ52eImbAUs5Ra5u2IOtM/C+B/iegEgB8CeD5phWFqI68j6sDeLd36NaLOeychMQnAj2N+DRmLATyKqBA/A+AXALYiXttZhqipTxydiIbMPoxouxwCcAWi2tlxN3XRyG+Q/uiQRj6AiJoRZXYBZh7MdXnSARH9GcDXlRm4hkZBQmsSGjlDbL1CMRHVIGoG+a8RICCuRdQe35nrsmhoZAJaSGjkEl9H1Ib+Z0QjitpzW5z0QERbETW73K5EWmloFCy0uUlDQ0NDwxFak9DQ0NDQcIQWEhoaGhoajki09UDeoK6ujkOhUK6LoaGhoTFi8frrrx9j5nr1ekEIiVAohNdeey3XxdDQ0NAYsSCi/XbXtblJQ0NDQ8MRWkhoaGhoaDhCCwkNDQ0NDUdoIaGhoaGh4QgtJDQ0NDQ0HKGFxCjHhg0bMHXqVBQVFWHq1KnYsGFD8pc0NDRGDQoiBFYjO9iwYQNWrFiBxx57DJdeeilefvll3HrrrQCAtra2JG9raGiMBhTE3k0zZsxgvU4i85g6dSquueYaPPvss9izZw+am5vN8927dydPQENDY8SAiF5n5hnqda1JjGK88cYb6Onpwbp160xN4pZbbsH+/bZrajQ0NEYhtJAYxSguLsasWbOwZMkSU5OYNWsWjhw5kuuiaWho5Am0kBjF6Ovrw4YNG1BfXw9mxrFjx7BhwwZEIvpTCBoaGlHo6KZRDJ/Ph5KSEpSUlICIzP8+n547aGhoRKGFxCjG4OAgKioqsG7dOvT29mLdunWoqKjA4GBBf0FUQ0MjgygIIXHixAkdy58l3HzzzViyZAmCwSCWLFmCm2++OddF0tDQyCMUhJA4dOgQVq9ejd7eXqxevRorVqzQgsIlhAAgIlMQCDQ2NuKJJ56wtO0TTzyBxsbGHJZYQ0Mjr8DMeX9MmTKFZXR2dnI4HGaNxFi8eDH7fD5etWoV9/T08KpVq9jn8/HixYuZmbmjo4NLSkoYgHmUlJRwR0dHjkuuoaEx3ADwGtvw34LQJMrLyy3nl156Kfbs2TOsZSjE7SvWrl2LG264wfQ1rFu3DjfccAPWrl0LANi+fTv6+vrQ0NAAIkJDQwP6+vqwffv2HJdcQ0Mjb2AnOfLtGDt2LIfDYTYMg8PhMK9YsWJYNYmOjg6ePHkyd3Z2cn9/P3d2dvLkyZM9z7g7Ojos9cjGjF3OAwCPGTPGUu6mpiaOdjtzIBDgVatWWd5ftWoVBwKBjJdLQ0MjvwEHTSLnAsDNAYAbGhqYiLihoYENwzBNJsOBcDjMnZ2dlmteTV6ZEjRe8gDA5eXlljza29uZiJiZGQCvW7fOIrjWrVtnChENDY3Rg4IWEkVFRRwKhdgwDA6FQlxdXc2NjY3ZaCdbGIbB/f39lmv9/f1sGIbrNDIhaLzmAYCLioq4oaHB4pMQQsDn83FZWRmHQiEmIg6FQlxWVsY+ny9jZdLQ0CgMOAmJgvBJfOQjH8Hbb7+NoaEhvP322/jJT36CgwcPDlv+zc3NePnlly3XXn75ZTQ3N7tOY8+ePbj00kst1zLtW1HzCIfD+NznPof33nsPZWVlWL58Oa6++mqEw2EAQCAQQE9PD6688kqcPHkSV155JXp6ehAIBDJWJg0rCtG3VcjQ7Z0B2EmOfDsuvPBCi8TbsmWLZ5NIOv6Ajo4Orq+vt2gz9fX1ntLIliYh1ysQCPCKFSss96qrq9nv99uWGwC3trZyIBBgABwIBLi1tVWbm7KE4TA5anyITIzb0QSMJHNTVVWVJ3OTG2JJJEQ6Ojq4srKS/X4/A2C/38+VlZWeBY1XBpFMsKlprlixgg3D4Lq6OiaiuF87IbFlyxZLmqkIYA13GA6To8aHaGxs5HHjxlnG3Lhx44bVVF1IKGghgZjjWvx6dVwnI5aOjg6uqKiwCIGKigqTmTY2NnJVVVVSQbV48WLLrFwtoxumL+43NjZyfX19QqGiMh1Vc/D7/VxVVWV5R2ZKjY2NXF1dbfFJDLe/ZzTBMAxev369hQbWr1/vybel4R56EuQNBS0k0g2BTUYstbW1ZuQUpEiq2tpa8/2xY8daGPbYsWMtxJZs4Rpzcm1F1gpCoRCPHTvWkcEzxzvUw+Ewb9myxWQ6hmHwsmXLOBAI2DKlxYsXs2EYPHbsWMvvcEaO5RLDEZIsQ89shxdaSHhDQQuJUCiU1uwrGbEA4JqaGsvgFRqBOC688EJLGdra2izEFggEeP78+ZZn5s+fb645SGZuUrUCwzB4y5YtFqGgRlTJAlOsixA+BsMw2OfzcVVVFRORRbgJphQOh3nGjBlMRAyAiYhnzJgxKswfuVj70tjYaDvZ0EIiO9Dt7Q0FLSR8Pl/Cjm5pabEwupaWFkvl7YilqqqKfT6fyVxvuOEG83kxwwbAPT09pqCYNWuWqSUUFRVZhAQArqurs5ik6urqzGeS2aPttIK7776bAThqUKr2UlVVxQC4oqKCiYiLiopMn4TdzJWIbDUoAMM6w84FcrH2JV/MTcOtQeUKsi/SzienYUVBC4lE6yRaWloYALe3t3N3dze3t7czAIugsNujSDB1wRQB8IoVK7i/v5/9fj8Hg0HLegLhrxBlUNcTCOYsM4yKigozjWRrLVSmtXjxYpPRO5mCVE1CCC6nIxAIcHt7u5mnqI/8jGiPdGbYhcCEMrX25ZprrrH4oa655hpHQZMPjuvhivixo4Fc0EUyP6HGhyhoIeHz+eJmA2LVMBFxe3u7pbLyqmLmeNu7YIzXXHMN9/f3m8zcMAyL0BAMWhCYuC4c23Ie4n3ZJyHeZU7OINTBK2sBTk5ldWaaSEDYaRLiXmtrKx89etQMf1Vttl4YWaGEeWaCYQOw9UM52byzxaC9mrzs/CK1tbUZY+B2NFBfX88VFRXDGo5aKLSYLyhoIaESsGzrB8CPPvqo5f6jjz6a0F8AgD/zmc9Y/AV2mkZ9fb3tDN3v93NpaamFYQPgUChkeU6cizxUghXaipyuEIYAOBgMcmNjo1mvZcuWWerV2NjIpaWlppYja0j9/f1cX18fJyRkU50wMckzLTsh4WWGnQ+zZQGVeS5evNhT9FgyEBHPnj3bksfs2bMtkwe1PGoodUlJiaWP3eTvNQpOBgC+++67LWUWk4NMMVM7DSsYDLJqNs620z6faLEQUNBCwml2HKtYQjOPeKa8vNzCTGVzEjPz9OnT49KvqamxmGDEoUY/MTOXlZXZmr3KysrMZ2TfiZqHEF7CTCbuhUIhs17Cd+CUp53ZSNYw7MxNchnEr+qT8BJNlgkzTiaQbA1JKBTiiooKC4OWhYgbhi20TVmTUH1VMlTf2IoVK7ioqMjiM3KzdkaNghPh2G76C4iP1BPaT6Y20RRmUrld7CYf2Yg0Uje4bG9vz7kPqFBQ8EJCZWRitiYYpSAK8SszZ/G86uAV12Vzk8xU7Uw4QlWurKy0ELjP5+Py8nKLWay8vNz0WwiTl+wcFgJOnIuZl0hP1M1pXyUgGnWlCh67ujhpEsJkIv8CSBjKmwh2s8gZM2ZYwnDtmGAyk4lX27I6i2xsbOTa2lqL0JXbIhVTkFdNArBG2YXDYV65cqWFjpLNdNV6ERGPHTvWUq/Jkyc7lsHn88VF8ok+l68JOnYLlTnPnj07ru6qIFI143ShClBhlhYWgVAoxCUlJWbAipuJgBu6KwQfnBsUtJAQTFL8yszUjkHKQiRWeXPWZ8dM7Ri2z+czGTIAvuqqqywErQ5uALxgwQILQS1YsMDC9Gtray07tMplEKYHWUOSD+GjUPOUNRu7dpDbQ/VrJHo+1VmlCCQQ7SrKNWPGDMfZcrIolFTWoAhflWxCu/rqqy2zSDl6zOfzcWlpqaeFhYJO3PokVCFhGAY///zzlueTaV2qphYIBHjlypWWd+bPn89EZMu0iMiiVcvatQwvW8bb7T7s8/nMQJDOzk6THuRIOkHXbhaXumG+qgAV659EHnL0nxvNzYnuWlpaMmq2zBcUvJCQGZggbGZ3jmvBrBJF/whGncwBLBiIIDgBeUdVuwgoAPz8889byiQYmDA9iHr29/fbOq5lzUSkIc/6E5VbDsuVtwp3OmR4MReJNpa1EsEMBNTZcrJ49mTfvbDz94jwXrltZBNhR0eHuSBSMDbDMCyMTV0wqcLrOhPVaSzTiFuBnEyTWLFihdn2dkyrsbGRS0pK4oREUVFRHKNzq0moZQoEAjxnzhyL9lhcXGyZqIk2c2LYqTid7QI5VDqULQ7J2tuO7ubPn88ALH2YbNFrPsJOABe0kADibf3yjDvR+gTxTDAYNDtWFjqqAOrv749zKDsdXnwSAHjlypWWMsmEK/sDBCEHg0FLvVQTlyi/mJXZHUIoODn9gai/Rv5VGaMXogfA1dXVZlvLMzgBVeioM2zm+MWOibQ0OwelmD2KcsjtIAZ3bW2tRatasGCBpZ6qtqjCbqZpGAbX1tY6OstlBi1ob/78+a5Ne8l8EoFAgGfNmmVh0DIjrK2ttfUXBIPBjPmh5HVGstYgAjPEhKy0tNTSvjKdpeJ0VoWwPJ7UyZ8bsxoQXSclo7m52VJmwzD47rvvdtzVIB/hpLkD+F8eTiEBYB2A9wHslq79M4D/AbATwM8AVLtMi2tqauKYKbOzL0B0mEwcdpqEavqxm4E73VP9Hol2VJW3/khmGhLpVVZWWuplJyScfBJ2moVqspIHsSpsUlWfAfDXvvY18zwcDseZ6tTBnkxICIavMmOhndg5y+3aVfS/6FPZcS3aW16drgYKqFDXqch7YcmzeqGdCOe5sJH7/X72+/3mbDcV/40qeITwkTUiWSsAwMuWLctodJPK0Ds6OkwBIIQDAG5razOfMQyDb7jhBrM/VObqJgBCnQ3X1tZaNFK5PezGGHNis5qdJkFEXFxcbJ4LLVimm3zfasVJcwfQz8MsJC4DMF0REi0AfLH/DwB4wE1aqsooawp2+y4JwhCzllSFgN2hMnoBADx9+nSL6UFETDFbF8fZ5e/3++OYWFlZmaUja2trLeYmob3IglPkbVcvOX1R5ssvv9wy0C6//HIGUl9xLdIXDF2o50Ig2zGgZHsaGYZhaXfxK+phN+sUedppoMIHIWs8sqbh5JNQnZhExHPmzLEwoenTp1vKtWrVKsvsWD4nIq6qqmK/328xLYoyOjnPZeboNPkQfS1rFqJdnARyqn1up90IB7Eog1wnIeBVulC3jEm2rkg1R4n+drNuyG7NlQo7TRGIrq8SSBYQkY9IMikbPiERLQtCspBQ7v0tgKddphM32OXFdOo+S+IQBCTMR6WlpY6hok6H+rwgelXtdCqDGJxq1I8d0cqDRtjUZSGiLuCrra11LdzsFvglet4LZKbl5PeRr9sxvUSRRQDidukVferkPBR52YVhCiFRVVVlCUeVnZx2znPDsG6GKNJLJKTXrVtnmR0//vjjcRMBMQsVkx9xCJOMvE6osbHRsihNtK2d7d3OPGvnkygpKUl7MZ0a3WQ3cRP/BW2Lfk1lZ2ZViwuHwyYNCSSib9HHyYIT1IlBS0uLhVaBqJlWDkFOZm5KJRoqkxFUQPxaGRHEwXkmJP4LwBddpmMyGfmXOT5qSDAI1eadyG7v5bAbeCIPQTDyr3hGhOLJi+VkghWMT2gKjY2NXFZWZvlgkLo9ucxsEh1yBMmNN95olinRu7JGNG3aNEcCVWd011xzjW1aixcv5qalmxwJN1GooRqcIBgI8OEstL6+3jJQgajZS6Tp8/ksgkVck8s4depU877qTxDlkgVZojYXM2qVeQu7vOwsF+sk5OeEYFO3SRHahjBZiecrKyttTYyBQMCM9mKOjz6TJyGZWg0NxPvT5PrL/2Wnvd0OxU7ftheal5yHoAm7CEK7/nEz67dbkKkuvC0uLk7ouE62+FGlXbtJVCZXjtv5pWJ8dZDtLDnIAYhoBYBBAE8neGYBgAXifGhoyPwtKirC0NAQtm7disHBQfT19aGtrQ3vv/8+zjvvPABAJBLB1q1bzfTee+8923wMw0AkEnFd9urqasu5nMfFF1+MU6dO4ezZs6irq8P555+PP/7xj9i6dSsMw0Bvby/uvvtuTJs2DXPnzjXfY2YMDAzA7/djcHAQW7duRW9vLwBgYGAARIRz585haGgIvb29ljwjkQiISAhTEy+88AKuvPJKs80Mw8Dx48fxs5/9zCy3m3ozM3bt2oXi4mIAwPHjx7Fo0SK88cYbmD17NpYvX45LL70Ut9xyCw4cOAAigt/vRyQSATPjvPPOw+nTp/HjH/8YpbdcYSm7wIsvvohnnnkG9913H6ZNm4Zdu3bhn//5n1FdXY3Zs2eDmfHDH/4QANDa2orbb78dPT09AIBXXnkFRIR58+bhxz/+MQCY95599ln09fUBAAYHB00aYmYQEQYHB1FaWopnnnkGGzduxCOPPIKKigps3LgRL774Iv7t3/4NwWDQLGdfXx9OnjwJZsa5c+fM63Y09NJLL6G3txeDg4Pw+/34yU9+ghtuuAH9/f04ePCgmS4z49ixY2b7BoNB9Pb2oqKiApMmTUIgEEBvb6/ZvpFIBMFgEIZhYPPmzZg7dy4Mw8AHH3yAioqKOBoQ9WJmbN26FS+++KLZPwBARACidCZorre3F2fPnsU3vvENjBs3LimNiD586qmncODAATONU6dOAYD5CwC1tbV4//33YRgGiouLcfbsWXR2dgIAfv/732PSpEnYunUrHnnkEXz961/H9ddfb777k5/8BI888giuvfZaGIaBvr4+LF++3KSZ733vewCAefPmYWBgIGH/BINBTJo0CV/96lfxwAMPONLlY489hu985ztmHnfeeScAoL29Ha2trVi1ahV+9atf4dZbb0V9fb1Ju7feeqvZ3nIaX/rSlzA0NITOzk4QETo7OzE0NISBgQFs3rwZu3btwqJFi/DNb34Tx48fx6RJk9DT04N58+aZNDBp0iRceumlWL58uev+kVFUVASfz4elS5fizjvvhM/ng8/nw9DQkD1DsJMcmTpgo0kA+AqA3wAo9ZCO7YIvjt50NHG4mVGkewgA4I9+9KOW2fBHP/pRSznFh4ucTFwiTJA5OlOSZyxO+0UB8eYOIH4fKnENsEZcffvb37bMlMSzdgsPnXaSDYVClrY+77zzLOUU9k5Zk5BnV7LDVrSdvFGenalu+vTppoNXzM5k56Goezgc5v3795vvCfOGTDPq+hthjpLXTYhn5dXRKp3JM3vxX7SpF9+X3++PM5HJ7SucwmqaTqZRWZMAYBsCK+fhJvxXht06CadD1uzk8qvmJCA+skhoSuK+3c7OduNe7WvRdsmiuOxMWoKG5GsXXnihpX7qJpyyb8UwrJ8ACIet34Dp6OjgcePGWXwcAGzXYnhZ7ChDtWpI0U3MuTY3AbgCwBsA6j2m48igRafbbVKn7mkkHL2ZOGQmJBP7zJkz+fDhwzxz5kxLOQFYvm7nlJ46+N2sk/B6yB9TWrBggYWA1MEMgKdMmWJhGHLkkRoBAoA/+9nPWsJuxcpaISRUH4TIRw4FlQezqqILU4uI4JEZvFx2tZ2dhKbKSGS7ushDbUP5eeEvsxPWV111lckQEvWJXVllM43cvsJ3kmxtjJ3DXi2/XA8Z4nspdqY39Vz9trra3rLpVbSR6puTt7oRE5z58+dbyiRHIokxL08shLnJLqpRnXQBUUElTKF2kE1aan+Ia7Ifyc5Up0ZpydFk4mhtbbUIDTFeRFsXFRVxQ0ODY1t4hRzMINpu1qxZDCDCwykkAGwAcATAAICDAG4FsBfAOwD+EDvWuEzLdhBw9KZlK295QZwqJORwx3QOOQ27tRfqYGdmcwW3U5pO79vZz91Eb9gd6qpueW2H+qzdAj0BWUgQkWUWKQaqOkBra2tNIWEXzy42umO29zmoa1eKi4sd4+Flp7JKA176NxAIOK5OT9b+8qxe3o8rWZ6yL8guJDnZdvDq4fP5OBAIsN/vt7SVYBAyA5cZnyiHUyivfC6Yo6wFqGVIVvfGxkZzJbjs26qqqrIEDAiG7rTeQzDzZAEpKm0KqA744uJiW9+KW01b1UbkiER5YiFoRI54U/PM5LYpYtzb+FiHV5PI1OHUyYIgnRiBm3hpOxXdDXHJZRDlkAecIAS5nF6ZlNPhdhCoaYZCIcsCJqfdb+Wyq1FXdqGKiaK2xFFWVmYKCcAaqw/ALAcRWYSZHOapMkgx6wSijlLZ3OSlbQ4fPuypP9RZpV1fyAzBzSHacsKECZZ0g8Eg19XVOc6O3aQtQmzt6FBuUzGbF9cE80wWyisv0pQjrkS+bp38Yh2QEBqqcCkpKbGsHJfNtyIPInJl9nIaD3ZmM1EuWWgLoaX2IbN1EqWG0Yo6CdpVhaMIMpHXuYi+TnWxo1291B2mZ8+eLco8MoWE05GMcdkdR48e9fS8gGouUjciVAdiojTt7sumjFR9LXbCTcwwQFafhFO5ZPslgLhBkOh9WUjI9mQnU49Q1WWGKBiKbHoT7aPacQUNeNW6enp6HIWn0FaSMT4x+Oza1C7STjaHiBBRQSuVlZVmW/n9fi4uLrYwUBEdp+4WINOR7IeS29tpgiXCakXbqaG8PT09cZFIcv/J/+U8ampq4uhbjB9ZexQ+JpGOujkfEL/Da6I6OQl6WbNW/QeCfuxm9fIhbxAqm4tEmuonhr/zne9YGLwaFi2HZtv5WtJd7CjGnzxepM8ajFwhIWYtMoEIxuV11u3lcBJEMlGKcpaUlLha4GdXXnlgp2puUttOhszAxUpg8V9ehFYIh20AACAASURBVCeH6DUt3cThsHX/IpkZqKqsyEPdiVQMMiIyZ1uyGQCILvoTgkPE+svtLJzNifrEbXurTn91Bq8yJTsTkOpHalq6yXV5RICCCHuW1zCItO1msk6HvH25Wic7P4raFn6/nwOBgMmg1a0/nEypor/kPOzaSu5zuZxC4KkmMDHOq6qqLIxSpOembezWzgDg9evXW9KTd5mWhYQw1ai0pmphhmHdT4qI4hzd6mJHdUW8EDpOPqFk6ybsyiCbyUSbYbh9EsMhJJIRQraim+R8xXYhiZ4XnZ/Ib5HofdU+7cbObqcRqYLLSUi4/UaCYHyJNAm5rCIPuzUjap1k85HcRupmiGLWLQa0ypQy1d/C5KX2h2AecjkAxO3f5VZIyDN4dVbKzBYfg5tyqzZzeXYu8hP37RifrOGUlJRwT0+PcHKa33wXz4ovPcqappdDfKbYbpdkdYW23bc4BN2kMu7tBI9d+cR/p8meoD2hualbYEyePNnyvDBRywJX1STGjh0bt6DSy86zqg9Q7R9J++wbdULC7lm7zk+FacjEYsfkZabuNc9MONeTHYmEhLq9iJhB2WkSpCx0S5SnyENVwe1mouJasogcYf7Jdls57UcEOM/GiT7cmiWZkLAThvL+UV61R9mpKWauTgEdiWhZME8Rnm2nSQDRiDZ5uxH1c7+p0ryd5iEgfyhMlFteYKfWI1n+QlsRgkc1ocllket3/vnnW8bHTTfdZJZTZdCJAg9kjUn9OJa8j5vdFw1VH4XsqFYFj1PesTKPLCHhdbYgbNzpMg27PfjTTdPLUVJSkjVzU7KtPuR4dsH4mpqaXM3e5BBYeUYlZjKzZ8/m7u5unjNnjnndzcpZu37OZHsLP4hglEByk5a63iCZkGCOagkiD3XtRqpasao9NjY2OjIqO2bOHDVX3HfffZZz2Sch92EmDjmYxCkoQNbs5Ii2KVOmpGSOlf0earvZTU5kQSR8RAJ33XWXJQ2xbbp4V+5juz2sqqqqLNpkbW2thfbEoX7RUEwM7ELM5a1D5DRk31esf0eWkEjGnMWaBdX+Jo4pU6Ykdbaqh7oWww1BCgYhIj4SPSvsuImeSdUnodrZVa2A2XkPKhGXL8xPIqTV7vvhidpBQHaYA9HdbOW4bXX2C8TbmsXWLPJzbqJp7BiE23aT13Ike8eLT8LOLyKH8rqZjCSaLQuGnki42WlEYuYqrz2R+5yZHaO4DMOIGy+J2l9ok8n6w+6+HPru9vsq8rm8iaZobyDK0O0WHqptJSY0YqdfMSGtq6vjoqKiuPU2wrcll0WMSdFequ/Lrn8E5HUTdt8tUbfFl017nZ2d8jd6RpeQkE0mdpI4lTTdDCz1EAxC3tXVSx5qPpnytahaQbK6C6IVC62alm6y7LHjph1UiLYJBoO2G/iJMsmOblmQ2rWD13267Bi0vN5D5OX0SU436XtxXItDMGZ5a2ov76uBA3b0lIx+7XwSYmdf4YNIZsqRBVMqDDxRf8mRYHb5AfGh6U55io9AyXTn9RCReGI9h7pLrHjOabPRuro6C20LX4vf77ddkyWeEYv6xLvLli0zacbuA1sAbHeRHnFCwqmTxH95EYywJ7tR+1PNz4mQ5Ty9RKU4HZnYrNBOK5Dr7hStIn+Vr2npprjdOsUhTEd20U12QkImcLv2kaNbkrWB1wVnyQ7RLl5NKqINi4qKPAkJWWsT1zIR0SYzZ3mVcaJ3RHSTTA/qdy+SvS9rRG4ON2sc5F91waUqtJIt5hPvyDSVrF52JihxzJkzx9JfH/vYx1zVW47QE+dCk5DXf6hbyDQ2NnJpaalFm6qsrLQ4suVP9Sah9ZEvJBIRE5BcSCRfXPehOUPsH2T3nBrVk86WIOo2H5mwuQuIr6+pQsIuD3UgiRBYNQ5cPmSiTyYkxIzPaVCHw2GLzwIAT/r2s+Z/ERHlZubolnbctLfdfXVr9lQ1CcFgMzExEP0rTCjqmpKKigrHuqqLFdWV9cCH0VGJaCb6331IuhyYoIbIinNVoLqJOLSjbXWLDa/t27R0U1w0kxzenQoN2u2gqwZuCO1FmLTEtjWyz0L2c8jtJP/G2nZkCYlUGj6VwWo5pEVnifZikhtezLidFmiph1c/SSqHwPPPP2+WURYSbmbNIrrJaQt0u+edhISTEFU3zrPrDzFYUm0Lu4mBU13GjBnDe/fudeX3CAQC/MlPftIV3TltFS7O3ayvcdPnah29rGEQsf/CxKjuH+XUZnZOYHGINSGJyi0cvHLkV6LnU9mKJVGZhUlLbisxPuRxIoSE7A9Ip89UIS6Hy6ptLmsOHR0dXF1dbd5XI6ac2jhGIyNHSAh12WvDpyskBKMTMxwnGysRcWNjo2mPFp0nO2tTPWTmmi4B1tTUmI5Vr+3ZtHRT3Pc8nEw9ch52QkImVLWubvpTFtheHdfZWEujblTotb9kU0MmNnUUaXrVaIUNXPiBxKpvsXLabZkEs7RjcOozIs0JEyZYFlAKDdOOTrxOGNV1LW4O9VsY6rWmpZvYMKwL19LpL2HedYrwkjWDtrY2SwisGiwg9qCySyuZJmGgAFBfX49AIGCeh8NhrF69Oit5NS3d5Oq5SCSCQCCAZcuWoayszHKv8Rv/gYULF+LgwYOW70a0tbVh9+7daLprY0bLnAqKi4vR1taGU6dOYeHCha7e6e7uRnt7u+Xa4OAgBgcHccsttyAYDKKmpibuvaKiIqxfvz4j5bZDY2NjWu/L34xwC4p9h8EJZWVluPPOO8HMKCoq8px+b2+vSeODg4OYOnVqSunIOHHiBL785S9briWrRzAYRHFxMT7+8Y8jEomguLgYAwMDqKysdPW+gPjuSW9vL5qWbkIgEAAzo7y83PKM3+/HwMAAJk+ejEOHDoGZ8d5772H69OkYHBxEIBCwzTM2mQQAS5pOIOUbLOIbJIkwODho/hffq5C/WwEAzc3NaGxsxO7du83vl/j9foRCIfT39yfNQwYzm20gyixQXFxsfl+mvr4eP/7xj9HV1YWBgQF897vfxc9//nPU1dWZefb396Onpyeu7fr7+/HMM88kHgO51hLcHJdccok565R3Lk1lc75kMzo398VMRziLgA+3BRHPEZG5s6M6g05FC5DV2kxoEoB173u30U2y00yUQY0cM7UJsg+zdWoLJ9u+fF/1zwhTnro/vugDN+2g5pvsPJUj1f4S/Z4pZzwR8YwZMzgcDrvuc6e1M+qK60R5qrTb0dERZxaSnwuHw3Erg6dNm2bRqOTPuHrVHpPRQCom30SBHCJ02gtdqSZH1S8lzH8dHR2mKcpusZ2gI7vV7GrbF6wmIWPt2rXw+/14+OGHLV+Jq6qqAhGhoaFhWMpRVFSEs2fPYsyYMTAMA2PGjDFnjU1LNyESiWDz5s0Zy098NUzGtGnTUk7PMAxccMEFmDlzpu19u9laJBLBvn37zK+9ief6+/tRU1MDwzBQU1ODoaEhEBGa7tqI3bt3o62tLWl5iMj2S3mylhaJRDB+/Hj85je/sXyFra2tDQ8++CDKysrAzNi3b5/t1/qccOLEibh65hqTvv0sOjs7zX53W5dk8Pl8ePPNN/HGG2+4ep6ZcfLkSQAwv4gnsH379jgtWoVhGGhqaoLf77dcb2trw5NPPolwOAyQgcbGRtTV1aGzsxOTvv0sVq9ejfLycnR0dKBp6SYwMy6//HIEg0GTNn0+H44cOYJIJIIjR454aYY4iD4X9XOjjdhh+/btOHPmTBwNbdiwIa6tktFZWVkZli1bZp4TkaX9T548iYGBAYwdO9ZsE+boVy6ZGT6fz6Sbvr4+7Nu3zzGvRPRVcEICiBKrSnSnTp0CM+P9998fljIIRsjM5qc6ichUMTMJOzMPAOzcudOToJAZPzOjp6cH3/zmN7FhwwbLc6WlpebnNJNBENfJkycRiURMhuKVqXl5nplx+vRpyzXTlBdjKLfffrtrU4j6SVoVqQgNpz5LBNmcdGDV32HJkiUAosxi0qRJruvjBCJCbW0tzpw5Y5uWOqYAyH5B9Pb2Wj576qbPent7sW7dOou5WEA2v77zzjt48MEHsWTJErPu99xzjznBWLJkCR566CFLX508eRLjxo3D0aNHMW/ePHeN4ADBfEX9UhXKa9asQWlpKSZOnAjDMMx2ToWGDMPAhAkTzPNgMAhmht/vR1FREZgZxcXFaGlpQV9fH/x+v5lfb28v5s+fb07oRH3cjmtLOTy/kWPcddddKC8vx+bNm21tfJmacbnBjTfeiLq6OhiGgbq6Otx4441Zyae6uhpr1qyxvbdz504wc1JfSn9/P+rq6szzvr4+rFu3DkVFRbjrrrssz549exbz5s3D0aNHXZVPaHDyb6bg1kekYvXq1bj99tttmVMiZKr8tbW12LZtGy6++GLX78gTDKGFAcB3v/tdvP3222lrOMzR72mLiY0KL20lxlkyO3swGMRNN92EM2fOJE1TFhqqBrpmzRqUlJSgpKTEMpvet28f6uvrsXFjen6+uPag1Fjj4OCgKeyZGWPGjEmrTIcOHTLPjxw5AmbG0NCQSStCA+/v74/zK9x///0WzStVFJyQOHjwIL7yla9gyZIlCAaD8Pl8Gc9DqIWis8Wvqi4+//zz6OnpMWflzz//fMbLIpCu8AsEAhamHwwGsWTJEtx88804ePBg3PMbN25EfX193HW/328ZpCKtDRs2oK+vDxs2bEjJEZwNrF692nSUJoJ8/+jRo57bWm0PADh9+jRuueUW7Nq1y3U6ToP5H//xHzF58uS0HdcALBMFFW4YuYpkM9NIJGJq98lMU4kwODiI8vJyrFu3ztb0mgy/+MUvLOd2ws3n833YxhwvRN0y2w8++AD79u0zhfKHCXhnt/LEQWgFskCTBX4gEDCfEVYNN7QcCAQSatMFJyQA4MEHH8Sf/vQnM2Ii0zhz5gzKysrMDhoaGkJZWZllENXW1uLUqVM4ePAgmBkHDx7EqVOnUFtbm/HyCJSWlqYcyaMSi4ieefzxxy3XW1paEqYzODiI0tJSy7Vz587hpptuQnFxMT772c/i3LlzKZVRmDvszB4qM0pFbXaDVGbrTr6Uu+66C5FIxFaI2OG8886zTefs2bPYt29f2pqEYRgoKSmxbV8vaXhFJBJBMBjE2rVrU84XiEY1ismhV1xxxRWWc1VrMoyoX8QUEjYM3cvkIRwOY//+/VGfSwxeoxqJCJMmTUr4jBB2ZWVlOHbsGPx+P3w+n9lGfX19lnLb8cu+vj50d3c75lFwQoKIcO7cOXzta19Dd3c3vva1r5nXhT06Ezhz5oxpxmFmx1mWCIuTw+PSBRFZZ3xkIBQKoaysDCtXrsxIHsXFxZg3bx66u7st2tjmzZvR0tISR0xi8BiGYWkLn8+HQCCA48ePA4gy+EAgkJKGN2XKFOzfvx9TpkyJu6fO/LyGE7pFe3s7uru7MWfOHOlqahMRIgIRYdGiRa6et8w6YxB0lQpzVhGJRHDgwIG4sM2sggyEw2GsW7fOVQBDInR2dmLPnj0ZCSxQ+cSJEydw5ZVXor+/3wy6SBVEhD/96U9oamrCn/70J1vGXFxc7HmCa0cDQuCLCa1hGBgcHDQnamIyVVRU5BgckjRfz2/kGMyMsrIyvPDCC6ipqcELL7xgRrUMJ9SImGTXVTg5nEVEgsowysrK8OCDD6Y90ACYkUjl5eXo6+uLE3CbN29GJBKxmGFkrUrGwoULMTAwENOgoo7RgYEB12svZHR1daGpqQldXV3eK+US5eXlICLH6BURNferX/3qw4spaqtFRUW4/fbbXa/pGRoaihOufX19mDBhgi19J2MydkwlEZNwI4i8MhkvEW6JkEpd3cIwDFRXV+PRRx9FaWmpK16SSOstLy/HhAkTQESYMGGCLa0Jpi1DPReRevI7KgYGBlBRUWGa4NQIKIGhoSEYhpGSybLghAQAfOYznzGdOEeOHMFnPvOZhM+rYbGLFy+2fc7pejbgFJmkhuK1tLRkZKA1Ld0EIkJjYyO6u7sRiUTQ3d2NxsbGtEx2q1evxqJFi2LqKqO7uxuLFi3K2mLHdCE0RFUzDAQCmDVrlmmGkM+9zioXL16MpqWbLAvi3KCmpgaDg4NxJr93330X//Iv/xK34CsZM7Nj6HaLHRM9ny9gZpSWltpGefX391uFugdMnz4dzc3NMAwDU6ZMwTe/+U1X7wltzG7s9Pb2mj4Jca7i3Llzce1t15+ygLGLnCwuLjYj/WSHOQBUVlZaaMbJRxEIBBL6iwpOSBQVFWHTpk0WM8+mTZssElIMMsFohcNWXF+9ejUWL15sYQiLFy9OibG1trbi6NGjaG1t9fyuHJnEzGhpaTE7UZxncq2F8J0IwiYi06eSDIlm4LKD2CtjBKIrpquqqszzUCiEqqqqtFdSe8Ftt92GHTt24N5778XEb/0U9957L3bs2IHbbrst6buZoCMgGjZr1+dEZK4bSBfd3d248MIL004nF6ivr7cwX4FAIGCZQM2cOROHDx+2XQMkQneblm5CY2MjDh8+jK6uLkQiEXR1deHxxx/3RHeq2XPatGkYGBgw++rYsWMYGBhIeU2TPJlJJsTFGGJmXH311fjggw9QUVFh4Y1y25WUlKCnpwf33ntvwhXnBSckhDqumj/s7OqJGG66jA2ICqydO3fivPPOw86dO9OOPpHNPKksxnNyOqvXZSHhFk4z8Exg5cqVKC4uRigUgrD/FxcXx/lf0hHITnUV11evXo2FCxdi+fLleOf/vQ7Lly/HwoULXdGFWzpyCmqora1N2OeDg4M4fvx40v5y0zbMjLfeeivhM/mK/fv3mzQggzm6dYfAjh07MH78eOzYscO8JiZiMqNduXIlhoaGTLoLhUIYGhqKozs340X0rbAQiHFy5swZTJs2DTt37gQATJw40XvFE8AwDHMyfOLECbN+l112GcLhMIaGhszAARXnzp0zt49JmEdGSzwMkFf7JrqeLsN1A7F3itiTJhsL6bxAdToTke3MtLKyEoZhmPvv5BryimkQOfpfRFhuKjHxt99+e9LrbiYO6Zjmjh8/HicoamtrTae/HYSJ0G4Vrwq1bYSJ0SndVCD7qcSMfTixY8cOnHfeeXG+AMEoZZu8iOZyglu6kyebdlD7ULUQCAEBAAcOHIgTFBMnToxb6yQCKOQFmXKdRf8NDQ3hqaeeMncgmPTtZ1FfX49ly5bhmmuuwcDAAHw+X8KwYYkWbKNBCk5IANEZvOw4ykT8eKp49913LbHguUYy4ej3+02Gc+bMGdfhkGImkq01EIkWUmUC6ZoYhb9KZRRe/VjHjx+3MJBEAkLk9+6775r5rlq1yhODd2JsqTjCVWzfvh3jx4/39E46EBGNzBy3GlnUJxAImP4CJ4e/jFTpzksfqjhw4IDl/QMHDsQ9IwIoHn74YfOaXVQaEeGrX/0qzj///Gjaq/4OgUAA5eXlePrppy3tMX78+LiwXFGXmOCyXdRTkEJCXnEo/x9OqCYcMctLts4g1/gwEglmJJIbiJlIKguZ8gXpmBgz6cfygnA4jKuvvtrMd/ny5fjCF76AcDiMpqWbHKN61Ovy7NoJXiZbYmfTbKxTsgMR4e2338YFF1xg7jv20Y9+1Ax9j0QiaGlpQW9vr+mcP3XqFHp7e/N+TNrBrr+iATgf7tEkMDAwgD/84Q8AYG5xsmbNGkvUZ3V1NWpqajB58mQAH+6cnEhQmWXJXLWGF4Ip5yoiw61pJx8h7LeyHTcR5M307M6zjY6ODk/Xs4VM+LG8YsWKFfjjH/+IF154AZO+/SxeeOEF/PGPf8SKFSsAAE899ZRtKOVTTz1lueZmvHiZbA0MDJhbfAwHpk6dihdffBH79+9HJBLB/v378eKLL2Lq1KnmM2JMioVhToEAhYCqqioYhmEJ6IiG18e3t12fynuZAdHAE0G/Xum2YIVEKs7XTGM4/B65xrRp03D69Gm0trZiwu1PobW1FadPn05rB1qvaGtrQ0dHh7ljaDgcRkdHR8ZNUvmItrY23HPPPY4b37W1teHpp5+2tM3TTz+dUtu4ZfjCxOYUxJCJhX8qTp48CSKyOISJyNxQUmCkjEl1w0wgutg01T2lxDY88q9bFKSQKCoqMqOZLPutaGQcIlpj48aNOPTvX8TGjRst0RrDhWz7LPIZyeqebtt49auopjcV2dDuxf5i6n5qdvuOZRoinDUTIcjJQEQIh8NxH1kjopQ/WDZx4kTs3bsXVVVVZqjv3r17XUdaFaSQiEQiFrt6Pi8CykeMHTsWhmFg7Nixrp5PFK2hUfhIxvSd3hGmN7d+kXQhdkAFnBeGZQOy9pJtzJ07F11dXbjlllvQ+I3/QHt7O7q6uixfuPQKEVG1fft289rEiRMT+iFkFJyQEPuoi4gCES2itQl3ICIcP34ckUjEVey9xuiA2x1z7bBo0SIQkUW797JnlReks1amECD8KmvWrMHBf70Ra9asyYhfxU1ElRMKTki0t7dbPngiPvbj9QMvoxXiy1UAzC9YaWjI8Lq2Qny7QzYFedmzyi3E4tWGhoaMLF5NBifNyus3Srwi3/wqBSckBEHKK6+zQZAaGqMVbhYeqhiOyK+hoSFzz6Nz585lPfT98ccfj1tH5Pf747bXH+nImpAgonVE9D4R7Zau1RLRL4nordiv825jCSATJDNrAaGhkUHkak2IGwgzs9vw7XSgfoc7HA7jySefHFVBE0B2NYknAFyhXFsG4EVmvhDAi7FzDQ2NPEMu1oQkglgQZ7dLcjYxmqPqBLImJJh5GwD14wpfAPBk7P+TAK7JVv4azlDDCDVGNtR+LsR+d7Np52hDom9aZBLD7ZNoYOYjABD7jf9eo0bWkWzDMo2RhaGhoWi4M0XDnnO9EWWqyDeHbq4xXJM979+YHCYQ0QIAC4DoniVbt24FAPNXINl5Ku/kYx6ZyFPAaYuGkdp2ozmPGTNm4LXXXova8KUttWfMmIGjGcpjpLRVPubhNIYB5/3UMpkHgOhsMlsHgBCA3dL5mwDGxf6PA/Cmm3QuueQSZmZuWrqJZSQ7T+WdfMwjU3kiuvGL7TFS207nwdzS0sJExACYiLilpaUg6zHa8nDKs6WlxXYMt7S0pJUHgNfYhv8Ot7lpI4CvxP5/BcBzw5z/qIb6/eRk1zVGBrSZZmRhuDcXzWYI7AYAvwHwF0R0kIhuBXA/gLlE9BaAubFzjWHC+vXrbZ2Y69evz1GJNDQ0UsFwCv5sRje1MfM4ZvYzcyMzP8bMx5l5NjNfGPtVo580soi2tjb86Ec/ssR9/+hHPxqVYX0aGhruoO0MowxtbW1oa2tDaNnPsfv+z+W6OBoaGnkO15oEETUR0ZzY/xIiGt4vz2gUNC7+hy2WXw0NjcKAKyFBRLcB+CmAR2KXGgE8m61CaeQ/vDL9U+cGsO/+z+HUOXefS9XQ0MgPuNUkbgcwC8AHAMDMb0EvhBvV0EzfPbQWpVHIcCsk+pi5X5wQkQ92H1sd4dCDXSMVaIGqUchwKyReIqLlAEqIaC6A/wTwX9krVn5CD3YNDY3RBrdCYhmAowB2Afg6gOcBfDdbhcoVCkVTKJRyamhoFD7cCokvAFjPzH/PzNcx89rYMu4RhULRFAqlnMmghV3uoNtewy3cColWAH8ioh8R0ediPomCgx4Y9hDtEVr282Ftm0wLO92/7jFSJhoa2YcrIcHMXwVwAaK+iJsA/JmIHs1mwbKB4RgYuWBU6eYp2qXQmYZmfCMPmRhPevKQHlwvpmPmAQAvAPgPAK8jaoIaNhRKRydjVNmoh2aOzkjW3oVCVyMBF//DFoSW/dz87waZoG09PtKD28V0VxDREwD2ArgOwKOIbvU9bMhFR2uGnjryhfkma+/R0h/5gJGisdohX+g9G3CrSdyM6ArrKcz8FWZ+npkHs1es/EAmGEihEk+mTFgjjRloZBaFOj5UjGR6d+uTuBHRbb/nEtHVRJR3q61TIbbhINBC1YBGMtFr5A9UOhspQmMkwa256e8B/BbA3wO4HsAOIroumwXzilSY2khlhCOlXoXiT/Bajnwpdz5ipNCuikLuc7fmpu8C+MuYqenLAP4KwP/JXrHSRypOslygkIkn2ygUf4LX2XC+lDvbyFfazkW5chHQkim4FRIGM78vnR/38G5OUChOslTU7YrmZZj25DRUNC8bljIOVxmGY6Ckm4eb97MhBApRW8lXYZhuuTIxAVX7J1/bCnDP6H9BRJuJ6GYiuhnAzxENh9XIMJyEhrzQ7fSe+7HrK7tweo+7r79mg2F4LYMbDMdA8ZpHvgxmr/nmM9MpdGRiAlpI/ePWcf0dAD8EcBGAiwH8kJnvymbBNKIoFILMh5lrKkimEeVr4IH6TCFoYRqFCS+L6Z4B8H0A/4jorrC12SpUrpCMYeSDmSdfkQ8zo1T6JxsakVekoq2oz+SjFjaaMZIEqtvopq8T0XsAdgJ4DdEV169ls2C5QDKGkQ8MpVAxHAK2UPtHM9/UkY1tOwo1hDxbgsmtJvFtAGFmDjHzR5h5MjN/JKMl0UgZhaDhZIKBF+rsLB/7Jx/LZAev5kA7p7LXNApVaGdrzYlbIfFnAGfTykkjayjUGbRXFOrgzcf+yUaZ8iFAws6Hl4/tnwx2ASte29dt2G2y3Z/dCom7AWwnokeI6F/F4fLdEYt8XYtRqOGp2YDXtijUemYCeiuW/IGdsMt0+7oNinErJB4B0AngVUT9EeIoKKgMI11HtV0j54MaXyjhqfnopxjNjC4f6p4P40fDCrdCYpCZ72Dmx5n5SXFktWRZgMowsuGoTvaOHgQfYqS0ldfJRybyGA7kYluUfDQNjWbtEnAvJP6biBYQ0TgiqhVHVkvmEYXCUPJxENghH9qzUISI18lHJvIYDqS7LYqb/smXPkwENxqW13oUQr0F3AqJmxDzS+BDU1NehcAWCvMt+7x8eQAAIABJREFUFKTbnvloSsoX5ELTyMVs2E3/FGofqvBaj1zUO1UacLvierLNMawhsKlK6kKR1iMNqQyC4RAs6eaRiTIOh6ahljOf/A3ptN9oN/3IyHS0kxPcLqb7O5tj9nB+VyJVSV1os5RCUkMzjeGYXaWbR6HMfPOxnJkYkyNF2Dml6SW94WoLt+amWxH9ZOn82LEWwB0AXiGiL2WpbAmRqxlFaNnPUVXiz1h6KnHk4+B2g5Eq3EZqvVJBIbSFGwaebj3cCDuvwQzZGPeZ6i+3QiICoJmZr2XmawF8DEAfgL8GsDStEqSIXMwo9t3/OQDAH7/X4vqdXBCHV6Q6M5IFZj7UIxsYqfVKBYXQFk4MfLhpdTiCGbyWIVW4FRIhZn5POn8f0e9dnwAw+gLKPaCQB1YipCIwNeyRyowvH2f1uSiTmzyT0Wo+tmUqyFY93AqJXxPRJiL6ChF9BcBGANuIqAxAt9dMiehbRNRFRLuJaAMRBb2mkS14MScNh3PcKY9Uyine186//EI21uPkAoU6W87HtkyFt3ith9s83AqJ2wE8DuDjAD4B4EkAtzNzDzN/xmUaAAAimgDgGwBmMPNUAEUAbvSSRrbgdXY8HM5xuzxSLad4Px+cf9lCpn1GmUI+lisfy6QRhd24z7Sm4JZ/uQ2BZQAvI7o1x68AbItdSxU+ACVE5ANQCuBwGmlpDAMyQaDZZkqpmsDytVzZRD6WSSMxcqXxuA2BvR7AbwFcB+B6ADuI6LpUMmTmQwD+BcABAEcAnGLmvLV7FMpsSy1npsudLoFmgimlKqgStUU+Mst8sZGnu7dZpjDcY3A4tlkpJPhcPrcCwF8y8/sAQET1iGoUP/WaIRHVAPgCgMmI+jP+k4i+yMxPKc8tALAAABoaGhAEsHXrViCF31SffeKKMtz8ix48eHmx7f1U88hEPRKV067c2W6rVJ4HogygzO8uz9N77jfr5jYPN22Rav3TqbvXeqZSrlT6w0t7u+mPdOksU7TsJW+1Xonq6aU8megn+TcqvJahohnYurUs7TwcwcxJDwC7lHNDveb2APD3AB6Tzr8M4KFE71xyySXctHQTM7PnX/Va09JNfNH3N9ueq+8lO3ebRyZ+E/13W85028pt/d08n045M5lHumVIpVxeaSSdNvHSVlOfmGoe2cgzXZrMxHu5qkch5AHgNbbhv24d178gos1EdDMR3Qzg5wCed/muigMAPklEpUREAGYD2OPmxXTVTtW0kA1Tg5s0C8GElY9mmHyGlz7Nhe/EjckkH6N8NHIPt47r7wD4IYCLAFwM4IfMnNIiOmbegaiZ6ncAdsXK8MNk76XCfEPLfp53DHk0Md98a3uBROVyw0zV94ejT9PNI18EQD6OydGCVH0rbjUJMPMzHP2mxLeY+WeeS2hN63vM/FFmnsrMX2LmvnTSA+y1hEJhyCNx0BRqpFEyZuq2Xrno03ynI6cxmc6an1SRD22V7WATFalOFBIKCSI6TUQf2BynieiDtEqsAWB0aRbJMFLaIhf1SJf55grprvkZjjztkK5GNBym70whoZBg5gpmrrQ5Kpi5crgKOdpQCIN7uKDbIjXkC9NJpf/yvc9T1YjyvV5OcG1u0hge5Gpw56OtOF8YXb4i3/pLRSr9V6h9nqzchVovoICFxGha4JJpBq62nSDgffd/riCJONvIR2acy8lEvrWFRnZRsEIiX6I13CATtst0Gfho2NY7GyjkGWCmka/h3fkquNItVyYmh5lom4IVEoWCfGAyw1WG4Riswx0RMlwYCfXIJ4e91/bMdPun2xapTg7lemSqP7SQ0MgIcrFWIB8EcCYwUuqRD0gl9L2Q2j8X+5BpIaGhkYfIlWYxEjSabCAf2iUbQsCN1qWFRJrIx6igbGG01DPXyNaMMFn/Fepai2wjnzWN4fB3aiGRBgppVXe6GC31HKkYTeGoowXD1T9aSGhoaKSMkappjNR6pQItJDQ0FGgG4Q4jda2G1qCs0EJCQ0OCZhD5Dd0/ww8tJDQ0NDRGCVLRwrSQ0NDQ0BgFSFUL00JilELb3TU0NNygoIWEZnSpQdt1NTQ03KJghYRmdBoaGhrZR8EKCQ0NDQ2N7EMLCQ0NDQ0NR2ghoaGhoaHhCC0kNDQ0RiwmTZoEIsL+B64GEWHSpEm5LlLBQQsJDQ2NEYlJkybhnXfesVx75513tKDwCC0kNDQ0RiSEgJg5cyYOHz6MmTNnWq5ruIMv1wXQ0NDQyBYCgQC2b9+O8ePHm+d9fX05LlVhQWsSGhoaIxZ9fX1obW3F0aNH0draqgVECtBCQkNDY0Tj2LFjGBgYwLFjx3JdlIKENje5xEUXXYRdu3YBAOgBYNq0adi5c2eOSxWP8vJy9PT0AIiWs6ysDGfOnMlxqTQ0cgfZ3KThHVqTcAEhIGS1ddeuXbjoootyXTQLhIAIhULYu3cvQqEQenp6UF5enuuiaWhoFCi0kIhhw4YNmDp1KvavbMXUqVOxYcMG896uXbtQUVGBjRs3or6+Hhs3bkRFRYWpWeQLenp6YBgG9u3bhwsuuAD79u2DYRimZjGScdFFF1ni4d0I8FTeSRdjxoyx5DlmzJik78ybNw+GYWD/A1fDMAzMmzcv6+XU0BDQQgJRAbFixQp0dXUBHEFXVxdWrFhhERSnT5+2aBKnT5/OYYmdEYlELCF/kUgk10XKOmRNTyCZpiebDwEMi3Y4ZswYnDhxAuFw2Lx24sSJhIJi3rx52LJlC5gZALBw4UJs2bJFCwqNYYMWEgDuuecePPbYY2Bm83jsscdwzz33mM80NDTgueeeQ11dHZ577jk0NDTksMTO8Pv9eOWVVzBu3Di88sor8PtH/lbqQkA899xzZv8Jpp/sHfH8c889l/SddCEExO7du818w+EwTpw44fjOL3/5S7S3t5vPP/TQQ2hvb8cvf/nLrJVzJCEUClnGdSgUynWRCg6jVkjIan9XVxfmzp0LwzBARDAMA5///OfR1dWF/Q9cDQB47733QETm8d577+Wk3PPmzTPLbRiGZdsBABgYGMDkyZPx5z//GZMnT8bAwEDGy7BkyRIzz2AwiCVLlmQ8D684deqUpf9OnToFABbTTnl5uaWturu7LWk89thjCfNIxVSk4sSJExY6SiQgAICZcd9991mu3XfffaZmkQpk8xUR5a1Wkglz4L59+1BbWwsiQm1tLfbt25f5go5wjEohIav9+/fvBxFhaGgIfr8f3d3dqKmpMe37R48ezXVxTQjTQ3t7O7q7uxEOh/HOO+9gypQpFr+D7JMgooyWYcmSJVizZg1WrVqFnp4e3HvvvVizZk3OBcVLL72EhQsXoru7GwsXLsRLL70EAKaJsK6uDj09PaipqTGFw7Zt2ywM8tZbb3VMX6UZoQF4FRRHjhyxmAOPHDmS8Hkiwt133225dvfdd6fcr4KGRFu1t7fnpfkqU8EihmHg5MmTAICTJ0/CMEYly0sLOWkxIqomop8S0f8Q0R4i+pvhzF9W+ydNmgRmhmEY6O/vR2lpKU6cOAHDMBCJRFBXV2d5VxBsLiBMDw899BCqqqrw1ltvYebMmXjrrbdQWlqKiRMnms8KJsTMluvpYu3atXjggQdwxx13oLS0FHfccQceeOABrF27NmN5pIpDhw5hYGAAhw4dMq8JE+Hx48cRCoVw8uRJVFVVYdq0aQCALVu24NixY/jCF76AjRs3mtdVqDSze/fupKYiJ5w6dQoDAwOmtpMIc+fOxcMPP4xFixbh1KlTWLRoER5++GHMnTvXc75APA3lq/lKNiEKE69Xc2AgEEAkErEImkgkgkAgkMWSjzzkSqw+COAXzPxRABcD2JNOYnbqczKTyPHjx02VH4CpvhcXF1vOxX3xK6Kb/uIv/iKdIqcE1fTQ19cHv98PZgYR4eDBg2Y5x48fj+3btyMQCODAgQOe8kmk5vf19eHNN99EMBgEESEYDOLNN9/MyEpW2RTkFdXV1ZboMzlNIgIzm6YGIsKuXbtQVFQE4MM+nThxYsK1LydPnrSYisQMNZnpTa6XYRjo6upCU1MTurq6ks5sN2/ejNraWjz88MOorq7Gww8/jNraWmzevNl8RjVBJtIKmBmf+MQnMHXqVBQVFWHq1Kn4xCc+kZb5KlvYtm2bpb23bdvm6X1halXpIl0TrJf2dnpf5ldjxozJa/PfsAsJIqoEcBmAxwCAmfuZuTvxW85wUp///d//PaFJ5N133zXV/lg5AMA0L4lz9b5wgKVij04XqumBiEyzSnd3NyZMmGCWU7RFX1+fJ6JLpuYbhoFHH30U9957r9m2jz76aEbUeNG2qaC7u9vs71WrVpnXxZoRGUePHsX06dMxNDQEAOjv70dnZyd8Pp8lok2F0M7kXwBJTW9yvSKRiGkubG9vTxp9Nm/ePJw4ccLyzokTJ8w+VU2QbqKf7rzzTqxevRq9vb1YvXo17rzzzoRlyBWESVWY91QfUjKItm1oaMCePXvMYJN0Iv5SaW+79wW/amxsxIkTJzBhwoS8Nf/lYsX1RwAcBfA4EV0M4HUA32RmSzA/ES0AsACIdvLWrVsBwPwV2LJlC1pbW3H99dfj97//Pa6//no88sgjiEQimD59On77299i+vTpuO222/DII49g/B1XmO8ePnzYZLICr776quV8x44d8Pv95uzjpz/9Kb7//e+jq6sL9fX1juXKxvkll1yChx9+GIcOHcJtt91mMp7Gxkb85je/wcGDB83nRVscOnQIGzduRNMnvuEqj127dmHmzJn41re+hd27d+Nb3/oWjh07hu3bt6PpquhzzIy9e/di27Zt2Lt3r6nJpFIvp2te0wCifokpU6ZY+nT8+PFxJopXX30Vb731lnn+yiuvgIiwZMkSLF++HLjh3xzzEDQjBAQARzpzSmPbtm345S9/GTcztqunHX3LfZrsvppmMBjE6dOn8YMf/AA9PT1Yu3YtTp8+jWAwOGy07PYZAKiqqsLvfvc7VFVVpfQ+ACxduhQHDx7E0qVLcccdd6Rcbjf9kSwN9f2DBw8iFAph3759rtJLtdxezuMgh4cNxwFgBoBBAH8dO38QwD8meueSSy5hjj7M0SJH0bR0EwPg7u5ulqE+x8zc09NjXgfA1dXVlnP18Pv9lvOioiLL+cSJEy3lSJS33X35mWTn8vstLS1MROYz48eP50AgYJ5/+ctftrzb3d3NACxpqGnK5wD46NGjlntHjx410wDACxYsMPMMBAK8YMECT3kkaisVbtIEwLNnzzbbRW4f+QgGg5bzT33qU5b8+/v72TAMxzyqqqps05Uh05kK0V/yu+I8UX+o9C36VBzJ7stpGobBc+bMsbTVnDlz2DAM1+2d6DwZLavvON0HwBdeeKGlHuI8WRnkNFauXMnhcJgNw+BwOMwrV650LKPTmJPPE7W3W1qV3wfA+/fvtx2zqbZdqucAXmMb/psLn8RBAAeZeUfs/KcApid64Q9/+IMlmkM29Qibnmy7FJDtrtXV1ZY0u7u7Lc+K/8JsotothWlCQE0P+NBWKdJRVUb1YyfBYNDMT9j35TLZfRxlypQppt8EiPpWZH/A008/DQBmva+99lrPkTDNzc2WcNLm5mbzXiAQwMaNG808+/r6sHHjRs/OQLWtJk2aZPFzeImWCgQC6O3tNdtFbh8Zvb29lvNf//rXAD70W4wZM8ZSVxVnz561vS6XW94jyDAMXHTRRSYdAtH+knHq1KmE/UNEmDp1qqU/1GCK6upqC/2rtCmPl+bmZpSXl1vaqry8PGG93UCEF8vldhqzMgQjssP+/fsTnrvBP/3TP1nOV6xYYf4XdCYzxGQgIkyYMMHS3uLcDVR+BQBNTU3mvWAwGLcGyy6ia8OGDQiHwzAMI26HiExj2IUEM78L4B0iEp7f2QDeSPTO0NCQY+ihCF8tLy/H66+/btmn6LLLLsOJEyewd+9eDAwMoLS01EJozIw9e/aYjk0AFpMNALz++usWAnAKx1NtjaqtUnwlS9iyq6qq0NfXh9LSUnR3d6O0tBR9fX2orKw0bd7qV7RE+KnwB/j9fvT19aG8vBx79+6F3+/H0NAQDMPAe++9h/PPPx8vvvgipk6d6rp/ysrKcOzYMTQ1NWHv3r1oamrCsWPHUFZWZt5/9913Lf3x7rvvmvfdQG0rEcrb1NSUUljtlClT8Morr2DevHk4evSoRTj7/X68/PLLludV57TY5+r06dOOcfSGYWBgYMCWzkS+FRUVOHXqlBlmO3v2bOzatQslJSXo7e01+6uystK0kff09DgKNQCoqanBwYMH8bGPfQz79+9HcXExBgcH4fP54sKzX3/9dcu53XiZMGECnn32Wdxyyy3o7u7GLbfcgmeffRYTJkxwbuAkUPcMk8dLquHCItpQbu/+/n5Pvi+fz4cPPvgAhw8fxh/+8AeTDxBRyuHbxcXF6Onpsfg5kvWhDJVfyTh8+DAMw0BfXx+CwaAjrxE7RMh+JXWHiIzCTr3I9gHg4wBeA7ATwLMAahI9HwwGLSpSOBy2mD+CwaBFfRb/ZTNMeXk5h8NhZmbLM14PgdbWVvO8aekmJiJub2+3lLO9vZ2JyCznzJkzzXtExA0NDWYaALihoYGJyHxm5syZFjU2EAjwqlWrZPWQS0tLHc1iRMQzZszgcDjsWu0kIq6trbWkWVtba6lHKBSymJtCoZAnc5PaVoFAgGfOnGmp+6pVqzgQCLhKMxAI8KxZsyxl8tKnwhSRyPQDxJsgxSHn19DQwIFAgJmjdNra2mrWS+0vIuLKysqEbUdE3NjYaKHXQCBgSdOJlgXk8RIIBHj+/PkWE8z8+fPNMqdirhA0ISDToVoGuzRUOLW3OHdrbgqHw3FpiDoLCDqze9/uHABXVlZa+E2yPlTrJfrPiR5LS0stZVJ5TTgc5s7OTkvanZ2dnsa53TkczE05ERJej2nTplkqJmx4otH37t1ruW8YRpzNce/evabdFQDv3LnTfMYwDNPuLu7v37/f8Xlmtjzv5BuRbZUA+PDhw5Yy7dmzx5KnfM7MfPjw4TgC6unpsaQh2zMNwzDfERB2dpVxpGpzBRL7LGSoecr1UO2yarmdbPt29VDbxSnv119/3dLer776quUZma7s0pL7zykPuR7J6Ir5wz522x+Clp3qAYC3bt1qWy87GmKO99clqp/aH3Zj0E0ZnCA/ky6dGYbB/f39luvd3d2W9hd1V+GUhx0d2PVhItpX20rmLeqYluvtVC/m6Dh3O16c6ukkJApi+aEciQIAV111leV8zpw5lnNh/1WfEXZXIsLll19u3mtubsatt95qUZOvuuoqi51Wfh6IX53rZmXsddddZ3n+05/+tOX5T3/607bPi84KBAJYs2aN5Z2rrrrK9Ac0Nzdb8gCAl19+Gc3NzbIWlxBu6qHW3WmlspqnOFfzCAQCuO666yx5rFmzBoFAIK7MdvWwaxc7qH2otr9KV3KeAOLaVrVDExGuu+46S38koys1TRV2/TFnzhxLmmo9Zs+ebTkX9XKiIbmt7frL6Vwtk9syJKJD+X66dNbc3GwxNQYCAdx9993/f3tXF1tXlZ2/dX+4N/UP2I5lC/kae5paqq5tEsaVOk5VtQNzLYaRlZFGaNTwhNSp3DpCqoaiIfPQp7Yqkwfe6AvqSMhBqGgYJhREIUUVgTwkanBgPCPBhBCwUE0pEnUnyt/qw73rZO919zn7XCfYcbI+6Sg5vvvs9bPXPvtnrb2Op3+RPQaXhm6zUBtm6c7VVaVSabNLt08DV+VOkwto9vN6vZ6rv3SM0Mhxo11Qs2mguQVy12NHuKurq+03ucbGxrhQKES3ljrdepLyssK567Ej3Gg0klHe/bfRaPBdjx3hWq3WEY3QVSqVuFQq8aFDh3h9fZ2Hh4eD5crlMhcKBR4bG2uTTaKy0mYUIoe+RI6pqSkGwPPz87y2tpYshaemppI69HaVu5IBkNlmQHskWejq6upK+F5cXGQiSp7L87xL6+zZs8l2iNiV6GIj25KxKCt91Wq1jtvjel9TU1Pedl2pVMos39/fn/AZa0+5KpWKR0PT1Hbj2o7869qZptvV1ZXYp9u+0g96enpytYWr/7yyuW2Y95mN2NRGL7e/hOyMeZuvJEKYmZkBgNRZgHuSulTKPg4iI21ep5iUd2cAExMTIKLkoM6VK1dARJiYmAAQjobKC3GsXrp0CQDw+OOPo6urKzXJYLFYBDPj3LlzYGbs2rUr1RmucezYscy/Ly8vY2pqyjvF6n6lT+c4ktQI4midn59P/b6FtJlEkg0NDWF1ddWLgrreH1O6fPlycvq5v78/iT4KHXpKg7YbsY+8dpVlG7HcTnlRLpeTgAkXwtu7776bBERcuXIFly5dSgIiYo7ovJFtFy5cSGjMzMzg9OnTmJmZSXJqff755xgbG8Pa2hrGWtla3f4EXO1zaR/Ycg+CyoHJTz75BETUFt0mqFarwf4RohGDfsbFtXzJkpmDdWrbWlnxk1dcl/6y1auEPNfg4KA3+mmHsOuIYuZkduKMkDw7O5uUq1QqniMN8B2OwFUnmZR3nczMvsNLHIKuU9ktI3zOz897PGoeqtWqx4NcAnEQC7QDOOQordfrnn60M1zg7oG7TkiXbl6Ho0sPaAYN6PZw77XjWnhIaw/NU0j3mgYRtfEhdhSSQ+uWiLher3vlNyJHX1+f94ysxLLaw7Ubrc/QvUtD/64DJpjDPry+vj6P7zRHdKjNQ/2lVCpxsVj0yszPz3s06vV6cq/7B3N7f9J2qtujXq8n9i6/u++BUHu4/SMPjdgzuh/re22X8i7KsjM4K4s0Gu7vzOl9+KZxXO/evdsTTDtSz5496/0eMvrV1VXPEe06h4B2J/Kbb76Z+jtzu7MPSHcIhhy+IR60A/LIkSMeTddhKWVcp2YnjlJteO5LSQcCCF3dOTSkjNsegO8wdsu5967DV3hIaw+Xp406rpmv2pFG3kNPG5EjLQAiqz203WgHvL7XjlD9u7blkBy6jpgjWrd5HhohW027Z27vc9pONQ0dyBF6D+j2cJ3QeWi4z4T40v04dL+R9nnllVcy63R/Z/b7S5o82M6DxI2+kpAy22kloZFnJZEHuj0AW0nkWUmEeJBnbuSVhPy+mSsJV7cudHts9koixJfux/p+q1cSSrbtO0gA4IWFBf7iiy94YWGBgauOVHF21et1zwFZKBT46NGjfOHCBR4fH2cAvGfPHl5bW0sUNjw8zOvr67xjx47EYGTmLYo+e/ZsQmPHjh28vr7Ohw4d4lKpxIuLi4mCFxcXPaeyWybk8NU8SKOWy+VkduPOTKS8OKCYrzo1RTf33XcfA+CZmRm+cOECDw4OMgDetWsXr66uJsbsphQRaKfb2NhYKt0s6PaQAbtUKnmObpfvyclJBsATExO8vr6epL8YGhri1dXVRDeFQqGNJ3Fca90LDZFDUnIUi8U2OwrpQut2ZGSEAfDIyIj3fCdyiJ1Vq9U2p39ae2i7kcGyXC4H9StyVqtVXl1d9cqvrq4mPHV1dXlyEFGiP3mmu7ub33//fc9pqp38oTYP9Rc5myQ09u7dywB47969XhDG2NhYsH/oPpdmp66u7rnnHgbA4+PjwfeA1pXbP1yHfIjG7OxssE/pZ9x+HOrX2i7l+d7eXq/+tDpl1ZF2H+ovadjWg4Q+EKMjEPThqUqlwktLS96BIff3jV5u1Eqj0WiLWHIPyUgZl89rjXpwt40EOiJER5DoyKKQTC6PzByNbNEDRigqJXZt5Bl9uXwvLi56ci8uLkafl9mq2MjS0pJXp25fHWHS39/fJkepVPJsIHawz42+C9kMM0fb8FqvqakpL5IrTySNK1uajJ32l+shi+alUCh4fMbaQ/eHUBndj3UbXu/2uR7tXyqVPLl0H2/db99BAkDqDD1rBi8QwxgaGuKVlZVk6UxEwVnLxMQEA82ZUWiGfvTo0aQOmVFI8rHBwcGkzPj4OC8tLQVnpvJy2blzJ6+trXnhm3lnvrGVxMzMDAPN5Hdu0jAi4uPHjyc0ZOtOXrauPvWsUq8s0lZyMsvUupdtiE50kTWTTZsZyQtJ2kfP4vUsU7eX1oO2idBKImQnUmeovdJWJ7JKDulXOrfst2u7S2vzQqHAJ0+eTNqDiBIeBwcHeXBwMFl5i10MDAwEbTG2Ygr1Bakj76pXVha33357RyttIH0lsW/fPgbA+/fvD+4gaLsSmtVq1esv7vtI24VuU3nBl8tlXllZ8Ww5tLLLWkmIDUiZ2267LUhD5CoWi8F3pthQX18fLy8vJ1tuAK5s20FiZGTEewG4e/1ZvgCBGLB7r30O7v4nEfHs7GxqegWpw00XInv/Ugezf1Re73EDSOK33fpcHmJ76DGfBBHx/Py8twcrsx6B0MxK/eHuTzP7PgoxXhchf48LMfq8uhCDd59xo2tCkAFCyyF16P1qZr+9tB60TYTkCNmJ1Cl1xPwcrr9NaGgfj6sbbXehNi8WiwmNer3uPc/cbE+9jz40NOTx7dpizPcS6gui/zRdiZyu31DbWcxnF2oPt40rlQovLCx4unF9kfKM2JXu4yEa2i50m0od7r1ry9pHJDxl+SSIqM3v5NKoVCpt7w7tH3Xbgpnd+rbnILFnzx5PIB3lkBZV5Cp5ZWXFu9fRSzqyIiu9gpRx7wuFQls0hntUHug8vUIsGkfXGYpuWltb86I5XnvtNa8OoZmmT6A9AkTzraPLQpFjLkKd+1pTTWhIG6bJkSeFidaDLh+yAW0nUqeU7zRNtNav1o22u1Cbu7orFApt6Uj0xEHazK1DR+BkRXGF+kJMVyKnSzNmEzr6L0RD8+mm5RA5s+zq+PHj7CJku5pGLGrRbQ/NQ4inEE0dfRZ7d+h35vLysieXU9/2HCTSVhLM2VFFrlK3ciUhdd7IKwnBdltJpAHY+EoipIfNXkm4NGz52WmfAAANb0lEQVQlcVXuzVpJuDRdaBrbbSURagvmm2AlAYR9EszZUUWCrfZJMLfvR99oPgnBdvNJpOFafBIhPWy2T0JgPomt8Ukw803pk2Dmm9MnMTg42Ba54iIU2aIRi2ro7+/36qjVal7EwtTUVFskjI7W6O/vD0bLCHQEiY6S0JERaZEvWXVqPqempjIjL0LnBLQ+dSRELLpJv7xD0Wed6iLUXjHo9tFy1Gq1zPbSetA20Wg0ovqP2YCkYc9qY63fUJRVp22uedTRgKEoIbfOWq3m6Ua3X6gvxHSl5ezq6vJoxGwilLtJt3Gj0ciMdtJ2pWkSUdQudJvG+NZRXpqnWq0WjaILvTuy3omdRDcRN2fqNzRmZmb4xIkTW82GwWAw3LQgopPMPNP2Q2jkuNEu+ca1QMcNh84PaMRim/XMSGeoDK1OOp0ZxWZ8egaieQrxoGfL+qCcniHGZjW1Wq3tGc2nlnNxcTHzXvM4NTXVRiP2TFdXV3S2FYNuLz1rj505CdmEliMkaxYPIbvUNqNnx53Wqa/QSkLPjrUu9Iw8tIp2n280GlEaWp/6Xteh5dKz6Uaj0dYesZWc7mOhGbvWQ0wObZtdXV2Z7wVNI3S4UtPUutCrEd1HY2eftv05CXeQkE7U3d3NJ0+eTBw0WQOFPgUZ22PVp0FDfo5OTzvH9o71XqbmKcSD3nfXpz+XlpZ4fHw82WsWI6pUKkn0g1zu88ViMXlG86nlPHjwIJdKJT548GDwXp9ylVPG5XI5oRF7ZufOnQw091Cz9m2zBgrdXnr/P3ZqOGQThUKBe3t7U0/26xPVMb+UPk0te+RAODV7njrdNk7zSfT09HChUGhLQS+nn2Mnl7VPb//+/QyA9+3bl0pD61Pf6zokzfedd94Z3JeX9tyxY0fSHjGfkO5jWu60E9kAUuXQfg7p1z09PcH3Qp5T+No/pn1A2q+h+6jYVW9vb9uJ7JvGJ+EOEjJAuNCefA1peEEsWkPnlWFuj5iKRRbJC0ciKWJRKDoqQvMU4kEGCBduNEe97n/mUIzRje6QgUMgRuvK6fKp5azX63zo0CHvd/deeHQjdKTDu7rLeoaI2iJd0j71mgbdXsx+JJG0l6BS8fMPhWxieHiYy+Wyp18tq5ubKU+EWyzP1UbqdHMzhaKbyuVyW/Sf+CXkmawcSDo6sF6v88LCgqcrTUPrU9/rOkQu1yZ03iV9z5wdXRaK0nLllpe97g/uveZbbNOVIxQN6Np6LJ9XKOLQjSbTEVKhd1FfX59HU9vVto9u0oPEyZMn2YWOCdYA2jMzxuK+dbx76OxFJxlY88SzZ53VSOMh7VOKQlN/vvH48eMeTZ0tMpTszeVTy1koFHh9fd373b0XHt2VnqYRe0baz9VN2qde06Dbi9k/dyL6d8vr+HVtE7Fsw8zcZhOxszKxjLkbqdM9GxM6J6FpaFvMk01Vlw+d6QnZVZp+dR0iV1YGV90ezPFzKrEzDppGHjlcu5F8Y2nvhRCN0JksfWYnqz+E3kXLy8sezRdeeMGjse3PSdhKIswDYCuJkNwh2Eriqk3YSuIqD7aSaNPd9h8kzCdhPgnzSZhPwnwS5pNIHSSYLbrJhUU3WXSTRTdZdNNXGd1k5yQMBoPBkHpOIvsL7QaDwWC4pWGDhMFgMBhSYYOEwWAwGFJhg4TBYDAYUmGDhMFgMBhSYYOEwWAwGFJhg4TBYDAYUrEtB4lqtQoiSq5qtRp9pru723umu7vb+/3w4cOYnJxEsVjE5OQkDh8+HK3zwIEDCS/VahVzc3NeHeVy2aNZLpe93w8cOJB5n4eHubk5FAoFEBEKhQLm5uYy5Zqens4sv1FddKKnAwcOdCzXwMBA5n0eOebm5jrmIyaHpjE6Ouq1+fT0dCZPeXQ7PT3t1TkwMJApR0x3IV1pDAwMtPWXLDvS/UvLnUf2mJ1ouaanp9vq0zRifUzbhO7DQk+uYrHYRkPLXq1WvTqnp6e9e11e0xgYGGjTnbar0dHRTN1quUZHRz3dFYvFzPehh9AJuxvtck9cy6lD/TlMN0+Mhk7LoT/BqdNX6OP8Ieij8jqNgD4K39vby0Az5UKedBZ5eIilmtBy6RQboc9lbkQXWcjzedmYXDplSZ7Pfmo59Kcr8/ARk6PTtBwb0a2ctpa0HDoFhpZjI59I1dApSnRqCW1HOhVIKLVETPaYncTS4IQ+wxrrY9omdB/WaWwkBRCAhIZOFxJL56JTarif6k37NG+n6Xe0XPoTq3L6ulKp6E+/XuabIS2HKNiFm9wqBBkgXLhJt3QiPGY/MVgIOulWKCGZm1SrXq97ibxiifHy8BBLWqfl0sn6dPmN6iILWk/M7YkKNbRcOvmhvs8jR6VS4YWFBU+OGB8xOTpN8LcR3coA4fLhJtPTcsR0x9yuqxBNlyedpE7bkfQvt06dpC4me8xOYgk1mZt92u3nsT6mbSLUh92EmMzhzL9u4sFYYkgpr2loXWkanSTy1HIREc/Ozno0u7u723TXqu/GGSQAFAH8J4AjsbJ6kFhZWfEUptNGawB+qnBm9lLt6pTazH6K4bQ63fS9odTGbnreQqHgpQSOpdjOy0NW+utQqnA37bcuv1FdZEHribk95XnoGZ3SWadwdu/zyCF1unLE+IjJ0Wmq8I3a2dramnevZXfliOmOuV1XIZpu2vRQumud5t79XcudR/aYnWi5dDps+Zv74suTxt61iVAfdlPrSxnd5jqFeVaKea0roeHWqdtL7MpF7JMArlzyvEtTp6R3eLqhBom/BrC0kUHCVhJN2ErCVhJaDltJjHllbCWxTVcSAEYAvA7gm50OEuaTuArzSZhPwnwS5pP4qn0SW5IFloj+BcDfA+gB8ENm/k6gzA8A/AAAhoaGvv7ss88mvzUaDVy8eDG5L5fLePXVVzNp3n///Th//nxyX61W8fLLLyf3r7/+Op555hl89NFHGB0dxUMPPYR77703s84nn3wSL730Ei5evIhyuYy7774bn332WVLHuXPncPny5aR8sVhErVZLft+9ezdOnTqVep+Hh0cffRRuhtyZmRk88cQTqXIREc6cOZNafqO66ERPDzzwAB555JGO5Orp6cGXX36Zep9Hjp07d+Kdd97piI+YHJOTkx6N9fV1rK2tJc+Mj4/j6aefTuUpj24ffvhhr816enpw/vz5VDliugvpSmN+ft57plqtYnh4ONWOqtWq17+03Hlkj9mJlmt8fBzM7NUHwKMR62PaJnQf/vDDDz0ZiAgHDx70aHz66aee7OVyGQCSOkdGRvDxxx8n98Vi0Suv0dPTgxdffNH724MPPujZ1eDgIJ577rlU3Wq57rjjDu95IoL77m+1XzAL7KYPEkT0HQDfZua/JKI/Qcog4cJShRsMBsNXixspVfheAPNE9CGAZwF8k4ie2QI+DAaDwRDBpg8SzPwjZh5h5jEA3wdwlJkf2mw+DAaDwRDHtjxxbTAYDIbNQWkriTPzGwDe2EoeDAaDwZAOW0kYDAaDIRVbEgLbKYhoDcDZrebDYDAYbmLcxcyD+o/bYpAwGAwGw9bAtpsMBoPBkAobJAwGg8GQChskDLcsiGiYiJ4log+I6JdE9K9ENEFEvyWiU62/PUVEBSL6GRHtc579NRH92Ll/noj2E9F/E9Htis4LRPRg6//7iGiZiH5FRKdVnf9MRN8L8Hm5xc8pInpR/24wfJXY0hBYg2GrQEQE4GcAfsrM32/9bTeAIQAfMPNuIioBOApgH4C3AMwCeIGIBgD8L4BvOFV+A8BfAXi1Vf6nrTpvB/BHAP6MiO4G8BMA32LmM0Q0DuDfiOg3zLycwe5vmXn39ZLdYOgEtpIw3Kr4UwAXmfkp+QMznwJwzrm/hObgsAvAMTQHCbT+PQJgkJoYR/NF/imAw2hmEhB8F8ArzPx/AH4I4O+Y+Uyr/jNoJrp89KsR0WC4dtggYbhVMQngZFYBIvodAPcCON0qO0lEt6E5SLwN4NcAfr91f6z12CsAvt5abQDNAUM+5lwP0DzR+nsWqkR0goiOu9tTBsNmwLabDIZ2/C4RnUIzx/7PmfllACCi9wDcA+APAfwjgK+hOUDsQXPFAWa+0PIbfI+IngewG80tKACgVp0uQn/TGGXmVSL6GoCjRHSamT+4ViENhjywQcJwq+I9AG1O4hY+SPEBvAXgjwH0MPP/ENFxAItoDhJPOeUOA/gxmgPAz5lZPn7yHoAZAK7/4R4Av8xilJlXW//+hojeaNGzQcKwKbDtJsOtiqMAKkT05/IHIvoDAHdlPHMMwF8AeKd1v4zmqmIUzQFA8O8Afg9NR/Zh5+8/AfAjIhpr0RsD8DiAQ2kEiaiPiCqt/+9EM9V+5qBiMFxP2CBhuCXBzVQD3wXwrVYI7HsA/hbAasZjb6G5xfR2q45LAP4LwAlmvuLUfQXA8wAGAPyH8/dTAB4D8Asi+hWAXwD4m9bfBf9ERB+3rrfR9HmcIKJ30Bx8/oGZbZAwbBosLYfBYDAYUmErCYPBYDCkwgYJg8FgMKTCBgmDwWAwpMIGCYPBYDCkwgYJg8FgMKTCBgmDwWAwpMIGCYPBYDCkwgYJg8FgMKTi/wFrlIGYMclOtAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Plot box plot of logmove vs. store demographic columns\n", + "for cl in storedemo.columns[1:]:\n", + " p = sales.loc[sales[\"logmove\"] != 0].boxplot(column=\"logmove\", by=cl)\n", + " p.set_title(\"logmove by {}\".format(cl), linespacing=3)\n", + " p.set_xlabel(cl)\n", + " p.set_ylabel(\"logmove\")\n", + " p.get_xaxis().set_ticks([])\n", + " plt.suptitle(\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEECAYAAADd88i7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de3gc9Xno8e+7utrGsSTbkW/YUo/bRLVsQnFOCzjBgiDHJRGEUIhj2iRSDJY5Cg9NgyBqm6ZFJm5LWo4SrEMil7S2BDUhhIQ6NkFyEkNwaxKObRBpLkBizEVgydgysiXt2z92V9mVtdJK2plZzbyf59lHOzPa+f1mtJp3ftcRVcUYY4wZScjrDBhjjMlcFiSMMcYkZUHCGGNMUhYkjDHGJGVBwhhjTFIWJIwxxiRlQcJ4SkReFJEPeJ0PJ4jIahE5kqZ93Scid6RjX1MxfeMdCxLGGGOSsiBhjM+ISLbXeTD+YUHCZAwRyRORfxaRo9HXP4tIXtz2W0Xklei2T4uIisjS6Lb7ROQeEdklIidF5AkRmRfdR7eIPC8i58ftq0xE9opIj4g8KyJV0fV/JCKvikhW3O9+REQORt+HROQ2EfmliLwpIv8uIkVjHNfnReSNaNXa+ui694rIa/EXdBH5qIg8M8qu5ojIYyJyQkR+ICJL4j6rInKTiPwc+Hl03d0i8hsReUtEnhaR98X9/t9E8/6v0f09KyIr47afLyI/iW57AMgf7RiNf1mQMJmkAfgj4D3AecD/Bv4SQEQ+CPw58AFgKXDJCJ+/Nvr7c4DTwI+Bn0SXHwS+HN1XDvAdYA/wTqAO2CEi71LVp4Be4NK4/X4caI2+/wxwVTT9BUA38NVRjmleNP2FwCeAe6Pp/BfwJnB53O9eD/zbKPtaD/xddH/PADuGbb8K+EPg96PL/0XkXBZF879TROIv9lXA/UAB8AjwFQARyQUejualCNgJfHSUfBk/U1V72cuzF/Ai8IHo+18Cfxy3bQ3wYvT9NuDOuG1LAQWWRpfvA74Wt70O6IxbXg70RN+/D3gVCMVtbwP+Jvr+DmBb9P1MIkFjSXS5E7gs7nPzgX4ge4RjWw0MADPi1v078FfR9/XAjuj7IuAUMD/JeboPuD9u+RxgEDg3uqzApWOc627gvOj7vwG+H7ft94G3o+/fDxwFJG77k8AdXn9f7OX+y0oSJpMsAF6KW34pui627Tdx2+Lfx7wW9/7tEZbPid+XqoaHpbUw+r4VuDpa1XU18BNVjeVrCfCtaDVVD5GgMQgUJzmmblXtTXJM24EPi8g5REpBP1LVV5LsB+KOWVVPAsfi9pWwHUBEPisinSJyPJrXWURKITGvxr0/BeRHq78WAC+ravzsn/F/FxMgFiRMJjlK5CIcszi6DuAVYFHctnMnmc65IhL//V8MvAygqs8RuSiuJbGqCSIX4rWqWhD3ylfVl5OkVSgiM4alczSazstEqsQ+Avwpo1c1QdwxRwNLEb89PxApTcS2v49ISeVaoFBVC4DjgIyRBkTO9UIRif/dxSl8zviQBQmTSdqAvxSRuSIyB/hrInfbEKmm+VS0wXl6dNtE7SdShXSriOSIyGrgw0Tq52NaibQ/vJ9InXxMM9AYazSO5vXKMdL7oojkRi/cHxq2v38FbiVSHfatMfbzxyKyKtpm8HfAflUdqUQFkWqyAaALyBaRvwbeMcb+Y34c/exnRCRbRK4m0j5kAsiChMkkdwAHgIPAISKNzncAqOou4P8CHcAviFzIINJAPS6qeoZIo+1a4A3gHuDPVPX5uF9rI9Km0K6qb8Stv5tII+8eETkBPEWksTiZV4m0BRwl0tC8cVg63yJahTWsWmokrcAXiFQzXUCkITuZ3cAu4L+JlIr6GLmK7izR83M18Mlo3q8DHkrls8Z/JLHa0ZipQUTKgMNAnqoOeJ2fyRCRXwI3qur3vc6LMcNZScJMGdHxCrkiUghsAb7jgwDxUSJtCe1e58WYkViQMFPJjUTq2H9JpEdRrbfZmRwR2QtsBW4a1tPKmIxh1U3GGGOSspKEMcaYpCxIGGOMSWpKzBY5Z84cLSkp8TobxhjjW08//fQbqjp3+PopESRKSko4cOCA19kwxhjfEpERp16x6iZjjDFJWZAwxhiTlAUJY4wxSVmQMMYYk5QFCWOMMUlZkDDGmEloa2ujvLycrKwsysvLaWtr8zpLaTUlusAaY0wmamtro6GhgZaWFlatWsW+ffuoqakBYN26dR7nLj2sJGGMmfK8uptvbGykpaWFiooKcnJyqKiooKWlhcbGRlfSd4OVJIwxU5qXd/OdnZ2sWrUqYd2qVavo7Ox0NF03WUnC+Irf64fN2by8my8rK2Pfvn0J6/bt20dZWZnjabvFShLGN4JQP2zO5uXdfENDA9dddx0zZszgpZdeYsmSJfT29nL33Xc7nrZbrCRhfCMI9cPmbJlyNy8irqbnGlXN+NcFF1ygxowlFArpmTNnEtadOXNGQ6GQRzkybmhtbdXS0lJtb2/XM2fOaHt7u5aWlmpra6vjaS9btkzb29sT1rW3t+uyZcscTzvdgAM6wvXXShLGNzLljtK4a926dTQ2NlJXV0d+fj51dXU0Nja6UsXY2dnJkSNHEtrBjhw54quGa2uTML4RhPphk1kWLFhAfX09O3bsGGoHW79+PQsWLPA6a2ljJQnjS76tHx5FUHt2xTosNDU10dfXR1NTEw0NDa4d/6lTp6iuriY/P5/q6mpOnTrlSrquGakOKtNe1iYxtbS2tuqyZcs0FArpsmXLXKkbVo3UDzc0NCSkHVv2Oy/r5b3mZbuAiGj0yZkqIlpSUqJz5sxREXE87XQjSZuE5wEglZcFianDy4uViOjcuXO1pKREQ6GQlpSU6Ny5c6fkP+x4BTlAetlhIS8vT9evX59w3tevX695eXmOp51uFiSMK7y8q8vOztZzzjkn4a7unHPO0ezsbMfT9lrseOODc+w8+J2X3zlAQ6GQFhcXq4hocXGxhkIhjVTSTC3JgoS1SZi08rK3x8DAAKdOnaKuro6TJ09SV1fHqVOnGBgYcDxtr+Xm5lJXV5cwRqSuro7c3Fyvs+a4hoYGampq6OjooL+/n46ODmpqamhoaHA87ezsbKZNm8a0adMQkaH32dk+6hM0UuTItJeVJKaORYsW6fTp0zUnJ0cBzcnJ0enTp+uiRYscTxvQdevWJRT9161bNyXv6sZLREas5gtCSULVu3YwQIuLixPOe3Fx8ZT8zmHVTcYNM2bMUEBra2u1p6dHa2trFdAZM2Y4njagWVlZCgy9Yst+F+Q2CS8BWlVVpXl5eQpoXl6eVlVVTcnvnAUJ4wpAL7zwwoR/mgsvvNCVf5rs7OyEABF7BaFNIsi9m7xUVFSUcDMS+1lUVOR11sYtWZCwNgmTds888wzhcBiAcDjMM88840q6ydoegtAm4eWo40zg1RiR06dPAzA4OJjwM7beF0aKHJn2mmhJwqt6yiAjevdeWFioIqKFhYVD69xKO9a7JPbTjbSNd7wsRRFXWo3/ORW/cwStusmK395ghOoet4OEF2kb73jdBdYv7WDJgoRvq5ts2mhjgqGzs5OdO3eSn5+PiJCfn8/OnTtdm2RvcHBwaBoYERmqcvIL3waJIDxW0Jh4a9asIRQKISKEQiHWrFnjdZZcUVBQwL333svmzZvp7e1l8+bN3HvvvRQUFLiWh8iN+G9/+olvg4RNG22CZM2aNezZs4eCggJEhIKCAvbs2ROIQPHWW28xa9Yszj//fHJycjj//POZNWsWb731ltdZ8wXfBgkvR2Ea47Y9e/YQCoXo7u5GVenu7iYUCrFnzx6vs+a4gYEB5s2bx6WXXkpubi6XXnop8+bNC0SvNjf4NkisW7eOK664grVr15Kbm8vatWu54oorAtMl0ARPOBymqqqKrq4uqqqqhroh+52I8NxzzxEKRS5noVCI5557ztXp4uPbJPzGt0Gira2NRx99lF27dnHmzBl27drFo48+Gpg59k3wLF68mG9/+9vMmTOHb3/72yxevNjrLLki1g4QPzYnfr2befBjm4RMhYNauXKlHjhwYFyfKS8vp6mpiYqKiqF1HR0d1NXVcfjw4XRn0USNdifl9HfNy7S9Fjv2wsJCuru7h35CcI49FAoRDoeHfoJ958ZDRJ5W1ZXD1/u2JGG9m0wQxQJD7GdQvPvd72ZwcBBVZXBwkHe/+92OpzlW1ZJfqp58GyTKysq49tprE/pOX3vttda7yUFB+afJRLH6+FTX+83zzz/Ppk2bOH78OJs2beL55593PE1VZcaMGSNumzFjxpQrSSTj2DdIRLaJyOsicjhu3T+IyPMiclBEviUijnVkXrhwIQ8//DDV1dX09PRQXV3Nww8/zMKFC51KMvBUlaKiohG3FRUV+eafJhMla6R2s/Ha62dsb926lYKCArZu3epamidPnjwrUMyYMYOTJ0+6lgfHjTQMOx0v4P3AHwCH49ZVAtnR91uALansayLTcuTl5emsWbMShsvPmjVrSj5WcKqJzYwZe7k1IyYBnpYDUBHRu+66S3t7e/Wuu+5SEXHt2L2cBqeysnLEv3llZaXjacdbUv9dV9NLN7yYuwkoiQ8Sw7Z9BNiRyn4mEiRiX5SZM2dqKBTSmTNnBuaCkSnc/qcJepDw8ti9nD+ptbV1xON2e542vwYJLyssq4FdTiYgIpw4cYJwOMyJEyesTtwYh3jZUeT6668f13ozPp48iFVEGoABYMcov3MDcANAcXExe/fuHXc6OqwOPLY8kX2ZicmUc50p+fCCG8e+ePFivvKVr3D++ecPrfvpT3/K4sWLHU8/1u4yvAtsOBx2/e/uy+/ZSMWLdL0YoboJ+ATwY2B6qvuZTHXTSC/jDqtuco/Xx97a2qpz587VkpISDYVCWlJSonPnznX1mQ5e/939Wt3kaklCRD4I1AOXqOopN9M2xrhDh5XgzdTmZBfYNiIlhneJyBERqQG+AswEHhORZ0Sk2an0TbDYGI2IwsJCDh48SGFhoavpNjY28sADD/DCCy8QDod54YUXeOCBB+z5LT7gWJBQ1XWqOl9Vc1R1kaq2qOpSVT1XVd8TfW10Kv0giz3nODaIsK6uzussOW6su9eg3N12d3ezYsUK10dc2wwH/hWM4ZgBUldXxz333JPwXIF77rknEIGisrJyXOtN+tjzW/zLgoTPNDc3U1BQQFtbG6dPn6atrY2CggKam/1fs7d7924qKysTpm2urKxk9+7dHufM/zLh+S1+nq7bSxYkfGZgYIDt27cnPNt7+/btgXkAy+7duwmHwyyp/y7hcNgChEsy4fktsSrFoFQtxjg9HYoFCR8aPhW6TY1unGbPb/FGW1sbDQ0NNDU10dfXR1NTEw0NDek97yP1i820l42TSF1RUZGKiGZlZSmgWVlZKiKuzZ8Uz8t+41O9z/p4ef1993JaDq+PPcaL71w6zzsZOC2HccDKlStRjcypDwzNsb9y5VnPEjEmbTo7O9m5c2dCr7qdO3da7yaHdXZ2cuTIkYTqpiNHjqT1vHsyLYdxTnt7O3l5eYTDYfr7+8nJySEUCtHe3u511owLcnJyhv7u/f39rqUb6xxRXFzM66+/TmFhIc3Nza6N1wiFQmRlZQ0d++DgYCCe8b1gwQLq6+vZsWMHq1atYt++faxfv54FCxakLQ0rSfjMwMAABQUF7N69mzNnzrB7924KCgoC03AddLHA4GaAAOjp6QEi1dfhcHio8Ti23mmqmnDssfSDYPixpvvYLUj4UHl5+dCAurq6OsrLy73OkvG5cDhMfn4+x44dA+DYsWPk5+e7djfv9IUyUx09epTy8nIuu+wycnNzueyyyygvL+fo0aNpS8Oqm3zo8ccfH3r/7LPP8uyzz3qYGxMU/f39CWMU3C7NBFFBQQGPP/74UDXfO9/5Th5//PG0VvNZkDDGpMXAwMBQkBgYGAjM3byXenp6UFW6uroIh8N0dXWhqmmt5rPqJmNM2sQCg9sBIhQKkZOTAzDUWSMIYtV58b0Z49enQzDOpDHGFfPmzSMUCjFv3jxX04315oNINVcQejbFKy4uTviZThYkjDFpEQqFePXVVwmHw7z66quBuZvPBK+99lrCz3Syv6IxJi2G370H7W7eryxIGGOMScqXQSITnlLm9MyMxhjjBl8GibF6Vjjd86KtrY2bb76Z3t5eAHp7e7n55pstUBhjphxfBgmv3XrrrWcNJOrv7+fWW2/1KEfGuMMe/OM/vh1Mp6ojflHd6L995MgRsrKyhga0vPjiiwnLxviVV+MkjHN8XZKIzYe+pP67Q+/dMjg4mHBXFRvkYowxU4mvg4TX7K7KGDPVWZAwxhiTlAUJY4wxSVmQMMYYk5QFCWOMMUlZkDDGGJOUBQljjDFJWZAwxhiTlAUJY4wxSVmQMMaYKcit2a4tSKRZJkxTbozxP7dmu7YgkWaqSl5e3ojb8vLybIoOn7PniBi/cSxIiMg2EXldRA7HrSsSkcdE5OfRn4VOpe+lvr6+swJFXl4efX19HuXIuKGtrY2Ghgaampro6+ujqamJhoYGCxTGMcluOtN5M+pkSeI+4IPD1t0GPK6qvws8Hl32pb6+voQZaC1A+F9jYyMtLS1UVFSQk5NDRUUFLS0tNDY2ep0142NOz3btWJBQ1R8Cx4atvhL4RvT9N4CrnErfGLd1dnZy5MiRhOqmI0eO0NnZ6XXWfMvaAJ3n9kOHilX1FQBVfUVE3uly+sY4ZsGCBdx66620trayatUq9u3bx8c//nEWLFjgddZ8K9nDxeK3m8nJ2CfTicgNwA0AxcXF7N27d1L7m+znp2ra8bzIR5DOe19fHydOnODyyy9ncHCQrKwssrOzmTlzZqDOg9vpz5w5kxMnToy43u1j9+O5FicjrYiUAN9V1fLo8s+A1dFSxHxgr6q+a6z9rFy5Ug8cODDhfJTc9igvfumKCX9+MtxOO5PuqoJ03iFy7kWEUCg0FCTC4bArT0X0+u/udfqzZ8/m2LHf1m4XFRXx5ptvpj2d8764h+Nv94/9iyOYNS2H//+FyjTn6Lcm+50XkadVdeXw9W6XJB4BPgF8Kfrz2y6nb4yjVHXoUbX2yFr3xAKC0zcHx9/un/D+S257NM25cYeTXWDbgB8D7xKRIyJSQyQ4XC4iPwcujy4bY4zJUI6VJFR1XZJNlzmVpgmOVIr9o925OV30N8YvMrbh2pjRTKbYD1O36G+M21IOEiKyBPhdVf2+iEwDslX17C4FJjDsbj4zpDJWwLqCmolKKUiIyAYi3VGLgP8FLAKasaqjQLO7+ZHl5+fT19c39NNpNlbAOCnVhuubgIuBtwBU9eeADYQzZgSxwODmVCzZ2SPf7yVbb0yqUg0Sp1X1TGxBRLIBuz0xJsrr6SH6+/vPCgjZ2dn090+sT78xManeZvxARD4PTBORy4FNwHecy9b4WN14aqxu2jmqSn5+PqdPnz5rm1szAMcCgpeDGI3/pBokbgNqgEPAjcB/AF93KlPjZXXjqbEA4axYO0R8oLAp4s1Ul2p105XAv6rqn6jqNar6NbUrTkZyY355k5xNEW/8JtUgUQX8t4j8m4hcEW2TMBnK6fnljTHBkVKQUNVPAUuBncDHgV+KSMZUNxljjHFGyiUCVe0XkV1EejVNI1IF9WmnMmaMMcZ7KZUkROSDInIf8AvgGiKN1vMdzJcxxpgMkGpJ4pPA/cCNqnp2Hz9jjDGO8qqrf0pBQlU/JiLFRKb5BvhPVX193KkZY8wUNrPsNpZ/47YJfhZg4l31verqn+rcTX8C/COwFxCgSUQ+p6oPTihVH7GBfCbogjTB4InOLwXuoUOpVjf9JfDeWOlBROYC3wcCHyRsIJ83JnNHF/k8TOauzvyWTTDob6kGidCw6qU3cfCpduNlF4zgmcwdHVhwNiZVqQaJ74nIbqAtunwdsMuZLI2fXTCM8Vay0oSVIqa+VAfTfQ64F1gBnAfcq6q3OpkxY8zUYiP9/Wk8g+m+KSKPxT4jIkWqesyxnBljjPFcqr2bbgT+FngbCBPp4aTA7ziXNWOMMV5LtSTxF8AyVX3DycwYY4wZmVcddFINEr8ETo177wFgPauMMW7wqoNOqkHiduBJEdkPDE3LoaqfmVCqPhLknlUWII3xv1SDxP8D2ok8mS7sXHbMVBLkAGkj7U1QpBokBlT1zx3NySRN5oIza1pOGnNigsBG2pugSDVIdIjIDcB3SKxuyogusGP9s9qD4Y0xZmJSDRIfj/68PW6ddYE1nrLSozHOS3Wq8FKnM2LMeFjp0Rh3pDqY7uoRVh8HDtlzJYxxlzWae2uiJdh0lF69KD2nWt1UA1wIdESXVwNPAb8nIn+rqv82odR9wqo9jJus0dw7o513p0uvXpWeUw0SYaBMVV8DiD6lbivwh8APgcAGCav2CCYbI2KCItUgURILEFGvA7+nqsdEZPRyrzE+FOQxIiZYUg0SPxKR7wI7o8vXAD8UkRlAz3gTFZFbgE8T6SF1CPiUqvaNdz/GGGOclerT5W4C/gV4D3A+8A3gJlXtVdWK8SQoIguBzwArVbUcyAI+Np59GGOMcUeqXWBVRPYBZ4jc/f+nTu6JItnAtGhV1XTg6CT2FWhj9XSxXi7GmMlItQvstcA/AHuJPEuiSUQ+p6oPjjdBVX1ZRP4R+DWR51PsUdU9492PiZhMT5d01Itbzy5j/C3VNokG4L2xMREiMhf4PjDuICEihcCVQCmR9oydInK9qm4f9ns3ADcAFBcXs3fv3vEmlWCyn8/ktCez/8l89r4Pzhh1+ye/1zvm7zh5bjL5vE/285n+/+Dn/7dMTdup9FMNEqFhg+beJPX2jOE+ALygql0AIvIQcBGQECRU9V4iz9Vm5cqVunr16gkmB3zvUSb1+clwOu3J7D+T85bpaX/vUT75vd4Jf3zWtBzv/m72d/df2g6mn2qQ+J6I7AbaosvXAf8xwTR/DfyRiEwnUt10GXBggvsyxhNBHh8zmRHf1g429aTacP05EfkocDGRNol7VfVbE0lQVfeLyIPAT4AB4KdESwzGmLF5PZDPy3Ywm5LEfamWJFDVbwLfTEeiqvoF4Avp2JcxQRPkgXw2JYn7Rg0SInKCSJfXszYR6Rn7DkdyZYwxJiOMGiRUdaZbGTHGGJN5JtpDyRhjTACk3CZhMtNkGjFtJlJjzFgsSExxk2nEtEY8Y8xYrLrJGGNMUlaSMMaMi1VxBosFCWOmIC8nVrQqzmCxIGHMFBPkKUHM2WbPns2xY8cAkC1QVFTEm2++mbb9W5AwxpgpSERGXH/s2LGhbZN77E+EBQmHxP8BZUvkZzr+YMYYA5HriYggIgnXlthyuq43vu7dNHv2bESEl7Z8CBFh9uzZrqQbHyBy3vepEdcbY0w6qColJSX84he/oKSkJO03o74tScTX08UcO3aM2bNnp7W+brjhgaD/R/9y1nYrURhj0unFF19k6dKljuzbl0FitDv2WH2dUxfqWBEwZvv27Vx//fUJ29Ntoj1G7PGhZqrxepr0TBUKhdizZw+VlZWEw+G07tuXQSL+Qn3RRRfx4IMPcs011/Dkk08ObXdLfIBwwmi9WKyXi/uC0hbl1Y1JkKdJH004HOYDH/iAI/v2ZZCIyc7O5vjx4yxatIiysjKys7MZGBhwNQ8bNmzga1/7mqtpBtFIpcfYRTrGyYv1aKXXdPY0yQTWBTfz5OTkMDAwQHZ2Nv39oz+Uabx8HSQGBgb42c9+Rjgc5mc/+5nrAQKwAOESry/Aw6sZR9pujFNigSHdAQJ83rsJGAoMXgQIgFtuucWTdI23tm/f7nUWjEkL3wcJr/3TP/2T11kwHnC6LcoYSF7Nmc7u9r4OEllZWaMuu2HLli1j/5Lxnfr6eq+zYAKitrZ2aPCcqlJbW5vW/fs6SAwODlJbW0tPTw+1tbUMDg66nge7WAST3RwYN6gqu3btoqOjg/7+fjo6Oti1a1da28B8HSRycnLYtWsXhYWF7Nq1i5wcGxdgjPGPvLw8Fi5cyNq1a8nNzWXt2rUsXLiQvLy8tKXh6yAxODjI22+/DcDbb7/tSUnCGGOccskll/DEE09QXV1NT08P1dXVPPHEE1xyySVpS8O3QSIvL48LL7yQnp4eVJWenh4uvPDCtEZYY4zx0ssvv8xVV13Ftm3bKCgoYNu2bVx11VW8/PLLaUvDt0Fiw4YN7N+/n82bN9Pb28vmzZvZv38/GzZs8DprxhiTFp2dnVx99dUsXbqUUCjE0qVLufrqq+ns7ExbGr4dTNfU1ATA5z//eT772c+Sl5fHxo0bh9Y7rbCwMGGCwaKiIrq7u11J23hr+LTNxjhlwYIF1NfXs2PHDlatWsW+fftYv349CxYsSFsavi1JQCRQ9PX1oar09fW5FiAAuru7ufjii3nllVe4+OKLLUAEiIjwzW9+0wKEccXwnkw2VfgUkZOTw5NPPjkU0XNychwZMm8y0zXXXON1FkwAHD16lPvuu4+6ujo6OzspKyvj7//+7/nkJz+ZtjR8XZLwyrnnnkt/fz8XXXQRR48e5aKLLqK/v59zzz3X66wZB2VnR+65CgsLOXjwIIWFhQnrjUm3srIyFi1axOHDhxkcHOTw4cNDE5qmi317HfCOd7yD0tLShJJEaWkp06dP9zhnxkmDg4Pk5ubS3d3NihUrAMjNzbUSpHFMQ0MD1113HTNmzOCll15iyZIl9Pb2cvfdd6ctDQsSDujs7KSvry9h8F5/fz/5+fke5so4TVV5/fXXmTVr1tC648ePU1BQ4GGu/Gcyz4Tw84O2nGoDsyDhgLKyMr74xS/y8MMPD9UTXnXVVWktAprMIyLcfvvt3HPPPUPrbr/9dmvATiN7lkWixsZGHnjgASoqKobWdXR0UFdXx7p169KShrVJOKCiooItW7ZQXV3NiRMnqK6uZsuWLQl/SOM/l19+OVu3bmXTpk0cP36cTZs2sXXrVi6//HKvs2Z8qrOzk1WrViWsW7VqVVrHSViQcEBHRwf19fVs27aNmTNnsm3bNurr6+no6PA6a8ZBu3fvprKykubmZgoKCmhubqayspLdu3d7nbremKgAAAqfSURBVDXjU2VlZezbty9h3b59+6Z+w7WIFABfB8oBBapV9cde5MUJnZ2d/PSnP+WOO+4YWtff38+dd97pYa6MGywgGDc1NDRQU1NDS0vL0GC6mpoaGhsb05aGV20SdwPfU9VrRCQX8FW3n1h0j69eSnd0NybG6+d7B1UmnPdYu0P8OInGxsa0tUeAB9VNIvIO4P1AC4CqnlHVHrfz4aRYdI+f472mpoaGhgavs2Z8SFVZvnw5AFVVVXR1dVFVVQXA8uXLLUA4RFVHHRvj1nlft25dwjiJdAYI8KYk8TtAF/AvInIe8DRws6r2xv+SiNwA3ABQXFzM3r173c7nhM2fP5/169dTXV3Nr3/9axYvXsz111/P/PnzXT8Or8+b1+kHxaFDh7jooou45ZZbOHz4MLfccgtvvPEGTz75pCd/Ay//7m6mPTAwwDnnnMNDDz3Em2++yUMPPcSHP/xhTp486Z/vfvxj79x4ASuBAeAPo8t3A3832mcuuOACNeO3pP67gU4/SADt6upKWNfV1aWRf3Hn0x7r5Ra3v3OAHjx4MGHdwYMHXT3mdAEO6AjXXy96Nx0Bjqjq/ujyg8AfeJAP40NtbW2Ul5eTlZVFeXk5bW1tXmfJNaWlpYjI0Ku0tNSVdPW3N4Dj2uYX5513XsJ5P++887zOUlq5HiRU9VXgNyLyruiqy4Dn3M6H8Z+2tjYaGhqGZv9tamqioaEhEIEiLy+PkydPUlxcTGdnJ8XFxZw8edK1h2zFN+I2NzePuN6vVJWsrCz27t1LVlaW74KiV+Mk6oAdInIQeA+w2aN8GB9pbGykpaWFiooKcnJyqKiooKWlJa3dATPV6dOnmTlzJq+99hplZWW89tprzJw5k9OnT7uaD1Xlxhtv9N2FciyDg4OsXr3al49I9iRIqOozqrpSVVeo6lWqag9bSJP4Yu9LWz6UsOz3uzo3Rp9msl/96lcJdcm/+tWvXE0/vgQx0rJfdXV1JZz3rq4ur7OUVjbi2mdGaniKf/mZG6NPM1lNTc2oy07buHHjqMt+5fV5d5pN8OdDI5UY/B4gwJ3Rp5lq+fLlPPLII2f97WPjJ9zi99LqcJly3p1kQcJn4r+sGzduHCryi4jvA4Ubo08z1fz58zl06NCI641zklVl+qmK06qbfEpV2bp1q+8Dw3BOjz7NVI899hi1tbUJVYu1tbU89thjruYjKFWbMQMDAxQWFiYcd2FhIQMDA15nLW0sSPiQV3XDwxvJg9Zw7iVVPWsCyTvvvNPVi/XXv/71UZf96gc/+MGoy1OdBQkf8qqXyViN5kG5u/RC7IFH8dx+4NGnP/3pUZf96pJLLhl1eaqzIOFTIkJtba3dvQdEpjzwSERoaWkJzPcuOzub7u5uioqKOHToEEVFRXR3dw9N/OcLqdz9ef2a6NxNra2tumzZMg2FQrps2TJtbW2d0H6mGjycO0c1uOfda5WVlSoiCqiIaGVlpavpe/29U/VmvrBMOO50IMncTZ4HgFReEwkSra2tWlpaqu3t7XrmzBltb2/X0tJS31+w4r+oX/3qV13/4gb1vAddLDjl5+frU089pfn5+UPByk1uB4nKykoFtLa2Vnt6erS2tlYB1wN0OgQuSCxbtkzb29sT1rW3t+uyZcvGva+pZKSA4GaQCOp5D7pYgIgXCxRucjtIiIjW1tYmrKutrXU9OKZDsiDh2zaJIE/R8NWvfnXUZScF+bwH3fDnJ/jmeQqjUPW+V5nTfBskgjxFw0033TTqspOCfN6DbvXq1aMu+1Em9Cpz3EjFi0x7WZtE6rA2CeMBa5OwNokpFyRUg9vLJj4wuBkgYoJ63oMuFihiLy/q5b3o3eR1r7J0SRYkRKdA3dnKlSv1wIEDXmfDGJPhSm57lBe/dIXX2ZiSRORpVV05fL1v2ySCLBQKJUyFEQrZn9k4L6iPjl2zZs3Q/1woFGLNmjVeZymt7OrhM6FQCFUlPz+fp556ivz8/Eg3NgsUxkFBfXTsmjVr2LNnDxs3bqSnp4eNGzeyZ88efwWKkeqgMu010TaJICJD+qubYMmU8TE2TmLiCNo4iSALYn91462gjo9RtXESZgoKYn91462gjo8JwjgJCxI+IyL09fUxbdo09u/fz7Rp0+jr6/PVl9ZkntijYzs6Oujv76ejo4OamhoaGhq8zpqjMmX2XUeNVAeVaS9rkxifTOivboInE8bH2DiJiSNJm4SPJj03MeFw2OssmABat25dYB4XG2/37t1eZ8FRVt1kjDEmKQsSxhhjkrIgYYwxJikLEsYYY5KyIGGMMSYpCxLGGGOSsiBhjDEmKQsSPlRXV0d+fj4iQn5+PnV1dV5nyQTAihUrEqaoX7FihddZcoXfj9uChM/U1dXR3NzM5s2b6e3tZfPmzTQ3N1ugMI5asWIFhw4doqqqiq6uLqqqqjh06JDvLpjDBeK4RxqGnWkvm5YjdXl5eXrXXXclrLvrrrs0Ly/PoxyZIAC0qqoqYV1VVZXrU9S7PS1Hphx3OpBpjy8VkSzgAPCyqn5otN+1x5emTkTo7e1l+vTpQ+tOnTrFjBkzfDV9scksIkJXVxdz5swZWvfGG28wd+5cR793qUxc6XT6Xhy3EzLx8aU3A/6ebN4DeXl5NDc3J6xrbm4mLy/PoxyZoKipqRl12Qkj3fkOfznNi+N2kydBQkQWAVcAX/cifT/bsGED9fX1fPnLX+bUqVN8+ctfpr6+ng0bNnidNeNjy5cv55FHHuHKK6/kjTfe4Morr+SRRx5h+fLlXmfNUUE4bk+qm0TkQeBOYCbwFyNVN4nIDcANAMXFxRfcf//97mZyCrv77rt59NFH6e/vJycnhyuuuIKbb77Z62wZn6uuruaFF14YWi4tLWXbtm0e5sgdfjnuioqKEaubXA8SIvIh4I9VdZOIrCZJkIhnbRLGGOOsTGqTuBioEpEXgfuBS0Vkuwf5MMYYMwbXg4Sq3q6qi1S1BPgY0K6q17udD2OMMWOzwXTGGGOS8vTxpaq6F9jrZR6MMcYkZyUJY4wxSXk24no8RKQLeMnrfBhjjI8tUdW5w1dOiSBhjDHGG1bdZIwxJikLEsYYY5KyIGHMKESkREQOu5DOfSJyjdPpGDNeFiSMmaTotPfG+JKn4ySMmSKyReQbwPnAfwN/BjwHbAMqga+IyEwiE1LmAr8A/lRVT4nIfcBbwEpgHnCrqj4okQchNAGXAi8AYz8YwRgPWEnCmLG9C7hXVVcQueBviq7vU9VVqno/8JCqvldVzyPynJT4hwrMB1YBHwK+FF33keh+lwMbgIucPwxjxs+ChDFj+42qPhF9v53IBR/ggbjfKReRH4nIIWA9sCxu28OqGlbV54Di6Lr3A22qOqiqR4F2B/NvzIRZkDBmbMMHE8WWe+PW3Qf8H1VdDnwRyI/bdjrufXy1kg1SMhnPgoQxY1ssIhdG368D9o3wOzOBV0Qkh0hJYiw/BD4mIlkiMh+oSE9WjUkvCxLGjK0T+ISIHASKgK0j/M5fAfuBx4DnU9jnt4CfA4ei+/tBerJqTHrZtBzGGGOSspKEMcaYpCxIGGOMScqChDHGmKQsSBhjjEnKgoQxxpikLEgYY4xJyoKEMcaYpCxIGGOMSep/AJ82HMGxAcZyAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Plot box plot of logmove across different brands and stores\n", + "for by_cl in [\"brand\", \"store\"]:\n", + " p = sales.loc[sales[\"logmove\"] != 0].boxplot(column=\"logmove\", by=by_cl)\n", + " p.set_title(\"logmove by {}\".format(by_cl), linespacing=3)\n", + " p.set_xlabel(by_cl)\n", + " p.set_ylabel(\"logmove\")\n", + " p.get_xaxis().set_ticks([])\n", + " plt.suptitle(\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check seasonality and autocorrelation\n", + "\n", + "Overall, we don't find a strong seasonality in the data. It seems that there is a weak yearly-seasonality according to the seasonal-trend-level decomposition and the autocorrelation values around the lag of 52 weeks. As a rough estimate, autocorrelation beyond 20 weeks is usually very small." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/data/anaconda/envs/forecasting_env/lib/python3.6/site-packages/ipykernel_launcher.py:4: FutureWarning: the 'freq' keyword is deprecated, use 'period' instead\n", + " after removing the cwd from sys.path.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Figure(432x288)\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOydd3gcxfnHP69OvXdZ1XKRey/YGDDFBkw1vQZIIPALgQRSSCCQhJCEQEgIJUBCh1BDcTBgsLExGBvc5G7LtuSi3uupnHRlfn/snnyy1Syraz7Pc8/dzc7uztzs7XfnnXfeEaUUGo1Go9H0N7z6ugAajUaj0bSGFiiNRqPR9Eu0QGk0Go2mX6IFSqPRaDT9Ei1QGo1Go+mXaIHSaDQaTb9EC5RG00OIyIMi8kZfl+N4EJHvi8javi6HRgNaoDSaE8K8oe8UkXoRKRKR50QkvK/LpdEMBrRAaTRdRER+ATwK3AOEAXOB4cAXIuLbS2Xw7o3zaDR9gRYojaYLiEgo8AfgJ0qpz5VSdqXUYeAqDJH6npnVX0TeFRGriGwRkakex/i1iOSb2/aJyAIz3UtE7hWRAyJSLiL/FZFIc1uqiCgRuUVEcoAvReRzEbnzqPJtF5HLzM/jROQLEakwz3OVR74oEVkqIjUishEY1WM/mkZznGiB0mi6xjzAH/jQM1EpVQt8BpxtJi0G3gMigbeA/4mIj4iMBe4EZiulQoBzgcPmPj8FLgFOBxKASuCZo85/OjDe3O8t4Fr3BhGZgCGSn4pIEPCFmSfWzPesiEw0sz8D2IB44GbzpdH0C7RAaTRdIxooU0o5WtlWaG4HSFdKva+UsgOPY4jaXMAJ+AETRMRHKXVYKXXA3Of/gPuVUnlKqUbgQeCKo8x5Dyql6pRSDcASYJqIDDe3XQ98aO57IXBYKfWKUsqhlNoCfGAezwJcDvzOPNYu4LVu+G00mm5BC5RG0zXKgOg2xoDize0Aue5EpZQLyAMSlFJZwN0Y4lMiIu+ISIKZdTiwRESqRKQKyMAQtDiPc3ge1wp8ClxjJl0DvOlxrDnuY5nHux4YBsQA3p7HArI7/xNoND2LFiiNpmt8BzQCl3kmmia184BVZlKyxzYvIAkoAFBKvaWUOhVDRBSGwwUYgnGeUirc4+WvlMr3ONXRyxC8DVwrIicDAcBqj2N9fdSxgpVStwOlgMOzjEDKcf8SGk0PoQVKo+kCSqlqDCeJp0VkkTmulIox3pQH/MfMOlNELjN7WndjiNp6ERkrImeJiB/GGFADRi8J4F/An90mOxGJEZHFHRRpGYbQPQS8a/bWAD4BxojIDWYZfURktoiMV0o5McbQHhSRQHPs6qYT/Gk0mm5DC5RG00WUUn8FfgP8DagBNmD0WBaY4z8AHwFXYzg63ABcZo5H+QGPYJgCizAcGH5j7vMksBRYISJWYD0wp4OyNGKIzUIMhwh3uhU4B8PsV2Ce61Hz/GA4agSb6a8Crxz3D6HR9BCiFyzUaDQaTX9E96A0Go1G0y/RAqXRaDSafokWKI1Go9H0S7RAaTQajaZf0qOBJkXkMGDFcJ91KKVmmTHF3gVSMUK7XKWUqhQRwfBeOh+oB75vznpHRG4CHjAP+yel1Gtm+kwMz6MADDfbu1QHXh/R0dEqNTW1+yqp0Wg0mlZJT08vU0rFdHX/3oiEfKZSqszj+73AKqXUIyJyr/n91xiTG9PM1xzgOYwZ8JHA74FZGJMT00VkqVKq0sxzG4Yb7jJgEUYctDZJTU1l8+bN3Vk/jUaj6Vb++MkeFk0axuzUyL4uygkhIicUmaQvTHyLORLv6zWMoJju9NeVwXogXETiMYJhfqGUqjBF6QtgkbktVCn1ndlret3jWBqNRjMgqW108NLaQ3y4Ja+vi9Ln9LRAKYzJhukicpuZFqeUKgQw32PN9ERaxgTLM9PaS89rJf0YROQ2EdksIptLS0tPsEoajUbTcxRV2wDIKqnt45L0PT0tUKcopWZgmO/uEJH57eSVVtJUF9KPTVTqeaXULKXUrJiYLptDNRqNpsdxC1RmSS2eQ+pKKZbtLKTJ4Wpr10FHjwqUUsodFLMEY0mAk4Bi0zyH+V5iZs+jZdBKd1DN9tKTWknXaPodNruT1749jNOlI7do2qeoxhCoqno75XVNzembsyv58Ztb+GJPcV8VrdfpMYESkSARCXF/xogHtgsjxpg7IOVNGLHKMNNvFIO5QLVpAlwOnCMiESISYR5nubnNKiJzTQ/AGz2OpdH0K5bvLuL3S3ezNaeyr4sy5Pnv5lzu+3BnXxejTYpNgYKWZr7tuVUA5FXW93qZ+oqe7EHFAWtFZDuwEfhUKfU5RoDMs0UkE2PV0UfM/MuAg0AW8ALwYwClVAXwR2CT+XrITAO4HXjR3OcAHXjwaQYvV//7O/7z3eG+LkabZJcbN5XCalsHOTU9zWc7C3l7Yw4VHr2T/kRRtQ2LlzGC4SlQuwtqgKF1DfWYm7lS6iAwtZX0cmBBK+kKuKONY70MvNxK+mZg0gkXVjOgqW9ysOFQBVHBvtxwcmpfF6dVDpfXAS2fjnuK3QXVjB8WipdXa8O0mvyqBgC+O1DOBVPi+7g0x1JUY2NUTBD5lQ0tBGpXfjUABWb5hwI6koRmwJNb0dDivT+SY/aginr46Xd/sZULnlrLyoyhM05xPCilyKs0rpO1WWUd5O4biqptxIcFMCo2uFmg6pscHCg1Phf1wkNOf0ELlGbAk1th3Pz7s20+2yxjT99c3De0TO2i3CpV9Xbqm4x1Ib890E8FqsbGsFB/RnsIVEZhDS4FMSF+FFRpgdJoBgy5pjBV1tupbXR0mL+4xsZvluzsVN7uoK7RQam1sfncPUmOKYSHy+p69Dzt0ehwdpypj3Cb9+aOjCS7vL754aa/YHe6KKttJC7MEKiiGhtWm52deYZ5b+H4OMpqG/v1b9ydaIHSDHhyPG4ynelFfb6riLc25PDfTbkd5m2Pl9ceYv3B8k6XL8DH0uM9KLczhvu9t9lTUMOk3y9nb1FNn5y/I9zXx9WzjZkr/a0XVWptRCmMHlRMMAAHSuvYVVBDdLAv05PDASiubmzvMIMGLVCaAU9uRUOz11NeJ8ah9pjeUG+sz8bVxXlJTQ4XDy/L4LmvDnSY1y0WM4dHUFzT2GLyZXfj7hFkV/RND2pzdgV2p2Lz4f7pTu8efzp9TCwxIX6syzrygPHRtvw+Fyy3h96wMD9GxxoClVlsZVd+NZMSw4gP9wegoLr/jrd2J1qgNAOe3Ip6piSFGZ+P6kEZT6QtBWFPYQ1+3l4cLKtjXRdvSIfL63C4FFtyKjsUuWzTg292aiRNDheV9fYunbMzuHtrxTWN1Df1jgnTk71FVgD2me/9jfyqBgJ9LUQE+nDKqCi+PVCGUooVu4u4651t/Pzd7didfRepwW0CHhYaQEpkIL4WL3YX1JBZUsvkxDDiwwIAKNQCpdH0f5RS5FbWMzUpnAAfS/MTMhh/4nmPrOKTHYXNaQ6ni33FVq6ZnUxkkC+vf9e1YMvuG7DV5mB/Sfs34+yKeiICfRgTZzwR95Qnn8PpIr+qgeFRgUBL02dv4f5d9hX3U4GqbCApIgAR4ZTR0ZTVNrF8dzG/+O92ooP9KKqxsWJ32x6Q23OrejTUUFFzD8ofb4sXqdGBLNtZiNOlmJgQRoLZgxoqc6G0QGkGNOV1TdQ3OUmJDCQpIqDFGNS2nCrsTsXX+48ECD5YVkeTw8X0lAiunp3Mqozi5oHz42G/xw14UwfmrOzyOlKigogLM24uPeUoUVhtw+lSnDo62jxv7wqUUor9Hj2onjRldpW8ygYSw41eyCnm7/STt7dgsQgf3j6PpIgAXvvucKv77imoYfEz6/jP+hNaQaJdimts+Hp7ERHoA0BabAglpoPN5KQwAn29CQvwoXCIePJpgdIMaNxjLimRgSRHBraYC+Weeb/xUEVzmnv8aUJCKNfPSQHgzVZuOE6XavdJeV+RlZExQcSE+JF+uKLNfGAIRWpUIMNCDYHqKUcJd4/ptLQY87y9Ow5VUG3D2uhgTFww1Q325htrfyK/qoHECEOgEsIDGBkdhMOleOLqaaREBXLjycPZeKiCjMJjnTw+MJe/WLG7qMfKV1htIy7UDyN6G4wyx6EiAn1IMB9w4sP8tYlPoxkI5JomveRWelC7CwzX3JyK+mbTyZ7CGny9vRgZHURSRCALxsfxzqbcY8Toz59mcPE/17bZC9hfbGVsXAizUyPa7UE1OVwUVDUwPDKQmBA/RHrOxOfuMU1OCiM80IfDvdyD2md67i2eZqx6s7efjUPVNjqobrCTGB7YnPab88fz9yuncsZYY9Wfq2Yl4+/jxWvfHm6xr8Pp4qNtBXiJEbS1uofGEYtqbMSHBjR/dztKTEoMaxathPCAITMXSguUZkDj7kElRQSQFBFAjc24CYHRgxobFwLARrOXs8dM87YYl/6VM5OoqGsiPfuIyCil+HxXIXuLrK1Gp2hocpJdUc+YuBBmDo8kv6qhzSfavMp6XApSooLwsXgRHezXKRNfenYFq44zGkRORT0+FmFYqD/DIwObo1f0Fm5BumhKAnBEsPoL+ebDTFLEEQFYOCGOy2YcWRQhPNCXS6cn8r9t+VTVH4nVtzarjLLaRm6dPxKnS/HV/hJ6guIaW7MpGGh2NZ+UGNacNkz3oDSaIzz31QEWPv41Nnv/mxyYW1FPdLAvQX7eJEcYT8Z5lfWUWhspsTZyxcwkgv282XioHKUUGYU1TIgPbd5/3uhovL3kmHGqArOX05rb8YHSWpSCscNCmDU8AqBNt2p3BIlU03FhWKh/CxNfVX1TCxMkGAL5y/d2cPubW44rOkZuRT3JEYFYvIThUUHN8f96i31FVhLC/EmJCiQ2xI99RX0bzaKqvomPtx9Zgcf9WyZ6CFRr3HhyKja7i1c9elEfbsknPNCHny0cQ1SQLyszul+glFIUVdsYFurXnJYWF8zVs5K5dPqRtVgTwvyprLfT0NT//o/djRYoTbsopXhvcy5ZJbUt/rBH09X5RCdKTkU9SaYwud9zKxqazXuTk8KYOTyCjYcqKLE2Ul7XxISEIwIV7OfNrNQI1ngI1NpMQ5SCfC2sO3DsRFy3p9qYuBAmJIQS4GNp0QPzJNuM6JBiClRcqH8LE9+zXx3g6ue/45BH5IetuVUcMp05Hlu+77h+i+RI4zypUYEUVDX06uJ2+4qsjB1m9FjHDgthX3Hf9qD++WUWP3l7a/N4ktsZJim8fYEaHx/KBZPjeWpVJl/uLaa20cGKPUVcOCUefx8LZ46L5et9Jd3ujl5Vb6fR4SIu9EgPysfixaNXTGGMaQkAml3Nezsm3678amb9aWVz0NreQAuUpl0OlNZysKyOYD9vnl2d1cLs4cbudHHpc9/ywP86t8aOUopvD5R1i6jlVtaTEukWKOOPm1dZ3+wgMSEhlJNGRLK/uLZZeDwFCoxJm3sKaygx//DfZJaSHBnAOROH8Z05T8aT/cVWfC1epEYF4mPxYlpyOJuzW3eUyK6oJ9DXQkyw8VQ8LKyliW/DoQqUosWYx4db8vDz9uL781L5aFtBp9eQyqk48lsMjwrCpXovPqHd6eJAaS1j3AIVF0Jmce1xLdD4u492ccebW7qlZ+B0KT7eYfSe3Av85Vc24OttmFk74rErpzA+PpSfvLWVJ1fux2Z3cel0wxS4cHwsNTZHh5ORS6w2Vu/rfE/LLTjDPEx8reGerFtY5Q6SXM+fP93T4w8jL35zkLLaRh7/Yn+PnscTLVCadlluzgl55voZWBsdPLM665g8b23IYXtuFW+sz2FHXlWHx3w/PY/rXtjAkq35J1Q2h9NFQZWN5EhDmMIDfQj28yavsoE9BTWkRAYS6u/DSSMiAXj9u8MAjBsW0uI488cY7sZrMsuwO12sP1jBaWkxnDwqirLapmMCr+4rtjIqNrh5HGtWagR7Cmpaje2XU26IhnuAe1ioYZ6x2Z3UNznYnV+Nt5fwfnoeVpudRoeTj7cXcu7EYdxz7lhiQvz406cZHbpsV9fbqW6wewiU8d5bruaHyuqwO1Xzbzt2WAiNDlenPQl3F1Tz+nfZfLqzkJtf3XTCk4w3HqqguKYRP28vVuwxvO7cLuadWYYk0Nebl26aTbC/Ny98c4jUqEBmpBhhhk5Li8HX4tXuGKHTpbj19XR+8MqmNnvXR+MWqPgOBCrB7EG5zdD/XnOAF745xGe7Ctvb7YQoq21k2c4iooP9+HJvCdtyW/+f//vrA1z49Dfd1rvUAqVplxW7i5iWHM7pY2K4fEYSr32b3eKpvMZm54mV+5k1PIKoIF/+3MHN1OlSzeGBXvjm4AnNlXHP+3HflEWk2ZNvd0E1E82e0pSkMHy9vdieV01KZCAh/j4tjjMhPpSYED/W7C9lW24VtY0OThsdzbxRUQCsO2pZhv1FVsaak24BZqVG4lLGvKujOVxe1ywWQLP5pqSmkW25VThcijvPGk1to4MP0vP4MqOE6gY7l89MIsjPm1+eM4b07EqW7WzftdntYp7s0YNyn783cDtIjI0zfnO3qa+zESWeWpVJiL83f7xkEhsOlfP9lzeRW1FPcY2NkhrbcV8nS7cXEOhr4Uenj2JXfg0FVQ3kVR2ZA9UZhoX589JNswnx8+Z7c4c3P2QE+Xkzd1QUq/a23Tt6ae1BtudW4e/jxV+WdfyAAVBsCo6nia+tcoHRg2pyuJonor+5IadT9eoMeZX1ODxE5t1NuTQ5Xbx00ywiAn14cuWxvagam51/rs5iV34Nn+woOGZ7V9ACNQSprrfzzOos7nlvOze8tIHrXljfvNaMJ4XVDWzPq+aciXEA/OzsMSDw4NI91Jm9hWdWZ1HVYOfBiydy99lj2HCoot0B5M93FXGwrI6F42PZW2Q9oTV53B58bucIMMx8GYVWDpfXNwuUn7elOcimp4OEGxFhfloM32SW8vW+UrwE5o2KJikikOFRgXzrMQ5VY7NTUG1rNmUBTE8Jx+IlfLStZY/Q5VLkVjaQaooFHLm5FNXY2Hy4EhH4wSkjmJ4SzmvfZfN+eh6xIX6cYorjFTOTGRMXzHNfH9tz9STHYz4YYDiO+Fp6rQe1v8iKxUsYFWvUNS02BJHORZTYXVDN8t3F3HLqCG6YO5ynr51Bek4lp/11NXMeXsVJD6/i8ue+7bRXYpPDxbKdhZwzIY6LpxkehV/sKSa/8vgECgzvuU0PLOSWU0e0SF84PpZDZXVktlK/g6W1/H3Ffs6eEMfvLpzI5uxKVuzp2CPT3YOKDWlfoPx9LEQG+VJQbZgQq+rtzBsVxcZDFa2W53jZlV/N6Y99xY/e2ILD6cLpUry1IYeTR0YxNTmcW+ePZPW+0mN6UW+sz8ZqcxAT4sfzaw51y0RtLVB9QGF1A798b3uPTvhrDaUUH23LZ8HjX/G3FftYk1lKjc3Brvxqbn8j/Rizitt2f+7EYQAkhgfwi7PHsDKjmHP+sYZ3NubwyrrDXDo9kUmJYVwzO5mRMUH85bOMVrv4Sin+uTqLkTFBPH3tDKKD/Xjhm0Ndrs/RvQYwHCXcg+ETE4645s4xzXxHjz+5mT8mmsp6O29syGZKUjhh5kz+eaOiWH+wvPlp0n0DGOsxaB3q78MPTx3Be+l5LZwt8s0n3BSPHpTnZN1NhysYGxdCWIAP35+XyqGyOlbtLeGS6YnN5kOLl3DVrGR25ddwsJWHiKN/C/e5RISUqKBem6y7t8jKyOgg/LwtAAT4WhgeGdipHpS79/SDUwwRuGBKPB/ePo+HL53Mw5dO5teLxpFZUst5T67hvc25Hd74vskspbrBzsXTEhgVE8yomCA+3l5AWW1jCxfzzuLvY2nuPblZNHEYgb4WHvpkT4vyuFyKX3+wAz9vL/58ySSumpXEqJggHv18b4seSWsUVduIDvbF17vj27J7su6SLflEB/vyxNXT8LV4nXAvSinFHz/Zg7eXsDKjmN9+tJsv95aQX9XAjScPBwwvx6N7UQ1NTl765hCnj4nhnnPGklFY0yIQb1cZcgLl6GVvsy/2FLNid1HzAOZ3B8q58Km1vJ+ex23/Seeud7ZSWdeEy6XIq6zvsodMbaOjXbv9zrxqbnhpI3e9s43E8AA+vvNUNvxmIR/dcQr/vG4GmSW1PLBkV4s/2/LdRYyKCWJUzBFz1v+dPor3f3QyQX4W7v1wJwLcc+5YwPA4uu+88RwsreORz/YeM2j71b5SMgpr+PEZownwtXDTycNZs7+0y4FFcyvrsXhJC5u95w1ooocYnTzKGGdyB5U9mtPSYhAxPKlOS4tusZ/V5mh2unC7Tnt6VYHRuxwVE8S9H+ygxmanrLaRH72Rjo9FmDU8sjmfe45LQVUDW7IrmZ1qbDtvUjyxIcbg/WUzElsc+6KpCYgYZqu2yKmoJyrIl2A/7+a01KjA5h5UZrGVJ1dmUl7bPdEdKuua+OMne3hl3SGqG+zsK65p0asEtydf+23r2XsKCzhiep2aHM51c1K4bk4Kt58xis/vns+kxDDueX8HT67KbPeYS7cXEB7ow6mjjYgaZ08YxmZzHKgjF/POEhvqz33njeObzDLeMZdtUUrxl88y2HS4kt9dNJHYUCOe3q8XjeNgaV1zvrYoqrF16CDhJj4sgMziWr7cW8LFUxOJDfXnvMnD+GBL3gk5mSzfXcyGQxU8cOEEfnzGKN7emMM9728nLtSPhRMMS0qwn3dzL+rhZRk4nC7e3ZRDeV0Td5w5msXTE4gJ8ePfazqO9N8R3h1nGVwU98As/rpGB7/6YAcWEZ68Zlrz01ZWSS3/95/NuJQRqmTeqGg+311EalQgb946h+W7inn6y0y+3FuC06WaV/r81/dmsmjSsE6du8Zm58U1B3lx7SEsItw6fyQ3nzqCYD9vbHYnO/Or+ffXB1iZUUJ4oA8PXjSBG05ObV6eAmD+mBjuWpDGEyszmZUayXVzUqiut7P+YAX/N3/kMeeclRrJJz85jTfWZxMb6tfs9gqG6eOa2cm8tPYQ3x4o529XGi6yBVUNPPVlJonhASw2zS7fmzucZ77K4l9fH+DcicNYuj2frJJaFk0cxhUzk4kN9WP57iLeT89jX5EVH4sXft5ejIwJ4tLpSRwoqSMh3L+5twFHXM2jg/2I9bDlzx0ZyYc/ntds6juayCBfpiSGsT2vujmWHcDJIw1T27cHypmaHM7+YitBvpZjTEX+Phb+duVULn/uW+79YAd7i6wUVDXw/I2zmsdjAEL8vAn0tbB6bwl1TU5mpRrzqHy9vfjVonFsPFTOuGEte3lxof7MGRHJ0u0F3LUg7ZineTDnQHn0JMEYh1qZUcx/vjvMnz7NoNHh4tVvD/G7iyZwybREtuRU8eGWPHIq6pkQH8rkpDDDoQP3WIuFYWH+BPq2vE1kFlu55bXNzZOQH/18Lza7i6tmJrfINzYuhC/2FLMtt4qJCaH4WFo+D6dnV/Dz/25v0Xtqi8TwAN66dS73vLedJ1dlMmt4JKd6PEi4qW9y8MWeYi6ZntjcEzlnYhz/+vpA83G6i+vnDGfZziL+/GkGp46O5tmvDvD2xhxumDucyz0eMs6eEMfs1Ah++9EuPtiSx8LxcUyID8XpUjiVwmZ3UtvoYH+Rtc0e/tEkhPuz0nTScD/QXD9nOB9tK+DjHQVcNSuZkhobTU5X83/iaFwuxZrMUkL8fZiREk6T08VfPstgTFww185OxuIlFNc08sGWPH62cEyL9rv1tJEUVdt4fs1BduZVk11ex+zUiGaHpO/PSz2uKRJtMeQEqqK+yRxAb/1JuiM+21nI++l53DQvldPSjGjIt7y2iR3mipfnTRrGeZPjAXj8i30E+Fh49IopLN9dzKqMYs6dGMejl08hxN+HccNCOXtCHM+vOUB4oC9pccG8su4wj3yWwVnjYlvt6hdUNfDZriLKaxspr21ixZ4iKuvtXDA5HrvTxeNf7OeVdYeIC/Unq6QWh0sRFuDDL88Zw03zUo9xEHDz07PS2JJTxW+W7ORPn+4h0Ncbp0txzsTWhdLX24ubTz32piIiPHL5FM4aF8tvluzioqfXIiLN7sZ/vnRS84UeEeTLFTOTeGN9Dku2GqaKUTHBPL06i6e+zCLQ10J9k5PE8ABOHxOD06VodLhIz65kZcYWAE4ZHdXi/G6PvolH/dFFhBkpEa03qskFU+IpqrEx3SNfTIgfY+NCeGpVJu+l51JqbSQtLqRVT7DpKRHcNn8U//r6ACF+3rx+85zmP6xnOYaF+jdHtnD3oACumJnEFTOTaI2LpiZw/5Jd7CmsafXazamoZ9pR4js8KhC7U/Hbj3ZzWlo0Pz5jNI8t38vP3t3OQx/vobLejr+PFyOjjeuuqQ0TVKi/N6Nig5maFE58mD9Pf5mFv4+F92+f12xWWpVRzGljYlrsN3tEJK4v4ZJn1hHgY2FacjhTksOYkhjOjvwqXlhzkPiwAF66aXaL3lNbWLyEP106iZ351dz97laW/fQ0YkP9qahrYum2fNZmlbPhUDn1TU4umXZEIKYlhRMT4keptbHbelAAXl7CX6+YwrlPrOH8p77BanNwx5mj+OU5Y1s8RIgIz14/k7c25PDl3uJ2b9zXmfEhO8L9UJgWG9x8rc9OjSAtNpi/r9jHc18d4FBZHSJGZI+7F6Yx0rSEKKVYk1nGY8v3sivfsAxMSw5nVEww2eX1vHbzSc0PfY9cPpnTx8Zwjtl7cuNj8eKhxZOYkhTO/Ut20uhw8fBlk5u3Xz8npVWP3+NF+mPE4Z4kMHGMuuh3r/HObXNbfRJtj71FNVzyzDrsToXTpZiWHE55XSNl1iaeuGYa//hiP1abg5U/P53MEisX/3MdP12Qxs/PHgMYF0ZH51y9t4QfvLqJBy+awPePeqostTZyyTPryK9qwNtLiAjyZXJiGD9bOIbJpulqe24Vz311gEaHk4kJYUxICOXUtGhC2xAmT6ob7Px3Uy5FNTYq6poIC/DhdxdO6JRbbmtU1TfxwjcHEYSUqEBGxQQzc3hLkSipsfHi2kOcanrNeVu8KKhq4MMteeRX2bhoSjxzR0a1KIPTpfjuQDkfby/gjCOh/i4AACAASURBVLExzQ8E7jpMe2gFd5wxml+apsfOopTC7lTHPBis2V/Ksp2F1DY6qG10cMm0RC6ZntjqMWx2J0+tyuSCKfFtPgRd+/x6vjtYTmJ4AOvuPatTZausa2L2n1dyy2kjuO+88S22NTQ5mfTgcm4/fVSLOmeVWLn+xQ388NSR3HLqCLy8BJdL8eaGbNZllbNgfCznTY4n2M+bRoeTfUVWSmoME6ACahvtFFbbKKyysa/Iyq6CauqbnExMCOWFG2eR0IneSGF1A5sPV5KeXcmWnEr2FlqbhfDak5K5/4IJLcySnSGz2PhvTUwIZXhUEB/vKDDG+iIDOWV0FAvHx7FgfMsb6v1LdvLBljx2PXhuix53d/DWhhx+s2Qn9543jh+dPqrD/CVWG3mVxn/YSwR/Hwsh/t4E+3kT1Mnf4qNt+dz1zjZ+vWgct59x5Jwfbsnj4WV7mZYcxpwRUVTUN/Gq+fAxKTGMRruT6gajXZMiArh74Rgamhy8tPYQh8vrOX1MDK/dfNJx1X93QTWbD1dy48nDW9zfHly6mz8snpSulJp1XAf0YMALlIgsAp4ELMCLSqlH2ss/YvwUpRb/5bjMaABWm52L/7mO2kYH/7vjFL7eV8qzX2Vhszt58abZTEsOZ/3Bcq55fj13LUhjS04lu/KrWfOrM9vstbSGUorrX9xARmENX91zZvOTpc3u5Jrn17OvyMqbt85henL4cQvsUOHr/aVMTQojPNC3r4vSKj97dxtLtuazeFoCT14zvdP7/eCVjewvruWbX53ZLNiVdU3c+vpm0nMqeeOWOc1LSPQETnOcNCE84BhzXWdpdDjZX1SLSMv4csfL++l5/PK97QT6Wrh8RhI3nDz8mHFBT6ob7OSU1zc/yHU31fX2Zsea3qC4xsYD/9vFXy6b3OHE41JrI8+vOcDughqC/bwJ9vdmenI4V81ObnZqcboUGw6WMz4+lIig7vnfNDqc+Pt4D12BEhELsB84G8gDNgHXKqX2tLXPzFmzVOR1f6fR4eLzu0/DtxN/NAXc/c42Pt9dxFs/nMMcc1zC6VLYnS78fSzNeX/y9lY+21mIw6V44ILx/PC0Y8dwOmJXfjUX/XMtt80fyT3njMWljJvasl2F/Pt7M9s0u2kGBo98tpd/fX2AP14yiRvmDu/0fku25vGzd7fz7m1zmTk8gvyqBn7w6ibyKht48uppLXqSQ4EtOZWMjg3ulHVA0zeIyAkJ1EAfgzoJyFJKHQQQkXeAxUCbAiXAby+cwI0vb2TC75Yf18nuPW9csziBYRO3eFla5PnN+eNYuaeYmBAfvnccNx9PJiWGcen0RP799UH+/fXB5vQHLhivxWkQ4F4VdXZq+2NiR3P2hGH4ee/k6ufXN6eFB/rw1g/nMCs1sp09BycdjSlqBj4DXaASAU/fzTxgztGZROQ24DaAlJQU5o+J4ZnrZrQ7r+RohoX5tzmA7Ul8WABv/HAOIf7eLXpWx8uDF09k/LDQ5gjiKVGBXDw1ocvH0/QfLpmeSGSQ7zHeeh0R7OfNc9+bwW5zYNvLS7hgcjyp0UEd7KnRDEwGukC1NghzjM1SKfU88DyAiFhF5MT9H/s/0UDXwzQMHIZ0Pe/sg4L0MEO6PQchx+epdBQDXaDyAM/JF0lAR0Gg9p2ITXSgICKbdT0HD7qeg4uhVM8T2X+gR5LYBKSJyAgR8QWuAZb2cZk0Go1G0w0M6B6UUsohIncCyzHczF9WSu3u42JpNBqNphsY0AIFoJRaBiw7jl2e76my9DN0PQcXup6DC13PTjCg50FpNBqNZvAy0MegNBqNRjNI0QKl0Wg0mn7JkBEoEVkkIvtEJEtE7u3r8nQXIpIsIqtFJENEdovIXWZ6pIh8ISKZ5vugmHYvIhYR2Soin5jfR4jIBrOe75renAMaEQkXkfdFZK/ZricPxvYUkZ+Z1+wuEXlbRPwHS3uKyMsiUiIiuzzSWm1DMXjKvDftEJEZfVfy46ONej5mXrs7RGSJiIR7bLvPrOc+ETm3o+MPCYEyY/Y9A5wHTACuFZEJfVuqbsMB/EIpNR6YC9xh1u1eYJVSKg1YZX4fDNwFZHh8fxT4h1nPSuCWPilV9/Ik8LlSahwwFaO+g6o9RSQR+CkwSyk1CcML9xoGT3u+Ciw6Kq2tNjwPSDNftwHP9VIZu4NXObaeXwCTlFJTMGKl3gdg3peuASaa+zxr3pvbZEgIFB4x+5RSTYA7Zt+ARylVqJTaYn62YtzMEjHq95qZ7TXgkr4pYfchIknABcCL5ncBzgLeN7MM+HqKSCgwH3gJQCnVpJSqYhC2J4YXcYCIeAOBQCGDpD2VUmuAiqOS22rDxcDrymA9EC4iAyLyb2v1VEqtUEq5l/dejxFAAYx6vqOUalRKHQKyMO7NbTJUBKq1mH2tL+gzgBGRVGA6sAGIU0oVgiFiQGzflazbeAL4FeBeWS8KqPL4MwyGdh0JlAKvmKbMF0UkiEHWnkqpfOBvQA6GMFUD6Qy+9vSkrTYczPenm4HPzM/HXc+hIlCditk3kBGRYOAD4G6lVE1fl6e7EZELgRKlVLpncitZB3q7egMzgOeUUtOBOga4Oa81zPGXxcAIIAEIwjB1Hc1Ab8/OMBivY0TkfowhiDfdSa1ka7eeQ0WguhKzb8AgIj4Y4vSmUupDM7nYbSYw30v6qnzdxCnAxSJyGMNEexZGjyrcNBHB4GjXPCBPKbXB/P4+hmANtvZcCBxSSpUqpezAh8A8Bl97etJWGw66+5OI3ARcCFyvjky2Pe56DhWBGrQx+8xxmJeADKXU4x6blgI3mZ9vAj7q7bJ1J0qp+5RSSUqpVIz2+1IpdT2wGrjCzDYY6lkE5IqIOwr0Aoz1zQZVe2KY9uaKSKB5DbvrOaja8yjaasOlwI2mN99coNptChyIiLHK+a+Bi5VS9R6blgLXiIifiIzAcArZ2O7BlFJD4gWcj+FRcgC4v6/L0431OhWjm7wD2Ga+zscYn1kFZJrvkX1d1m6s8xnAJ+bnkeZFngW8B/j1dfm6oX7TgM1mm/4PiBiM7Qn8AdgL7AL+A/gNlvYE3sYYW7Nj9BxuaasNMUxfz5j3pp0Yno19XocTqGcWxliT+370L4/895v13Aec19HxdagjjUaj0fRLhoqJT6PRaDQDDC1QGo1Go+mXaIHSaDQaTb9EC5RGo9Fo+iVaoDQajUbTL9ECpdFoNJp+iRYojUaj0fRLtEBpNBqNpl+iBUqj0Wg0/RItUBqNRqPpl2iB0mg0Gk2/RAuURqPRaPolWqA0Go1G0y/RAqXRaDSafokWKI1Go9H0S7w7zjK4iI6OVqmpqX1dDI2mV2l0uKiqbyLAx0KwvzdeIn1dpGNosDtBQYCvpa+Loukm0tPTy5RSMV3df8gJVGpqKps3b+7rYmg0vcaOvCq+/8omLHVNNAG13l5MTw5nWJg/McF+eHkJh8vqOFxeR3igLz89K41TRkchvSRiSin+sz6bhz7egwJ+ecF4vj8vtdfOr+k5RCT7RPYfcgKl0Qwlvs0q49bXNxMR5Mu7t82nxNrIl3tL2JZbxdacKkqtjTiVYnhkIKnRQewpqOF7L21gzohI7jt/PNOSw3u0fDa7k9/+bxfvpeexYFwsXl7CHz7ew878ah6+dDL+Pro3NZQZcku+z5o1S+kelGYosCqjmNvf2MKI6CBev+Uk4kL9W82nlGrurTQ6nLyzMZd/rs6ivLaRn5yVxk/OGo23pfuHq+1OFze/uolvMsv46YI07l6QBsBTX2byxMpMUiIDuXthGounJWLx0r2pgYiIpCulZnV5/7YESkRC29tRKVXT1ZP2JVqgNEOBlXuKuf3NdCbEh/LazScRHuh7XPtbbXZ+/9FuPtyaz8zhETxx9TSSIwO7rXxKKe77cCfvbMrl0csnc/XslBbbv8ks5S/L9rKnsIbRscFcOj2RccNCGBcfSkKYvzb/DRB6UqByAQUIkABYzc/BQL5SKqXVHfs5WqA0g50Vu4u4460tTEgI4/WbTyIswKfLx/poWz4PLNmFl5fwj6uncta4uG4p47++PsAjn+3lzjNH88tzx7aax+VSfL67iKe/zCKj8Mjz8OTEML4/L5ULp8bj561NgP2ZHhMojxM8C3yulFpqfr8ImK+UuqerJ+1LtEBpBjObDldw3QvrmZgQxuu3nESof9fFyU1OeT23v5nO7oIa7jxzND9dkIavd9dMfkop3lifzW8/2s2FU+J56prpeHXCfGe12dlfbGVbbjXvbMwhs6SWqCBfbp0/kptOTtWef/2U3hCozUefoLW0gYIWKM1gpay2kQue+oYAHwsf3XnqCfWcjsZmd/L7j3bz7uZcLF5CQrg/qVFBnDE2lkunJxIZ1LEJ8VBZHfd9uIP1ByuYPyaG52+Y2SUnCKUU3x4o599rDrJmfymxIX78ZEEa18xOxqedsbLqBjsfpOfxxoZsKuqauHhqAlfNSmZiQminTYbV9Xa8LUKQn/Yv6wy9IVArgC+BNzBMft8DFiqlzu7qSfsSLVCawYjTpbjp5Y1sOlzBkh+fwoSEdoeQu8zqvSVszankcHk9+4ut7C2y4mvx4uyJcVx3Ugonj4w6pkdUUNXAK+sO8fp32fh6e/HABeO5alZyt4wjbTxUwWPL97LpcCUjY4K4//zxnDUutsWxM4utvLzuMEu25mGzu5iREk5CeAAr9hTT5HAxblgIl89IYvH0BGJDDEcSpRQF1Tb2FdWQUWhld0E1u/JryKmo5+9XTuXymUknXPahQG8IVDTwB2C+mbQG+L1SqqyrJ+1LtEBpBiNPrNzPEyszW3U46En2FtXw7qZcPtyST3WDnRHRQVw2PZFAP28amhzsL65l2c5CFHDx1ATuO28csW14E3YVpRSrMkp4+LMMDpbWMXN4BMMjA/Hz8SK3ooG1WWX4eXtx6fREvjd3OJMSwwCjN7R0RwHvp+exPbcKi5cQE+xHfZODBrsTu/PIvXF4VCCTEsKYmBjKORPiGB0b0q11GKz0uEANNrRAabqC06VYs7+U99JzqWlwMDwqkBHRQYQH+hLgYyHA14tJiWHNT+C9hVKKp7/M4vEv9nPZjET+fuXUPvFws9mdfLarkDfX57A5u7I5PcTPmytnJXPzqakkRXSfF2Br2J0u3lyfzTubcqlrctBodxHga+GqWclce1JKu2bIrBIr/9taQKm1kQBfC/4+FpIiAhgfH8KYuBBCumEsbyjSGz2o0cDPgVQ8JvYqpc7pYL+XgQuBEqXUJDPtMeAioAk4APxAKVUlIqlABrDP3H29UupH5j4zgVeBAGAZcJdSSolIJPCuWa7DwFVKqSP/jDbQAqU5Hqob7LyxPps312dTUG0jKsiXpIgADpXVUWNztMgrAielRnL+5HhmDo9gdGww/j4Wahsd7MyrJrPEiojg5+1FgI+F2BA/I5pDiB8BPpbjFpb6Jgf3vLeDT3cWctn0RB6+rH9MbK2oa8IiQoCvpcvOFJrBQW8I1DbgJSAdcLrTlVIbOthvPlALvO4hUOcAXyqlHCLyqHmcX5sC9Yk731HH2QjcBazHEKinlFKfichfgQql1CMici8QoZT6dUcV1gI1dLDZnewtslJZ30Rdo4P6Jic+FsHXYsHfx4sQfx/CAnwI9LVgsztpsDtpdLhwuhQul2LdgTJe/zYba6OD09Kiue6kFBaMj2u+6VbVN1HdYMdmd2G12VmTWcZnOwvJLKkFwOIlDAv1p7C6AVcHhgpvLyHY35vwAB9iQ/yJCfVjVEwwp6VFMy05vHnw32qzsy23irVZZazYXczh8jruO28ct542Us8N0vQ7ekOgtiilZnTp4O0Lz6XAFUqp69vKJyLxwGql1Djz+7XAGUqp/xORfebnQjPfV0qp1idUeKAFavDidCk2Hqpg+e4iNmdXsLfQiqMjZWgHETh/Ujw/PnMUExPCOr3f4bI6dhfUsLeohuzyekZEBzEtJZwJ8aEI0OR0Ud/kpLjGRlG1jbLaJqw2O7WNDirr7ZTU2CiusZFTUY9LQbCfN5FBvpRaG42AqoCPRZieHMGPzxzFGWNju1xHjaYnOVGB6oyv5EcichuwBGh0J3ZDJImbMUx0bkaIyFagBnhAKfUNkAjkeeTJM9MA4pRShWZZCkVE/0uHADnl9ewrthLgY/SCyuuaOFhaR2axla/3l1Je14S/jxczUiK4bf5IpiSFExPiR7CfN4G+FhwuRZPDRYPdidVmp7rBTn2TE38fC4E+Fvx8vLB4CV4iJIYHdCl6Qmp0EKnRQVwwJb7dfGPi2h9or6638+2BMtZmlWG1OYgJ8SM62I/x8SGcNCKSQF/t6qwZ3HTmCv+h+f5bjzQFdNlVSETuBxzAm2ZSIZCilCo3x5z+JyITMSJXHM1xPxKbAnsbQErKgAyAMeSx2Z08uzqL574+0MK7yk1siB8nj4rigsnxnD42ZlDcvMMCfThvcjznTW5f6DSawUqH/2KlVHJ3nlBEbsJwnligTPuiUqoRs3emlEoXkQPAGIwek+eEgySgwPxcLCLxHia+knbq8DzwPBgmvu6sj+bEsNrsVNXbSQwPaDOiwLcHynhgyS4OltVxybQEbpqXisOlaGhyEhrgw6iYIO1lpdEMQjoUKBEJwHBSGK6Uut306ktTSn12vCcTkUXAr4HTlVL1HukxGA4PThEZCaQBB5VSFSJiFZG5wAbgRuBpc7elwE3AI+b7R8dbHk3vo5Tis11FvLT2EAdLa6mstwPGOMvkxDCmp4Qzf0wMM4dHUFnXxJ+XZfDRtgJSIgP5zy0ncVpal9c+02g0A4zOOEm8DewErlNKTRKRQGCdUmp6J/Y7A4gGioHfA/cBfkC5mW29UupHInI58BCG2c+JMRH4Y/M4szjiZv4Z8BPTzTwK+C+GqTEHuFIpVdFRhbWTRN+xLbeKP32yh83ZlYyODWbOiEhSIgMJDfAho7CGbblV7CmoweFSBJuhZJocLn50xih+fMaofuFCrdFoOk+vxeITka1uURKRbUqpaV09aV+iBar32V1QzRMrM/liTzHRwX788pwxXDkrudU1fqw2O+uyyvl6fyk2u5OfLkhjRHRQH5Rao9GcKL3hxdckIv6YzgkiMgJjoq1G0y5ZJbU8tnwvy3cXE+Lvzc8WjuGW00Y0945aI8Tfh0WThrFo0rBeLKlGo+mPdEagHgI+B5JE5DXgdOCWHi2VZkBTam3kiZX7eWdTLgE+Fu5akMbNp47o1ujaGo1m8NOuQIkxNX07cCUwD8Pt+x6lVJsec5qhS1G1jRe+OchbG3KwO11cPyeFny5IIzrYr6+LptFoBiDtCpTpjPCJUmom2ktO0wYul+LR5Xt5Ze1hnEqxeGoCd541mpExwX1dNI1GM4DpjIlvo4jMUEpt6fHSaAYcSin++OkeXll3mMtnJHH3wrQuRV/QaDSao2lToETEWynlAE4FbjUnz9ZhmPlUV+PzaQYX/1iZySvrDnPzKSP47YXjdcBSjUbTbbTXg9oIzAAu6aWyaAYYL689xFOrMrlqVpIWJ41G0+20J1ACoJQ60Etl0Qwg1h8s50+f7uGcCXH85bIpWpw0Gk23055AxYjIz9vaqJR6vAfKoxkAlFht/OTtraRGBfH41dNanXCr0Wg0J0p7y11agGAgpI1Xh4jIyyJSIiK7PNIiReQLEck03yPMdBGRp0QkS0R2iMgMj31uMvNnmsFm3ekzRWSnuc9Toh/jexynS3HX29uoabDz7PdmtDvpVqPRaE6E9u4uhUqph07w+K8C/wRe90i7F1jlsRLuvRgBZM/DCBKbBswBngPmmEu7/x6YhRHNIl1ElprLuz+HsYyGe7XdRRjx+jTdjFKKrblVPP/1Qb47WM5fr5jCuGGhfV0sjUYziOlwDOpEUEqtMVfL9WQxRhBZgNeArzAEajHG8vAKWC8i4eYyGmcAX7gDwYrIF8AiEfkKCFVKfWemv47h0KEFqptwuhQ786tZl1XGx9sL2FtkJcjXiAxx1axuXYVFo9FojqE9gVrQQ+dsayXcRCDXI5979dz20ttabbcFesHC4+eN9dn89fO91NgcAExNCuPPl05i8bREbdbTaDS9Qpt3ms4sXdHNtLV67vGmH5uoFyw8bpIiAlg0aRinpsUwb1SUDlek0Wh6nb54FG5rJdw8wNNu5F49N48jJkF3+le0v9pum6Snp9eKyL4ul37gEA2UnehBHuuGgvQw3VLPAYCu5+BiqNRz7Ins3BcC1dZKuEuBO0XkHQwniWpTxJYDD7u9/YBzgPs6WG23PfadyPokAwX3Ol59XY6eRtdzcKHrObgQkRNafK9HBcpzVV0RycPwxnsE+K+I3IK5Eq6ZfRlwPpAF1AM/AMPUKCJ/BDaZ+R7yMD/eTsvVdrWDhEaj0QwSelSglFLXtrHpGAcM03vvjjaO8zLwcivpm4FJJ1JGjUaj0fRP2puoO1h5vq8L0Evoeg4udD0HF7qenUCMjotGo9FoNP2LodiD0mg0Gs0AQAuURqPRaPolQ0agRGSRiOwzA8ve29fl6S5EJFlEVotIhojsFpG7zPRWg/IOdETEIiJbReQT8/sIEdlg1vNdEfHt6zKeKGaYr/dFZK/ZricPxvYUkZ+Z1+wuEXlbRPwHS3t2V6Ds/k4b9XzMvHZ3iMgSEQn32HafWc99InJuR8cfEgIlIhbgGYyAtBOAa0VkQt+WqttwAL9QSo0H5gJ3mHVzB+VNA1aZ3wcDdwEZHt8fBf5h1rMSuKVPStW9PAl8rpQaB0zFqO+gak8RSQR+CsxSSk3CWD3hGgZPe76KEbzak7ba0DNQ9m0YQbAHCq9ybD2/ACYppaYA+4H7AMz70jXARHOfZ817c5sMCYECTgKylFIHlVJNwDsYwWkHPEqpQqXUFvOzFeNmlohRv9fMbK8xCFZGFpEk4ALgRfO7AGcB75tZBnw9RSQUmA+8BKCUalJKVTEI2xNjmkuAiHgDgUAhg6Q9lVJrgKPDxbXVhs2BspVS6wF3oOx+T2v1VEqtUEo5zK/rORLxZzHwjlKqUSl1CGPO60ntHX+oCFRbAWcHFWbk+OkYkTVaBOUFYtvec8DwBPArwGV+jwKqPP4Mg6FdRwKlwCumKfNFEQlikLWnUiof+BvGZP1CoBpIZ/C1pydtteFgvj/dzJEACsddz6EiUJ0OLDtQEZFg4APgbqVUTV+Xp7sRkQuBEqVUumdyK1kHert6AzOA55RS04E6Brg5rzXM8ZfFwAggAQjCMHUdzUBvz84wGK9jROR+jCGIN91JrWRrt55DRaDaCkQ7KBARHwxxelMp9aGZXOw2ExwVlHegcgpwsYgcxjDRnoXRowo3TUQwONo1D8hTSm0wv7+PIViDrT0XAoeUUqVKKTvwITCPwdeenrTVhoPu/iTGyucXAterI5Ntj7ueQ0WgNgFppoeQL8ZA3dI+LlO3YI7DvARkKKUe99jkDsoLLYPyDkiUUvcppZKUUqkY7felUup6YDVwhZltMNSzCMgVEXcU6AXAHgZZe2KY9uaKSKB5DbvrOaja8yjaasOlwI2mN99czEDZfVHA7kBEFmEsQnuxUqreY9NS4BoR8RORERhOIRvbPZhSaki8MALR7gcOAPf3dXm6sV6nYnSTdwDbzNf5GOMzq4BM8z2yr8vajXU+A/jE/DzSvMizgPcAv74uXzfUbxqw2WzT/wERg7E9gT8Ae4FdwH8Av8HSnsDbGGNrdoyewy1ttSGG6esZ8960E8Ozsc/rcAL1zMIYa3Lfj/7lkf9+s577gPM6Or4OdaTRaDSafslQMfFpNBqNZoChBUqj0Wg0/RItUBqNRqPpl2iB0mg0Gk2/RAuURqPRaPolWqA0Go1G0y/RAqXRaDSafokWKI1Go9H0S7RAaTQajaZfogVKo9FoNP0SLVAajUaj6ZdogdJoNBpNv0QLlEaj0Wj6Jd7tbRSRGe1tV0pt6d7iaDQajUZj0O5yGyKyup19lVLqrO4vkkaj0Wg0HQjUYCQ6Olqlpqa2ub26wU5YgE/vFUgzJFCAtcFOqL62NN2MS0Fto51Q//53baWnp5cppWK6un+7Jj5PRGQSMAHwd6cppV7v6on7itTUVDZv3tzqtk2HK7jyX9/x2A9mc+bY2F4umWYw8/muIn70Rjov3XEKU5PD+7o4mkHEWxty+M2SnSz51ZkkRwb2dXFaICLZJ7J/p5wkROT3wNPm60zgr8DFHeyTLCKrRSRDRHaLyF1m+oMiki8i28zX+R773CciWSKyT0TO9UhfZKZlici9HukjRGSDiGSKyLsi4ntctT+KnPJ6AIqrbSdyGI3mGHIrjGurqEZfW5ruJce8tooH4bXVWS++K4AFQJFS6gfAVMCvg30cwC+UUuOBucAdIjLB3PYPpdQ087UMwNx2DTARWAQ8KyIWEbEAzwDnYfTgrvU4zqPmsdKASuCWTtanVfKrGgAotTaeyGE0mmPQ15ampxjM11ZnBapBKeUCHCISCpQAI9vbQSlV6PbyU0pZgQwgsZ1dFgPvKKUalVKHgCzgJPOVpZQ6qJRqAt4BFouIAGcB75v7vwZc0sn6tEp+pdHQZbU939BWm52hNv43lMnr5WtLM3TIrzR6UIPx2uqsQG0WkXDgBSAd2AJs7OxJRCQVmA5sMJPuFJEdIvKyiESYaYlArsdueWZaW+lRQJVSynFUepdpfhLp4Yauqm/ipD+v4rNdRT16Hk3/wX1t9fRNJLeinukPfcH6g+U9eh5N/6G3elC78quZ+ocV7Cuy9uh5POmUQCmlfqyUqlJK/Qs4G7jJNPV1iIgEAx8AdyulaoDngFHANKAQ+Ls7a2un7kJ6a2W4TUQ2i8jm0tLSNsvafBOxNrWZpzs4XF5Pg93JnoKaHj2Ppv/gfsrt6ZtIZokVh0vpa2uI0ORwUWJeU6W1PXvfyiiswaVgb1HvXVudjiQhJwmCSgAAIABJREFUIokiMg9IAcJFZH4n9vHBEKc3lVIfAiilipVSTtNk+AKGCQ+MHlCyx+5JQEE76WVmObyPSj8GpdTzSqlZSqlZMTGtezwqpXrtKddtSnSfT9O7ZJfX8YNXNlJZ17N/aDdWm50am9HRL+vhm0h+lc1819dWX7Arv5rbXt9MQ5OzV85XVG3DPVLQ0/etAvPacpure4POevE9CqwDHgDuMV+/7GAfAV4CMpRSj3ukx3tkuxTYZX5eClwjIn4iMgJIwzAjbgLSTI89XwxHiqXKGMBZjeHAAXAT8FFn6tMaZbVNNDlc+Hp79fhTbkFV3wqU1Wbn+69sJLu8rk/O39es3lvC6n2lLNmaf0LHSc+upLC64zZ0/7F789oq6KNrq8Rq48aXNw7KAfvOsGJ3ESv2FLNiz4mZ7789UEZ5JwQnr8romQ/Wa6uzPahLgLFKqfOVUheZr3bdzIFTgBuAs45yKf+riOwUkR0YLus/A1BK7Qb+C+wBPgfuMHtaDuBOYDmGo8V/zbwAvwZ+LiJZGGNSL3W24kfjFotJCaFYGx3Y7D33BOQ+V34vPol4sjWniq/+v73zDo+rOBf3++2qr3q3JBfJveMGNqYY22BTggkpQHJp4YabhBsINyGh3ORCGuSmkPIDEl9qEgKEXkIAAzbEgHvvliUXSZbVe9+d3x/nnNWutLta2aqreZ9Hj/acPWfPzM63881XZuZgOWsPlA3K8webw2UNAGekoJRS3PzUJv73nYM9XltsdiIzsuIHYJQ7uIOfT/Mr+fhQOZ+N0BiYJVuvbDt92Wppd3LDE5t4dN2RHq+1+pABka3agZetYCfqFgDhQNDfgFJqPb7jRG8HuOdnwM98nH/b131KqQI6XYRnhNXQs0cnsu14DeX1rf026c3qRErrWnC6FHabr6+p/yisaPT6P9LINzuR3cW15JfVMyE9rtefUd7QSl1LBzuLanq8tqtsNbZ24IgMeo58rygZ5MFPgSVb5SNbtv51uJyy+hbS46J6uKM7Rysb6XApdgUjW2Z7z8pJ5LlNx1FKYTiv+p7BGFgHa0E1ATtE5E8i8nvrrz8LNtBYP+yzzFn+/TkasUYiTpcalMl1BeXGj6ggxBVUc5uTbz+33d1pWOSXNbBsSjo2Of2RrtUBF5Q39ph6W1zTQoTdxtTMeKCfZct0J1Y2tvWrF8AfnbLV0MOVw5vqxja+9exWLxdvu9NFYUUjF0/LwKXgjR0+Q+I9YsnWnuI6nK7AU1FKappJj4skKzGK1g4XDa0dAa8/XZRSXi6+gZoiE6yCegP4CfApRpq59RcyFNc0ExcZRm6qA+jfYHZJTQvZidHm64Ef6VqKqSBERrlKKS7+zUf84YPDXufXHizjzZ0lvLmzs6OobmyjsrGNReNTOH9iGq/vKMHVQyfgC0/rc28PGXPFNc2MSowiLd6Y295fCqrD6aK0rlO2BsPNF2rWeWuHk0UPfsCzG71X7Hlr90ne3l3Kmn2n3OeOVTbR4VKsnJ7JrJyE03YhW7/P5nYnR8oDK/rimmayEqNJjbVkq3/6reqmdlraXWQnRtPY5qS2eWDmQwWbZv4M8Bydiulv5rmQoai6meykaNLijIbur4Bjc5uTqsY2zs5NBganE7EUU0lt86CMsvuaA6X1HC5r4PnNJ7xGdlbn4emGyzd/8OPTY7l6bjbFNc1sLKzq9TMLKxrdrtndRbUBry2ubiI7MZq0WEu2+qcTKatvxelSbtka6MGPUsqtmArKG0NiIvrWo9WcrG3h+U0nvM6/b8rWjhMesmVa6hPSY/n8nGz2ltRx6FTv5wz1TrYGpt+yZGmg+61gs/iWAIcxlhx6FDgUTJr5cKK4ppnsxGhSHP07yrXce/PHJbmfO5C0tDspqW1mQnosSg3dkW5JTXPQSRyf5FcAxne50/xBdzhdfGjev6uo1t1ZHj5ldCIT02O5ZFomjgg7r24v6vaZzW3OgFlUBRWNjE9zkJUQxe7iHjoRU7bcnUh/yZYpSwvGmZ3IAMehTtW10tTmZEJ6LA2tHUM2k6+wopFPTZnpifXmdbuLa91rdTa0dvDZESMJZJeHAskvM5TR+PRYPjc7C7tNfLqQ61vaqWnyP0gprGhk3pgkosPtAWXL5VKU1LSQ42VB9c93XjxIshWsi+/XwCVKqQuVUhcAK4CH+69YA09xdRNZidFEhNlIjAnv95HIhLRYkmLCB7wTOVrZiFKwfGoGMHQV1O/eP8zXntkc1Aj0X4cryE6MJtwuvL37JACbj1ZT29zO+RNTqWpsc8/dyC9rIDrcTlZCNNERdlbOGMXbu0u7WZI/+cc+Pv/op36tgMKKRnJTHczMSQjYiVgTKbMSo0l2RCACFf0kW1YnMmdMIjYZeAvKij9ZsjVUY5w/f3s/Nz21OagpAuvzKxibYiRLvb3HkK2PD5XT5nRx/sRUjpQ3uGOQ+WUNZCVEERsZRmpsJBdOSuP1HcXdZOiuF3dx01Ob/T6zsKKR8emxzMiODyhbFQ2ttDldA2pBLTAH1gMlW8EqqHCllDufVil1CCOrLySwJlJmJxm++9TYyKBGImV1LewtCTx67orVsFmJ0WQnRQ+4BWW595ZOSTePh2Ywe+vxapQyFFUgWjucbCys5OJpGSyekMo/dp1EKcWafaeICLNx20UTgE433+GyesanO7CZLpSVMzJpaO1g5wnvjKn1hys4XtXks32cLsWxykZyU2OZmZ1AYUUjdX4SJayJlNlJ0YTbbSTFRARlQZ2oauJwL91DVlnHJMeQGR9F0QDL1hFTIS2fasnW0FNQSim2Haumzeni0bWB07irG9vYXVzL1XNymJ2TwD92GQpqzb5TJMWEc/PicSiFW4kcLmtgQkZnRujK6ZmcrG3xiiM5XYpPjlSwq6jGZ0JDTVMbVY1t5KU6mJGdwN6SWjqcLp/ls9o7OzGapJgIbBKcBVVQ3tDrOZDF1c1EhdsYnxZLZJhtaLn4MNbie0JElph/jxNCSRJW5pMVXE6NjQhqJPLfr+3hi499FtSEOovimhZEIDMhiqyE6AEf5VoW0/SseDLjo4bkKLe2uZ38sgZSYyP4x+6TAZdW2XqsmpZ2F4snpHLZzFEU1zSzq6iWNftLWTw+hbljkogIs7kV0JGyBiZ6pJVbI8JNHnGoU3Ut7i0Mth3vnupbXN1Mu1ORl+pgZo6R9bnHz0jXmkiZ4yFbwVhQd76wg2tWb6CpLfisrJKaZhJjwnFEhpGVGD3g1nlheSPR4XbmjEkiMsxG4RDM5Dte1URlYxupsRG8sPlEwI720yOVKAXnTTRka3dxLQXlDXx4oIylUzKYM9qQnZ0nanG5FEfKG5iQFuu+34rXeMY4D5bWU9/SgUvRbVAEnb/P3FQHs3ISaGl3ccSPoi/2GOzabUKyI7LHfkspxb//eQvXP7HJr+LzRUmtkYxhswnZiQM3sA5WQX0T2AvcDtxhvv5GfxVqoLEmUloWVFpclNdI5MMDpzjvFx96LY3T1NbBR4fKaW538n//Kgz6WSU1zWTERRFutxkWVPXApWwCHClvIDM+CkdkGHlpjiE5yrUCzz9eNYO4yDB+u8awohpbO7j/jb389v1D7mvXH67AbhMW5iWzYlom4Xbh4fcPcaKqmYunZRIRZmPaqHh2FtXS0NpBSW0LE9I7O5HEmAimZMax6WhnJ7LZ4/W2Y9XdymelUOemOZiZnQD4V1CWkuiULW/r/OWtRSz79TovF2NZXQtbjlVT1djGXzcEv99bSU0LWQnR7ueVBOHC6ksKKhrITXVgtwm5qUNTtrYdN9rzF1+YBcAja/MBw3K5++VdPLm+87e8Pr+cuMgwZuckcNlMYwGcH7+1j9rmdi6elkGSI4IxyTHsKqqhuKaZlnYXEzM6ZWtsSgzpcZFeg58txwLLlltBpTmYmW0MfvzNh+pJth7/VwGr/t96ryzVw2UNFJQ3cryqidd6kQZf7JF5bHh+BmZ6TLBZfK1Kqd8opa7G2HPpA6XU0IyAngbuhvYc5Xqka354oIyi6mbe8EhX/uhgOa0dLvLSHPz5s6NUBbmuW0lNM1mJUe7nNbY5qWvun7kLvrBiJ4DZiTQMuWyrbceqsQlcMCmNm8/L5Z29pfx9ywmu+MN6nv70KL99/7A7MeKT/ArmjE4kLiqchJhwFk9IZd1BY0HgZaar6azRiewprnXHszwVFBgj3a3Hqmk3R5RbjlYTHW5n/tgkth8P0ImkOkh2RJCdGO0VLPfEGmlmJhhtnhob6eXi++DAKY6UN3qlK79nvs5Lc7D644Kg13UrMVOOwZCtkzUtPc6j6UsKKxrJTeuUraEY39x2rIbYyDCWTE7nmgWjeXHLCV7dXsSlv/sXz28+wc/e3u8ebKzPr2Dh+BTC7DZGJ8cwOyeBdQfLiQizcf7EVMCYfL3zRI1XBp+FiHB2bjIbC6rcv7HNR6vJjI9iYnqsW1l6YmXwjU6KIS/VgSPCf6JEcU0zcVFh7q3eU2MjvBaMfX//KXYW1Xqt6vHunlJEjPZ5ZG1+0FZUSU1z5+BnAK3zYLP41olIvIgkAzuAp0TkNz3dNxD42223NxTVNBNht7nTgNPiImlo7XB3DFaq58vbOrO93tlbSlJMOI98ZS7N7U6eWF8Q1LO6diLG85tOp9i9RilFQXkjeWYnkpcWS11LR9DKdaDYdryaSRlxxEaGcct5ucRFhfH9l3bR0u7k6ZsXMC4lhntf3U1pbQu7ims5z+wsAPdId/boRDLiDaUwKyeBpjYn75rbm3RVUOfkptDU5nTPZ9p8tIo5YxJZkJvM3pK6bgkUhRWNxEWFkeIwNnCemZ0Q0IJKj4skMswOQFpspNdq+bt8yNa7e0vJTXXw0NWzqGho6zYHxx9GtqBR56zEaDpcasAy6Vo7nJyoamJ8qiVbDo5XNbmV/lBh2/FqZo9OwG4TvnXReAThzhd2EhVu5y+3nE1STAR3v7KLI+UNnKhqdisi6JSt8yakulcCmZ2TQElti1sJeLr4AM7JTaa0roUi01OyubCK+eOSmDsmie0naroNDgsqGhmdZCRr2WzC9Gz/STjF1c3uPgRMC8psb5dLsafYkOeXt3r3W3PHJPGDlZMprGjkzV09W1GtHU7KzUQfMGSroqF1QKaoBOviSzC3yrgaeEopNQ9Y3n/FCo4edtsNmpKaFkYlRrkD554pm20dLvafrCfFEcGuImMU3tbh4sP9ZSyfmsHUUfFcNnMUz3x6LGDqKJhpobWdprLV4CUDZC5XN7VT29zutqDyzP89xaE+PlTOTU9t4rrVG/jCY59y/xt7aevo7Hhqm9r56uMb+MU7B864jC6XYseJGuaONfz7CdHh/HjVdL5yzhj+ecf5LJmczs+vnsmxyiZueWazESOY0NmJrJiWSWxkGJ+b1bkm8WxzdZBXtxcTbhfGdlnCakGuFYeqpL6lnf0n65g/Lpk5oxPpcKluyqewopG8VId7SZmZOQkcrWzyOXmxpLbZ7YIBSI2LpLndSWNrhzu7MMURwceHyjlV10JtUzufHankkukZnJ2bzKK8FP70cUGPnUFdSzv1LR2dg58ka7LuwAx+TlQ14VJ4WFCxdLiUO5bnj7d3n+TGJzdx7erPuPrRT/jluwe8XFKn6lr4/KOf8KePel6Xriea2jo4UFrP3DFGe49KiOa/r5jK1xbn8ta3z+P8iWk8cOV09hTXcftz2wFv2bp81igiwmx8bnZ32XptezGpsREkmYMWi7NzUwAjDlVc00xpXQsLxiUzZ0wiNU3t3azMwvJGxpm/S4BZ2QnsK6nzaekU1zST4yFbaaZ1rpSisLKRhtYOUhwR/HNPKQ2tHZyoamJvSR0rpmdwybRMpmTG8YcP83u0sktrjf7J0/MDcLK2//utYBVUmLkK+ZeBt/qxPL3F5267gW5w+XBnWRMpLayUzbL6VkMhOV3csXwiYTbh5a1FfHqkgvrWDlbOyATg20sn0NDa4eW/9kVlo7FiutV5uDuR6oHpRKyMvfHmKM+ypAKtm+ZyKe5/Yy+7imrpcLmw24SnPz3KN/66lZZ2J7VN7fzbExv5JL+Sx9YdYd3B3i1A29zm9Eolzy9voL6lw92JAHx+Tg4///xMEmOMH/+541O5Zv5o9pbUERsZ5u4kABJiwvnk7qV8bXGu+1xuioO4yDDK6lvJTXUQZvcW+/S4KPJSHWwqrGL78RpcCs4el+xWkl1dMZ5uUsAdh9rrY6TbbZQb25kObI2Mv3vJZFzKUKAfHjzlXo0A4PZlEymvb+W5TccDfo8nrUSfJG/rfKBiBVYgPy81eNlqaXfyo9f3su9k55I+j6w9wn/9fQcdThdldS1ct3oD24/X8It3Dvh0twaiobXDa5mrnSdqcbqUl2zdsGgcP/rcNLdFdNnMTJZPzWBvSR3ZidFe7ZyTFMOme5dx1Vmd+6JOz4rHJkZf0dUyB2O+XWJMOJsKK9ly1Cj//HFJHrLVGV9SSnG0sots5STQ2uFyL0LrSbGHNwaMfqutw0VdS4fb6/O9FZNpbnfy9u6TvLvX8CCsmJ6JzSZ8e+lECsobeasHK8qdLZjUdWDd/26+YBXUjzFWE89XSm0WkTyMibuDjb/ddr3w3LDwaKmPrKyuDe1hQVkumCWT0rloSjqvbC/m7d0ncUTYWWyOrqZkxrN8anq3lQy64k4xN325KY4IIsNslAzASAQ6036tH0BOUgzhduFIgGyr9/adoqCikQeunM6L3ziXv//HIn7++ZmsPVjGTU9t4vonN3KwtJ4//ttcJqbH8oOXd1Hb1PMyKBsKKvneiztZ8LP3ueThj92Tcq3A8dwxiYFu597LppIWF8kFk1IJ76JwEqLD3dYwgM0mzBptKBFfnQgYcahNhVVsLKzEbhPOGpNIamwkY5Jj2HasU2Za2p0U1zSTm9r5OZaC+uSI9+RPayKlp4JKjeuUrd1m8PuK2aOYPzaJl7YW8c6eUjLiI5ltZgcuzDNG2y9s9l7JoCue0xc8/w9UrMAtW2ldrXP/svXKtmIqGlr53TVn8eI3zuWVby3mrhWTeW1HCd/461au/b8NlNa18ORN88mMj+K7f9/ZYzxOKcW6g2Xc/tx25v90DRc//JF7gGH9nxNAtkSEn1w1nbjIMC6aktZt4dXEmAivczERYUwyU8t9yZbNJiwYl8zGwio2H60iNjKMKZnxTEiLJS4qzGvwU1ZvTHTO8zH4+aTLxGLLYvaSrS79VlS4jS/NyyEv1cFLW4t4b+8ppmTGMTbF+PxLZ2SSm+oIQra8s5xzkgZOtoJNknhRKTVLKfUt87hAKfWF/i1aUAS1q67nhoWNLpvXlsXWREp/Db27uJaE6HBGJ0fzxXk5lNe38tLWIpZMSScq3O6+59IZoyirb3X7fX1R3KUTEZEBDTgWVDQSbhe3gNltwtgUh99RrlKKP350hDHJMVxqWosAXzlnDA9/+Sw2H61m/8k6Hvu3uaycMYrffPksKhva+NEbe3x+nsXfNh7n2tUbeGdPKZfOyCQv1cH9b+6lpd3JtuPVJMWEe40ifZEQE87bt5/PQ2Y2Vk/MMjt8fyuXn52bTF1LBy9uKWLaqHhizRH13DGJbDte7R54HK9qQnm4sgCSHBFcOiOTJ9cf9RpVek6ktEiNNaxAy4LKTXUQHxXOF+flkF/WwJp9p9wjXDBk5LIZozhQWk9RAEvbc04MQGxkGAnR4QPm4iusaCA1NtIdsE+MiSDZEeE3UcLpUqz++AizchJYND7Fff62iybwwJXTeX9/GaW1LTx989ksnZLBL780m4KKxh7dyI+uO8JNT23m48PlfHFeDulxkfzo9T04XYrtx6vJS3O4LXF/jEqIZs1/Xci9l00Nqu7WYGKiH9k6JzeZY5VNrNl3irljk7DbBJtNOGt0olcmX+cAslPR5aY6OCc3mUfW5nuFELpm8IFHv1Xfyp7iWqZnJRBmt/GFeTlsKqxi87EqVkzv/B3bbMKK6ZlsKqzyO48POgc/VqJPRnwUIgzIPLtgkySiROQ2EXlURJ60/vq7cEHgb7ddv9hFuP+Nve4O5y8bjqGUsTyJRYpXJ1LDrJwERISLJqeT7IjApfBqaIAlk9MQMTJn/FHSpRMBQ1kN1JyCgvIGxiTHeLm48lIdfmNQmwqr2HGihq9fkNfNLXbVnGyev3Uhz9+6kGXmygEzcxL4z6UTeH1HiVfGoycHSut44M29nD8xlc33LeeXX5rNj1fN4FhlE6s/LmDb8RrmjEkKasuAtLjODrEnZrsVlH8LCoxRrLUMFcDcsUmU1be626jA7cryVqD3XT4Vl1L87O397nPPfHYU6HSpWmUGy4KqdY+QL5s1isgwm0/ZWmpmI34YYOmnkppmwu3itv7BkLOBim8WlDd2+07yUh1+5/C8t7eUo5VNfOPC8d3a+sZzx/Hnr53Ni99Y5G6XxRNSuXHRWJ7+9Cj/Olzu8zM3H63i1+8d5IpZo9h073J+etVM7r1sKnuK6/jbpuNsO17j5d4LRGZCFDERwW2JYrmYg5Gtsz1la0wSh07VuyfseqaYW4gI9185nbqWDn79njG9QinFnz87CviWrVP1rewp6ZStq+dmIwLKh2wtm5pOh0vx0UHf3ykYspXmkegTEWYjIy5qSLn4/gJkYixx9BGGIuj9Koh9j8/ddgPdkJEQxWcFlby9u5TXdxTzk7f2sXJ6JpfP7Ax8GjP+jWWIDpbWM8Ns6IgwG1+Ym01MhJ2LJntvHZ8SG8ncMUl8cMC/giquacYRYSc+ulPw+3PSW01TG//xly38z+t7KChvMIL7XbKMctMcHKts9BmE/eNHR0hxRPCleTk+P3/BuGTmjU32OnfbRROYOyaR77+002shTTCC1P/5t+3ER4fzmy+fRXSEIfDnTUzl8pmjeGRtPvllDT26906HJZPT+M7yiSwzV9DoSk5SjHvgYK03Brg7NCtWYHUi47p0xjlJMXxryQT+sesknx6p4OlPCnlk7RGuXTCacz0shOQYY7mj/aX1lNS2MCvHkK34qHAunzWK1NhId4dmMT4tltxUB+/v96+gimuayUyI8nJtWvPs+oNTdS3c9NQmHnx7P0XVTaZseX8n/uZCWZb5uJSYbh2mxQWT0pieleB17u5LpzIpI5ZvPbvNve6dRXVjG7c/t53RyTE8ePVMIsKMru3K2VkszEvm5//YT1VjW9AKqjdcMXsUdy6f5CU3nkwbFY/DlPX5nrI1Nslrwm5hRQORYTZGxXvvITV1VDzXLxzLsxuPsbekloffP8xzm07wrSXjmToq3n2dZZ1vLKikqc3pVlCjEqJZMimNvDQHU0d5W3lzxySRFBPOBwEG1l1DINC/suVJsApqglLqh0CjuYr55cDM/itWcPSw265PUhwRTBsVz49e38N3/76ThXnJ/Pbas7ptGpgWF8n6/AranYpZ2Z0/lO+tmMya/7qQOB8j92VT09lTXOfOeumKlWLuOWLMSoymvN5I2XxkbT5zf7KGJ9cXemUytXY4OV7Z1Kv5SpUNrVz3fxtZe6Cc5zadYOmvPyK/vKFbJzI+NZZ2p+LNXSXuTLGWdif/3H2StQfLuenccV6uzJ4It9tYfcN80uIi+fdnNnPCzOJq63Dxo9f3cqS8gd9ec5Z7tGfx31dMdbdBf3QiUeF2vrN8UsCNAi3F4GlBTc6MIyrcxmdHKmlpd1JY0UB6XKTbBejJf1yYR05SNN95fgcPvLWPS6Zl8NOrZni1d5jdRoojwh1zm+khWz+9agZvffu8bjE1gGVT0tlwpNLvfj+e81QsDAuqmXaniwf/uZ/5P13Di1u846TNbU6KqnsnW8U1zXz5T5/x2ZFKHl9fyAX/u5bKxrZuspWXFktFQytrD5S5sz4bWzt4YfMJdhbV8vUL8nq1WWd0hJ0nblxAZJidm57a7E6hb2l3ctdLu6hoaOUP183x+m2KCD9eNcOd7j53bN8PfuKjwrlj+US3UuxKmN3GvHHJhNvFbckDnGW+/iS/gtYOpzv5xubjO7lz+SQSYyL42tOb+f0Hh7lm/mjuWjHZ65qkmAjsNnFb2tbgB+B3183hhVsXdbNW7TbDM7T2YHnAJZWs6QsWWYnR7t0Q7n11N+f8/H3e2eO9zX0gt2GwBLutp/WkGhGZAZQC48746X2Av912A/HjVdP54h8/Y9qoeP7vhvk+O+DU2EgOmStfz/Ro6Mgwu5eLzpPlUzP433cO8uGBMr5yzphu75fUtPgciQB86Y+fsbu4lnEpMfz4rX2sO1TO91dM5r29pTy78TiVjW2kOCI4Jy+ZCelxNLd10NDqBBSxkWE4IsPIiI9iQrqxCO03/7qN41VNPH7jfKaMiuO5jSd4a1cJF070tvzmjUsiITqcO1/YyX2v7mFSRhz7TtbR1uEiPS6S6xeN7c1X6/7unrppAVc/+ik3PbWJWTmJvL//FPUtHfznRRPcySWejEqI5q4Vk/n9B4e9svIGkq+fn8f0rHivXVDD7TbmjE7iuU3HeW7TcWziPQr2JCrczo+umMatf9nK2bnJ/P66Od1co2B8PwdK6xGB6R4KKiYizK9badnUDB5fX8j6wxXu7FFPSmpaOKeL5ZWdGE19awdXP/qpW7buemkXaw+WcdtFhiv2+U3HqWvpICM+koV5KYxNcdDU2kFjWwcgxEWF4YgIY1RCFOPTY4kOt/P1P2+hrqWd525dSEZ8FH/dcIz39pZ2a9dF41OIibBz89ObiYsMIy89ln0ltbQ7FeNSYvjCXN+WeSBGJ8fwxI3zuWb1Z9z89CbGpjhYe6CMpjYnP7ximjvW6MmkjDi+uWQ8r2wr9hsn6m9uXzqBldMz3V4DMOKokzPieHTdER5ddwQRY5qELxJiwvnBysn84OXdXDwtg599fkY3ZWOzCSmOCE7WthATYffylsRHhYOfzX2XTc3gle3FbDte0816tzYqXDp39mI+AAAaTUlEQVTZ2/OQnRjNO3tOsur/fcLBU/WMSY7hG3/dyjXzR3P9orH8fcsJXtrafZeA3hKsglotIknADzFcaLHAj8746YPE/HHJvPzNRUxIi/NpCUFnwNFaKSAYJqbHMjo5mg/2n+qmoJRSFNc0u92FFtbcgsNl9Tx09UyuWTCaZzce56f/2McVf1iPiDF6Pn9iGjtP1LDBdE9Gh9txRIYhYoxKm7pkN8VE2Hn65rPdAeg7lk/kjuUTu5V5fFosm+9bzoaCSt7bV8r+k/XcsHAsiyemck5uctB++K5MSI/jT9fP58YnN1HR0MaK6ZlcNjOTiyb7drEB3Lw4lxsWjevVqLovmZYVz7Ss+G7nf/Xl2XySX0FZXQun6lq5eFqG38+4eFoGz9+6kJnZCX4tT0O26slLdfi0xHwxf1wS8VFhfLD/VDcFZW1U2HXwYx0frWjkka/MZeWMTFZ/XMCv3zvI27tLsduElTMyWTA2ia3Ha/j0SCWv7yghJsKQLaWgodXYqM6TxJhw/vbvC90Dtx+snMIPVk7pVuazRiey7YcXs/5wBWv2neJIeQO3nJfH+RNTmTc2qVeWuSezRyfyu2vn8M2/bqW0toWr5mRz+cxRXq7UrvzXxZP4zvJJgyZb88cl+xzY/PH6eWwqrORUXSvl9a1cNSfL72d8ef5oRifFMHdsks+BDxiyVVbfyoyshKDramTCCh/sP9VNQVU1ttHS7uo+sE6Mot2pqGho5Zmvnc2ivBR++/4hHvvoCC9sOUGE3cbnZmexnzMjqF+HUupx8+VHQN4ZPnNI0DV20hXLBTUzOyGogD0Y7oRlUzJ4btNxmtuc7tGSy6W4/829VDW2eZndAPPHJvPtpRO4YlYWkzON0d2/LRzLwrwU1h00JgN7xjuUUrgU3YSvw+niZG0L+WVGrGnR+BQv/3QgIsJsXDApjQsmpfV8cS9YND6Fz+5ZSnx0uE+3lS8GqwMJRHZiNF+eP7rnCzFkYGGe/44SOmXL12jfH+F2GxdOTmftwTJcLuV2A7U7XXzvxZ04Xarb4GfJ5DS+uWQ81y0Ywxhzy4hvLhnP+RNT2VhYxWUzMxllugVvWmzIllJ0czG1O10UVzeTX9bAsaomLpqc1i2W6Y+ocDvLp2WwPIBSPx1WTM9k473LSXZEBCUzIoJ96IkWuamOHjNWLUSEc314HzxJi4uEk95en56IiwrnnNwU3t9/ins8Mheb25x898WdAN1k6/JZWZTUtnDzueNIN2Nm3185hWVT09ldVMvls7JIi4vkN9cEXQyfBKWgRCQD+DmQpZS61FytYZFS6okze/zQxbKguiqUnlg2NZ2nPz3KJ/kVLJ+WQYfTxV0v7eLV7cXcekEe1y7w7ugiwmx895LJ3T5nQnqsz6wgfz80a72w0ckxXNSrEvcvKbGRPV80wrCC2TOzeydby6em8+bOEnYUGdloLe1Obnt2Gx8cKOP7Kyd3s6wckWE+LZsZ2QndOhwwZMvXWCzcbmNcqqNbYshg0zWOqTmzfuuBN/dxtMJYyaK+pZ1bnt7C5mNVPHj1zG6WVbIjwqdszRvbPXHqTAjWf/M08BRwn3l8CHgBCFkF5WlB9YZzclOIjQzj3ld384e1+TSas9nvWjGZby3pnlKrGXl0WlC9k60lk9Kx24T/fHYbafFR1Da1cayqiZ9cNYPrF/Y+VqgJPU6331o+NYMH3tzH9U9uJMXctuNUXQu/v3YOn5vt3+3Y3wSroFKVUn8XkXvAyJ4Tkf5fKXAQWTQ+hRXTM1gYwK/ti4gwG3dfOoV1B8tpd7pwRNj5+vm5XLOge9KEZmRy4aR0dhXV9soNA0ag/K4Vk9ly1NhwLy4yjLtWTOFyj3UHNSObi6elU9nQyriU3lm7o5Nj+PbSCew/WUebUxEXFcbPPj+DJQFixgOBBJNeKiLrgC8Aa5RSc0VkIfALpdSF/Vy+Pmf+/Plqy5Ytg10MjUajCXlEZKtSav5p3x+kgpoL/AGYAewB0oAvKqV2ne6DBwsRqQcO9njh8CcVqOjxquGPrmdooesZWkxWSp12bn9AF5+ILABOKKW2iciFwH9gWFLvYSwzNBw5eCYafbggIlt0PUMHXc/QYiTV80zu7yn390+AtULhuRhJEo8A1cDqM3mwRqPRaDSB6ClJwq6UqjJfXwOsVkq9DLwsIjv6t2gajUajGcn0ZEHZRcRSYsuADz3eO70lBgafkWL56XqGFrqeoYWuZxAETJIQkfuAyzCCeWOAuUopJSITgGeUUovP5OEajUaj0fijxyw+M6V8FPCeUqrRPDcJiFVKbev/Imo0Go1mJNLjAmlKqQ1KqVct5WSeOzTclJOIrBSRgyKSLyJ3D3Z5+goRGS0ia0Vkv4jsFZE7zPPJIrJGRA6b//t+D4tBQETsIrJdRN4yj3NFZKNZzxfMfcGGNSKSKCIvicgBs10XhWJ7isidpszuEZHnzI1RQ6I9zU1dy0Rkj8c5n20oBr83+6Zd5rSeYYGfev7SlN1dIvKqiCR6vHePWc+DIrKip88Pdj+oYY2I2DGyDy8FpgHXmesJhgIdwHeVUlOBhcBtZt3uBj5QSk0EPjCPQ4E7wGuR5F8AD5v1rAZuGZRS9S2/A95RSk0BZmPUN6TaU0SygduB+UqpGYAdY8PRUGnPp4GVXc75a8NLgYnm363AYwNUxr7gabrXcw0wQyk1C2NZvHsAzH7pWmC6ec+jZt/slxGhoICzgXylVIFSqg14Hlg1yGXqE5RSJy1rVilVj9GZZWPU7xnzsmeAqwanhH2HiORgbJb5uHkswFLgJfOSYV9PEYkHLsBc51Ip1aaUqiEE2xMj0SraTMSKAU4SIu2plPoYqOpy2l8brgL+rAw2AIkiMizWr/JVT6XUe+ZmsgAbMHZgB6OezyulWpVShUA+Rt/sl5GioLKBEx7HRea5kEJExgFzgI1AhlLqJBhKDBjcRbX6ht8C3wesDYpSgBqPH0MotGseUA48ZboyHxcRByHWnkqpYuBXwHEMxVQLbCX02tMTf20Yyv3T14B/mq97Xc+RoqB8LSEe/B7XwwARiQVeBr6jlKob7PL0NSJyBVCmlNrqedrHpcO9XcOAucBjSqk5QCPD3J3nCzP+sgrIBbIAB4arqyvDvT2DIRTl2MoC7wCetU75uCxgPUeKgioCPDdiygFKBqksfY6IhGMop2eVUq+Yp09ZbgLzf9lgla+PWAxcKSJHMVy0SzEsqkSPuXqh0K5FQJFSaqN5/BKGwgq19lwOFCqlypVS7cArGKvVhFp7euKvDUOufxKRG4ErgK+qzlTxXtdzpCiozcBEM0MoAiNQ98Ygl6lPMOMwTwD7lVK/8XjrDeBG8/WNwOsDXba+RCl1j1IqRyk1DqP9PlRKfRVYC3zRvCwU6lkKnBARaxfLZcA+Qqw9MVx7C0UkxpRhq54h1Z5d8NeGbwA3mNl8C4FayxU4HBGRlcAPgCuVUk0eb70BXCsikSKSi5EUsinghxnbPIf+H8aE40PAEeC+wS5PH9brPAwzeReww/y7DCM+8wFw2PyfPNhl7cM6LwHeMl/nmUKeD7wIRA52+fqgfmcBW8w2fQ1ICsX2BB4ADmDskPAXIDJU2hN4DiO21o5hOdzirw0xXF+PmH3TbozMxkGvwxnUMx8j1mT1R3/0uP4+s54HgUt7+vygttvQaDQajWagGSkuPo1Go9EMM7SC0mg0Gs2QRCsojUaj0QxJtILSaDQazZBEKyiNRqPRDEm0gtJoNBrNkEQrKI1Go9EMSbSC0mg0Gs2QRCsojUaj0QxJtILSaDQazZBEKyiNRqPRDEm0gtJoNBrNkKTfFJSIjBaRtSKyX0T2isgd5vlkEVkjIofN/0nmeRGR34tIvojsEpG5Hp91o3n9YXOfEev8PBHZbd7ze3PZfo1Go9GEAP1pQXUA31VKTQUWAreJyDSM3UE/UEpNxFhy3tot9FKM/UEmArcCj4Gh0ID/Ac7B2L/+fyylZl5zq8d9K/uxPhqNRqMZQPpNQSmlTiqltpmv64H9GPvPrwKeMS97BrjKfL0K+LMy2ICxs+YoYAWwRilVpZSqBtYAK8334pVSnyljz5A/e3yWRqPRaIY5YYHeFJF6fO8ZL4BSSsUH8xARGQfMATYCGcrcLVIpdVJE0s3LsjE2ubIoMs8FOl/k47yv59+KYWnhcDjmTZkyJZhiazSaEOJAaT3tTle38+F2G1My4wahRKHP1q1bK5RSaad7f0AFpZQ641YTkVjgZeA7Sqm6AGEiX2+o0zjf/aRSq4HVAPPnz1dbtmzpqdgajSbEyL37H35H21seunygizMiEJFjZ3J/QAXl42HpQJR1rJQ63sP14RjK6Vml1Cvm6VMiMsq0nkYBZeb5ImC0x+05QIl5fkmX8+vM8zk+rteMMF7bXswv3z1ISU0zWYnR3LViMlfN8WlMa0YwWYnRFNc0+zyvGZoEFYMSkStF5DBQCHwEHAX+2cM9AjwB7FdK/cbjrTcAKxPvRuB1j/M3mNl8C4Fa0xX4LnCJiCSZyRGXAO+a79WLyELzWTd4fJZmhPDa9mLueWU3xTXNKKC4ppl7XtnNa9uLB7tomiHGXSsmEx1u9zoXHW7nrhWTB6lEmp4I1oL6CUYm3vtKqTkichFwXQ/3LAauB3aLyA7z3L3AQ8DfReQW4DjwJfO9t4HLgHygCbgZQClVJSI/ATab1/1YKVVlvv4m8DQQjaEwAypNTejxy3cP0tzu9DrX3O7kl+8e1FaUxgtLHnxZ28FY4dpSH3jESIDr4SKRLUqp+SKyE5ijlHKJyCal1Nn9X8S+RcegQotAcYVCHVfQBIFlhXsOdKLD7Tx49Uy3AgrmGk13RGSrUmr+6d4fbJp5jZns8DHwrIj8DmOek0YzqPiLH+i4giZYAlnhvblG0/cEq6BWAc3AncA7wBHgc/1VKM3Q4bXtxSx+6ENy7/4Hix/6cMjFdnRcQXO6WLLtK3ECoMTjfEkQ12j6nqBiUEqpRo/DZ/xeqAkpuro1rAQEYMi4NQLFFTQaf/hy2XVFAYsf+pC7VkzWGYCDRFAKqsuE3QggHGgMdqKuZnjSXwkIfR1svmpOtlZIGi96kjFfsu0La1D2hXnZvLy1uFsMSlvq/UtQLj6lVJxSKt78iwK+APy//i2aZrDpD7eGTgvX9DfByFhvZLi53cnaA+U8ePVMshOjESA7MVonSAwAvZqoa6GUek1E7u75Ss1wJli3Rm8sIp0WrulvgpExf7Ltj5KaZm2pDwLBuviu9ji0AfPxs6yQZvhjKZzimmZj0UWP97q6NQLFqaB7bMjfyLW4ppnFD32o40iaMyYYy/+uFZN9po1Hhduobmrvdq+ONQ0OwVpQnhl7HRgrSazq89JoBp2uCsda9FBhuDWC8eU3tzv5zgs7vJRbcU0zd76ww++oRsxrrGuHWjKGZvgQjOXvL7kG8Km4dKxpcAg2i+/m/i6IZmjgS+FYyumTu5d2uz6QL7+rMgqknLq+19fJGAnR4YhAdVM7dhGcSpFonqtpane/3x+v9TM7XwezSkMw1wfCn3XUVckEctnprNChQcCVJETkDwRw5Smlbu+PQvUGEVkJ/A6wA48rpR4KdL1eSSIwgVZmePias3x2+GdCdoBYwJmsBhFMGrFmcAhmlQZf10PwikMvSzQ0ONOVJHpSUNairouBacAL5vGXgK1KqTtP98F9gYjYgUPAxRirm28GrlNK7fN3j1ZQgfE3cTExOpzWDlefdviWAvL3TH9WWzAEmoCpGRpYLmMr3hkIX/JnWd6JPVhcWlkNHv2qoDwesha4RCnVbh6HA+8ppS463Qf3BSKyCLhfKbXCPL4HQCn1oL974uLi1Lx58waohMOPhpQpVOatRNnD3efE2Y642nGFxwS+WSnwv99XN+yttYzevtrvM1MK3iG28kCv6wBw9Jzv9aosmsFBnO0oW1jPbdUL2fKUnf6QLU3wfPTRRwOyFl8W4Ll5Yax5brDxt9uuFyJyq4hsEZEt7e1n5pIKdWIrD5BS8A721lpQCntrLSkF7+AKCy6LSZxdvl+lOv+6XJd0/OOAzzyTDsTeVnfa92oGDkNx9G1CsLKHUz3mAgCqx1zgpZy6vq8Z2gSbxfcQsN20pAAuBO7vlxL1jqB21e26o+66dev6uVihxleCcpllJ8W4XTY9b2dwFlfNuSrgM88EHYMaRoiN6HB74LbqpTXsjEzgOw8/y50v7PD5visyAd0P9D8BdlAPimCz+J4SkX8C55in7lZKlZ7Rk/sGf7vwavoYX5lRnlhZUv4yo3ydP5PYQE/3dk0jHurZbSPhmf4SajxjUX2ZgHPPK7tJjAnX85qGMT0lSUxRSh0Qkbm+3ldKbeu3kgWBiIRhJEksA4oxkiS+opTa6+8enSRx+vRlKvCZ7K+j9+YZnvS23fxllILvqQm+8JVcoWVl4OjvLL7VSqlbPVx7niil1OmlWPUhInIZ8FuMNPMnlVI/C3S9VlBDg2Az93xZSv6yvs4k608zMPRmkBNIRrpaXDXNvq2trtMjdBbfwDIgWXyhhFZQQ4NgdsL1N+L252bUu+gOH/p6F9v+mKqgOXMGZEddEfmSiMSZr/9bRF4RkTmn+1CNJpidcP0to2T3E3jNSowe8hssagyC2aH2qjnZQa8grjeuDE2CzeL7oVLqRRE5D1gB/Ar4I51JExpNrwhmORp/yyg5lfK5iO1FU9KG/AaLGoNgt3IJdgVxvXFlaBKsgrJ6kcuBx5RSr4vI/f1TJM1IIJgOJdCWCL4WsdVbeQwf+mOHWr0dRugRrIIqFpE/AcuBX4hIJMFP8tVofNJTh9JTanvXRWz9zXk5kw0WNf1DsAu6DjZ6maTBJVgl82XgXWClUqoGSAbu6rdSaTR4xyD84al8golraYYGvYkvDRZ69+fBJ9iJuk0iUgacBxzG2BPqcH8WTKOBTivLX5aWp/IZLqNyjcFQd8lpl/HgE+yOuv+DsYvuZOApIBz4K8Yq5xpNn+LLrRKM8tGBck1fEmwih6b/CDYG9XlgDrANQClVYqWdazR9ib8t5B+8eiYPXj2zR+Uz1EflmuFDfyRyaHpHsAqqTSmlREQBiIijH8ukGcEEcqt8cvdSrXw0A4Z2GQ8+wSqov5tZfIki8nXga8Dj/VcszUhFu1U0QwXtMh58gk2S+JWIXAzUYcShfqSUWtOvJdOMSLRbRTOU0C7jweW01uIzt1q/Vin1bN8XqX8RkXrgYI8XDn9SgYrBLkRvsUXHJ4fFp41FpHMKhFKujrryY67muioftwzLep4Gup6hxUip52Sl1GnnKwS0oEQkHrgNY5faN4A15vFdwA5g2Cko4OCZLF44XBCRLbqeoYOuZ2gxkup5Jvf35OL7C1ANfAb8O4ZiigBWKaV8T9vXaDQajaYP6ElB5SmlZgKIyOMYJukYpVR9v5dMo9FoNCOanpY6cu8CppRyAoUhoJxWD3YBBghdz9BC1zO00PUMgp521HUCjdYhEA00ma+VUir+TB6u0Wg0Go0/RtyOuhqNRqMZHugtMzQajUYzJBkxCkpEVorIQRHJF5G7B7s8fYWIjBaRtSKyX0T2isgd5vlkEVkjIofN/0mDXda+QETsIrJdRN4yj3NFZKNZzxdEJGKwy3imiEiiiLwkIgfMdl0Uiu0pIneaMrtHRJ4TkahQaU8ReVJEykRkj8c5n20oBr83+6ZdIjJ38EreO/zU85em7O4SkVdFJNHjvXvMeh4UkRU9ff6IUFDmxOJHgEuBacB1IjJtcEvVZ3QA31VKTQUWAreZdbsb+EApNRH4wDwOBe4A9nsc/wJ42KxnNXDLoJSqb/kd8I5SagowG6O+IdWeIpIN3A7MV0rNAOzAtYROez4NrOxyzl8bXgpMNP9uBR4boDL2BU/TvZ5rgBlKqVnAIeAeALNfuhaYbt7zqNk3+2VEKCjgbCBfKVWglGoDngdWDXKZ+gSl1EmllLXKfD1GZ5aNUb9nzMueAa4anBL2HSKSA1yOuQ6kiAiwFHjJvGTY19OcHH8B8ASAUqrN3CQ05NoTY5pLtIiEATHASUKkPZVSHwNdVz7x14argD8rgw0Ya56OGpiSnhm+6qmUek8p1WEebgByzNergOeVUq1KqUIgH6Nv9stIUVDZwAmP4yLzXEghIuMwtkXZCGQopU6CocSA9MErWZ/xW+D7gMs8TgFqPH4ModCueUA58JTpynzc3D0gpNpTKVUM/Ao4jqGYaoGthF57euKvDUO5f/oa8E/zda/rOVIUlPg4F1LpiyISC7wMfEcpVTfY5elrROQKoEwptdXztI9Lh3u7hgFzgceUUnMwpnkMa3eeL8z4yyogF8gCHBiurq4M9/YMhlCUY0TkPowQhLUkXq/rOVIUVBEw2uM4BygZpLL0OSISjqGcnlVKvWKePmW5Ccz/ZYNVvj5iMXCliBzFcNEuxbCoEk0XEYRGuxYBRUqpjebxSxgKK9TacznGxP9ypVQ78ApwLqHXnp74a8OQ659E5EbgCuCrqnMuU6/rOVIU1GZgopkhFIERqHtjkMvUJ5hxmCeA/Uqp33i89QZwo/n6RuD1gS5bX6KUukcplaOUGofRfh8qpb4KrAW+aF4WCvUsBU6IiLUr3jJgHyHWnhiuvYUiEmPKsFXPkGrPLvhrwzeAG8xsvoVAreUKHI6IyErgB8CVSqkmj7feAK4VkUgRycVICtkU8MOUUiPiD7gMI6PkCHDfYJenD+t1HoaZvAtjhfkdZl1TMDKFDpv/kwe7rH1Y5yXAW+brPFPI84EXgcjBLl8f1O8sYIvZpq8BSaHYnsADwAFgD8bC1JGh0p7AcxixtXYMy+EWf22I4fp6xOybdmNkNg56Hc6gnvkYsSarP/qjx/X3mfU8CFza0+frlSQ0Go1GMyQZKS4+jUaj0QwztILSaDQazZBEKyiNRqPRDEm0gtJoNBrNkEQrKI1Go9EMSbSC0mg0Gs2QRCsojUaj0QxJ/j9NSqo1t0j8RwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Check Seasonality\n", + "# Not much seasonality is found\n", + "d = sales.loc[(sales[\"store\"] == 2) & (sales[\"brand\"] == 1)].copy()\n", + "decom = sm.tsa.seasonal_decompose(d[\"move\"].values, freq=52)\n", + "print(decom.plot())" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# autocorrealtion: weekly, monthly, quarterly, yearly\n", + "def single_autocorr(series, lag):\n", + " \"\"\"\n", + " Autocorrelation for single data series\n", + " :param series: traffic series\n", + " :param lag: lag, days\n", + " :return:\n", + " \"\"\"\n", + " s1 = series[lag:]\n", + " s2 = series[:-lag]\n", + " ms1 = np.mean(s1)\n", + " ms2 = np.mean(s2)\n", + " ds1 = s1 - ms1\n", + " ds2 = s2 - ms2\n", + " divider = np.sqrt(np.sum(ds1 * ds1)) * np.sqrt(np.sum(ds2 * ds2))\n", + " return np.sum(ds1 * ds2) / divider if divider != 0 else 0" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/data/anaconda/envs/forecasting_env/lib/python3.6/site-packages/numpy/core/fromnumeric.py:3118: RuntimeWarning: Mean of empty slice.\n", + " out=out, **kwargs)\n", + "/data/anaconda/envs/forecasting_env/lib/python3.6/site-packages/numpy/core/_methods.py:85: RuntimeWarning: invalid value encountered in double_scalars\n", + " ret = ret.dtype.type(ret / rcount)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3deXzU9Z348dc7dyAXgQQhCacI4gEooi3uVu2B1ou2bqvb7fba2v52e/1qaXF7aG272tJut9t1t2vvU2urIlVb6s+jh/UgGBAVoohAEsIhMEmA3Hn//vh+J0wm35nMTOY7k+T7fj4eaOb7/c73+/nOfOf7/n5uUVWMMcYEV062E2CMMSa7LBAYY0zAWSAwxpiAs0BgjDEBZ4HAGGMCzgKBMcYEnAUCl4jMEpFjIpKb7bQkw03zvDTvc6WIvOzue3U69z2Ricj7ROQvo3j/70TkvelMk7vfYhH5rYi0iciv073/8UJE5oiIikheEI8fT2ADgYjsFpE3hV+r6l5VLVHV/mymK1lumnelebe3AP/l7nt9mvedFBG5WUR+ns00+MHrvFT1MlX9iQ+HuwaYDkxV1b/zYf+Don9XfhORNSLyvIh0iMirIrImU8f2g4hcKyLbReS4iLwiIn+TieOOuchkEiMieara59PuZwMvpPJGn9OVESIigKjqQLxl48hs4KVUvpdMfp8pHkuAfwSeA+YDfxCRJlW9K0vpGc3x3gx8DXgX8AwwI1PHRlUD9w/4GTAAdALHgM8AcwAF8txtHge+AvzV3ea3wFTgF0A7sAmYE7HPRcDDwBGgEXhnnOO/D9gFdACvAu+OWPcBYDtwFNgIzI5Yp8C/AC8Dr0YsO9X9uxD4BrAXOAB8Fyh2100DHgBCbhr/DOR4pO2VqM+mEJgJbHDftxP4UMT2NwO/AX7ufi7/5LHPy4EGd30TcHPEuouA5qjtdwNvAi4FeoBeNy1b3fXx0pML/Kt7Hh3AZqDOXfd693trc///+oj3PQ58FXjCPfdTYywrB34AtAIt7jWSG/G9/iVin992z7fdTcffuMtjndfj4c8PJ7f+eWAPcBD4KVDurpvjfu/vdb/r14DPxbjWvhR1rA8muO8Puvv+k8c+Pa8lPH5X7vZX4TxYhNxzPD3qu/4szo28G+fhdCZwD3AI5/fx8SR+2/8JfCfGuvC5XQ/sc7/DG+Jdy8AK4Ek37a3AfwEFUb/Jj+D8Jo8Ct+M8MIBzLX7D/X524fx2B+8xHun7K/DBrNwTs3HQsfDPvQDf5HGRRAaCnThPGeXAi8BLODeoPPfH8yN328k4P/j3u+vOcb/8MzyOO9m9yBa6r2eEtwNWu8c83d3P54G/Rl10DwOVnLzBRwaC/8C5QVYCpTjB61Z33a04gSHf/fc34Qs2gc/mj8B/A0XAUvcH+saIH0+vm/accLqi9ncRcJa7/mycILU6Yp1nIIjY/8+j1sdLzxpgG7AQ52lxCU4Ar8T5ob7H/Wyvc19Pjfi+9wJnuOvzYyxbD/yv+z1W4zy5fdjdx/sYGgj+wT12HnADsB8oinNej3MyEHzAvRbmASXAvcDPoq7V7wHF7jl2E3GDjdrvkGMluO+fuufo9X3GvJYYfu2cBhwH3uxu+xn32AUR228B6txzycEJml8ECtw07gJWJfCbFpwHjo/EWB8+tzvdczsL59qJvNaGXMvAucAF7nc4B+ch7ZNRv8kHgApglru/S911HwF2uOdWCTxGjECAEzR6gLXu59OME3SGff6+3A8zcZCx+M/jgp3D8EDwuYj13wR+F/H6SmCL+/e7gD9H7f9/gZs8jjsZ5+niHdFfMvA7Ip4I3IvxBG6uwE3fJVHvUZwnVXF/cPMj1r2OkzmHW4D7cYNGop+NexH3A6UR628Ffuz+fTMeT40j7P8/gG+5f19EEoEggfQ0Ald7HPM9wDNRy54E3hfxfd8StX7IMpxy9u7I7w0noDzm/v0+IgKBRxqOAku8zivieOFA8AjwzxHrFuLcpMI3JAVqI9Y/A1wb47jRn2Ei+54X5zxiXksM/119Abg76ppuAS6K2P4DEevPB/ZG7fNG3IeuEa6rLwFbgcIY68Pntihi2deBHyR6LQOfBO6L+v1dGPH6bmCt+/ejRAQl4C3EDgQz3XX1OA+H03Byol9N5reV6r/AVhYn6EDE350er0vcv2cD54tIKPwPeDdwSvQOVfU4TuD4CNAqIg+KyKKI/Xw7Yh9HcG7wNRG7aIqR1ipgErA54v2/d5cDrMN50viDiOwSkbUJnD84F+gRVe2IWLYnwTQBICLni8hjInJIRNpwzn1agsdPNj11OMVCXu/bE7UskfOIXDYb56m2NeIz/l+cnMEwInKDW/HX5m5bTuLnHZ3ePTg36ukRy/ZH/H2Ck9djOvYd7ztN5loacix16liaiP25zwZmRv2W/jUqbcOIyEdx6gouV9XueNtGHW+Pm0avdYjIaSLygIjsF5F24N8Y/h3G+h5mehwrlk73/99R1VZVfQ34d+Ctcc8kTYIcCDSN+2oC/qiqFRH/SlT1/3geWHWjqr4ZJ/LvwMnih/fz4aj9FKvqXxNI92s4F9MZEe8tV9US95gdqnqDqs7Dyc18SkTemMC57QMqRaQ0YtksnKe6kdIU9kucIqs6VS3HKVYQd91xnAAGgNt8tyrivdH7Hik9TTjFeV7nMTtqWSLnEbmsCSdHMC3iMy5T1TOi3+S29vgs8E5giqpW4NRNhM97pM8sOr2zgD6GPoykKpF9x0zfCNeS1/c1eCy30r2O2J97E04uNvI3UKqqMW+IIvIBnCKVN6pqc6ztItRF/D3LTaNXWgD+B+c3ukBVy3CCkpCYVo9jeVLVozjFQem8LyUsyIHgAE75Yzo8AJwmIu8RkXz333kicnr0hiIyXUSuEpHJODeVYzhFHeDcIG8UkTPcbctFJKHmfu6T1veAb4lItfv+GhFZ5f59hYic6v4Q291jjthUVlWbcCqxbhWRIhE5G6ci8ReJpMtVivMU3yUiK4C/j1j3ElAkIpeLSD5OvUhhxPoDwBwRyUkwPd8HviwiC8RxtohMBR7C+Y7+XkTyRORdwGKc7y4hqtoK/AH4poiUiUiOiMwXkTfEOOc+nDLjPBH5IlAW67w83An8XxGZKyIlOE+iv9L0tGIZ1b5HuJaif1d3A5eLyBvd7/cGnOs+8uEm0jNAu4h8Vpz+D7kicqaInBcjLe920/9mTbwZ9RdEZJL7O3s/8Ks425a653jMzbl7PtzFcDfwcRGpFZEpOMEqnh8BHxORanf7T5LE9TkaQQ4EtwKfd7Ofnx7NjtxiircA1+I8XezHaQZW6LF5Ds6PYR9O0c8bgH9293Of+7673Gzo88BlSSTlszhZ9qfc9/8/nPJfgAXu62M4ZeP/raqPJ7jf63DKV/cB9+HUfTycRLr+GbhFRDpwKgHvDq9Q1TZ3/fdxnhKP4zwZhYU7QB0WkWcTSM+/u/v/A84P+Ac4ZfqHgStwPvvDOJWWV7hZ8GT8I04l5os4Zf6/wbuZ30acOp+XcIoEuhhaTOB1XpF+iNMK5084LWe6gI8lmdZYRrvveNfSkN+VqjbiVJp/ByfXeiVwpar2eO1YnX48V+I0AnjVfc/3cYrVvHwFp0J+kzgdII+JyHdHSP8fcX4njwDfUNU/xNn20zgPLh04D1rxgka07+FcB1uBZ3Eq5eP5Mk5rtpdwKqUbcFqt+S5c02+MMSaggpwjMMYYgwUCY4wJPAsExhgTcBYIjDEm4MbdoHPTpk3TOXPmZDsZxhgzrmzevPk1Va3yWjfuAsGcOXOor6/PdjKMMWZcEZGYPZutaMgYYwLOAoExxgScBQJjjAk4CwTGGBNwFgiMMSbgLBAYY0zAWSAwxpiA8y0QiMgPReSgiDwfY72IyH+KyE4ReU5EzvErLcYYY2Lzs0PZj3EmX/5pjPWX4YxrvgBnntL/cf+fdusbWli3sZF9oU5mVhSzZtVCVi+rGfmNxhgTAL7lCFT1TzgTr8RyNfBTdTwFVIiI1wQfo7K+oYUb791GS6gTBVpCndx47zbWN7SM+F5jjAmCbNYR1DB0xqZmhk5onRbrNjbS2Tt0RsbO3n7WbWxM96GMMWZcymYg8JoA2nO6NBG5XkTqRaT+0KFDSR1kX6gzqeXGGBM02QwEzUBdxOtanDloh1HVO1R1uaour6ryHDwvppkVxUktN8aYoMlmINgA/KPbeugCoE1VW9N9kDWrFlKcnztkWXF+LmtWLYzxDmOMCRbfWg2JyJ3ARcA0EWkGbgLyAVT1u8BDwFuBncAJ4P1+pCPcOujmDS8Q6uzllLIi1l62yFoNGWOMy7dAoKrXjbBegX/x6/iRVi+r4Vh3H59f/zwbPraS6tKiTBzWGGPGBetZbIwxAWeBwBhjAs4CgTHGBJwFAmOMCTgLBMYYE3AWCIwxJuAsEBhjTMBZIDDGmICzQGCMMQFngcAYYwLOAoExxgScBQJjjAk4CwTGGBNwFgiMMSbgLBAYY0zAWSAwxpiAs0BgjDEBZ4HAGGMCzgKBMcYEnAUCY4wJOAsExhgTcBYIjDEm4CwQGGNMwFkgMMaYgLNAYIwxAWeBwBhjAs7XQCAil4pIo4jsFJG1HutnichjItIgIs+JyFv9TI8xxpjhfAsEIpIL3A5cBiwGrhORxVGbfR64W1WXAdcC/+1XeowxxnjzM0ewAtipqrtUtQe4C7g6ahsFyty/y4F9PqbHGGOMBz8DQQ3QFPG62V0W6WbgH0SkGXgI+JjXjkTkehGpF5H6Q4cO+ZFWY4wJLD8DgXgs06jX1wE/VtVa4K3Az0RkWJpU9Q5VXa6qy6uqqnxIqjHGBJefgaAZqIt4Xcvwop8PAncDqOqTQBEwzcc0GWOMieJnINgELBCRuSJSgFMZvCFqm73AGwFE5HScQGBlP8YYk0G+BQJV7QM+CmwEtuO0DnpBRG4RkavczW4APiQiW4E7gfepanTxkTHGGB/l+blzVX0IpxI4ctkXI/5+EVjpZxqMMcbEZz2LjTEm4CwQGGNMwFkgMMaYgLNAYIwxAWeBwBhjAs4CgTHGBJwFAmOMCTgLBMYYE3AWCIwxJuAsEBhjTMBZIDDGmICzQGCMMQFngcAYYwLOAoExxgScBQJjjAk4CwTGGBNwFgiMMSbgLBAYY0zAWSAwxpiAs0BgjDEBZ4HAGGMCLi+RjUSkEHgHMCfyPap6iz/JMsYYkykJBQLgfqAN2Ax0+5ccY4wxmZZoIKhV1Ut9TYkxxpisSLSO4K8icpavKTHGGJMViQaCC4HNItIoIs+JyDYReW6kN4nIpe57dorI2hjbvFNEXhSRF0Tkl8kk3hhjzOglWjR0WbI7FpFc4HbgzUAzsElENqjqixHbLABuBFaq6lERqU72OMYYY0YnoRyBqu4BKoAr3X8V7rJ4VgA7VXWXqvYAdwFXR23zIeB2VT3qHudgMok3xhgzegkFAhH5BPALoNr993MR+dgIb6sBmiJeN7vLIp0GnCYiT4jIUyLiWSEtIteLSL2I1B86dCiRJBtjjElQokVDHwTOV9XjACLyNeBJ4Dtx3iMey9Tj+AuAi4Ba4M8icqaqhoa8SfUO4A6A5cuXR+/DGGPMKCRaWSxAf8Trfrxv9JGagbqI17XAPo9t7lfVXlV9FWjECQzGGGMyJNEcwY+Ap0XkPvf1auAHI7xnE7BAROYCLcC1wN9HbbMeuA74sYhMwykq2pVgmowxxqRBQoFAVf9dRB7HaUYqwPtVtWGE9/SJyEeBjUAu8ENVfUFEbgHqVXWDu+4tIvIiTi5jjaoeTv10jDHGJCtuIBCRMlVtF5FKYLf7L7yuUlWPxHu/qj4EPBS17IsRfyvwKfefMcaYLBgpR/BL4AqcMYYiK2nFfT3Pp3QZY4zJkLiBQFWvcP8/NzPJMcYYk2mJ9iN4JJFlxhhjxp+R6giKgEnANBGZwskmo2XATJ/TZowxJgNGqiP4MPBJnJv+Zk4GgnaccYSMMcaMcyPVEXwb+LaIfExV4/UiNsYYM04l2o/gOyJyJrAYKIpY/lO/EmaMMSYzEp2z+Cac8YAW4/QLuAz4C2CBwBhjxrlExxq6BngjsF9V3w8sAQp9S5UxxpiMSXSsoU5VHRCRPhEpAw4yATqTrW9oYd3GRvaFOplZUcyaVQtZvSx6pGxjjJnYEg0E9SJSAXwPp/XQMeAZ31KVAesbWrjx3m109jqDqraEOrnx3m0AFgyMMYGS6Axl/6yqIVX9Ls7Uk+91i4jGrXUbGweDQFhnbz/rNjZmKUXGGJMdI3UoOyfeOlV9Nv1Jyox9oc6klhtjzEQ1UtHQN+OsU+CSNKYlo2ZWFNPicdOfWVGchdQYY0z2jNSh7OJMJSTT1qxaOKSOAKA4P5c1qxZmMVXGGJN5iQ46N0lEPi8id7ivF4jIFf4mzV+rl9Vw69vPIi/HGTWjvCifW99+llUUG2MCJ9F+BD8CeoDXu6+bga/4kqIMWr2shupSpzvE286psSBgjAmkRAPBfFX9OtALoKqdjDx5/bjQ1tkLQNORE1lOiTHGZEeigaBHRIpxZykTkflAt2+pypDe/gGO9zh1BE1HLRAYY4Ip0Q5lNwG/B+pE5BfASuB9fiUqU8K5gaL8HJqOdKKqiEyIjI4xxiRsxByBOHfGHcDbcW7+dwLLVfVxX1OWAaETTiBYPKOMzt5+XjvWk+UUGWNM5o0YCFRVgfWqelhVH1TVB1T1tQykzXfhHMGZNeWAFQ8ZY4Ip0TqCp0TkPF9TkgVtnU4OYDAQWIWxMSaAEq0juBj4sIjsAY7jtBhSVT3bt5RlQDhHcMbMMgCaj9rwEsaY4Ek0EFzmayqyJFxHMKO8mGklBZYjMMYE0oiBQERygAdV9cwMpCejwjmCsqI8aqdMsjoCY0wgJVJZPABsFZFZye5cRC4VkUYR2Skia+Nsd42IqIgsT/YYo9HW2UtpYR55uTnUVU6i6YgVDRljgifRoqEZwAsi8gxOHQEAqnpVrDeISC5wO878Bc3AJhHZoKovRm1XCnwceDrJtI9a24leyorzAaibUszvtrXSP6Dk5lhfAmNMcCQaCL6Uwr5XADtVdReAiNwFXA28GLXdl4GvA59O4Rij0tbZS8UkNxBUTqJvQGlt66R2yqRMJ8UYY7Im0RnK/ojTqazU/bfdXRZPDdAU8brZXTZIRJYBdar6QLwdicj1IlIvIvWHDh1KJMkJCXX2Uj6YI3Bu/lY8ZIwJmkSHoX4nzhzFfwe8E3haRK4Z6W0eyzRinznAt4AbRjq+qt6hqstVdXlVVVUiSU5IW2QgqHQmpLEKY2NM0CRaNPQ54DxVPQggIlXA/wN+E+c9zUBdxOtaYF/E61LgTOBxd3yfU4ANInKVqtYnmK5RCZ04WTQ0s6KYHIFma0JqjAmYRHsW54SDgOtwAu/dBCwQkbkiUgBcC2wIr1TVNlWdpqpzVHUO8BSQsSCgqrR3nqwszs/NYUZ5MU3WqcwYEzCJ5gh+LyIbcQacA3gX8Lt4b1DVPhH5KLARyAV+qKoviMgtQL2qboj3fr919Q7Q0z9ARXHB4LK6ymL2Wo7AGBMwCQUCVV0jIm8HLsQp+79DVe9L4H0PAQ9FLftijG0vSiQt6RJyxxkK1xGAU2H8x5fSVxltjDHjQUKBQETmAg+p6r3u62IRmaOqu/1MnJ/CvYrDdQTgNCE92NFNV28/Rfm52UqaMcZkVKJ1BL8GBiJe97vLxq3wOENDcgRuyyEbfM4YEySJBoI8VR2ctcX9uyDO9mNeOEcQXTQE1oTUGBMsiVYWH3KbdW4AEJGrgXE9OU2bZ47ACQR+NiFd39DCuo2N7At1MrOimDWrFrJ6Wc3IbzTGGJ8kGgg+AvxCRG53XzcB7/EnSZkxmCOIqCOoKimkIC/Htyak6xtauPHebXT29gPQEurkxnu3AVgwMGYcmKgPcom2GnoFuEBESgBR1Q5/k+W/ts5ecnOE0sKTH0FOjlA7pdi3eQnWbWwcDAJhnb39rNvYOCEuJmMmson8IJdoq6Fy4Cbgb93XfwRuUdU2H9Pmq1BnD2VFebi9mgfV+Tgvwb6Qd04j1nJjTHZ4PflP5Ae5RCuLfwh04Iwz9E6gHfiRX4nKhLbOPiomDa/vrqss9m3guZkVxUktN8ZkXvjJvyXUieI8+X/2nudomcAPcokGgvmqepOq7nL/fQmY52fC/BY60TM4vESkuimTaOvspb2rN+3HXLNqIcVR/ROK83NZs2ph2o9ljEmN15N/d99AjK0nxoNcooGgU0QuDL8QkZXAuA6D7REjj0YKtxzyo55g9bIabrpy8ZBlX7rqjHGfrTRmIon3hD9RH+QSDQQfAW4Xkd0ishv4L+DDvqUqA0KdvVR4BIJZlf7OSzBrqrP/91wwe8hrY8zYEOsJv6aimFvffhanlBUBUFGcz61vP2tCPMglGgjaVXUJcDZwtqouw6kzGLfaYuUI3E5lzT5VGDfsDQHwob+Zhwg88+oRX45jjElNvCLc1ctq+PNnL0YE3vv6ORMiCEDigeAeAFVtV9V2d1m8uQjGtIEBHTJNZaTySfmUFuX51oS0Ye9R5lVNZtbUSSw6pcwCgTFjzOplNdz69rPIc+cuD+cEwjf9/NwcKicVcLCjO5vJTKu4zUdFZBFwBlDujj4aVgYU+ZkwP3V096GKZ44AnFyBH8NRqyrP7g1xyaJqAM6fW8mvNjXR2z9Afm6iMdkY47dLzzyFG369lY9dcio3vGV4HUBVaSGHOrqykDJ/jHT3WQhcAVQAV0b8Owf4kL9J80+7xzhDkeoq/ZmgZu+RExw53sOyWRUArJhbSWdvP8+3jNvuGMZMSK8cOkb/gHLa9FLP9dVlRcHJEajq/cD9IvI6VX0yQ2nyndfIo5HC8xKo6rAOZ6MRrh84Z9YUAM6bUwk49QTL3GXGmOx76YBTBbrolBiBoLSQl/ZnrprU76EtEh1r6HoRGZYDUNUPpC0lGeQ18mikuspJdPUOcOhYN9Wl6SsBe3bvUSYX5A4+ZVSVFjKvajLPvHqED79hftqOY4wZnR37OyjIzWHOtMme66tLC3ntWDcDA0pOTvoeFr1kYmiLRAumHwAedP89glNHcCwtKciC8OxkXj2L4eS8BOluQtqwN8SSugpyIy6c8+dW8szuI/QPaFqPZYxJXeP+DuZVTY5Zd1ddWkjfgHL0RI/n+nSKN7RFuiQUCFT1noh/v8AZZuLMtKUiw0bMEfjQhLSzp5/tre2D9QNhK+ZW0tHVR2MGs5nGmPhe2t8Rs1gInDoCICP1BJkYoyzVpioLgFlpS0WGhesIvJqPwsmy/E/ctYWVtz3K+oaWUR9zW0sbfQM6WD8QtmLuVACeefXwqI9hjBm9ts5e9rV1cVq8QFBaCGQmEGRijLKEAoGIdIhIu/uvDfgt8Jm0pSLD2jt7KcjL8ZyXeH1DCzdteGHwdbg8brTB4Nm9RwFYWjc0R1BTUUxNRTHP7Lb+BMaMBS+PUFEMDNYdHmz3vwnpmlULyY1qtJLuoS0SnY+gVEQqcXIC4drTcVuo3RZjeAnwb86Ahr1HmTN1ElNLCoetO39uJX96Of2tlFI1USffMCYRO9xi2lhNRwGqyzKXI1i9rIYv/fYFOnv76e4dyF6rIRH5J+ATQC2wBbgAeBK4JG0pyaDQCe/hJcCf8rhwR7ILT53muX7F3ErubWhh12vHmV9VkvJxUhF90794URX3bG6ZkJNvGJOIxv0dlBTmUROn6KUoP5fSojwOZSAQ7G/r4uiJXr5wxWI+eOFcX46RaB3BJ4DzgD2qejGwDDjkS4oyINY4Q+BPeVxLqJNDHd2cE1VRHLZi7sn+BJnkNe76z5/a63sLBWPGssYDHZw2vWTE3Hl1aSEHM9C7uH6Pc19YPtu/vkaJBoIuVe0CEJFCVd2B0+t4XArFGGcI/Jkz4Fm38jlWp7G50yYzraTQ10CwvqGFlbc9yty1D7Lytke5Z3MzX3nwxWE3/VhaQp3D9pGOSnRjxhJVpXF/BwtPKRtx26rSQg62+58jqN99lOL8XBbPHDlNqUo0EDSLSAWwHnhYRO4H9o30JhG5VEQaRWSniKz1WP8pEXlRRJ4TkUdEZHZyyU9Ne2ev56Q0cHLAqchs4drLFo26fqAoPydm5ZOIOP0JfAoEXk/+N/x6K68dS64N9Kfu3jJkH+moRDdmLDnY0U1bZ2/ciuKw6tLMDDOxec9RltSV+zoeWaL9CN6mqiFVvRn4AvADYHW894hILnA7cBmwGLhORBZHbdYALFfVs3FGM/16cslPTehEDxXF3p3JwAkGT6y9hEdveAMAPXFmJ0rEs3tDnF1bQV6cL3LF3EpaQp2+DH/tVQEOsb/86AxxUV4Oxfk5RPd5syIjM9EkUlEcFi4aUvWv3cyJnj5ebG1n+exK344BKfQjUNU/quoGVR3pcXIFsNOd2rIHuAu4Ompfj6lq+M73FE5ltK/6+pXjPf0x6wgizasqYUltOeu3pP7U29Xbz4v72ob1H4h2vLsPgAu/9ljai11iVXQP4D3j0rsvmEVNRTGC07z1tnecTVevdzCcCPO1GhMWHj9oYSI5grJCunoH6HB/u37Y0hSif0A5d46/Y5ElOtZQKmqApojXzcD5cbb/IPA7rxUicj1wPcCsWaPrxxbuVRyrjiDa1UtruOWBF3n5QAcLEnhKiPbCvjZ6+3VYj+JI6xta+M9HXh58ne6WOjMrij0n3q5xm6El0lR03cZGz31MhPlajQnbsb+DqtJCKifHLjEIO9mXoJuyosTuJ8navNvpf3ROnb+BwM9B8L2q3D3zUCLyD8ByYJ3XelW9Q1WXq+ryqqqqUSVqpOElol25ZCa5OZJyrqBhsKI4diBYt7GRrqjip3QWu6xZtZDocbEiZ1x6Yu0lvHrb5Tyx9pKYgcePSnRjxprGA+0J1Q9AZO9i/1oO1e85ymnTSyhP8ME1VX4GgmagLuJ1LR4VzCLyJuBzwFWq6nvNS7KBoKq0kJWnTmN9wz4GkhwYbn1DC9/4g3Mzf9vtf41Z3OP3WCKXnnkKIkJJYd5gcU+yc61GV6Ln58qEma/VGID+AeXlA8cSqh+Ak53K/OpLMDCgPLv3KP17Vg4AABr9SURBVOf6XD8A/gaCTcACEZkrIgXAtcCGyA1EZBnwvzhB4KCPaRnUFp6LIIkIu3rpTFpCnWx2h4lIRLilTrhsPV4rG7/HEtnW0kb/gPLNdy4Z8ck/nnDu4cNvmIcgXHbWKWlJnzFjwZ7Dx+nuG0iofgCgyi0a8isQvHSwg46uPl/7D4T5FghUtQ/4KLAR2A7craoviMgtInKVu9k6oAT4tYhsEZENMXaXNsnmCABWnXEKxfm5SVXgfu13OxLumOV3scum3entkLK0toKe/gF2tNqIqWbiCE9GszDBHEFZUR6FeTm+NSGtd+sHlvtcUQz+Vhajqg8BD0Ut+2LE32/y8/heBuciSCIQTC7M482Lp/PgtlZuuvIMCvKGxs/IYRpOKS/inFlTaI0xGJVXcU/46TxcISvAl68+I23FLptePcL8qsme4xyl4mx34Lytzc78CsZMBDv2dyCSWNNRcPr/VJcV+jbw3OY9R5lWUsisykm+7D9S4GZMD+cIYnUoi+Vty2oInejljy8NHVkjurNWa1sXD25rJT/GrEWxinvCxS7f+8flaJztkjUwoNTvOTo4jEU6zCwvYlpJIVuaQmnbpzHZ1ri/g9mVkyguGD4qcSx+diqr33OE5bOnZGQgSl9zBGNR6EQvJYV5SffSu3DBNCYX5vLxOxvo6u0fbGp5m0cREDi5iO6+gSHrEinuef38qRTk5vBY40FeH2OQumScLGdMXyAQEZbWlbPVAoGZQJwxhpJrIl5dWsjLB9M/WePB9i6ajnTy3tfNSfu+vQQyR5BM/UDYg8+10tXr3Ngjh2nYHyNb2NbZO9jKJpmWOpML8zh/XiWPNaZnTL9N7rAV581Jb8uDJbUVvHLoOO1dvWndrzHZ0NXbz+7XjifcdDSsutSfoqHNe5z6gXMzUFEMAcwRxBtnKJ51GxuHzSvcP6AI3p0jZlYUs3pZTUrl/BctrObLD7xI05ET1I2yfHDT7qNMLyscnIc5XcJ1A9ua21iZhpyLMdm08+AxBpS4s5J5qSotpL2rj67efs+JrlJVv+cohXk5nDGzPG37jCdwOYJQnElp4onVpl/xHqZhNC1+LllUDcDjjaNvUVu/+wjL51SmvZzx7FrnAt3abMVDZvwLzxmefI7Anyak9XuOsqS2YljDFL8ELhCkWjQUq/I2XOSTbBFQPHOnTWbO1Ek8umN0gaD56An2tXVxng/Zy4pJBcydNtnqCcyE8NKBDgpyc5g9dXJS76sqS3/v4s6efl5oafN9fKFIgSwaSnScoUhrVi3kxnu3eVb+ploEFM9FC6u585m9o8pyhtshn5fGFkORltSW89Qum2vZjG/rG1r48V9309M/wEXrHk9qGsjBYSbSOC/B1uYQfQOakY5kYYHLEQxocp3JwiKHWEjXk388Fy+qprtvgCd3HU55H5t2H6GkMI9FCUyykYqzayvY397F/jb/Z2kyxg/h5t/dfSOPAOBlcOC5NBUNrW9o4fqf1gPw+fuez9h8H4HLEUByw0tE8uPJP5bz51ZSlJ/D4zsOcvHC6pT2sWn3Ec6ZPYXcGH0aRmtJRMeyU8ptuAkz/njN1REeASCR3/rUyQXk5khaiobCQSmcntb2rozNFx64HAGkliPItKL8XFbOn8ZjjYdSmvgidKKHlw4cY4WP5YxnzCwjL0esnsCMW6Md8DEnR5hWUpCWyuJ4QclvFgjGsIsWVbP3yAl2vXY86feG2yEvT3P/gUhF+bksmlFqLYfMuJWOAR/T1bvY71GI4wlkIIg3TeVYctFpztwLj6XQeuiZ3UfIzxWW+jwW0JLaCp5rbkt6iG5jxoI1qxYOKzpNtvl3dZomsfd7FOJ4AhkIxkuOoK5yEguqS3g8hV7G9buPclZNeVo7uXhZUldBR1cfrx5OPtdiTLatXlZD7ZRiCnJzUm4EUl1WmJYcwZpVC8kbZVBKVSADQSrNR7Pl4kXVPP3q4cE5jRPR1dvPc82htA8r4SWc47B6AjMeDQwor3V0c92KupTn6qgqLeLw8W76+r3n9U7U6mU1LJ7h1LtlomVipEC2GkpliIlsyc8RevuVM27aODjHcLwLY31DC1958EV6+5Vfb27m9Bllvl5I86tKmFSQy9amEG8/p9a34xjjh+ajnRzv6WfRjNSbWFeXFqIKh4/3ML2saFTpCXX2suqMU7j93eeMaj/JClwgyBEoLRwfp72+oYUf/OXVwdcjTWof3fzsyPEe35uf5eYIZ9WUs6W5zZf9GxM538fMBB6GkrFjfztAwrOSeamK6FQ2mkDQ0dXL3iMneOfyzD9QBa5oqKw4nxyf2tWnW7KT2mer+dnSugq272unu2/4cNzGjEb0fB/JdvgayY79yc1K5iVdk9iHxzs6fRS5k1QFLhCMl4piSL45Wbaany2ps6krjT/8frjZsb+d2VMnMXkUpQTVZenpXby91cmdZCMQjI8ykjRKZeTRbJlZUUyLx008XjOzZLZPlwPuEBNX3/5EQvUYxnjxKgLyup4hfQ83O/Z3jCo3AFBVkp7xhl5s7aC8OJ8Z5aOrZ0hF4HIE46miONlJ7desWkh+bmabn61vaOFrv98x+DrdWXcTDF5FQJ+6e0vM7dPxcNPZ405GM8on8IK8HKZMyh910dCLre2cPqM0I1NTRgtcIKiYND46k8HQge4ACvNy4jYnW72shvPmVBK+jDLR/CzZegxjvHgVAQ0oFOXlUBQ1Jn+6Hm5ePtjBgMLpo6goDhtt7+L+AaVxf3tWioUggEVD5cXj65TDA939633b+O3WfVy1ZGbc7UMnell56jR+/k/nZyR92ewWbyaOWNdLd98A33rXUtZtbKQl1El+rqTt4WawojgdgWCUncp2Hz5OV+9A1gJB8HIE42R4iWhLa0fuwXuip48d+9tZNsvfYSUiZbNbvJk44l1Hq5fV8MTaS/jIG+YDcOmZ6RnpdkdrB0X5yU9G46WqtJDXRhEIwhXFiy0QZMZ4ajUUaUkCPXi3NbcxoPg+vlCkZOsxjPGSyHW0fPYUevs1bb3Yd+xvZ+H00rQM015dWsShju6URgoGJxDk5ginVpeMOi2psEAwTpxaXcJktwdvLFvcdZkMBNH1GHk56cu6m+BYvayGz19++uBrr/qtc90ZuzbvPTrq46mq02IoDcVC4PQl6OkfIHSiN6X3b2/tYH7VZN/HBotlfBWYp0Gqk9JkW26OcFZt/B68DXtDzKqcxFS3OVumhOsxvv/nXXzlwe28bv7UjB7fTAy1lZMA+OU/nc/rT502bP2UyQXMr5rM5t2jDwSHjnVz5HhP2mbvqx6cu7ibKZOTL37e3trOCp+mlE2ErzkCEblURBpFZKeIrPVYXygiv3LXPy0ic/xIx/lffZjPr38egA//bDPnf/VhPw7juyUj9ODd0hTKaG4g2gXznADw5CupT69pgmvL3hAicFZtecxtzp09hc17j4562PNw58dFM9KVIwh3Kku+CWnoRA+tbV1ZqygGHwOBiOQCtwOXAYuB60RkcdRmHwSOquqpwLeAr6U7Hed/9WEOdPQMWXago2dcBoOltbF78La2dbK/vSujFcXRTp9RRllRngUCk5KtzSFOrSqhtCh2rn357EpCJ3rZ9dqxUR0rPJxDunIEVaOYxP7FLPYoDvMzR7AC2Kmqu1S1B7gLuDpqm6uBn7h//wZ4o6S5N0V0EBhp+VgWOUdwtC17M18/EC03Rzh/3lSe3GWBwCRH1akEHun6PdedejU8A1+qtu9vp7q0kMoUinG8nBxvKPlAsL01PMZQenInqfAzENQATRGvm91lntuoah/QBgwrYBaR60WkXkTqDx1KfpKWiWJGeRFVpYWDlcKRtjSFKMjNYfHM7D1VALxu3lT2HjkRc2gAY7w0H+3k8PGewYedWOZNm8yUSfnUj7KeYEdrx6h7FEeaXJjH5ILclIqGtre2M62kYLB4KRv8DAReT/bRBXuJbIOq3qGqy1V1eVVVVVoSNx6JCEtqKzxbDjXsDbF4ZhmFedlpdRAWrih+yoqHTBISbfEmIk49wShyBH39A+w8eIxFaWoxFFZdllrv4u2t2etRHOZnIGgG6iJe1wL7Ym0jInlAOXAknYmYXuqd9Yu1fKxbWlfOK4eO0951splaX/8Az7WEslo/ELZweilTJuVb8ZBJytamEIV5OQk15zx3diW7XjvO4WOpdeB69bXj9PQPpDUQrG9ooeVoJw8+18rK2x5NeKyt3v4BXj5wbEIHgk3AAhGZKyIFwLXAhqhtNgDvdf++BnhUU+2REcPTn3vzsJv+9NICnv7cm9N5mIwJZ523RTQj3bG/g67egazWD4Tl5AgXzJtqFcZjzPqGFlbe9ihz1z6Y1I0qU7Y0hTizppz83JFvScvdeoJn96bWsWx7miuKwwPm9bhTVSYz8OKuQ05Qymb9APjYj0BV+0Tko8BGIBf4oaq+ICK3APWqugH4AfAzEdmJkxO41o+0jNebvpeza5yb/ZamECvdttbhbPU5s6ZkLV2RLpg3ld89v5+mIyeoc9uGm+yJnrkucqY7wLfZvxLV2z/A8/va+PsVsxPa/qyacvJzhfo9R3jz4ulJH69xv9OLd3716IeWgPhzJoz0WWZzDoJIvnYoU9WHgIeiln0x4u8u4O/8TMNEUz4pn3nTJg+pJ9jSFGLq5AJqp4yN8X3C9QRPvnLYAsEYEOtGdeO92+gf0GFPsuDf1KZeXjrg5mgTLNosys/lzJrylDuW7XB78aarPm00Ay9ub22nIDeH+VXZGVoiLHBDTEwES+oqhjQhbdh7lKV1FVkZx9zLguoSppUU8JTVE4wJsW5Inb39g0EgclmmhxAfrCiuTbxoc/nsKTzX0pbS9Kg79nekrVgIYg+YV1o08nP2i63tnFpdklCRmJ8sEIxDS2rLOdDezf62Lto6e3nl0PExUVEcJnKyP0Gaq3xMCpKd8SrTQ4hvbQpRObmAusrEc7Tnzq6kp2+A51vakzpWe1cvLaHOtI0xBN4D5uWK0N7Vxwd+vInX3/pIzLqZ7a0dWS8WAgsE41K4wnhLU2iwiGhp3dioHwh73byptLZ1sefwiWwnJfC8RrQszs9lSoxxtzI9hPiWphBLasuTytEODkC3J7lGhicniE9fIIgceFFwBsxbd83ZrJw/lUd3HGRfW9fgrGuRlciHOrp57Vh31iuKIYCDzk0Ep88oIz9X2Nocojg/FxE4uy72+CzZMFhPsOswc6alp1JurPKaa3f1spqYy9O1/0TcXd/En15+jTecVsXOg8eG7AMYUokMTseeT75pQdJpTNWx7j5ePniMt541I6n3VZUWMnvqJOp3H+X6v038fTvS3GIoLDzwYqRv/GF4EVtkJXK25yCIZIFgHCrKz+X0GWWDba9PrSqhLM74LNkwb9pkqkoLefKVw1y3Yla2k+ObWC1y6vcc4Z7NLZ4tdZIJBvFa/MTaTzhwhHt3nza9hB+8dzl5Mcqhw0GmcnIBh4/30Hw0c0VD25rbUGXEHsVezp09hT82HkJVh+Qm4gXm2x7aDsA1//NXPnPpIl8rxVvbvHsZt4Q6ue/ZZm7a8AIAn7p7K2sv8zctI7FAME4tqa3gvoYW8nMlpSZ0fhMRXhdRTzBWKrLTLVaLnJ8/tXfYtiM1KfS6gX3t9ztiNk0MH3+kp/y9h0/wwHOtnseNfpL9xF0N/M/jr3D10pnMy0BLllQqisOWz67k3mdb2HP4xGCuM15g/k198+D82vvaunxvITWzojjmUCuf+vVWwtVn+9v9T8tIrI5gnOofUI5193H0RC9/eOHAmOsgBE459KGObube+NCQirKx3rkpGclWrMbaPnwDawl1DpYn33D31rhPlWvveW7I9mvveY4v3v/8sMDR1TeQcEugz11+OoX5OXzh/uczUtG/tSnE7KmTUhrDv+2EM3DkRd94fPA6+nqMwPnzp/YOBoHI5X62kPKqRC7Ky2FSfg7RH202WmtFshzBOLS+oYV7nm0efB3q7M36E0W09Q0trN9y8gYfvlE9/eph7nu2ZfBHmUxRRzY7PcUS66kvV4R+jxvptBiTBnnlLPpVETwG33JF39i6+gaGLQtLNGBVlxbxmUsX8YX1z3POlx8mdKLX1898a3OI8+YkPyHL+oYWvv3Iy4OvW0KdfOruLSQ7TYGfLaTCn1f0tft/f7Ul42kZiQWCcWjdxka6YzzdjJUbpFcau/oGuPOZpmHbxkt7KmXkyRhtkLn87Bnc8addQ5YV5+fyjnNrhtQRgFMRe7ynjxf2tXHGzKGV+7GKENTdX+R+ivJyYt7wY0mmJdBktwHCUXfaxdF85vE+3wPtXbS2daU0NMq6jY3DPoMBJWbgjBWY/W4h5VWJHFl/k8m0xGOBYBwaTU/GTElXkUmsMvibN7ww6pY6ox16YefBDu58ei81FcUMqLK/rWvItstnVw7ZxwdWzuGHT+zmnd99ksmFeRzq6GZ6WREzK2K3869x9xedllg3k4rifLr7BoZ8ZtGTwI/kmw+/FLPoIplcGxA3iIfrB1KpKI51vXgFzliBOdnPJV3WrFo4rB4nW2kJs0AwDsUqjsjmE0W0ZItMpnqUEbd19sZ8Ug519hLqHPrEmmxLnVjlyV+8/3l6+zVugGgJdZKbIxTn53L3R15Hjcdn7/U0qMBXH9zO8R5n3/vbu9jf3sVZNWW8fODYkKfc8M3Baz8wvFK4OD+Xm686YzCNqeZykn3Q8Aqon/nNc+TmQGdv7Jzr1qYQeTnCGSnMoRHr+ooVOL0Cc7aKGGMVGWUzNy/jrefn8uXLtb6+PtvJyKroHx44N4Fb337WmCkaipXGWEUmInDNubU8sfMwLaFOKorz6XMrxEcr+uYwo7yIvz2tirs2DS+misfrabsgN4evX3N2wp/7ytseTfoGFotfdSex0jhtcgH1Xxg+gOMF//YI+9uTm5DlP961lM/e8xzdfQOD5z6aZrUw9n4DY42IbFbV5Z7rLBCMT2O5AjUs0Y5WH734VH761O7BKfvCcgRWnXkKj+84NOzJPVl5OUJfVE1ibo7QP8pJ0MG5iT+x9pKEtp279kHPMmwBXr3t8lGnJR28brLi/mfV4lN4rjlEa1sX08uKWDyzjEd3HExq/4Lz2Ud+H6ncxMfDb2AssUBgxrzX3/oI+zyaSno9KZ/o6RusyIwUq9gplvKiPHoiioDAuSEV5ed47j+WZG7i8XIEiQaTTIi+yX78klP5zbPNbPIY8bMgV+jpH/65x8pBDagOC8ow9j6DiSZeILA6AjMmxGovvy/UOayMPJlip+iKw0jtXX18611LE+qUFS9AJFM3MxYrCr141Uv856M7PbedVJBHrkcFdaz6irHYfDLoLBCYMSGZCvB4lW1eFYLxmuvFqoj12j94B4hkbuJjsaIwUbFu1G2dvZ4BNXxO46H5ZNBZIDBjQrJPyrFu4Mm0sIl3A08mQCR7E4+377EsXrBO5pzGS64oSCwQmDHBzyfldO57vN7E0yFdN/DxnCuaqKyy2BiTMGupM35ZZbExJi2CnCOayGz0UWOMCTgLBMYYE3AWCIwxJuAsEBhjTMBZIDDGmICzQGCMMQFngcAYYwJu3HUoE5FDwJ4U3z4NeC2NyRnLgnKuQTlPCM65BuU8IbPnOltVq7xWjLtAMBoiUh+rZ91EE5RzDcp5QnDONSjnCWPnXK1oyBhjAs4CgTHGBFzQAsEd2U5ABgXlXINynhCccw3KecIYOddA1REYY4wZLmg5AmOMMVEsEBhjTMAFJhCIyKUi0igiO0VkbbbTk04i8kMROSgiz0csqxSRh0XkZff/U7KZxnQQkToReUxEtovICyLyCXf5hDpXESkSkWdEZKt7nl9yl88Vkafd8/yViBRkO63pIiK5ItIgIg+4ryfcuYrIbhHZJiJbRKTeXTYmrt1ABAIRyQVuBy4DFgPXicji7KYqrX4MXBq1bC3wiKouAB5xX493fcANqno6cAHwL+73ONHOtRu4RFWXAEuBS0XkAuBrwLfc8zwKfDCLaUy3TwDbI15P1HO9WFWXRvQdGBPXbiACAbAC2Kmqu1S1B7gLuDrLaUobVf0TcCRq8dXAT9y/fwKszmiifKCqrar6rPt3B86No4YJdq7qOOa+zHf/KXAJ8Bt3+bg/zzARqQUuB77vvhYm6Ll6GBPXblACQQ3QFPG62V02kU1X1VZwbqBAdZbTk1YiMgdYBjzNBDxXt6hkC3AQeBh4BQipap+7yUS6hv8D+Aww4L6eysQ8VwX+ICKbReR6d9mYuHaDMmexeCyzdrPjlIiUAPcAn1TVducBcmJR1X5gqYhUAPcBp3ttltlUpZ+IXAEcVNXNInJReLHHpuP+XIGVqrpPRKqBh0VkR7YTFBaUHEEzUBfxuhbYl6W0ZMoBEZkB4P7/YJbTkxYiko8TBH6hqve6iyfkuQKoagh4HKdOpEJEwg9vE+UaXglcJSK7cYpsL8HJIUy4c1XVfe7/D+IE9xWMkWs3KIFgE7DAbYlQAFwLbMhymvy2AXiv+/d7gfuzmJa0cMuOfwBsV9V/j1g1oc5VRKrcnAAiUgy8Cac+5DHgGnezcX+eAKp6o6rWquocnN/lo6r6bibYuYrIZBEpDf8NvAV4njFy7QamZ7GIvBXnSSMX+KGqfjXLSUobEbkTuAhnSNsDwE3AeuBuYBawF/g7VY2uUB5XRORC4M/ANk6WJ/8rTj3BhDlXETkbp+IwF+dh7W5VvUVE5uE8NVcCDcA/qGp39lKaXm7R0KdV9YqJdq7u+dznvswDfqmqXxWRqYyBazcwgcAYY4y3oBQNGWOMicECgTHGBJwFAmOMCTgLBMYYE3AWCIwxJuAsEBiTJBE5NvJWxowfFgiMMSbgLBAYkyIRKRGRR0TkWXec+asj1n1BRHa4Y8zfKSKfzmZajYknKIPOGeOHLuBt7sB304CnRGQDcC7wDpzRUfOAZ4HN2UumMfFZIDAmdQL8m4j8Lc6QFzXAdOBC4H5V7QQQkd9mL4nGjMwCgTGpezdQBZyrqr3uCJpFeA+jbMyYZXUExqSuHGcs/V4RuRiY7S7/C3ClO/dwCc7sW8aMWZYjMCZ1vwB+605EvgXYAaCqm9y6gq3AHqAeaMtaKo0ZgY0+aowPRKREVY+JyCTgT8D14fmWjRlrLEdgjD/uEJHFOHUGP7EgYMYyyxEYY0zAWWWxMcYEnAUCY4wJOAsExhgTcBYIjDEm4CwQGGNMwP1/R5QytEDtrGcAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sample_store = 2\n", + "brand_list = sales[\"brand\"].unique()\n", + "l_range = list(range(1, 53))\n", + "\n", + "for j in range(len(brand_list)):\n", + " brand = brand_list[j]\n", + " d = sales.loc[(sales[\"store\"] == sample_store) & (sales[\"brand\"] == brand)].copy()\n", + " cor = []\n", + " for l in l_range:\n", + " cor.append(single_autocorr(d[\"logmove\"].values, l))\n", + " l_range.insert(0, 0)\n", + " cor.insert(0, 1)\n", + " plt.scatter(list(l_range), cor)\n", + " plt.plot(list(l_range), cor)\n", + " plt.title(\"time series for autocorrelation for store {} brand {}\".format(sample_store, brand))\n", + " plt.xlabel(\"lag\")\n", + " plt.ylabel(\"autocorrelation\")\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Impact of promotional information: deal and feat\n", + "\n", + "We find that deal column has a very significant impact on sales. The impact of feat column also looks strong although the pattern shown in the scatter plot is a bit noisy." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'logmove')" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEVCAYAAAAVeRmFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAX70lEQVR4nO3dfbRcdX3v8fc3DyThoWCah1IxxDaK0HRZa0QaLt4TQIWigIoIwYqABkRi12VJwGILZZlbo3e1WivGIBRUPChQvAEMAiWn4K1Ag1pFsFeoPCeGBOFKkJCH7/1jdtLJ4eyTmSQze+bM+7XWrLOfZu/vmeycz/x++ykyE0mShjKq6gIkSZ3LkJAklTIkJEmlDAlJUilDQpJUypCQJJUyJNRxIuKRiDiy6jpaISL6IuKJFq37gxHxvV2wnukRkRExZlfUpe5mSEiSShkSkqRShoQ6WkSMi4jPRcRTxetzETGubv6CiFhZzPtQ0U0yo5h3ZURcGhHLIuL5iPg/EfE7xTp+FRE/i4g31K3rwIgYiIhnI+KnEXFsMf2QiFgVEaPrln1XRPy4GB4VERdExMMRsTYivhURE7fze/1FRKwputZOKaa9KSJ+Wd/NExHviYgflazjtyNiaUT8v4i4F/j9QfNfFxG3RcQzEfEfEXFi3bxjIuKHxXsfj4iLG/n3UO8xJNTpLgQOAf4IeD1wMPBJgIg4CjgXOBKYAfz3Id5/YrH8JGA98H3gB8X4dcDfFusaC9wI3ApMAeYDV0fEAZl5N7AOOLxuvXOBbxTDHwOOL7b/u8CvgC8O8zv9TrH9VwKnAkuK7fwbsBZ4a92y7we+VrKeLwIvAvsCpxcvit9nD+C2osYpwMnApRHxB8Ui64APAPsAxwAfiYjjh6lZvSozffnqqBfwCHBkMfww8Kd1894OPFIMXwH8Td28GUACM4rxK4HL6ubPBx6sG/9D4Nli+DBgFTCqbn4/cHEx/CngimJ4L2p/ZPcvxh8Ejqh7377ABmDMEL9bH7AR2KNu2reAvyyGzweuLoYnAi8A+w6xntHFNl5XN+1/At8rht8H3DXoPV8GLir5zD8H/F0xPL34HF9Wv6/ee3n2gjrd7wKP1o0/WkzbMm9F3bzHh3j/L+uGfzPE+J5163o8MzcP2tYri+FvAP8aER8B3g38IDO31LU/cENE1L93EzAVeHKImn6VmetKfqevAw9GxJ7UWkF3ZebKIdYxGRjDtr9z/ee0P/DmiHi2btoYilZJRLwZ+DQwE9gNGAdcO8R21OPsblKne4raH7wtphXTAFYC+9XNe9VObudVEVH/f2IaxR/5zHyA2h/ho9m2qwlqf6iPzsx96l7jM3OogAB4RdEdVL+dp4rtPEmtS+xdwJ9R3tX0NLUWSf3vPG1QTf8yqKY9M/MjxfxvAEuBV2Xm3sBiIEq2pR5mSKjT9QOfjIjJETEJ+Ctq37ah1k1zWnHAefdi3o66h1oX0oKIGBsRfcA7gWvqlvkGteMPb2Hbb92LgYURsT9AUetx29neX0fEbhFxGPCOQev7KrCAWnfYDUO9OTM3Af8EXBwRu0fEQdSOb2xxE/DaiPiz4vcZWxwYP7CYvxfwTGa+GBEHUws+6WUMCXW6T1HrUvox8BNqB50/BZCZy4C/B5YDD1H7Bg61A9RNycyXgGOptRTWAJcCH8jMn9Ut1k/tmMIdmbmmbvrnqX0rvzUifg3cDbx5mM2tonZw+yngauCsQdu5gaILa1C31GDnUOsuW0Xt+Ms/1v0+vwbeBpxUbGcVsIhatxLA2cAlRb1/RS1wpZeJTB86pJGh+JZ8PzAuMzdWXc/OiIiHgTMz8/aqa1FvsyWhrlZcr7BbRLyC2jflG0dAQLyH2tlFd1Rdi2RIqNudSe0g7sPUzij6yPCLd7aIGAC+BHx00JlWUiXsbpIklbIlIUkqZUhIkkp1xRXXkyZNyunTp1ddxoizbt069thjj+0vKHUI99nWue+++9Zk5uTB07siJKZPn86KFSu2v6CaMjAwQF9fX9VlSA1zn22diHh0qOl2N0mSShkSkqRShoQkqZQhIUkqZUhIkkoZEpI6Xn9/PzNnzuSII45g5syZ9Pf3V11Sz+iKU2Al9a7+/n4uvPBCLr/8cjZt2sTo0aM544wzADj55JMrrm7kMyQkdbSFCxcyd+5c5s+fz4MPPsiBBx7I3LlzWbhwoSHRBoaEpI72wAMPsG7dOq644oqtLYnTTz+dRx8d8tov7WKGhKSOtttuu3HooYdu05I49NBDWblyZdWl9QRDQlJHW79+Pf39/UyePJnMZM2aNfT397N5s4/baAfPbpLU0caMGcOECROYMGECEbF1eMwYv+O2g5+ypI62ceNGJk2atM0xiblz57Ju3bqqS+sJhoSkjnfwwQdz9NFHs379esaNG8fb3/52li5dWnVZPcGQkNTRJk6cyI033sioUbXe8Y0bN3LjjTcyceLEiivrDYaEpI62fv16MpNNmzYBbP25fv36KsvqGR64ltTRyo49eEyiPQwJSVIpQ0JSV4iIbX6qPQwJSV3BkKiGISGpK2y5wtorrdvLkJAklTIkJEmlDAlJUilDQpJUypCQJJUyJCRJpQwJSVIpQ6IHzZ8/n/HjxzNnzhzGjx/P/Pnzqy5JUofyLrA9Zv78+SxevJhFixZx0EEH8cADD3D++ecD8IUvfKHi6iR1GlsSPeayyy5j0aJFnHvuuYwfP55zzz2XRYsWcdlll1VdmqQOZEj0mPXr13PWWWdtM+2ss87y3vyShmRI9Jhx48axePHibaYtXryYcePGVVSRpE7mMYke8+EPf5jzzjuPz372s6xevZopU6awevVqzj777KpLk9SBbEn0mNmzZ7Pnnnuydu1aNm/ezNq1a9lzzz2ZPXt21aVJ6kAtC4mIuCIiVkfE/XXTPhsRP4uIH0fEDRGxT6u2r6EtXLiQww8/fOtD5UeNGsXhhx/OwoULK65MUieKzGzNiiPeAjwPfDUzZxbT3gbckZkbI2IRQGaev711zZo1K1esWNGSOnvNqFGjGDVqFJ/5zGe2ngK7YMECNm/e7H361ZGGe8hQq/5+9aKIuC8zZw2e3rKWRGbeCTwzaNqtmbmxGL0b2K9V21e5efPmbXMK7Lx586ouSVKHqvLA9enANyvcfk/KTJYtW8by5cvZtGkTy5cvZ9myZX4jU0dp9BGlg5dzP971KgmJiLgQ2AhcPcwy84B5AFOnTmVgYKA9xY1wY8eOZcaMGZx++uk89thjTJs2jRkzZvDkk0/6GatjLF++fOvwnDlzGloOcB9ugbaHREScCrwDOCKHif3MXAIsgdoxib6+vvYUOMKdeeaZXHrppUyZMgWAF198kTvuuIOzzz4bP2N1G/fZ1mvrKbARcRRwPnBsZr7Qzm2rZvbs2YwePZpVq1axefNmVq1axejRoz0FVh2r7LukXUvt0cpTYPuB7wMHRMQTEXEG8A/AXsBtEfGjiFg87Eq0y51zzjls2LBhm2kbNmzgnHPOqagiafsyk8xk//Nv2jqs9mhZd1NmnjzE5MtbtT015plnaiecjRo1is2bN2/9uWW6JNXziuseNXny5G1+StJQDIketWDBApYtW8aCBQuqLkVSB/MGfz1qwYIFbNq0idGjR1ddiqQOZkuiR23atGmbn5I0FEOix5RdydroFa6Seosh0WM851xSMwwJSVIpQ0KSVMqQkCSVMiQkSaUMCUlSKUNCklTKkJAklTIkJEmlDAlJUilDQpJUypCQJJUyJCRJpQwJSVIpQ0KSVMqQkCSVMiQkSaUMCUlSKUNCklTKkJAklTIkJEmlDAlJUqkxVReg1ouIHVouM1tRjqQuYkj0gPo/9sMFhqEgaTC7myRJpQyJHlPWWrAVIWkohkQPykwyk/3Pv2nrsCQNxZCQJJVqWUhExBURsToi7q+bNjEibouInxc/X9Gq7UuSdl4rWxJXAkcNmnYB8M+Z+Rrgn4txSVKHallIZOadwDODJh8HXFUMXwUc36rtS5J2XruPSUzNzJUAxc8pbd6+JKkJHXsxXUTMA+YBTJ06lYGBgWoLGqH8XNVt3Gfbq90h8cuI2DczV0bEvsDqsgUzcwmwBGDWrFnZ19fXphJ7yC034+eqruI+23bt7m5aCpxaDJ8K/O82b1+S1IRWngLbD3wfOCAinoiIM4BPA2+NiJ8Dby3GJUkdqmXdTZl5csmsI1q1TUnSruUV15KkUg2HRETsHxFHFsMTImKv1pUlSeoEDYVERHwYuA74cjFpP+DbrSpKktQZGj0m8VHgYOAegMz8eUR4IZykHfb6v76V536zoen3Tb/g5qaW33vCWP79orc1vR3VNBoS6zPzpS1PNYuIMYD3l5a0w577zQYe+fQxTb1nYGCg6eskmg0VbavRYxL/EhF/AUyIiLcC1wI3tq4sSVInaDQkLgCeBn4CnAl8B/hkq4qSJHWGRrubjgO+mpmXtbIYSVJnabQlcSzwfyPiaxFxTHFMQpI0wjUUEpl5GjCD2rGIucDDEfGVVhYmSapewy2CzNwQEcuondU0gVoX1IdaVZgkqXqNXkx3VERcCTwEnAB8Bdi3hXVJkjpAoy2JDwLXAGdm5vrWlSNJ6iQNhURmnhQRU6nd5hvg3swsfWCQJGlkaLS76b3AvcB7gROBeyLihFYWJkmqXqPdTZ8E3rSl9RARk4Hbqd30T5I0QjV6ncSoQd1La5t4rySpSzXakrglIr4L9Bfj7wOWtaYkSVKnaPTA9XkR8R7gUCCAJZl5Q0srkyRVrpmL6a6PiNu2vCciJmbmMy2rTJJUuYZCIiLOBC4BfgNsptaaSOD3WleaJKlqjbYkPg78QWauaWUxknrHXgdewB9edUHzb7yq2e0ANPdwI/2XRkPiYeCFVhaineOjINVtfv3gp30yXRdoNCQ+AfxrRNwDbL0tR2Z+rCVVqWk+ClJSKzQaEl8G7qD2ZLrNrStHktRJGg2JjZl5bksrkSR1nEavml4eEfMiYt+ImLjl1dLKJEmVa7QlMbf4+Ym6aZ4CK0kjXKNXXL+61YVIkjpPoxfTvXuIyc8BP/G5EpI0cjXa3XQG8CfA8mK8D7gbeG1EXJKZX2tBbZKkijUaEpuBAzPzlwDFU+q+BLwZuBMwJCRpBGr07KbpWwKisBp4bXGDv+Yv85UkdYVGWxJ3RcRNwLXF+AnAnRGxB/BssxuNiP8BfIjaGVI/AU7LzBebXY8kqbUaDYmPAu8G/hu1O8BeBVyfmQnMaWaDEfFK4GPAQZn5m4j4FnAScGUz69G2vFmapFZo9BTYjIjvAS9R+/Z/bxEQO7PdCRGxAdgdeGon1iW8WZqk1mjomEREnAjcS62b6UTgnog4YUc2mJlPAv8LeAxYCTyXmbfuyLokSa3VaHfThcCbtlwTERGTgduB65rdYES8AjgOeDW14xnXRsT7M/Prg5abB8wDmDp1KgMDA81uquc0+xk9//zzO/S5+m+hXWWHWqa3NPeePca6z+6MRkNi1KCL5tbS+JlRgx0J/CIznwaIiH8CZgPbhERmLgGWAMyaNSub7RbpObfc3HTX0Y50N+3IdqShPNLX/HumX3Bz092q2jmNhsQtEfFdoL8Yfx/wnR3c5mPAIRGxO7XHoR4BrNjBdUmSWqjRA9fnRcR7gEOpnd20JDNv2JENZuY9EXEd8ANgI/BDihaDJKmzNNqSIDOvB67fFRvNzIuAi3bFuiRJrTNsSETEr6md8vqyWdTOjP2tllQlSeoIw4ZEZu7VrkIkSZ1nR89QkiT1AENCklTKkJAklWr47CZ1vnZcvbr3hLHNb0NS1zIkRogduQrVq1clbY/dTZKkUoaEJKmUISFJKmVISJJKGRKSpFKGhCSplCEhSSplSEiSShkSkqRShoQkqZQhIUkqZUhIkkoZEpKkUoaEJKmUISFJKmVISJJKGRKSpFKGhCSplCEhSSplSEiSShkSkqRShoQkqZQhIUkqZUhIkkoZEpKkUoaEJKmUISFJKlVJSETEPhFxXUT8LCIejIg/qaIOSdLwxlS03c8Dt2TmCRGxG7B7RXVIkobR9pCIiN8C3gJ8ECAzXwJeancdkqTtq6Il8XvA08A/RsTrgfuAP8/MdfULRcQ8YB7A1KlTGRgYaHedPcHPVd3Gfba9qgiJMcAfA/Mz856I+DxwAfCX9Qtl5hJgCcCsWbOyr6+v3XWOfLfcjJ+ruor7bNtVceD6CeCJzLynGL+OWmhIkjpM20MiM1cBj0fEAcWkI4AH2l2HJGn7qjq7aT5wdXFm038Cp1VUhyRpGJWERGb+CJhVxbZ7UUSUz1tU/r7MbEE10va5z3YOr7juAZk55Gv58uWl8/zPpiq5z3aOqrqbVKGhvqX5H0ydzH22OrYkekxZM3645r1Upfp9c/z48UNOV+sYEj2qvukudYPMZNmyZe6zbWZISOp4U6ZMGXZcrWNISOp4q1evHnZcreOB6x5lf666TUQwfvx4XnzxxapL6Sm2JHpMWX+u/bzqVPX7Zn1AuM+2hyHRYzy7Sd2mft+cNm3akNPVOoZEj/LsJnWbzOSqq65yn20zQ0JSx5s5c+aw42odQ0JSx7v//vuHHVfreHZTj7I/V90mIpg2bRqPPfZY1aX0FFsSPcazm9Rt6vfN+oBwn20PQ6IHDXVHTamTuc9Wx+6mHuQdNdVt3GerY0uix3idhLpN/b7Z19c35HS1jiHRo7xOQt0mM7nooovcZ9vMkJDU8U455ZRhx9U6hoSkjnf11VcPO67W8cB1j7I/V90mIujr62POnDlVl9JTbEn0GK+TULep3zcHBgaGnK7WMSR6kOecq9u4z1bHkJAklTIkJEmlDAlJUilDQpJUypCQJJUyJCRJpQwJSVIpr7juQd52Wd3GfbY6tiR6jLcKV7ep3zcvueSSIaerdQyJHuWtwtVtMpPDDjvMfbbNKguJiBgdET+MiJuqqkFSd/j2t7897Lhap8qWxJ8DD1a4fUld4vjjjx92XK1TSUhExH7AMcBXqti+av25c+bMsV9XXSMiuOuuu9xn2yyq6N+LiOuAvwH2Aj6eme8YYpl5wDyAqVOnvvGaa65pb5Ej2FD341++fHkFlUiNcZ9tvTlz5tyXmbMGT2/7KbAR8Q5gdWbeFxF9Zctl5hJgCcCsWbOy/gHo2jlbvhgMDAzg56pu4D5bnSq6mw4Fjo2IR4BrgMMj4usV1CFJ2o62h0RmfiIz98vM6cBJwB2Z+f521yFJ2j6vk5Aklar0thyZOQAMVFmDJKmcLQlJUqlKToFtVkQ8DTxadR0j0CRgTdVFSE1wn22d/TNz8uCJXRESao2IWDHUedFSp3KfbT+7myRJpQwJSVIpQ6K3Lam6AKlJ7rNt5jEJSVIpWxKSpFKGRA+IiKMi4j8i4qGIuGCI+eMi4pvF/HsiYnr7q5RqIuKKiFgdEfeXzI+I+Ptif/1xRPxxu2vsJYbECBcRo4EvAkcDBwEnR8RBgxY7A/hVZs4A/g5Y1N4qpW1cCRw1zPyjgdcUr3nAl9pQU88yJEa+g4GHMvM/M/MlanfePW7QMscBVxXD1wFHhE92UUUy807gmWEWOQ74atbcDewTEfu2p7reY0iMfK8EHq8bf6KYNuQymbkReA747bZUJzWvkX1au4ghMfIN1SIYfEpbI8tIncL9tY0MiZHvCeBVdeP7AU+VLRMRY4C9Gb65L1WpkX1au4ghMfL9G/CaiHh1ROxG7UFPSwctsxQ4tRg+gdqDoPxmpk61FPhAcZbTIcBzmbmy6qJGqkqfJ6HWy8yNEXEO8F1gNHBFZv40Ii4BVmTmUuBy4GsR8RC1FsRJ1VWsXhcR/UAfMCkingAuAsYCZOZi4DvAnwIPAS8Ap1VTaW/wimtJUim7myRJpQwJSVIpQ0KSVMqQkCSVMiQkSaUMCWknRMTFEfHxHXjfByPiH1pRk7QrGRKSpFKGhNSkiLiweD7H7cABxbTfj4hbIuK+iLgrIl5XTH9n8YyOH0bE7RExtdLipSYZElITIuKN1K5IfwPwbuBNxawlwPzMfCPwceDSYvr3gEMy8w3UbtO+oL0VSzvH23JIzTkMuCEzXwCIiKXAeGA2cG3dYzjGFT/3A75ZPO9gN+AX7S1X2jmGhNS8wfeyGQU8m5l/NMSyXwD+NjOXRkQfcHGLa5N2KbubpObcCbwrIiZExF7AO6ndZO4XEfFe2PoM5tcXy+8NPFkMn/qytUkdzpCQmpCZPwC+CfwIuB64q5h1CnBGRPw78FP+6xGxF1PrhroLWNPeaqWd511gJUmlbElIkkoZEpKkUoaEJKmUISFJKmVISJJKGRKSpFKGhCSplCEhSSr1/wHC/yFh2boEiAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Check the impact of deal, feat by plotting logmove vs feat and deal\n", + "# These two features significantly impact the sales\n", + "plt.scatter(sales[\"feat\"], sales[\"logmove\"])\n", + "plt.title(\"logmove vs feat\")\n", + "plt.xlabel(\"feat\")\n", + "plt.ylabel(\"logmove\")\n", + "p = sales.boxplot(column=\"logmove\", by=\"deal\")\n", + "plt.suptitle(\"\")\n", + "p.set_title(\"logmove by deal\", linespacing=3)\n", + "p.set_xlabel(\"deal\")\n", + "p.set_ylabel(\"logmove\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Impact of price\n", + "\n", + "We find that the sales does typically decrease when the absolute price or the relative price of the product increases." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# correlation between the sales and price, sales and relative price\n", + "sales[\"price\"] = sales.apply(lambda x: x.loc[\"price\" + str(int(x.loc[\"brand\"]))], axis=1)\n", + "price_cols = [\n", + " \"price1\",\n", + " \"price2\",\n", + " \"price3\",\n", + " \"price4\",\n", + " \"price5\",\n", + " \"price6\",\n", + " \"price7\",\n", + " \"price8\",\n", + " \"price9\",\n", + " \"price10\",\n", + " \"price11\",\n", + "]\n", + "sales[\"avg_price\"] = sales[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols))\n", + "sales[\"price_ratio\"] = sales.apply(lambda x: x[\"price\"] / x[\"avg_price\"], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(sales[\"price\"], sales[\"logmove\"])\n", + "plt.title(\"logmove vs price\")\n", + "plt.xlabel(\"price\")\n", + "plt.ylabel(\"logmove\")\n", + "plt.show()\n", + "plt.scatter(sales[\"price_ratio\"], sales[\"logmove\"])\n", + "plt.title(\"logmove vs price_ratio\")\n", + "plt.xlabel(\"price ratio\")\n", + "plt.ylabel(\"logmove\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "forecasting_env", + "language": "python", + "name": "forecasting_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/grocery_sales/python/01_prepare_data/ojdata_preparation.ipynb b/examples/grocery_sales/python/01_prepare_data/ojdata_preparation.ipynb new file mode 100644 index 00000000..38508ec6 --- /dev/null +++ b/examples/grocery_sales/python/01_prepare_data/ojdata_preparation.ipynb @@ -0,0 +1,1354 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Preparation for Retail Sales Forecasting\n", + "\n", + "This notebook introduces how to split the Orange Juice dataset into training sets and test sets for training and evaluating different retail sales forecasting methods.\n", + "\n", + "We use backtesting a method that tests a predictive model on historical data to evaluate the forecasting methods. Other than standard [K-fold cross validation](https://en.wikipedia.org/wiki/Cross-validation_%28statistics%29) which randomly splits data into K folds, we split the data so that any of the time stamps in the training set is no later than any of the time stamps in the test set to ensure that no future information is used (expect certain information that we can know beforehand, e.g., price of the product in the next few weeks as we can set the price manually).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Settings and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "System version: 3.6.10 |Anaconda, Inc.| (default, Jan 7 2020, 21:14:29) \n", + "[GCC 7.3.0]\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "\n", + "from fclib.common.utils import git_repo_path\n", + "from fclib.dataset.ojdata import download_ojdata, split_train_test\n", + "\n", + "print(\"System version: {}\".format(sys.version))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Use False if you've already downloaded and split the data\n", + "DOWNLOAD_DATA = True\n", + "\n", + "# Data directory\n", + "DATA_DIR = os.path.join(git_repo_path(), \"ojdata\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Download Data\n", + "\n", + "We need to download the Orange Juice data before splitting it into training and test sets. By default, the following cell will download the data. If you've already done so, you may skip this part by switching `DOWNLOAD_DATA` to `False`.\n", + "\n", + "The dataset is from R package [bayesm](https://cran.r-project.org/web/packages/bayesm/index.html) and is part of the [Dominick's dataset](https://www.chicagobooth.edu/research/kilts/datasets/dominicks). It contains the following two csv files:\n", + "\n", + "1. `yx.csv` includes weekly sales of refrigerated orange juice at 83 stores. This files has 106139 rows and 19 columns. It contains weekly sales and prices of 11 orange juice brands as well as information about profit, deal, and advertisement for each brand. Note that the weekly sales is captured by a column named `logmove` which corresponds to the natural logarithm of the number of units sold. To get the number of units sold, you need to apply an exponential transform to this column.\n", + "\n", + "2. `storedemo.csv` includes demographic information on those stores. This table has 83 rows and 13 columns. For every store, the table describes demographic information of its consumers, distance to the nearest warehouse store, average distance to the nearest 5 supermarkets, ratio of its sales to the nearest warehouse store, and ratio of its sales\n", + "to the average of the nearest 5 stores.\n", + "\n", + "Note that the week number starts from 40 in this dataset, while the full Dominick's dataset has week number from 1 to 400. According to [Dominick's Data Manual](https://www.chicagobooth.edu/-/media/enterprise/centers/kilts/datasets/dominicks-dataset/dominicks-manual-and-codebook_kiltscenter.aspx), week 1 starts on 09/14/1989.\n", + "Please see pages 40 and 41 of the [bayesm reference manual](https://cran.r-project.org/web/packages/bayesm/bayesm.pdf) and the [Dominick's Data Manual](https://www.chicagobooth.edu/-/media/enterprise/centers/kilts/datasets/dominicks-dataset/dominicks-manual-and-codebook_kiltscenter.aspx) for more details about the data." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data already exists at the specified location.\n", + "Data download completed. Data saved to /data/home/vapaunic/forecasting/ojdata\n" + ] + } + ], + "source": [ + "if DOWNLOAD_DATA:\n", + " download_ojdata(DATA_DIR)\n", + " print(\"Data download completed. Data saved to \" + DATA_DIR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we define parameters for data preparation and forecast settings. In particular:\n", + "- *N_SPLITS* defines the number of training/testing splits we want to split our data into\n", + "- *HORIZON* or forecasting horizon determines the number of weeks to forecast in the future, or the test period length\n", + "- *GAP* defines the gap (in weeks) between the training and test data. This is to allow business managers to plan for the forecasted demand.\n", + "- *FIRST_WEEK* is the first available week in the data\n", + "- *LAST_WEEK* is the last available week in the data" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Forecasting settings\n", + "N_SPLITS = 1\n", + "HORIZON = 2\n", + "GAP = 2\n", + "FIRST_WEEK = 40\n", + "LAST_WEEK = 156" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Splitting Time Series Data\n", + "\n", + "In all our examples we use `split_train_test()` utility function to split the Orange Juice dataset. Splitting time series data into training and testing has to follow the rule that, in each split, test indices need to be higher than the train indices, and higher than the test indices in the previous split.\n", + "\n", + "We wrote the `split_train_test()` function to do just that. Given the parameters listed above, it creates `N_SPLITS` number of training/testing data splits, so that each test split is `HORIZON` weeks long, and the testing period is `GAP` number of weeks away from the training period. The first available week in the data (or the first week we want to start modeling from) is given as `FIRST_WEEK`, and the last week we want to work with is `LAST_WEEK`.\n", + "\n", + "For demonstration, this is what the time series split on the Orange Juice dataset looks like, for the parameters listed above.\n", + "For `HORIZON = 2` and `GAP = 2`, assuming the current week is week `153`, our goal is to forecast the sales in week `155` and `156` using the training data. As you can see, the first forecasting week is `two` weeks away from the current week, as we want to leave time for planning inventory in practice.\n", + "\n", + "![Single split](../../../../assets/time_series_split_singleround.jpg)\n", + "\n", + "We also refer to splits as rounds, so for `N_SPLITS = 1`, we have single-round forecasting, and for `N_SPLITS > 1`, we have multi-round forecasting." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Single-Round Forecasting\n", + "\n", + "Next, we can use `split_train_test()` utility function to split the data in `yx.csv` into training and test sets based on the parameters described above. If we want to do a one-time model training and evaluation, we can split the data using the default settings provided in the function.\n", + "\n", + "The data split function will return training data and test data as dataframes. The training data includes `train_df` and `aux_df` with `train_df` containing the historical sales and `aux_df` containing price/promotion information. Here we assume that future price and promotion information up to a certain number of weeks ahead is predetermined and known. The test data is stored in `test_df` which contains the sales of each product.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "train_df_list, test_df_list, aux_df_list = split_train_test(\n", + " data_dir=DATA_DIR,\n", + " n_splits=N_SPLITS,\n", + " horizon=HORIZON,\n", + " gap=GAP,\n", + " first_week=FIRST_WEEK,\n", + " last_week=LAST_WEEK,\n", + " write_csv=True,\n", + ")\n", + "\n", + "# Split returns a list, extract the dataframes from the list\n", + "train_df = train_df_list[0].reset_index()\n", + "test_df = test_df_list[0].reset_index()\n", + "aux_df = aux_df_list[0].reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweeklogmoveconstantprice1price2price3price4price5price6price7price8price9price10price11dealfeatprofit
021409.01869510.0604690.0604970.0420310.0295310.0495310.0530210.0389060.0414060.0289060.0248440.03898410.037.992326
121468.72323110.0604690.0603120.0451560.0467190.0495310.0478130.0457810.0279690.0429690.0420310.03898400.030.126667
221478.25322810.0604690.0603120.0451560.0467190.0373440.0530210.0457810.0414060.0481250.0326560.03898400.030.000000
321488.98719710.0604690.0603120.0498440.0373440.0495310.0530210.0457810.0414060.0423440.0326560.03898400.029.950000
421509.09335710.0604690.0603120.0435940.0310940.0495310.0530210.0466480.0414060.0423440.0326560.03820300.029.920000
521518.87738210.0604690.0603120.0435940.0467190.0495310.0530210.0464560.0357810.0423440.0295310.03820300.029.920000
621529.29468210.0514060.0603120.0435940.0467190.0495310.0530210.0479690.0357810.0310940.0295310.03898410.027.125471
721538.95467410.0514060.0603120.0498440.0467190.0342190.0530210.0479690.0357810.0310940.0295310.03898410.027.125041
821549.04923210.0514060.0603120.0498440.0373440.0495310.0530210.0479690.0382810.0481250.0279690.03507810.027.082481
921578.61323010.0514060.0603120.0482810.0467190.0310940.0530210.0310940.0414060.0423440.0420310.03898410.027.061163
\n", + "
" + ], + "text/plain": [ + " store brand week logmove constant price1 price2 price3 \\\n", + "0 2 1 40 9.018695 1 0.060469 0.060497 0.042031 \n", + "1 2 1 46 8.723231 1 0.060469 0.060312 0.045156 \n", + "2 2 1 47 8.253228 1 0.060469 0.060312 0.045156 \n", + "3 2 1 48 8.987197 1 0.060469 0.060312 0.049844 \n", + "4 2 1 50 9.093357 1 0.060469 0.060312 0.043594 \n", + "5 2 1 51 8.877382 1 0.060469 0.060312 0.043594 \n", + "6 2 1 52 9.294682 1 0.051406 0.060312 0.043594 \n", + "7 2 1 53 8.954674 1 0.051406 0.060312 0.049844 \n", + "8 2 1 54 9.049232 1 0.051406 0.060312 0.049844 \n", + "9 2 1 57 8.613230 1 0.051406 0.060312 0.048281 \n", + "\n", + " price4 price5 price6 price7 price8 price9 price10 \\\n", + "0 0.029531 0.049531 0.053021 0.038906 0.041406 0.028906 0.024844 \n", + "1 0.046719 0.049531 0.047813 0.045781 0.027969 0.042969 0.042031 \n", + "2 0.046719 0.037344 0.053021 0.045781 0.041406 0.048125 0.032656 \n", + "3 0.037344 0.049531 0.053021 0.045781 0.041406 0.042344 0.032656 \n", + "4 0.031094 0.049531 0.053021 0.046648 0.041406 0.042344 0.032656 \n", + "5 0.046719 0.049531 0.053021 0.046456 0.035781 0.042344 0.029531 \n", + "6 0.046719 0.049531 0.053021 0.047969 0.035781 0.031094 0.029531 \n", + "7 0.046719 0.034219 0.053021 0.047969 0.035781 0.031094 0.029531 \n", + "8 0.037344 0.049531 0.053021 0.047969 0.038281 0.048125 0.027969 \n", + "9 0.046719 0.031094 0.053021 0.031094 0.041406 0.042344 0.042031 \n", + "\n", + " price11 deal feat profit \n", + "0 0.038984 1 0.0 37.992326 \n", + "1 0.038984 0 0.0 30.126667 \n", + "2 0.038984 0 0.0 30.000000 \n", + "3 0.038984 0 0.0 29.950000 \n", + "4 0.038203 0 0.0 29.920000 \n", + "5 0.038203 0 0.0 29.920000 \n", + "6 0.038984 1 0.0 27.125471 \n", + "7 0.038984 1 0.0 27.125041 \n", + "8 0.035078 1 0.0 27.082481 \n", + "9 0.038984 1 0.0 27.061163 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_df.head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweeklogmoveconstantprice1price2price3price4price5price6price7price8price9price10price11dealfeatprofit
0211559.00307010.0429010.0519790.0451560.0310940.0264060.0503520.0413660.0310940.0373440.0185940.02945300.0000026.851024
1211569.87591110.0389060.0519790.0467190.0318190.0283200.0467710.0404690.0310940.0373440.0326560.02804711.0000022.896316
2221558.76904110.0429010.0519790.0451560.0310940.0264060.0503520.0413660.0310940.0373440.0185940.02945300.0000029.861343
3221568.72323110.0389060.0519790.0467190.0318190.0283200.0467710.0404690.0310940.0373440.0326560.02804700.0000029.916250
4231558.09070910.0429010.0519790.0451560.0310940.0264060.0503520.0413660.0310940.0373440.0185940.02945311.0000036.118103
5231567.33693710.0389060.0519790.0467190.0318190.0283200.0467710.0404690.0310940.0373440.0326560.02804700.0000039.047500
6241559.86931010.0429010.0519790.0451560.0310940.0264060.0503520.0413660.0310940.0373440.0185940.02945311.0000023.502053
7241569.13561710.0389060.0519790.0467190.0318190.0283200.0467710.0404690.0310940.0373440.0326560.02804710.9737926.420000
8251559.85261510.0429010.0519790.0451560.0310940.0264060.0503520.0413660.0310940.0373440.0185940.02945310.0000019.999910
9251569.35738010.0389060.0519790.0467190.0318190.0283200.0467710.0404690.0310940.0373440.0326560.02804710.0000024.212895
\n", + "
" + ], + "text/plain": [ + " store brand week logmove constant price1 price2 price3 \\\n", + "0 2 1 155 9.003070 1 0.042901 0.051979 0.045156 \n", + "1 2 1 156 9.875911 1 0.038906 0.051979 0.046719 \n", + "2 2 2 155 8.769041 1 0.042901 0.051979 0.045156 \n", + "3 2 2 156 8.723231 1 0.038906 0.051979 0.046719 \n", + "4 2 3 155 8.090709 1 0.042901 0.051979 0.045156 \n", + "5 2 3 156 7.336937 1 0.038906 0.051979 0.046719 \n", + "6 2 4 155 9.869310 1 0.042901 0.051979 0.045156 \n", + "7 2 4 156 9.135617 1 0.038906 0.051979 0.046719 \n", + "8 2 5 155 9.852615 1 0.042901 0.051979 0.045156 \n", + "9 2 5 156 9.357380 1 0.038906 0.051979 0.046719 \n", + "\n", + " price4 price5 price6 price7 price8 price9 price10 \\\n", + "0 0.031094 0.026406 0.050352 0.041366 0.031094 0.037344 0.018594 \n", + "1 0.031819 0.028320 0.046771 0.040469 0.031094 0.037344 0.032656 \n", + "2 0.031094 0.026406 0.050352 0.041366 0.031094 0.037344 0.018594 \n", + "3 0.031819 0.028320 0.046771 0.040469 0.031094 0.037344 0.032656 \n", + "4 0.031094 0.026406 0.050352 0.041366 0.031094 0.037344 0.018594 \n", + "5 0.031819 0.028320 0.046771 0.040469 0.031094 0.037344 0.032656 \n", + "6 0.031094 0.026406 0.050352 0.041366 0.031094 0.037344 0.018594 \n", + "7 0.031819 0.028320 0.046771 0.040469 0.031094 0.037344 0.032656 \n", + "8 0.031094 0.026406 0.050352 0.041366 0.031094 0.037344 0.018594 \n", + "9 0.031819 0.028320 0.046771 0.040469 0.031094 0.037344 0.032656 \n", + "\n", + " price11 deal feat profit \n", + "0 0.029453 0 0.00000 26.851024 \n", + "1 0.028047 1 1.00000 22.896316 \n", + "2 0.029453 0 0.00000 29.861343 \n", + "3 0.028047 0 0.00000 29.916250 \n", + "4 0.029453 1 1.00000 36.118103 \n", + "5 0.028047 0 0.00000 39.047500 \n", + "6 0.029453 1 1.00000 23.502053 \n", + "7 0.028047 1 0.97379 26.420000 \n", + "8 0.029453 1 0.00000 19.999910 \n", + "9 0.028047 1 0.00000 24.212895 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_df.head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
storebrandweekprice1price2price3price4price5price6price7price8price9price10price11dealfeat
021400.0604690.0604970.0420310.0295310.0495310.0530210.0389060.0414060.0289060.0248440.03898410.0
121460.0604690.0603120.0451560.0467190.0495310.0478130.0457810.0279690.0429690.0420310.03898400.0
221470.0604690.0603120.0451560.0467190.0373440.0530210.0457810.0414060.0481250.0326560.03898400.0
321480.0604690.0603120.0498440.0373440.0495310.0530210.0457810.0414060.0423440.0326560.03898400.0
421500.0604690.0603120.0435940.0310940.0495310.0530210.0466480.0414060.0423440.0326560.03820300.0
521510.0604690.0603120.0435940.0467190.0495310.0530210.0464560.0357810.0423440.0295310.03820300.0
621520.0514060.0603120.0435940.0467190.0495310.0530210.0479690.0357810.0310940.0295310.03898410.0
721530.0514060.0603120.0498440.0467190.0342190.0530210.0479690.0357810.0310940.0295310.03898410.0
821540.0514060.0603120.0498440.0373440.0495310.0530210.0479690.0382810.0481250.0279690.03507810.0
921570.0514060.0603120.0482810.0467190.0310940.0530210.0310940.0414060.0423440.0420310.03898410.0
\n", + "
" + ], + "text/plain": [ + " store brand week price1 price2 price3 price4 price5 \\\n", + "0 2 1 40 0.060469 0.060497 0.042031 0.029531 0.049531 \n", + "1 2 1 46 0.060469 0.060312 0.045156 0.046719 0.049531 \n", + "2 2 1 47 0.060469 0.060312 0.045156 0.046719 0.037344 \n", + "3 2 1 48 0.060469 0.060312 0.049844 0.037344 0.049531 \n", + "4 2 1 50 0.060469 0.060312 0.043594 0.031094 0.049531 \n", + "5 2 1 51 0.060469 0.060312 0.043594 0.046719 0.049531 \n", + "6 2 1 52 0.051406 0.060312 0.043594 0.046719 0.049531 \n", + "7 2 1 53 0.051406 0.060312 0.049844 0.046719 0.034219 \n", + "8 2 1 54 0.051406 0.060312 0.049844 0.037344 0.049531 \n", + "9 2 1 57 0.051406 0.060312 0.048281 0.046719 0.031094 \n", + "\n", + " price6 price7 price8 price9 price10 price11 deal feat \n", + "0 0.053021 0.038906 0.041406 0.028906 0.024844 0.038984 1 0.0 \n", + "1 0.047813 0.045781 0.027969 0.042969 0.042031 0.038984 0 0.0 \n", + "2 0.053021 0.045781 0.041406 0.048125 0.032656 0.038984 0 0.0 \n", + "3 0.053021 0.045781 0.041406 0.042344 0.032656 0.038984 0 0.0 \n", + "4 0.053021 0.046648 0.041406 0.042344 0.032656 0.038203 0 0.0 \n", + "5 0.053021 0.046456 0.035781 0.042344 0.029531 0.038203 0 0.0 \n", + "6 0.053021 0.047969 0.035781 0.031094 0.029531 0.038984 1 0.0 \n", + "7 0.053021 0.047969 0.035781 0.031094 0.029531 0.038984 1 0.0 \n", + "8 0.053021 0.047969 0.038281 0.048125 0.027969 0.035078 1 0.0 \n", + "9 0.053021 0.031094 0.041406 0.042344 0.042031 0.038984 1 0.0 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aux_df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multi-Round Forecasting\n", + "\n", + "To create training data and test data for multi-round forecasting, we use the same function passing a number greater than `1` to `n_splits` parameter. Note that the forecasting period we generate in each test round are **non-overlapping**. This allows us to evaluate the forecasting model on multiple rounds of data, and get a more robust estimate of our model's performance.\n", + "\n", + "For demonstration, this is what the time series splits would look like for `N_SPLITS = 5`, and using other settings as above:\n", + "\n", + "![Multi split](../../../../assets/time_series_split_multiround.jpg)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's now generate `10` rounds of training/testing data." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [ + "## Generate 10 splits (rounds) of data\n", + "N_SPLITS = 10\n", + "\n", + "train_df_list, test_df_list, aux_df_list = split_train_test(\n", + " DATA_DIR, n_splits=N_SPLITS, horizon=HORIZON, gap=GAP, first_week=FIRST_WEEK, last_week=LAST_WEEK, write_csv=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above cell wil generate the following splits.\n", + "\n", + "| **Round** | **Train period in weeks** | **Test period in weeks** |\n", + "| -------- | -------------------------- | ----------------------- |\n", + "| 1 | 40 - 135 | 137 - 138 |\n", + "| 2 | 40 - 137 | 139 - 140 |\n", + "| 3 | 40 - 139 | 141 - 142 |\n", + "| 4 | 40 - 141 | 143 - 144 |\n", + "| 5 | 40 - 143 | 145 - 146 |\n", + "| 6 | 40 - 145 | 147 - 148 |\n", + "| 7 | 40 - 147 | 149 - 150 |\n", + "| 8 | 40 - 149 | 151 - 152 |\n", + "| 9 | 40 - 151 | 153 - 154 |\n", + "| 10 | 40 - 153 | 155 - 156 |\n", + "\n", + "The gap of one week between training period and test period allows store managers to prepare the stock based on the forecasted demand. Besides, we assume that the information about the price, deal, and advertisement up until the forecast period end week is available at each round." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ROUND 1\n", + "--------\n", + "Training\n", + " Data shape: (84183, 18)\n", + " Week range: 40-135\n", + "Testing\n", + " Data shape: (1826, 18)\n", + " Week range: 137-138\n", + "Auxiliary\n", + " Data shape: (86911, 15)\n", + " Week range: 40-138\n", + "\n", + "ROUND 2\n", + "--------\n", + "Training\n", + " Data shape: (85998, 18)\n", + " Week range: 40-137\n", + "Testing\n", + " Data shape: (1793, 18)\n", + " Week range: 139-140\n", + "Auxiliary\n", + " Data shape: (88704, 15)\n", + " Week range: 40-140\n", + "\n", + "ROUND 3\n", + "--------\n", + "Training\n", + " Data shape: (87802, 18)\n", + " Week range: 40-139\n", + "Testing\n", + " Data shape: (1771, 18)\n", + " Week range: 141-142\n", + "Auxiliary\n", + " Data shape: (90475, 15)\n", + " Week range: 40-142\n", + "\n", + "ROUND 4\n", + "--------\n", + "Training\n", + " Data shape: (89617, 18)\n", + " Week range: 40-141\n", + "Testing\n", + " Data shape: (1749, 18)\n", + " Week range: 143-144\n", + "Auxiliary\n", + " Data shape: (92224, 15)\n", + " Week range: 40-144\n", + "\n", + "ROUND 5\n", + "--------\n", + "Training\n", + " Data shape: (91333, 18)\n", + " Week range: 40-143\n", + "Testing\n", + " Data shape: (1727, 18)\n", + " Week range: 145-146\n", + "Auxiliary\n", + " Data shape: (93951, 15)\n", + " Week range: 40-146\n", + "\n", + "ROUND 6\n", + "--------\n", + "Training\n", + " Data shape: (93071, 18)\n", + " Week range: 40-145\n", + "Testing\n", + " Data shape: (1749, 18)\n", + " Week range: 147-148\n", + "Auxiliary\n", + " Data shape: (95700, 15)\n", + " Week range: 40-148\n", + "\n", + "ROUND 7\n", + "--------\n", + "Training\n", + " Data shape: (94842, 18)\n", + " Week range: 40-147\n", + "Testing\n", + " Data shape: (1771, 18)\n", + " Week range: 149-150\n", + "Auxiliary\n", + " Data shape: (97471, 15)\n", + " Week range: 40-150\n", + "\n", + "ROUND 8\n", + "--------\n", + "Training\n", + " Data shape: (96591, 18)\n", + " Week range: 40-149\n", + "Testing\n", + " Data shape: (1738, 18)\n", + " Week range: 151-152\n", + "Auxiliary\n", + " Data shape: (99209, 15)\n", + " Week range: 40-152\n", + "\n", + "ROUND 9\n", + "--------\n", + "Training\n", + " Data shape: (98340, 18)\n", + " Week range: 40-151\n", + "Testing\n", + " Data shape: (1705, 18)\n", + " Week range: 153-154\n", + "Auxiliary\n", + " Data shape: (100914, 15)\n", + " Week range: 40-154\n", + "\n", + "ROUND 10\n", + "--------\n", + "Training\n", + " Data shape: (100056, 18)\n", + " Week range: 40-153\n", + "Testing\n", + " Data shape: (1705, 18)\n", + " Week range: 155-156\n", + "Auxiliary\n", + " Data shape: (102619, 15)\n", + " Week range: 40-156\n", + "\n" + ] + } + ], + "source": [ + "for i in range(len(train_df_list)):\n", + " train_df = train_df_list[i]\n", + " test_df = test_df_list[i]\n", + " aux_df = aux_df_list[i]\n", + " print(f\"ROUND {i+1}\")\n", + " print(\"--------\")\n", + " print(\"Training\")\n", + " print(f\" Data shape: {train_df.shape}\")\n", + " print(f\" Week range: {min(train_df['week'])}-{max(train_df['week'])}\")\n", + " print(\"Testing\")\n", + " print(f\" Data shape: {test_df.shape}\")\n", + " print(f\" Week range: {min(test_df['week'])}-{max(test_df['week'])}\")\n", + " print(\"Auxiliary\")\n", + " print(f\" Data shape: {aux_df.shape}\")\n", + " print(f\" Week range: {min(aux_df['week'])}-{max(aux_df['week'])}\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Reading\n", + "\n", + "\\[1\\] Christoph GBergmeir, Rob J. Hyndman, and Bonsoo Koo. 2018. A Note on the Validity of Cross-Validation for Evaluating Autoregressive Time Series Prediction. Computational Statistics & Data Analysis. 120, pp. 70-83.
\n", + "\\[2\\] How To Backtest Machine Learning Models for Time Series Forecasting: https://machinelearningmastery.com/backtest-machine-learning-models-time-series-forecasting/Parameters.rst
\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "forecasting_env", + "language": "python", + "name": "forecasting_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/grocery_sales/python/02_model/autoarima_multi_round.ipynb b/examples/grocery_sales/python/02_model/autoarima_multi_round.ipynb new file mode 100644 index 00000000..20ef2c5e --- /dev/null +++ b/examples/grocery_sales/python/02_model/autoarima_multi_round.ipynb @@ -0,0 +1,599 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ARIMA: Autoregressive Integrated Moving Average\n", + "\n", + "This notebook provides an example of how to train an ARIMA model to generate point forecasts of product sales in retail. We will train an ARIMA based model on the Orange Juice dataset.\n", + "\n", + "An ARIMA, which stands for AutoRegressive Integrated Moving Average, model can be created using an `ARIMA(p,d,q)` model within `statsmodels` library. In this notebook, we will be using an alternative library `pmdarima`, which allows us to automatically search for optimal ARIMA parameters, within a specified range. More specifically, we will be using `auto_arima` function within `pmdarima` to automatically discover the optimal parameters for an ARIMA model. This function wraps `ARIMA` and `SARIMAX` models of `statsmodels` library, that correspond to non-seasonal and seasonal model space, respectively.\n", + "\n", + "In an ARIMA model there are 3 parameters that are used to help model the major aspects of a times series: seasonality, trend, and noise. These parameters are:\n", + "- **p** is the parameter associated with the auto-regressive aspect of the model, which incorporates past values.\n", + "- **d** is the parameter associated with the integrated part of the model, which effects the amount of differencing to apply to a time series.\n", + "- **q** is the parameter associated with the moving average part of the model.,\n", + "\n", + "If our data has a seasonal component, we use a seasonal ARIMA model or `ARIMA(p,d,q)(P,D,Q)m`. In that case, we have an additional set of parameters: `P`, `D`, and `Q` which describe the autoregressive, differencing, and moving average terms for the seasonal part of the ARIMA model, and `m` refers to the number of periods in each season.\n", + "\n", + "We provide a [quick-start ARIMA example](../00_quick_start/auto_arima_forecasting.ipynb), in which we explain the process of using ARIMA model to forecast a single time series, and analyze the model performance. Please take a look at this notebook for more information.\n", + "\n", + "In this notebook, we will train an ARIMA model on multiple splits (round) of the train/test data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Settings and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "System version: 3.6.10 |Anaconda, Inc.| (default, Mar 23 2020, 23:13:11) \n", + "[GCC 7.3.0]\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "import math\n", + "import warnings\n", + "import itertools\n", + "import numpy as np\n", + "import pandas as pd\n", + "import scrapbook as sb\n", + "from datetime import datetime\n", + "\n", + "from pmdarima.arima import auto_arima\n", + "\n", + "from fclib.common.utils import git_repo_path, module_exists\n", + "from fclib.common.plot import plot_predictions_with_history\n", + "from fclib.evaluation.evaluation_utils import MAPE\n", + "from fclib.dataset.ojdata import download_ojdata, split_train_test, complete_and_fill_df\n", + "\n", + "pd.options.display.float_format = \"{:,.2f}\".format\n", + "np.set_printoptions(precision=2)\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "print(\"System version: {}\".format(sys.version))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parameters\n", + "\n", + "Next, we define global settings related to the model. We will use historical weekly sales data only, without any covariate features to train the ARIMA model. The model parameter ranges are provided in params. These are later used by the `auto_arima()` function to search the space for the optimal set of parameters. To increase the space of models to search over, increase the `max_p` and `max_q` parameters.\n", + "\n", + "> NOTE: Our data does not show a strong seasonal component (as demonstrated in data exploration example notebook), so we will not be searching over the seasonal ARIMA models. To learn more about the seasonal ARIMA models, please take a look at the quick start ARIMA notebook, referenced above in the introduction." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Use False if you've already downloaded and split the data\n", + "DOWNLOAD_SPLIT_DATA = True\n", + "\n", + "# Data directory\n", + "DATA_DIR = os.path.join(git_repo_path(), \"ojdata\")\n", + "\n", + "# Forecasting settings\n", + "N_SPLITS = 5\n", + "HORIZON = 2\n", + "GAP = 2\n", + "FIRST_WEEK = 40\n", + "LAST_WEEK = 156\n", + "\n", + "# Parameters of ARIMA model\n", + "params = {\n", + " \"seasonal\": False,\n", + " \"start_p\": 0,\n", + " \"start_q\": 0,\n", + " \"max_p\": 5,\n", + " \"max_q\": 5,\n", + "}\n", + "\n", + "\n", + "# Run notebook on a subset of stores (to reduce the run time)\n", + "STORE_SUBSET = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preparation\n", + "\n", + "We need to download the Orange Juice data and split it into training and test sets. By default, the following cell will download and spit the data. If you've already done so, you may skip this part by switching `DOWNLOAD_SPLIT_DATA` to `False`.\n", + "\n", + "We store the training data and test data using dataframes. The training data includes `train_df` and `aux_df` with `train_df` containing the historical sales up to week 135 (the time we make forecasts) and `aux_df` containing price/promotion information up until week 138. Here we assume that future price and promotion information up to a certain number of weeks ahead is predetermined and known. In our example, we will be using historical sales only, and will not be using the `aux_df` data. The test data is stored in `test_df` which contains the sales of each product in week 137 and 138. Assuming the current week is week 135, our goal is to forecast the sales in week 137 and 138 using the training data. There is a one-week gap between the current week and the first target week of forecasting as we want to leave time for planning inventory in practice.\n", + "\n", + "The setting of the forecast problem are defined in `fclib.dataset.ojdata.split_train_test` function. We can change this setting (e.g., modify the horizon of the forecast or the range of the historical data) by passing different parameters to this functions. Below, we split the data into `n_splits=N_SPLITS` splits, using the forecasting settings listed above in the *Parameters* section." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data already exists at the specified location.\n", + "Finished data downloading and splitting.\n" + ] + } + ], + "source": [ + "if DOWNLOAD_SPLIT_DATA:\n", + " download_ojdata(DATA_DIR)\n", + " train_df_list, test_df_list, _ = split_train_test(\n", + " DATA_DIR,\n", + " n_splits=N_SPLITS,\n", + " horizon=HORIZON,\n", + " gap=GAP,\n", + " first_week=FIRST_WEEK,\n", + " last_week=LAST_WEEK,\n", + " write_csv=True,\n", + " )\n", + "\n", + " print(\"Finished data downloading and splitting.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To create training data and test data for multi-round forecasting, we pass a number greater than `1` to `n_splits` parameter in `split_train_test()` function. Note that the forecasting periods we generate in each test round are **non-overlapping**. This allows us to evaluate the forecasting model on multiple rounds of data, and get a more robust estimate of our model's performance.\n", + "\n", + "For visual demonstration, this is what the time series splits would look like for `N_SPLITS = 5`, and using other settings as above:\n", + "\n", + "![Multi split](../../../../assets/time_series_split_multiround.jpg)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Process training data\n", + "Our time series data is not complete, since we have missing sales for some stores/products and weeks. We will fill in those missing values by propagating the last valid observation forward to next available value. We will define functions for data frame processing, then use these functions within a loop that loops over each forecasting rounds.\n", + "\n", + "Note that our time series are grouped by `store` and `brand`, while `week` represents a time step, and `logmove` represents the value to predict." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def process_training_df(train_df):\n", + " \"\"\"Process training data frame.\"\"\"\n", + " train_df = train_df[[\"store\", \"brand\", \"week\", \"logmove\"]]\n", + " store_list = train_df[\"store\"].unique()\n", + " brand_list = train_df[\"brand\"].unique()\n", + " train_week_list = range(FIRST_WEEK, max(train_df.week))\n", + "\n", + " train_filled = complete_and_fill_df(train_df, stores=store_list, brands=brand_list, weeks=train_week_list)\n", + "\n", + " return train_filled" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Process test data\n", + "\n", + "Let's now process the test data. Note that, in addition to filling out missing values, we also convert unit sales from logarithmic scale to the counts. We will do model training on the log scale, due to improved performance, however, we will transfrom the test data back into the unit scale (counts) by applying `math.exp()`, so that we can evaluate the performance on the unit scale.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [ + "def process_test_df(test_df):\n", + " \"\"\"Process test data frame.\"\"\"\n", + " test_df[\"actuals\"] = test_df.logmove.apply(lambda x: round(math.exp(x)))\n", + " test_df = test_df[[\"store\", \"brand\", \"week\", \"actuals\"]]\n", + " store_list = test_df[\"store\"].unique()\n", + " brand_list = test_df[\"brand\"].unique()\n", + "\n", + " test_week_list = range(min(test_df.week), max(test_df.week) + 1)\n", + " test_filled = complete_and_fill_df(test_df, stores=store_list, brands=brand_list, weeks=test_week_list)\n", + "\n", + " return test_filled" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model training\n", + "\n", + "Now let's run model training across all the stores and brands, and across all rounds. We will re-run the same code to automatically search for the best parameters, simply wrapped in a for loop iterating over stores and brands.\n", + "\n", + "We will use [Ray](https://ray.readthedocs.io/en/latest/#) to distribute the computation to the cores available on your machine if Ray is installed. Otherwise, we will train the models for different stores, brands, and rounds sequentially. By the time we develop this example, Ray only supports Linux and MacOS. Thus, sequential training will be used on Windows. In the cells below, we first define a function that trains an ARIMA model for a specific store-brand-round. Then, we use the following to leverage Ray:\n", + "- `ray.init()` will start all the relevant Ray processes\n", + "- we define a function to run an ARIMA model on a single brand and single store. To turn this function into a function that can be executed remotely, we declare the function with the ` @ray.remote` decorator.\n", + "- `ray.get()` collects the results, and `ray.shutdown()` will stop Ray.\n", + "\n", + "It will take around 4.5 minutes to run the below cell for 5 rounds on a machine with 4 cores and about 2.7 minutes on a machine with 6 cores. To speed up the execution, we model only a subset of twenty stores in each round. To change this behavior, and run ARIMA modeling over *all stores and brands*, switch the boolean indicator `STORE_SUBSET` to `False` under the *Parameters* section on top." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def train_store_brand(train, test, store, brand, split):\n", + " train_ts = train.loc[(train.store == store) & (train.brand == brand)]\n", + " train_ts = np.array(train_ts[\"logmove\"])\n", + "\n", + " model = auto_arima(\n", + " train_ts,\n", + " seasonal=params[\"seasonal\"],\n", + " start_p=params[\"start_p\"],\n", + " start_q=params[\"start_q\"],\n", + " max_p=params[\"max_p\"],\n", + " max_q=params[\"max_q\"],\n", + " stepwise=True,\n", + " error_action=\"ignore\",\n", + " )\n", + "\n", + " model.fit(train_ts)\n", + " preds = model.predict(n_periods=GAP + HORIZON - 1)\n", + " predictions = np.round(np.exp(preds[-HORIZON:]))\n", + "\n", + " test_week_list = range(min(test.week), max(test.week) + 1)\n", + "\n", + " pred_df = pd.DataFrame(\n", + " {\"predictions\": predictions, \"store\": store, \"brand\": brand, \"week\": test_week_list, \"round\": split + 1,}\n", + " )\n", + " test_ts = test.loc[(test.store == store) & (test.brand == brand)]\n", + "\n", + " return pd.merge(pred_df, test_ts, on=[\"store\", \"brand\", \"week\"], how=\"left\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ray is available. Parallel training will be used. \n", + "\n", + "Initializing Ray...\n", + "Address information about the processes started by Ray:\n", + "{'node_ip_address': '172.18.9.4', 'redis_address': '172.18.9.4:45060', 'object_store_address': '/tmp/ray/session_2020-03-31_20-37-43_347276_81682/sockets/plasma_store', 'raylet_socket_name': '/tmp/ray/session_2020-03-31_20-37-43_347276_81682/sockets/raylet', 'webui_url': 'localhost:8265', 'session_dir': '/tmp/ray/session_2020-03-31_20-37-43_347276_81682'} \n", + "\n", + "20:37:44.015663 --- Round 1 ---\n", + "Training ARIMA model ...\n", + "20:38:11.713901 --- Round 2 ---\n", + "Training ARIMA model ...\n", + "20:38:39.725381 --- Round 3 ---\n", + "Training ARIMA model ...\n", + "20:39:09.059834 --- Round 4 ---\n", + "Training ARIMA model ...\n", + "20:39:52.311496 --- Round 5 ---\n", + "Training ARIMA model ...\n", + "CPU times: user 26.6 s, sys: 1.83 s, total: 28.4 s\n", + "Wall time: 2min 40s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "if module_exists(\"ray\"):\n", + " print(\"Ray is available. Parallel training will be used. \\n\")\n", + " \n", + " import ray\n", + " import logging\n", + " \n", + " # Initialize Ray\n", + " print(\"Initializing Ray...\")\n", + " address_info = ray.init(log_to_driver=False, logging_level=logging.ERROR)\n", + " print(\"Address information about the processes started by Ray:\")\n", + " print(address_info, \"\\n\")\n", + "\n", + " @ray.remote\n", + " def ray_train_store_brand(train, test, store, brand, split):\n", + " return train_store_brand(train, test, store, brand, split)\n", + "\n", + " # Create an empty df to store predictions\n", + " result_df = pd.DataFrame(None, columns=[\"predictions\", \"store\", \"brand\", \"week\", \"round\", \"actuals\"])\n", + "\n", + " for r in range(N_SPLITS):\n", + " print(f\"{datetime.now().time()} --- Round \" + str(r + 1) + \" ---\")\n", + "\n", + " # Process training data set\n", + " train_df = train_df_list[r].reset_index()\n", + " train_filled = process_training_df(train_df)\n", + "\n", + " # Process test data set\n", + " test_df = test_df_list[r].reset_index()\n", + " test_filled = process_test_df(test_df)\n", + "\n", + " store_list = train_filled[\"store\"].unique()\n", + " brand_list = train_filled[\"brand\"].unique()\n", + "\n", + " if STORE_SUBSET:\n", + " store_list = store_list[0:20]\n", + "\n", + " # persist input data into Ray shared memory\n", + " train_filled_id = ray.put(train_filled)\n", + " test_filled_id = ray.put(test_filled)\n", + "\n", + " # train for each store/brand\n", + " print(\"Training ARIMA model ...\")\n", + " results = [\n", + " ray_train_store_brand.remote(train_filled_id, test_filled_id, store, brand, r)\n", + " for store, brand in itertools.product(store_list, brand_list)\n", + " ]\n", + "\n", + " result_round = pd.concat(ray.get(results), ignore_index=True)\n", + "\n", + " result_df = result_df.append(result_round, ignore_index=True)\n", + "\n", + " # Stop Ray\n", + " ray.shutdown()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "If Ray is not installed, we will train all the models sequentially as follows. The training time could be several times longer compared with training the models in parallel with Ray." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 16.2 ms, sys: 13 µs, total: 16.2 ms\n", + "Wall time: 15.4 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "if not module_exists(\"ray\"):\n", + " print(\"Ray is not available. Sequential training will be used. \\n\")\n", + " \n", + " from tqdm import tqdm\n", + " \n", + " # CHANGE to False to model across all stores\n", + " subset_stores = True\n", + "\n", + " # Create an empty df to store predictions\n", + " result_df = pd.DataFrame(None, columns=[\"predictions\", \"store\", \"brand\", \"week\", \"actuals\", \"round\"])\n", + "\n", + " for r in tqdm(range(N_SPLITS)):\n", + " print(\"-------- Round \" + str(r + 1) + \" --------\")\n", + "\n", + " # Process training data set\n", + " train_df = train_df_list[r].reset_index()\n", + " train_filled = process_training_df(train_df)\n", + "\n", + " # Process test data set\n", + " test_df = test_df_list[r].reset_index()\n", + " test_filled = process_test_df(test_df)\n", + "\n", + " print(\"Training ARIMA model ...\")\n", + " store_list = train_filled[\"store\"].unique()\n", + " brand_list = train_filled[\"brand\"].unique()\n", + "\n", + " if subset_stores:\n", + " store_list = store_list[0:10]\n", + "\n", + " for store, brand in itertools.product(store_list, brand_list):\n", + " combined_df = train_store_brand(train_filled, test_filled, store, brand, r)\n", + " result_df = result_df.append(combined_df, ignore_index=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Note that since `auto_arima` model makes consecutive forecasts from the last time point, we want to forecast the next `n_periods = GAP + HORIZON - 1` points, so that we can account for the GAP, as described in the data setup.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model evaluation\n", + "To evaluate the model, we will use *mean absolute percentage error* or [MAPE](https://en.wikipedia.org/wiki/Mean_absolute_percentage_error)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE values for each forecasting round:\n", + "round\n", + "1 59.98\n", + "2 77.02\n", + "3 62.05\n", + "4 73.62\n", + "5 68.83\n", + "dtype: float64\n" + ] + }, + { + "data": { + "application/scrapbook.scrap.json+json": { + "data": 68.29505356232335, + "encoder": "json", + "name": "MAPE", + "version": 1 + } + }, + "metadata": { + "scrapbook": { + "data": true, + "display": false, + "name": "MAPE" + } + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overall MAPE is 68.30 %\n" + ] + } + ], + "source": [ + "mape_r = result_df.groupby(\"round\").apply(lambda x: MAPE(x.predictions, x.actuals) * 100)\n", + "\n", + "print(\"MAPE values for each forecasting round:\")\n", + "print(mape_r)\n", + "\n", + "metric_value = MAPE(result_df.predictions, result_df.actuals) * 100\n", + "sb.glue(\"MAPE\", metric_value)\n", + "\n", + "print(f\"Overall MAPE is {metric_value:.2f} %\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The resulting MAPE value is relatively high. As `auto_arima` searches a restricted space of the models, defined by the range of `p` and `q` parameters, we often might not find an optimal model for each time series. In addition, when building a model for a large number of time series, it is often difficult to examine each model individually, which would usually help us improve an ARIMA model. Please refer to the [quick start ARIMA notebook](../00_quick_start/auto_arima_forecasting.ipynb) for a more comprehensive evaluation of a single ARIMA model.\n", + "\n", + "Now let's plot a few examples of forecasted results.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAARRCAYAAADQPHLpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdeXxdVb3//9cnTZvTIWla2qQpBVq1AiKUoWARRLAKRUW4fkHEARClilzH63zlFsXx6g8Vr8K3X0FAGRQEwSuCDBaU0SKojFKgQEmadExS2pM2yef3x1o7PTk9GU5ykpPkvJ+PRx4n2XvttdfeOcPen/NZa5m7IyIiIiIiIiIykpUVuwEiIiIiIiIiIn1RAENERERERERERjwFMERERERERERkxFMAQ0RERERERERGPAUwRERERERERGTEUwBDREREREREREY8BTBERIaImc01Mzezy7OWXx6Xzx2i/R4d6z9/KOovBWZ2fjyHRxdh31VmdpGZrTaz9tiOA4e7HYVkZrPM7AozW2NmHfGYqovdrlLR03vRMLfBzWxFsfY/muhciYj0rLzYDRARGQwz86xFncAm4B/Ape5+1fC3amjFwMfzwBXufmZRG1Ni4vPtbnc/egh389/AR4H/BX4BdABrh3B/w+Fy4FjgGmAV4EC6mA2SwjKz1QDuPre4LRERkbFMAQwRGSu+Fh/HA3sDJwHHmNkh7v7Z4jUrpy8D3wFeHqL6HwL2BdYPUf0ytN4J/MvdTyh2QwrBzCYAbwPucPf3F7s9UjT7AluL3YhRQudKRKQHCmCIyJjg7udn/m1mi4HbgU+b2UXuvroY7crF3RuAhiGsfyvw1FDVL0NuNnBPsRtRQLMIXVbri90QKR5313tSP+lciYj0TGNgiMiY5O53Em7iDTgUuvcDN7PXmtmvzKzJzDozxzows+lm9m0ze9LMtplZs5ndaWbH5tqXmVWa2YWxf3/azJ4ys8/Sw3tsb2NgmNlhsV0vm1mbmTWY2R/N7D1x/fmE7iMAZ8R6kp8zY5kex8Aws/lmdmWsf7uZ1ce/5+co2zUOhJmdbGYPmdlWM9toZtea2e49nf8cdZ2ZtNHMlpjZinhePavcPvH8vBSPv9HMrjazvXPUWWtm3zezp83sFTPbHH+/3MxelWvfPbStz/7mSR3xzzdnnffzM8q9Kz5XGmL7683sbjP7eD/O0Yq4D8vax4qMMmVm9jEz+6uZbYnH/VczO8fMdnm+JdtbGIPiZ/H/3tHTucjYboKZ/buZ3WJmL8Rj2Whmd5jZ8X0dS0Y9q4EX4p+Zz9fLs8qdZmZ/MrNN8TX0pJl91cwqssrVm9maHPt5IdZ7Xtbyt8flX+9HW83MzjCz+8xsXWzHS2Z2m5mdmlX2GDNbbmZPmFmLhfeJx8xsmZmlctSd+Vo6zcwejq+legvvHRWx3Fvi/6slnotfmNluuc5r/JlqZv8T/6/p2J5Pmpn1dbwZdU0ysy+b2aPx+bTFzO43s9P6uf3R8Xm7F7BX1mvj8oxyu7zOCn1eYtk58Zw8F5+3G8zsZjM7tL/nJNbT79ey5fGZYf14L8x1ruLycjP7uJk9EM/FVjN7xMJrNdfrf8DvRyIiI5UyMERkLEsu4rPHyXg18CDwL+AqYCLQAmBmewErgLnAn4FbgcmEtP5bzeyj7v7/unYQLrDvJARJ/h7rqwbOA96cV2PNzgYuJox5cDPwDFADLAQ+Dvw6tq0a+FTc328zqni0j/oPBe4AKmP9TwD7AO8HTjSzxe6+MsemHwfeFbe5G3gDcCqwwMwOdPe2PA7zZGAJ8AfgEsJ5Ttq3BLiB0A3od4SxEuYA7wbeYWbHuPvfYtlJwL2E/+XtsbwRbqJOBK4HnsujXX15lNBNaRnhhvzyjHUrYpuWAv+XMF7F7whdeGqAA4APAT/tYx+Xx7qy97E6o8wvgPcBLwE/Izy3/y3WfSThf5ltOvAAsIVwfjuBxj7aMh34EXAf4fyuA+qAE4BbzOxsd/9ZH3UA/JDwP85+vnY9V83sUuAsYE1s32ZgEXABsNjM3ubu7bH4XcD7zWyf5FtqM3sNsGdcvzhul3hLfLyzH239JqF71/OE11pzPOZDgVOAX2WU/SLhtXMf8HsgBRwBnA8cbWZvdfeOHPv4BHB8PA8rCOOCfAaYbmY3AdfG+pYDbwQ+AMyI22SbQHg9V8ftJgD/h/B/2xs4t68DtjCQ6l3AQcDfgMsIgdfjgKvNbD93/2of1awmvDY+Hf/+Yca6Xt+TMhTkvJjZwcAfCc/f2wjPpxmELoV/MbN/c/db+mpMPq/lfD8zMvT4XthDm5L3xeOAp4GrCePIHAP8mPC+/MGBHIOIyKji7vrRj370M2p/CDdwnmP5Wwk3ap3AXnHZ3KQ88K0e6lsRt3lv1vJqwsX4NqA2Y/lXYn2/Acoyls8DNsZ1l2fVdXlcPjdj2euAHXGb/XK0a07G73Nz1Zux/ui4/vyMZQY8GZe/P6v8qXH5U1nHcH5c3gLsn7XN1XHde/r5fzozlu8EluRYP40w+Op64HVZ6/Yj3Hz/LWPZCbG+H+SoawJQmWPfZ/byHFqRtSw59qP7Kpux7mGgDajJsW5Gns/pXfYBnBbX/Q2YkrF8MrAyrntfrtcHcCVQnkcbKjKfcxnLpwKPxefpxH7W1ePzNeN/c0N2fRn/g09lLDsrLjs3Y9lH47I/xvM/KWPdI4SxBCb0o50bCEGUSTnWzcj6+1WA5Sh3QWzLqT0cSzOwb9Z5fpwQtNwAvDljXRkheOTAgVn1rY7L/wJUZCyfDjwb1x3V1/+Ane9FX8haniLciHdm77uX87caWJ3P87qQ54Xwpdwqwk39m7P2M5sw5lBD5vnqpa39fi2T/2fGmfTyXtiPc/VjYFzG8nHApXHdiQM5Bv3oRz/6GU0/6kIiImNCTEU+38y+aWbXEy6+Dfihu7+QVbyRnYN+ZtaxgJA18Rt3vzZznbtvJnwzniJ8y5n4EOFC9Avu3plR/nngojwO4RzCBfgF7v549kp33yVtPk9vJHxjfL9nzczi7r8i3AjtTfgWP9tF7v7PrGXJN4qH5dmOm9z91hzLTydc8C9z9yey2vd43N9BZva6rO22ZVfk7tvdvTXPdhVKOyEQ1Y27F2JA1bPi45fcfUtG3a8QMgIAPpJju+3A53xnFkOf3L0t13PO3ZsJ39JPI3bNGqRPEc7ZWe6e/b+8gHDzmplVkmRSLM5YthhoIrzeJhCfw7GLwQLgL+6+vZ/t2UG4ae4m+//n7s+5e3ZmF+zMPjiuh/ovcvcnM+ppI2R2lAG/d/e7M9Z1Ar+Mfy7oob4ve0YGlLtvZGcGyod62AboOj8fAFa6+39nrnP3NOE5ZYSMn6FWiPPyDkJG1o8zy8dt6gmz+8yi+3OnN32+lgf4mZHo6b1wF7F7yL8Tsik+4xnZPfH3/yAGp/M9BhGR0UZdSERkrFgWH52Qgv5nwjSqv8xR9u+eu9vD4fFxquUYPwKYGR/3hTD2BfAa4CV3fzZH+RUZ7erLovj4h36Wz9fB8fGuHtbfRbjxO4hdB5DM1a3kpfg4Lc92PNTD8uTcL+jh3L82Pu5L6PpyN+Eb1S/FtPFbCF1KHvXcqfvD4Srg/wMeN7NfxTbe6+7rClT/wYRg2Yoc6+4m3HgflGPdandvyndnZrYf8HngKEJXiuyxHfo9BkoP9U8i3ICuJwy2m6tYG/H1BuDuL5jZc4QZhsqIWTKErhR3E27YFhOyMY4h3ID39JzPdhWhK8PjZnZdrO/+GLTJbvtkQvDl3wjPzUp2dlmDns9NrtdSMrjpwznWJTMVzcmxrp3QhSXbiviY67mQ6VDCt/c5x8shdOWCjPM/hApxXpL3kL16OJ5knJ99Ce8Xvenvazmvz4wsPb0X5vJaYDdCt8Kv9vBa2Za1n6F+PxIRKQoFMERkTHD3fg9aR/gWK5dkULi3xZ+eTImPU+NjT+MJ9LSfXKrj41BNrZq0tafZT5Ll1TnWbc6xLPk2f1ye7ejr3J/dx/ZTANy9xcwWETJp3sXOb7zXm9lPgW+4+y7fPA4ld7/QzNYTxgz5JGFMADezu4HPe+7xRfIxFdiYK5vA3dvjvmtybJfP8xCAeG7vIlwn3EkY/6SF2KWAMM5IRY8V9M80wk3/TPof6CO252xCQGdH3P5Od281s7+y8xv2xRnl++MzhO4XZwFfij/tZnYL8B/uvgq6xiK4i5B99BghU2AdO7/pXkbP52aXYAg7X0u9rRufY936HoJ1yf97ao51mZLX3KH0nk0zpZd1hVKI85Iczyl97KvP48njtZzvZ0amfF6XyX7m0/trpWs/w/B+JCJSFApgiEgpypX6DTsvlD/l7v3p/pGUr+1h/aw82pQECXZnaKZATdraU5vqssoNlb7O/QJ3/0e/KgpdHD5s4evI1xEGbDwX+C9C6nkyI0XStWeXz7w4iGHBuPuVwJWx3jcSvqE/C7jNzPYdSCZEhmbCoIbjs4MzZlZOGKywJVezBrCvrxIGtz3G3Vdk7evLhADGYCX/80fc/eBeS3Z3FyGA8VZC95hkWfL4ZTObTghgNBPGDOlTDAb8CPiRmdUQMpLeS7gh3i8OaNlGOPbDgCvc/czMOsysjvyCMYMxw8zG5QhiJK/xvl7LyfofuPtnC9u0okiO50R3v3mwlfXztZzvZ0a3XeRRNtnPje7+7n7vYGjfj0REikJjYIiI7PRAfHxTfwrHcRZWAbub2atzFDl6APvuzxSVyQ1LPtkPj8THo3tYnyzv183eEMjr3Gfy4HF3/zE7vwU9KaPIpvi4R47NF+a5u076cd7dfbO73+LuZxMGSpzOAI4tyyOEz+2jcqw7KrarUP+/1xCyPVbkWPfmQuwgjuPxOCE4MD2PTe8i3PwtJgStnotjzkDItigjzMYwnzAQYt5dity9yd1vcPf3xP29Gnh9XP2a+PibHJsW5Nz0UznhpjTb0fHxkRzrMj1EeD4P9nmZ6CD/jKxCGvB7SG/6eC0PyT5zeIo4O0/MAMrLEL0fiYgUhQIYIiJRTKn9M/BuMzsrVxkz2z9+O5v4OeG99LuxT35Sbh4hbbe/LiakRZ+XY6BKzCyzr/cmwg3cntnlenEvYeq9I83s5Ky6TybcAP+LMJhnMfyccIG+zMx2GRjUzMrM7OiMv19vZnNz1JNkw2zNWLaScKP2vjjuQlLHdMLAfvnYQO5ACGa2JGZCZEueL1tzrMvHZfHx21nHMQn4Tvzz0kHuI7GakO1xQOZCM/swPQ9QORAXEgbevCxXNoyZTYtjnHSJ3xo/Tpi29Ci6dxG5jzALxVfi3/0a/8LMKsxssWUNLhBvFpPgSvL/Wx0fj84q+yrgu/3ZXwF9O07lnLRhOiF7BsJrqkfxPF4FLDSz83I9d83s1fG9rD82ADPNbGI/yxfaTYQuQOea2dtzFTCzwzNfOz3p72t5gJ8ZeYsD8P6YkCl3Ua5zbGZ1mZ8dw/B+JCJSFOpCIiLS3fsINz2XmtkngQcJN9ZzgAMI38IeTpj1AMIgaScRRpn/m5ndRuh7fiphMMx39Wen7v6EmX0cuAR4xMxuIgzYthshS6CVMCgh7r7FzB4E3mRmVxECDx3AzT11v3B3N7MzCNMP/irW/xRh5pGTYv2nZ86kMpzcfUMMpNwIPGBmdxJuUjsJgZrDCeciGUjyrcCFZnYf4TiaCP+jE+M238uouyGepw8Cj5rZ74Eq4O2E/1Ffgx1muhN4r5n9jjC4YDtwj7vfA1wLpM3sL4SbXCN8y3loLHtHPuckm7tfbWYnAu8hDMz3W0Ig6yTCtL2/zp5hZhB+SAhU/MXMfk1IYV9I6FZxPXByL9v2m7tfZmaHEPrpPxtfPy8SggbzCAGKnwMfy9r0TnZmRHQFMNy9zczuJf/xLyYS/j+r42vrBcJz7W2EgRFvzpgl43eEzKvPmtn+hEyHPYF3Ar8nv8DiYDQQxtp4zMxuJowHcTLhJven8TnZl38nZKp8HfhgfO42EqYd3Zfw3D0NeL7HGna6M5a/1czuIQzA+nd3/11eRzVA7r7DzN4N3Ab8Pr43PEq4Ud8jtu1VhPPT1817Pq/lfD8zBuoCwqC3HwNOMLO7CGMm1RD+h0cA/0kY5DjfYxARGTUUwBARyeDua+IN1ScIQYn3E9Ki1xIuDH8M/DOjfJuZvRU4nxC0+BThYvEbhJvxfgUwYl3/z8weAz5H+Hb3JMIMDf8AfpZV/IPAD4AlhBsMA9bEsj3V/6CZHUr4hvatwAmx/msI07c+3d+2DgV3vzN+4/85ws3zmwhjHNQTbhAyU/ZvI9xkH0UIWlQRbuhuBy509+zZGc4m3JidRhgn40XCtJvfIwQE+utT7Oy+8HZC9s3XCIGQL8V2HxzXpQk3wl8ELi7QoKKnEWYTOAv4aFz2JCGQdnEB6gfA3W81sxMIz5VTCQGyhwhBtFdRoABG3Ne5ZvYHwo3ZWwkDyW4k/I++x84pMzPdyc7/xZ9yrFsMNHqOKYl7kExFewyhW0YS1HuWMMVxkv2Cu79iZm8hZL0cTXiePke4wbyQcL6Gw3bC+foWYayOGbEd3yG8T/UpDob7ZmAp4Ub8/xACN42EAOpnCK+p/vgG4X93AuFmehxwBSHgMyzc/R8Wpjb9LCGglExz3UAINC0jvOf1pd+v5Xw/MwZxbDvM7CTC1LdnxuObQhhA9nnCmD+ZAczheD8SERl25jmnMRcRERGRkcjMVgO4+9zitkRERGR4aQwMERERERERERnxFMAQERERERERkRFPAQwRERERERERGfE0BoaIiIiIiIiIjHjKwBARERERERGREU8BDBEREREREREZ8RTAEBEREREREZERTwEMERERERERERnxFMAQERERERERkRFPAQwRERERERERGfEUwBARERERERGREU8BDBEREREREREZ8RTAEBEREREREZERTwEMERERERERERnxFMAQERERERERkRFPAQwRERERERERGfEUwBARERERERGREU8BDBEZFczsaDNbU6r7FxERkcEzs9Vm9tZS3b/IaKcAhkgJMbPzzeyXw7i/uWbmZrYl4+e8jPXfN7NnzKzVzJ4ys9OHq22FZmZvNLOH4rH8w8yOLHabREREhttIu9YYjcxsQrwu0hcnIlnKi90AERk9zKzc3dsHsGl1D9u9ApwA/As4FLjVzFa5+32DaSeAmY1z947B1tPPfU0HbgbOAW4ATgN+Z2avcvdNw9EGERGRsWAIrjWK0ZbB+jzQBEwpwr5FRjRlYIiMQWb2RTN7OWYDPG1mi81sCfAV4NT47cTfY9nZZnazmW00s1VmdnZGPeeb2fVm9kszawHONLMyM/uSmT1rZhvM7NfxBj5v7r7M3Z9y9053fxD4M3B4H8f2FTNbH1Mw35+x/HIzu9jMbjGzV4BjzOwdZvaImbWY2Utmdn5G+eQbmzPM7MVY539mrJ8Y69xkZk8QAiw9eSPQ6O7XuXuHu/8SWAe8eyDnRUREZKQbLdcaPTjUzJ6In/E/N7NUbMvRZrYmHtta4OdmNs3M/tfM1sXy/2tmczLav8LMLjCze+O5+KOZzchY/0EzeyEex3/maEs3ZjYP+ADw7QIer8iYoQCGyBhjZnsD/w4c6u6VwHHAane/FfgW8Ct3n+LuC+Im1wBrgNnAycC3zGxxRpUnAtcD1cBVwCeBk4A3x202AT/po1kvxAuCn2d+qGe1eyIhSPB4L/XMAmYAuwNnAMvj8SbeB3wTqAT+QsjwOD22/R3AOWZ2UladRwJ7A4uB/zKzfePyZcCr489xcX89sfiTvez1vWwjIiIyKo3Wa40M749tfjXwWuCrGetmAdOBvYClhPuln8e/9wS2Af+TVd/7gA8BNcAE4HMAZvY64GLgg/E4dgPm0LsfE4JA2/ooJ1KSFMAQGXs6gArgdWY23t1Xu/uzuQqa2R6EG/gvunva3R8Ffkb4oE3c7+6/jVkS24CPAv/p7mvcvQ04HzjZzHJ1SVtPCErsBRxCCCxc1UO7LwH+DtzWx/Gd5+5t7n438HvgPRnrbnL3e2Nb0+6+wt3/Gf/+B+EC6s1Z9X3N3be5+9/j/pOLrfcA33T3je7+EnBRL226D5htZqeZ2XgzO4NwUTSpj2MREREZjUbrtUbif9z9JXffSPji47SMdZ3Asnitsc3dN7j7b9x9q7u3xvLZ1xI/d/d/xbb/GjgwLj8Z+F93vycex3mx/pzM7N+Acne/sY/2i5QsBTBExhh3XwV8mvBh32Rm15rZ7B6KzwY2xg/kxAuEDIfES1nb7AXcaGabzWwz8CThQqY2R1u2uPtKd29390bCtzXHmllVZjkz+x4hW+E97u69HN4md38lq62Zx9atrWb2BjP7U0z7bAY+RsjgyLQ24/et7OxvOjurvhd6apS7byB8e/RZoBFYAtxB+LZJRERkTBmN1xpZsj/fM9u+zt3TyR9mNsnM/m/sBtIC3ANUm9m4jG36dS0Rr2E25GqQmU0G/hv4RC/tFil5CmCIjEHufrW7H0m4AHDgu8mqrKL1wHQzq8xYtifwcmZ1Wdu8BBzv7tUZPyl3f5m+JXV1dbcws68BxwPHuntLH9tPix/wmW2t76WtVxMG19zD3acSsjyyu3r0pAHYI2tfPXL3u939UHefTvhWaW/goX7uS0REZFQZTdcaOWR/vvd2LfEfhM/0N7h7FXBUP+pPdLuWMLNJhG4kucwH5gJ/juNv3ADUmdlaM5vbj32JlAQFMETGGDPb28zeYmYVQJrQhzKZjaMRmGtmZQCxa8R9wLfNLGVmBwAfpvfUy0uAb5rZXnF/M83sxB7a8obYnjIz243QDWOFuzfH9V8m9Bt9W8xi6I+vWZhe7E3AO4HreilbSfjWJ21mh8V99devgS/Hwbvm0Mc3ImZ2UOw+UgV8H1jj7n11hxERERl1RtO1Rg/ONbM5cWDQrwC/6qVsZTy+zbH8sl7KZrseeKeZHWlmE4Cv0/P912OEYMeB8ecjhHN5ILtmqIiULAUwRMaeCuA7hD6hawkDSn0lrktu9jeY2d/i76cRIv71wI2Efp+391L/jwhZDX80s1bgAeANPZR9FXAr0Er4YG6jez/TbxG++XjGds7d/pVdq+myljCQVz3hwudj7v5UL+U/Dnw9tvO/CEGJ/voaIa30eeCPwC/6KP8Fwjl/CagD/i2PfYmIiIwmo+laI5erCZ/tz8Wfb/RS9ofARMKxPhD31S/u/jhwbtxfA+EaJmf30tgFZm3yA2wEOuPfwzItvMhoYL13NxcRERERERERKT5lYIiIiIiIiIjIiKcAhoiIiIiIiIiMeApgiIiIiIiIiMiIpwCGiIiIiIiIiIx45cVuwHCbMWOGz507t9jNEBERGTMefvjh9e4+s9jtKAZdV4iIiBReT9cWJRfAmDt3LitXrix2M0RERMYMM3uh2G0oFl1XiIiIFF5P1xbqQiIiIiIiIiIiI54CGCIiIiIiIiIy4imAISIiIiIiIiIjXsmNgSEiIqVlx44drFmzhnQ6XeymjHqpVIo5c+Ywfvz4YjdFRESkaHRtUTj5XlsogCEiImPamjVrqKysZO7cuZhZsZszark7GzZsYM2aNcybN6/YzRERESkaXVsUxkCuLdSFRERExrR0Os1uu+2mC4xBMjN22203fdskIiIlT9cWhTGQawsFMEREZMzTBUZh6DyKiIgE+kwsjHzPowIYIiIiIiIiIjLiKYAhIiIygqxYsYL77rtvUHVMmTKlQK0RERGR0W4sXVtoEE/ZxW8feZnv3fY09Zu3Mbt6Ip8/bm9OOmj3YjdLRGRYFPs9cMWKFUyZMoU3vvGNw7bP0cTMPgN8BHDgn8CHgDrgWmA68Dfgg+6+3cwqgCuBQ4ANwKnuvjrW82Xgw0AH8El3vy0uXwL8CBgH/MzdvzN8RyciUtqK/Rk8VIp9XGPp2kIZGNLNbx95mS/f8E9e3rwNB17evI0v3/BPfvvIy8VumojIkBvK98CTTjqJQw45hP3224/ly5cDcOutt3LwwQezYMECFi9ezOrVq7nkkkv4wQ9+wIEHHsif//xnzjzzTK6//vquepJvQLZs2cLixYs5+OCD2X///bnpppsG3caRzsx2Bz4JLHT31xOCDO8Fvgv8wN3nA5sIgQni4yZ3fw3wg1gOM3td3G4/YAnwUzMbZ2bjgJ8AxwOvA06LZUVEZIiN1fsQXVsUljIwpJvv3fY023Z0dFu2bUcH37vt6TER/RSR0va13z3OE/UtPa5/5MXNbO/o7LZs244OvnD9P7jmoRdzbvO62VUsO2G/Pvd92WWXMX36dLZt28ahhx7KiSeeyNlnn80999zDvHnz2LhxI9OnT+djH/sYU6ZM4XOf+xwAl156ac76UqkUN954I1VVVaxfv55Fixbxrne9qxQGFSsHJprZDmAS0AC8BXhfXH8FcD5wMXBi/B3geuB/LJygE4Fr3b0NeN7MVgGHxXKr3P05ADO7NpZ9YoiPSUSk5I3W+xBdWwwvBTCkm/rN2/JaLiIylmRfYPS1PB8XXXQRN954IwAvvfQSy5cv56ijjuqa93z69Ol51efufOUrX+Gee+6hrKyMl19+mcbGRmbNmjXoto5U7v6ymX0feBHYBvwReBjY7O7tsdgaILnS3R14KW7bbmbNwG5x+QMZVWdu81LW8jcMwaGIiEiWsXofomuLwlIAQ7qZXT2Rl3O8ScyunliE1oiIFFZf32Yc8Z27cr4H7l49kV999PAB73fFihXccccd3H///UyaNImjjz6aBQsW8PTTT/e5bXl5OZ2d4SLH3dm+fTsAV111FevWrePhhx9m/PjxzJ07N6951EcjM5tGyIiYB2wGriN098jmySY9rOtpea6utZ69wMyWAksB9txzzz7bLSIifRut9yG6thheGgNDuvn8cXszflz367qJ48fx+eP2LlKLRESGz+eP25uJ48d1W1aI98Dm5mamTZvGpEmTeOqpp3jggQdoa2vj7rvv5vnnnwdg48aNAFRWVtLa2tq17dy5c3n44YcBuOmmm9ixY0dXnTU1NYwfP54//elPvPDCC4Nq4yjxVuB5d1/n7juAG4A3AtVmlnwpMweoj7+vAfYAiOunAjjKhZUAACAASURBVBszl2dt09Pybtx9ubsvdPeFM2fOLNSxiYiUtKH6DC42XVsUlgIY0s1JB+3OcfvVdv29e/VEvv3u/Ud0vzMRkUI56aDd+fa792f36okYhXsPXLJkCe3t7RxwwAGcd955LFq0iJkzZ7J8+XLe/e53s2DBAk499VQATjjhBG688caugbbOPvts7r77bg477DAefPBBJk+eDMD73/9+Vq5cycKFC7nqqqvYZ599Bnv4o8GLwCIzmxTHslhMGJ/iT8DJscwZQDLq2M3xb+L6u9zd4/L3mlmFmc0D5gMPAX8F5pvZPDObQBjo8+ZhOC4RkZJ30kG7c/4JO8dNrqmsGBP3Ibq2KCwLn+OlY+HChb5y5cpiN2NEO++3j/GLB16gsqKcf37tuGI3R0RkUJ588kn23XffYjdjzMh1Ps3sYXdfOBz7N7OvAacC7cAjhClVd2fnNKqPAB9w9zYzSwG/AA4iZF68N2OAzv8Ezor1fNrd/xCXvx34IWGGk8vc/Zu9tUfXFSIihfP8+lc45vsrALjyrMM46rUjM8tN1xaFlc+1hcbAkF00NId+Tq1t7bSmd1CZGl/kFomIiATuvgxYlrX4OXbOIpJZNg2c0kM93wR2CU64+y3ALYNvqYiI5KuxJZ3zd5GEupDILta27BxkZm2z3jhERERERGToNbW25fxdJKEAhuyiYXOa+TVTAKhXAENERERERIZBU8y6mDCuTBkYkpMCGNJNekcHG17ZzsF7TgNgbfPonndZRERERERGh6bWNirKy5g7Y5ICGJKTAhjSTfJGceCe1ZhB/Wa9cYiIiIiIyNBrbElTU1VBbVWKxhZ1IZFdKYAh3SQDeO4xbRIzp1TQoAwMEREREREZBo0taWorU9RWpbq6k4hkUgBDukkCFrOmpqibmuoKaIiIyMgxZUocp6i+npNPPrnXsj/84Q/ZunVrXvWvWLGCd77znQNun4iIyEA0tbbFDIwKmlrb6Oz0YjepZIyWawsFMKSbJGBRNzVF3dSJCmCISGlqaIA3vxnWrh22XXZ0dOS9zezZs7n++ut7LTOQiwwREZFiaGppoyZmYLR3Ohu3bi92kwpH1xYFoQCGdLO2OU1VqpzJFeXUVado2LwNd0U+RaTEXHAB/OUv4bEAVq9ezT777MMZZ5zBAQccwMknn8zWrVuZO3cuX//61znyyCO57rrrePbZZ1myZAmHHHIIb3rTm3jqqacAeP755zn88MM59NBDOe+887rV+/rXvx4IFymf+9zn2H///TnggAP48Y9/zEUXXUR9fT3HHHMMxxxzDAB//OMfOfzwwzn44IM55ZRT2LJlCwC33nor++yzD0ceeSQ33HBDQY5bRESkv15pa2dLWzu1VSlqKlMAY2sgT11bFOS4ywtSi4wZ9ZvTzK6eCIQsjFe2d9Da1k5VanyRWyYiUiBHH73rsve8Bz7+cdi6FRYvhocegs5OuOQSeOQRWLoUzjwT1q+H7LTKFSv6tdunn36aSy+9lCOOOIKzzjqLn/70pwCkUin+8pe/ALB48WIuueQS5s+fz4MPPsjHP/5x7rrrLj71qU9xzjnncPrpp/OTn/wkZ/3Lly/n+eef55FHHqG8vJyNGzcyffp0LrzwQv70pz8xY8YM1q9fzze+8Q3uuOMOJk+ezHe/+10uvPBCvvCFL3D22Wdz11138ZrXvIZTTz21nydTRESkMJpaw6CdNZWhCwmEjIz9ZhezVf2ka4thu7ZQAEO6WduyjVlTQ8SzbmoIZDRsTlM1SwEMESkRL7wASeaZe/i7APbYYw+OOOIIAD7wgQ9w0UUXAXR9oG/ZsoX77ruPU045pWubtrZwMXfvvffym9/8BoAPfvCDfPGLX9yl/jvuuIOPfexjlJeHj/bp06fvUuaBBx7giSee6GrH9u3bOfzww3nqqaeYN28e8+fP72rf8uXLC3LcIiIi/ZEM2llbFbqQwBjKwNC1RcGuLRTAkG4aNqfZf/epAMyuDm8c9c3b2HtWZTGbJSJSOL19q9HcDJs2db/I2LQJliwJf8+Y0e9vRbKZWc6/J0+eDEBnZyfV1dU8+uij/do+m7v3q8zb3vY2rrnmmm7LH3300T63FRERGUqNSQZGVQUzK0MGxqiZSlXXFsN2baExMKRLekcHG17Z3pV5MSs+rtVAniJSKi64IKR3ZuroKEh/1RdffJH7778fgGuuuYYjjzyy2/qqqirmzZvHddddB4QLgr///e8AHHHEEVx77bUAXHXVVTnrP/bYY7nkkktob28HYOPGjQBUVlbS2toKwKJFi7j33ntZtWoVAFu3buVf//oX++yzD88//zzPPvtsV/tERESGU1cGRmWK8ePKmDFlAo2tY+A+RNcWXe0rBAUwpEtTjHAmXUhqKysoM2jYvK2YzRIRGT733w/bs0Y8374d7rtv0FXvu+++XHHFFRxwwAFs3LiRc845Z5cyV111FZdeeikLFixgv/3246abbgLgRz/6ET/5yU849NBDaW5uzln/Rz7yEfbcc08OOOAAFixYwNVXXw3A0qVLOf744znmmGOYOXMml19+OaeddhoHHHAAixYt4qmnniKVSrF8+XLe8Y53cOSRR7LXXnsN+nhFRETy0dTaxoTyMqomhk4CNZWprqDGqKZri4JeW1ipzTCxcOFCX7lyZbGbMSI98NwG3rv8AX754Tdw5PwZACz61p0cOX8G3z9lQZFbJyIyME8++ST77rtvUduwevVq3vnOd/LYY48VtR2FkOt8mtnD7r6wSE0qKl1XiIgUxqevfYSHX9zEn7/wFgA+9POHWL9lO7/7xJF9bDn8dG1RWPlcWxQlA8PMPmNmj5vZY2Z2jZmlzGyemT1oZs+Y2a/MbEIsWxH/XhXXz82o58tx+dNmdlwxjmUsSbqKJBkYye/qQiIiIiIiIkOpsaWta/pUCIN5jplBPKVghj2AYWa7A58EFrr764FxwHuB7wI/cPf5wCbgw3GTDwOb3P01wA9iOczsdXG7/YAlwE/NbNxwHstYU98cuorUZQQwZlenupaLiMjAzJ07d0x8QyIiIjJUmlrTXdOnAtRUpVi/pY32js5etipdpXptUawxMMqBiWZWDkwCGoC3ANfH9VcAJ8XfT4x/E9cvtjCc6YnAte7e5u7PA6uAw4ap/WPS2uY0ValyJlfsnJxmVtVEGjanKbWuRiIytug9rDB0HkVEZKg07ZKBUUGnw4ZXtveyVfHoM7Ew8j2Pwx7AcPeXge8DLxICF83Aw8Bmd2+PxdYAu8ffdwdeitu2x/K7ZS7PsY0MQENzumsGksTs6hTbdnTQsq29h61EREa2VCrFhg0bdKExSO7Ohg0bSKVSfRcWERHJw9bt7bS2tVOTkYFRG4MZI7Ebia4tCmMg1xblfRcpLDObRsiemAdsBq4Djs9RNHk25Jo81ntZnmufS4GlAHvuuWeeLS4dDc3bqKvu/uRJAhr1zduYOml8MZolIjIoc+bMYc2aNaxbt67YTRn1UqkUc+bMKXYzRERkjElmQ8weAwPC2Bgjja4tCiffa4thD2AAbwWed/d1AGZ2A/BGoNrMymOWxRygPpZfA+wBrIldTqYCGzOWJzK36cbdlwPLIYwWXvAjGiPWNqfZf/ep3ZYlA3qubU6zb11VMZolIjIo48ePZ968ecVuhoiIiPQgybLIHAMj+X0kZmDo2qJ4ijEGxovAIjObFMeyWAw8AfwJODmWOQO4Kf5+c/ybuP4uD7k6NwPvjbOUzAPmAw8N0zGMOW3tHazfsj1nFxJAA3mKiIiIiMiQaGoNWRZJ1gXAblMqKDNoGoEBDCmeYc/AcPcHzex64G9AO/AIITvi98C1ZvaNuOzSuMmlwC/MbBUh8+K9sZ7HzezXhOBHO3Cuu3cM68GMIY3N4U0jcwpVCGlc48qMhs164xARERERkcJLsixqKndmYIwrM2ZWVozILiRSPMXoQoK7LwOWZS1+jhyziLh7Gjilh3q+CXyz4A0sQbmmUIXwxlFTWUFDswIYIiIiIiJSeOta25hQXsbUid3H3KutStHYqvsQ2alY06jKCLM2Biiyu5CEZSka1IVERERERESGQGNLmprKCsIIAzvVVKaUgSHdKIAhAF0ZFtkZGAB11ROVgSEiIiIiIkOiqbWt2/gXidqqCo2BId0ogCFAmEK1KlXO5IpdexXVVYUMDM1zLCIixWRme5vZoxk/LWb2aTObbma3m9kz8XFaLG9mdpGZrTKzf5jZwRl1nRHLP2NmZ2QsP8TM/hm3uciyvw4UEZGCSzIwstVWpdjwyna2t3cWoVUyEimAIUDIwMjVfQRCBkZ6Ryebt+4Y5laJiIjs5O5Pu/uB7n4gcAiwFbgR+BJwp7vPB+6MfwMcT5ilbD6wFLgYwMymE8biegNh/K1lSdAjllmasd2SYTg0EZGS1lsGBsC6LepGIoECGAKEDIzsGUgSs6dqKlURERlxFgPPuvsLwInAFXH5FcBJ8fcTgSs9eACoNrM64Djgdnff6O6bgNuBJXFdlbvfH6dsvzKjLhERGQJbt7fTmm5nZo4MjJoY1GhUNxKJFMAQIAziObs6dwAjCWys1TgYIiIycrwXuCb+XuvuDQDxsSYu3x14KWObNXFZb8vX5FguIiJDpCkO0pkzA6MyFcvoPkQCBTCEtvYO1m/Zzqyq3F1IZleH5fUKYIiIyAhgZhOAdwHX9VU0xzIfwPLs/S81s5VmtnLdunV9NVdERHrR1BoCGLnHwAjLNBOJJBTAEBqbwxtCXQ8ZGDOmVFBeZjRsVhcSEREZEY4H/ubujfHvxtj9g/jYFJevAfbI2G4OUN/H8jk5lnfj7svdfaG7L5w5c2YBDkdEpHQl3UNyZWBMmzSB8eNMXUikiwIYQkMc2yLXFKoA48qM2qqUupCIiMhIcRo7u48A3AwkM4mcAdyUsfz0OBvJIqA5djG5DTjWzKbFwTuPBW6L61rNbFGcfeT0jLpERGQIJBkYSbZFprIyo6YypQwM6bLrnJlSchpiYKKnAEayToN4iohIsZnZJOBtwEczFn8H+LWZfRh4ETglLr8FeDuwijBjyYcA3H2jmV0A/DWW+7q7b4y/nwNcDkwE/hB/RERkiDS1pJlQXsbUieNzrq+pqqCpVV+kSqAAhnQFMGb1MI1qWJfiny83D1eTREREcnL3rcBuWcs2EGYlyS7rwLk91HMZcFmO5SuB1xeksSIi0qem1jZqKisIiW+7qq1M8dz6LcPcKhmp1IVEWNu8jcpUOVMqeo5nza6eSENzmnAtKCIiIiIiMniNLemcA3gmaqsq1IVEuiiAIdQ3p5ndS/YFhC4k29s72fjK9mFqlYiIiIiIjHVNrW05B/BM1FSlaN62g/SOjmFslYxUCmAIa5vTzOpl/AvYOT5GgwbyFBERERGRAuk7AyPVVU5EAQyhoXlbrwN4AtTFDA0FMEREREREpBC2be+gNd1OTS8ZGMnsJOpGIqAARslra+9g/ZbtXQGKntRVJxkYmolEREREREQGL5ldRBkY0l8KYJS4xuYQyewrA2PG5ArGjzNlYIiIiIiISEEkWRW9jYFRW6kAhuykAEaJSzIqkgyLnpSVGbVVKRo2KwNDREREREQGrysDo6rnDIyqieVUlJfR1KouJKIARslbGyOZfWVgAMyeOpF6ZWCIiIiIiEgBdGVgVPZ8L2IWvkhVBoaAAhglr35zeCOY1ccYGKFMirUKYIiIiIiISAE0taaZMK6M6knjey1XW1WhAIYACmCUvLXN26hMlTOlorzPsnXVIYDR2enD0DIRERERERnLmlramFlZgZn1Wq6mKkWTZiERFMAoefXN6X51H4HQhWR7RycbXtk+xK0SEREREZGxrqk13TVNam9qK9WFRAIFMErc2uZ0n1OoJmbFQIe6kYiIiIiIyGA1trRR08v4F4naqgpe2d7Blrb2YWiVjGQKYJS4hjwzMADqmzUTiYiIiIiIDE5TSz8zMKo0laoECmCUsLb2DtZvaet3BkYy1aqmUhURERERkcFI7+igJd1OTVXfX6Ym06wqgCEKYJSwZCCc/mZgTJ80gQnjymjQG4eIiIiIiAxCci9SU9n/DAwN5CkKYJSw+phJMaufAYyyMmPW1BQNmxXAEBERERGRgWtsDfcU/cnAUBcSSSiAUcLWxjeA2dX9C2BACHY0aAwMEREREREZhCSboj9jYEypKGfyhHE0KgOj5CmAUcIa4mwis/o5BgbA7Kmpru1EREREREQGIsmm6M8sJBCyMJKsDSldCmCUsIbN26hMlTOlorzf29RVT6SxJU1npw9hy0REREREZCxrbE0zfpwxbdL4fpWvqaqgSV1ISp4CGCUsnylUE3VTU+zocNZvUfqWiIiIiIgMzLqWNmoqU5hZv8rXVqXUhUQUwChlDc3pvLqPAF1TrqobiYiIiIiIDFRja7pretT+CAGMNO7KBC9lCmCUsIbmNLMHkIERttVAniIiIiIiMjBNLW3U9nP8CwjTrba1d9KyrX0IWyUjnQIYJaqtvYP1W9r6PYVqYmcAQxkYIiIiIiIyMI0t+WdgABrIs8QpgFGikmmLZufZhWT65AlUlJcpgCEiIiIiIgOS3tFBS7q9KyjRH10BDA3kWdIUwChRO6dQzS8Dw8yom5qifrO6kIiIiIiISP6SL1NnVuaTgRHKaiDP0qYARolKxrDIdxYSCEGPtcrAEBGRIjCzajO73syeMrMnzexwM5tuZreb2TPxcVosa2Z2kZmtMrN/mNnBGfWcEcs/Y2ZnZCw/xMz+Gbe5yPo7PL6IiPRbU+wGkk8GRk2lMjBEAYySlWRg1FXn14UEQrcTdSEREZEi+RFwq7vvAywAngS+BNzp7vOBO+PfAMcD8+PPUuBiADObDiwD3gAcBixLgh6xzNKM7ZYMwzGJiJSUJIuiJo8MjIkTxlGVKqdJAYySpgBGiWrYvI3KinKmVJTnvW1ddYq1LWk6OjWFkYiIDB8zqwKOAi4FcPft7r4ZOBG4Iha7Ajgp/n4icKUHDwDVZlYHHAfc7u4b3X0TcDuwJK6rcvf7PczTd2VGXSIiUiADycBIyqsLSWlTAKNENTSnqavOv/sIwKypE+nodNZv0ZuHiIgMq1cB64Cfm9kjZvYzM5sM1Lp7A0B8rInldwdeyth+TVzW2/I1OZaLiEgBNba0MX6cMW3S+Ly2q61KaRaSEqcARola25JmVp4zkCRmx3EzNJCniIgMs3LgYOBidz8IeIWd3UVyyTV+hQ9gefdKzZaa2UozW7lu3bq+Wy0iIt00taSpqUyR7zBDNVUVXQOASmlSAKNE1W9OdwUi8lUXAx8aB0NERIbZGmCNuz8Y/76eENBojN0/iI9NGeX3yNh+DlDfx/I5OZZ34+7L3X2huy+cOXPmoA9KRKTUNLW25TUDSaK2KkVTa5pOdWUvWQpglKDt7Z2s39KW9xSqiWTmEgUwRERkOLn7WuAlM9s7LloMPAHcDCQziZwB3BR/vxk4Pc5Gsghojl1MbgOONbNpcfDOY4Hb4rpWM1sUZx85PaMuEREpkMaWdNe0qPmoraxgR4ezaev2IWiVjAb5j+Aoo14y9dBAplAFqJ40ntT4MhrUhURERIbfJ4CrzGwC8BzwIcIXMr82sw8DLwKnxLK3AG8HVgFbY1ncfaOZXQD8NZb7urtvjL+fA1wOTAT+EH9ERKSAmlrbOPzVu+W9XTLoZ2NLG7tNyT8AIqOfAhglqGsK1QGOgWFm1GkqVRERKQJ3fxRYmGPV4hxlHTi3h3ouAy7LsXwl8PpBNlNERHqQ3tFB87YdeU2hmqhJAhitaV5HVaGbJqOAupCUoIbmkDkx0AyMZNukHhERERERkf5Y1xoG4azJcwpVoKvbSVOLvkgtVQpglKCuDIzqgWVgAMrAEBERERGRvCXd2QeSgZEM/NmomUhKlgIYJWhtc5rKinKmVAy8B1Hd1BSNLWnaOzoL2DIRERERERnLmmIGRu0AMjAqyscxffKEriCIlB4FMEpQ/eZtA56BJFFXnaLTYd0WRT9FRERERKR/BpOBkWynDIzSpQBGCVrbkh5U9xGA2XEA0PrNin6KiIiIiEj/NLW2MX6cMW3ShAFtX1uVoqlV9yClSgGMElS/OU3dAFK2MiUZHGs1DoaIiIiIiPRTY0uamVMqKCuzAW1fW1WhLiQlTAGMErO9vZP1W9qoqx5cACPJwNBMJCIiIiIi0l/rWtsGNANJorYqxbrWNjo6vYCtktFCAYwSk0QrBzOFKkDVxHImTRinLiQiIiIiItJvjS3pAY9/AWH61U6HDRqLryQpgFFikqlPZ00d3BgYZsasqSnWtigDQ0RERERE+qexpW1AM5AkajWVakkrSgDDzKrN7Hoze8rMnjSzw81supndbmbPxMdpsayZ2UVmtsrM/mFmB2fUc0Ys/4yZnVGMYxltki4fsweZgRHqmKgMDBERERER6Zf0jg6at+2gtmrgGRhJ8EPjYJSmYmVg/Ai41d33ARYATwJfAu509/nAnfFvgOOB+fFnKXAxgJlNB5YBbwAOA5YlQQ/p2c4MjMEHMOqmpjQGhoiIiIiI9Mu61pA1UVM5uDEwABo1E0lJGvYAhplVAUcBlwK4+3Z33wycCFwRi10BnBR/PxG40oMHgGozqwOOA253943uvgm4HVgyjIcyKq1tTlNZUU5lavyg66qbmqKptY0dHZ0FaJmIiIiIiIxlyfSnNYPIwJgxZQJm6kJSqoqRgfEqYB3wczN7xMx+ZmaTgVp3bwCIjzWx/O7ASxnbr4nLelouvWho3laQ7AuAuuqJuIe5nEVERERERHqTBB0Gk4FRPq6MGVMqaFIXkpJUjABGOXAwcLG7HwS8ws7uIrnkmiDYe1m+awVmS81spZmtXLduXb7tHVMamtPUVQ9uAM9EEghp2KxuJCIiIiIi0rsk6DCYMTCS7TUGRmkqRgBjDbDG3R+Mf19PCGg0xq4hxMemjPJ7ZGw/B6jvZfku3H25uy9094UzZ84s2IGMRg3NaeoGMepvptlxJpNkXA0REREREZGeNLa2UV5mTJs0YVD11Fam1IWkRA17AMPd1wIvmdnecdFi4AngZiCZSeQM4Kb4+83A6XE2kkVAc+xichtwrJlNi4N3HhuXSQ+2t3eyfktbAbuQxAwMDeQpIiIiIiJ9aGppo6aygrKyXMn0/VdTleoaT0NKS3mR9vsJ4CozmwA8B3yIEEz5tZl9GHgROCWWvQV4O7AK2BrL4u4bzewC4K+x3NfdfePwHcLo09iSxh1mVxcmgFFZUc7kCeM0laqIiIiIiPSpqTXNzAJkg9dWVbB+y3Z2dHQyflyxJtaUYihKAMPdHwUW5li1OEdZB87toZ7LgMsK27qxa21LMoVqYcbAMDPqqieyVl1IRERERESkD00tbey126RB15NMpbqutY3ZBRrfT0YHhatKSH0cbHN2gbqQQJhKVV1IRERERESkL42t6UFNoZpIBgHVQJ6lRwGMEpJkShRqDAwIAYx6ZWCIiIiIiEgv0js62Lx1B7WDmEI1kUzDqoE8S48CGCWkoTnNlIpyKlPjC1Zn3dSJrN/Sxvb2zoLVKSIiIiIiY8u61hBsKEwGRghgaCDP0qMARglpaN5GXQGzLyAMCOqu9C0REREREelZEmyoKcAgnrtNnsC4MtM9SAlSAKOENDSnC9p9BHYOCNqgbiQiIiIiItKDptjdoxBdSMrKjJrKCnUhKUEKYJSQhuY0sws0A0kiGRBUA3mKiIiIiEhPkmyJQnQhgdCNRBkYpUcBjBKxvb2T9VvaCp6BUVetDAwREREREeldU2sb5WXG9EkTClJfbVVFV1aHlA4FMEpEY0sadwo+BsaUinIqK8q7ZjgREREZSma22sz+aWaPmtnKuGy6md1uZs/Ex2lxuZnZRWa2ysz+YWYHZ9RzRiz/jJmdkbH8kFj/qritDf9RioiMPY0tbcysrKCsrDBvq7VVKRo1iGfJUQCjRKyN6VVJxkQh1VWnqN+sLiQiIjJsjnH3A919Yfz7S8Cd7j4fuDP+DXA8MD/+LAUuhhDwAJYBbwAOA5YlQY9YZmnGdkuG/nBERMa+ptZ0QQbwTNRWpdi8dQfpHR0Fq1NGPgUwSkQSYCh0Bkaoc6K6kIiISDGdCFwRf78COClj+ZUePABUm1kdcBxwu7tvdPdNwO3Akriuyt3vd3cHrsyoS0REBqGppY2aysKMfwF01ZVMzyqlQQGMEpF08RiaAEZKAQwRERkuDvzRzB42s6VxWa27NwDEx5q4fHfgpYxt18RlvS1fk2O5iIgMUlNrmtoCDeAJIQMD0ECeJaa82A2Q4dHQnA7jVaTGF7zuuqkTWb+ljbb2DirKxxW8fhERkQxHuHu9mdUAt5vZU72UzdXR2gewvHulIXCyFGDPPffsu8UiIiWurb2DTVt3UFOAKVQTOwMYysAoJcrAKBENzdsKPgNJIsnqaGzWm4eIiAwtd6+Pj03AjYQxLBpj9w/iY1MsvgbYI2PzOUB9H8vn5Fie3Ybl7r7Q3RfOnDmzEIclIjKmJbOFFDYDI9SlDIzSogBGiVjbnB6S7iMQBvGEECQREREZKmY22cwqk9+BY4HHgJuBZCaRM4Cb4u83A6fH2UgWAc2xi8ltwLFmNi0O3nkscFtc12pmi+LsI6dn1CUiIgPUFMepKGQGxtSJ45lQXqaZSEqMupCUiPrmNHvPqhySuuumhplNNA6GiIgMsVrgxjizaTlwtbvfamZ/BX5tZh8GXgROieVvAd4OrAK2Ah8CcPeNZnYB8NdY7uvuvjH+fg5wOTAR+EP8ERGRQWiKWRI1BczAMDNqqyq6sjukNCiAUQK2t3eyfktbV6Ch0JLMjnplYIiIyBBy9+eABTmWbwAW51juwLk91HUZcFmO5SuB1w+6sSIi0iXJwKgt4DSqALWVKXUhKTHqQlICmlrTuA/NDCQAOthUMgAAIABJREFUkyvKqUqVd810IiIiIiIikmhsSVNeZkyfNKGg9dZWKYBRahTAKAFJ14666qHJwACYXT2R+s168xARERERke6aWtuYWVlBWVmuyZ4GrkZdSEqOAhgloCuAMUQZGACzpqY0iKeIiIiIiOyisSVNTWXhxr9I1FalaG1r55W29oLXLSOTAhgloGFzCCwM1TSqEAbyVBcSERERERHJtq61jZoCj38BO6dSTcbYkLFPAYwS0NCcZkpFOVWp8UO2j9lTU2x4ZTvpHR1Dtg8RERERERl9hiwDI07LqnEwSsegAhhmdkrGfOxfNbMbzOzgwjRNCqWheduQZl/AzuwOZWGIiEhfdP0gIlI62to72LR1R8FnIAG6sjoUwCgdg83AOM/dW83sSOA44Arg4sE3SwppbXN6SMe/gDCIJ+wcb0NERKQXun4QESkR62L3jqEZAyN2IdFAniVjsAGM/5+9O4+P6ywPPf57ZzTSyNpt7ZJH3hUviWMpsZ2E4BCWBAiJKQFC0pZygRRaLlBuU5J7S7kQaEMDhV4KFEqhQPatSUggaRqSACGRY0mJbdnxEtuSpZE0spYZbTPSzLz3jzNHlh2vmuWcM3q+n898JJ1ZzjvJWDrnOc9i1gu8F/iB1voxILWzcUTSejMQwDBfXxp5CiGEOAty/CCEEPOE2Z8iHRkYhXk5LMh1SwbGPJJsAKNHKfVD4EPAr5RSeSl4TZFCU9E4A2MRqkvSN0IVjCaeIBkYQgghzoocPwghxDwRSAQXKtKQgaGUoqrYS7808Zw3kj1Y+BDwNHC11noEWAjckvSqRMoERsNobTTZTKf8XDelCzySgSGEEOJsyPGDEELME/2h9GVggFGaIhkY80dOMk/WWk8opQLAW4D9QDTxVdiEmRGR7iaeYGRh9I7ILw/hHI+293Dn03vxj0xSW5rPLVc1snVDndXLEiLryfGDEELMH4HRMG6XYlFBeioFq4q97OgeSctrC/tJKoChlPoycBHQCPwU8AB3AZclvzSRCmYAw2yymU41JV4pIRGO8Wh7D7c9spPJxOjfnpFJbntkJ4AEMYRIMzl+EEKI+aM/FKGiMA+XS6Xl9auK8+gPRdBao1R69uEU8+HiXLIlJO8HrgXGAbTWfqAo2UWJ1OlLlHRkJgPDKyUkwjHufHrvTPDCNDkd486n91q0IiHmFTl+EEKIeSIwGpmZFpIOVcVeJqdjjEaiaduHE5gX53pGJtEcuzj3aHuP1UtLqWQDGFNaaw1oAKVUQfJLEqnkHwlTkOumKC+pZJuzUlPiZXhimsmp2JkfLITF/CMnD7adarsQIqXk+EEIIeaJQChMRVH6LqZWJnprBOZ5H4z5cnEu2QDGA4ku4qVKqU8C/w38W/LLEqnSFwxTU5qfkXQqcxJJ3zz/5SGc4VRlVQvy3ERj8QyvRoh5R44fhBBinkh7BkZiuonZLHS+mi8X55IKYGitvwk8BDyMUcf6d1rr76ZiYSI1eoOT1GSgfASgptTYT2+W/SMR2emWqxrJyzn+V6DbpRiPxPizn75CcGLaopUJkf3k+EEIIeaHqWicofEpKtOYgWFON5nvk0hOdXEuE70QMynpmeta62e01rdorf9aa/1MKhYlUqc3GM5cACORgeGXRp7CAbZuqGPrhbUAKKCuNJ9vfXA9//iBC2g5NMjW77/IgcCYtYsUIovJ8YMQQmS/gTFzhGr6MjAqiyUDA4yLc/me40/v8z1ubrmq0aIVpcecGiMopUZJ1K2eeBegtdbFSa1KpMR0LM7AWITqksxE3cxASZ808hQOkZvjpjAvhx1fftdxnbGXVhTwqV+08v7vv8h3P7KBKxorLVylENlDjh+EEGJ+MbMiKtMYwFiQm0ORN2feZ2Bs3VDH4FiE25/cM7Ptr9+1SqaQAGiti7TWxSe5FcnBh330h8JoTcYyMLweNwsLciUDQzhGhz/ImpriN431unjJQh77zGXUly3gf/zHK/z4dwcx+g0KIZIhxw9CCDG/BBJZEeksIQGjjCQwKucgCwtzAfj+TU0A5OYkXXBhOyl5R0qpSqWUz7yl4jVF8voSgYRMBTAAqou90gNDOEIsrtnTO8raupOfM9WXLeChT13CO9dU8bUn9/DFh3cQicqEHSFSSY4fhBAiu5lBhXRmYIBRojLfS0gAWjuHKczL4aq11fgWLuCFfQNWLynlkgpgKKWuVUrtBw4BLwCHgV+nYF0iBfwzAYzMNW6pLfXSKxkYwgEOHR1jcjrG2tqSUz6mIC+HH9zUzGevXMED27v54x+3cHRM/jgKkSw5fhBCiPmhPxTG7VIsKkhzAKPIO+9LSABaO0fY4CvF7VJsWVXBH94YzLoLcMlmYNwObAb2aa2XAm8HXkx6VSIlzF4U5nSQTKgpyZcAhnCEXT0hANadIgPD5HIpvvCuRr77kQ3s6A5y3b+8yG5/KBNLFCKbyfGDEELMA4FQhPLCXNwnlOumWmWxl0AoMq9LfkfD0+ztC9HkKwNgy6oKJqZibD88bPHKUivZAMa01noQcCmlXFrr54ALU7AukQL+kTAFuW6K8ubUq3VOqku8BCenmZiKZmyfQsxFhz9Ibo6L5RWFZ/X4962v5aFPXUosrrn+X//AU7v60rxCIbKaHD8IIcQ80D8amRlzmk5VxXlMxeKMTEynfV929dqRIHENzQ1GAOOS5YvIdbuyrowk2QDGiFKqEPgtcLdS6p8BOXO1ib5gmJrSfJRKb8RzttpEtodkYQi76/CHOK+6CI/77H8Nnl9fwuOfuYyVVUV86q5Wvvvs/nkd6RciCXL8IIQQ80AgFE57A09gJkjSP48bebZ2DqMUXOgrBYxS6IuXlvHCXglgzHYdMAH8FfAU8AbwvmQXJVKjNxTOaANPONZvo3dk/v7yEPantWZXT/C0/S9OpbLYy/03b+b9G+r41jP7+Ox9rzI5lV21hUJkgBw/CCHEPBAYjaS9gScYGRjAvG7k2do1TGNVEcVez8y2Lasq2Ns/ij+LhiykZAqJ1joKvITRhEuKw22id2SS6gykbM1mBkz8wez5RyKyT/fwJKFwlLW1c5va6PW4+acPreeLV5/HEzv8fOiHL81M/RFCnD05fhBCiOw1FY0zND5FVQYyMMwsj/nayDMe17R3DdOUKB8xXdFYCcBvs6iMJNkAxm8Br1KqDngW+BjwH8kuSiRvOhZnYCxCTWnmJpCA0QMDkJM5YWsd/iAA6+rOPQPDpJTi01cs59/+5CIODozxvn/5Pe1d2dUkSYg0mvPxg1LKrZRqV0o9kfh5qVKqRSm1Xyl1v1IqN7E9L/HzgcT9S2a9xm2J7XuVUlfN2n51YtsBpdStKXu3QggxDw0kJrdlIgPD3EdgngYwDgyMMRqOzjTwNK2sLKSmxJtVfTCSDWAorfUE8EfAd7XW7wfWJL8skaz+UBityXgJSV6Om/LCXHolA0PYWIc/hNulOK+6KOnXeseaKh75i8vIy3Hx4R+9zKPtPSlYoRBZL5njh88Be2b9/A3g21rrlcAw8PHE9o8Dw1rrFcC3E49DKbUGuAFYC1wNfD8RFHED3wPenVjLRxKPFUIIMQdmMKEqAwGMvBw3ZQs887aEpLXTuIjWfEIGhlLGONXf7z/KdCxuxdJSLukAhlLqEuAm4MnEtsyNvBCnZGZAZDqAAUYWhjTxFHbW4Q+xvKIAr8edktdrrC7i8c+8hQ2LS/n8/a/yjadeJx6X5p5CnMacjh+UUvXAe4Efmy8CXAk8lHjIz4Ctie+vS/xM4v63Jx5/HXCf1jqitT4EHAA2Jm4HtNYHtdZTwH2Jxwoxbzza3sNld/yGpbc+yWV3/EaC8iIpZjAhE008wWjkOV9LSFo7h1lYkMuSRQvedN8VjRWMRqK0d41YsLLUSzaA8TngNuA/tdYdSqllwHPJL0skq3cmgJHZEhJzn9LEU9jZrp4g6+bQwPN0Fhbk8ouPb+IjG3384Pk3uPkXrYxFZKiCEKcw1+OH7wB/A5iXkRYBI4leGgDdQF3i+zrgCMz02ggmHj+z/YTnnGr7myilblZKbVdKbR8YyJ60XDG/Pdrew22P7KRnZBIN9IxMctsjOyWIIeZsIDERJBMlJMZ+vPSPzs8MjLbOYZp8ZSedPnnpinLcLsUL+wIWrCz1kgpgaK1/q7W+Vmv9jcTPB7XWn03N0kQyzBKOagsyMGpKvNLEU9hWYDRMYDTCmjk28Dyd3BwXf//+dXzl2rU8tzfAB77/B44MTaR8P0I43VyOH5RS1wABrXXr7M0ne/kz3Heu29+8Uesfaa0v0lpfVFFRcZpVC+Ecdz69l8np46dqTU7HuPPpvRatSDhdfyiCS8GigswEMKqK8uZlD4yh8SkOHh1/U/mIqdjrodlXxvNZMk41JVNIhP30BsMU5Lop9ma+oqemJJ/RcFSuPgtb6vAbgw6SaeB5OkopPnrpEn72sY30Bie59l9+z8sHB9OyLyHmmcuAa5VShzHKO67EyMgoVUqZf+zqAX/i+25gMUDi/hJgaPb2E55zqu1CzAunGrOYTeMXRWb1h8JUFOXhdp0sPpx6VcVeAqOReVfG23aK/hezbWmsoMMfIjDq/ACPBDCyVO9ImOoS70nTiNKtttScRCJ/8IT97E4EMNKRgTHbW1aW89hn3kJZQS5//OMWbnnoNakrFiIJWuvbtNb1WuslGE04f6O1vgmj9OT6xMM+CjyW+P7xxM8k7v+N1lontt+QmFKyFFgJbANeAVYmpprkJvbxeAbemhC2UHuKyXWn2i7EmQRGIxnrfwFGs9BYXDM4PpWxfdpBa9cwOS7FBfWnvji3ZZWRLfi7fUcztay0SSqAoZS67Gy2iczrDYUt+4NTXWz8ovJLHwxhQx3+IA2LFlDs9aR9X0vLC/jPv7iMFZWFPLi9W+qKhUhI8fHDF4EvKKUOYPS4+PfE9n8HFiW2fwG4FUBr3QE8AOwGngL+UmsdS/TJ+AzwNMaUkwcSjxViXrjlqkZy3cefGuR73NxyVaNFKxJO1x8KZ2QCiakycQ4y3xp5tnUOs7au5LTN6dfUFFNemJcV41STzcD47lluExnWF5ycCSRkmhk46ZNJJMKGdvWEWJvm7IvZSvI9hMLTb9oudcVinkvq+EFr/bzW+prE9we11hu11iu01h/UWkcS28OJn1ck7j846/lf11ov11o3aq1/PWv7r7TWqxL3fT2J9yeE42zdUMd5NYWY2f45LsU//NH5bN1w0l62QpzRwGhkJqiQCVWJfWVDmcTZmo7Fea17hCZf6Wkf53IZ41R/u3+AmMNLbObUICEx+uxSoEIp9YVZdxUDqZlLKOZsOhYnMBqxZIQqHPvlIY08hd0EJ6fpGprgwxcvPvODU+hUU3mkrljMN3L8IIR99YfCdPhH+cTlyyhd4OEfn9o7k3YuxLmaisYZHJ+isihzGRhmtoc5vnU+2NMbIjwdP23/C9OWxgoebutmR/cIG3xnfrxdzTUDIxcoxAiAFM26hThWhyosEhiNoDXUWFRCkpvjorwwT0apCtsx+19kMgMDpK5YiFnk+EEIm3rglSPE4pobN/poSpzctB8ZtnhVwqmOjhlBhKoMZmCUF+ah1PwqIWk9iwaepstXlKMUji8jmVMGhtb6BeAFpdR/aK07U7wmkaTeEetGqJpqS730zqNfHsIZOvxBANbWpmcCyancclUjtz2y87jxdPkel9QVi3lHjh+EsKdYXHPvti4uX1nOkvICKouNyRFtnSNceV6V1csTDmQGETKZgeFxu1hUkDevMjBaO4epLfFSU3Lmi2JlBbmsry/l+b0DfP4dqzKwuvSYUwaGUuo7iW//RSn1+Im3s3wNt1KqXSn1ROLnpUqpFqXUfqXU/YkO4CS6hN+vlDqQuH/JrNe4LbF9r1Lqqrm8l2zUm+g9UXsWH+R0qSnxzgRShLCL3f4QVcV5VGTwjykYdcX/8EfnUzcr4+KTb10mdcVi3knF8YMQIvWeez2APxjmpk0+ABbk5rC6poi2LsnAEHMTGM18BoaxvzwC8+gialvnME1nkX1huqKxgte6Rxh28KSWOWVgAL9IfP1mEvv+HEaXbzOX+xvAt7XW9yml/hX4OPCDxNdhrfUKpdQNicd9WCm1BmPE2VqgFvhvpdQqrXXsxB3NN71B6zMwakryefHAoGX7F+JkdvmDGc++MG3dUMfWDXVMTEXZ9PVnOTIkAT4xL6Xi+EEIkWJ3t3RSWZTH21cfy7Zo8pXxcGs3sbjGbXb2dKhH23u48+m9+EcmqS3N55arGuUiQpoFLMjAACNg0j9Pmnj6RybxB8N88hwCGFtWVfCd/97P7w4c5dr1tWlcXfrMKQNDa92a+PrCyW5ner5Sqh54L/DjxM8KuBJ4KPGQnwFbE99fl/iZxP1vTzz+OuA+rXVEa30IOABsnMv7yTa9wTAFuW6KvXONTyWvpsTLWCTK6EmmLwhhhcmpGAcCYxnvf3GiBbk5bN1Qx5M7ex0d/RZiLpI9fhBCpN6RoQme3zfADRcvxjNrjGqTr4zxqRh7+0YtXF3yHm3v4bZHdsoo8wwLjEZwKVhUmOkAxvwpITEzpM6m/4XpgvpSyhZ4eH5vIF3LSrukxqgqpS5TSj2jlNqnlDqolDqklDp45mfyHeBvgHji50XASGIGO0A3YIZF64AjAIn7g4nHz2w/yXPmtb5gmOoSL0acxxpmA9FeGaUqbOL1vhBxnfn+Fydz4yYfU9E4D7d1W70UISyRxPGDECLF7nulCwXcsNF33HazkafTy0jufHrvcT2oQEaZZ0J/KEx5YV7Gs3cqi7wcHYsQjcXP/GCHa+0cxutxsbrm7C/OuV2Ky1dW8Nt9R4k7dJxqUgEM4N+BfwLeAlwMXJT4ekpKqWuAgHkVxtx8kofqM9x3uuecuM+blVLblVLbBwac3XX1bPiD4bNq5JJO5ghXGRMp7KLDogkkJ7O6ppgmXyn3bOtCa2f+8RAiSed8/CCESL2paJz7X+nmyvOq3jQZa/HCfMoLcx0fwDjVsagco6ZXYDSS8f4XYJSQaA1Hx7I/y7Wta4T19aXHZU6djS2rKjg6FmF3byhNK0uvZAMYQa31r7XWAa31oHk7w3MuA65VSh0G7sMoHfkOUKqUMmse6gF/4vtuYDFA4v4SYGj29pM85zha6x9prS/SWl9UUZH986z7gpMzAQSrmPvvkwwMYRMd/iAl+R7qy+wxuvTGTQ0cHBjn5YNDVi9FCCvM5fhBCJFi/7W7j6NjEW7a7HvTfUopNvjKaO8asWBlqSOjzK3RH4pkvP8FGCUkxv6z+xwkPB2joyd4Tg08TW9dZZwPO3WcarIBjOeUUncqpS5RSjWZt9M9QWt9m9a6Xmu9BKMJ52+01jcBz3FsBvxHgccS3z+e+JnE/b/RxiXLx4EbElNKlgIrgW1Jvh/Hm47FCYxGLA9gVBV7UcrIBhHCDjr8IdbWFltaWjXbNRfUUOzN4Z5tXVYvRQgrnPPxgxAi9e5+uYv6snzeuvLkF/iafGUcOjrOkIN7Nt1yVSMe9/F/+/M9bhllnmaBUJhKizIwIPsDGDu6g0TjmmbfuQcwKoryWFdXzAt7nRnASLbL46bE14tmbdMYWRXn6ovAfUqprwHtGOmlJL7+Qil1ACPz4gYArXWHUuoBYDcQBf5SJpAY6VpaH+tBYRWP20VFYR59QUnPE9abjsV5vW+Uj17SYPVSZng9bj7QXM9dL3dydGwN5RluciWExVJ5/CCEmIMDgTFeOjjI31zdeMo+BU2+UgDau4aPm1DiJFs31HH/9i5eesPIeCzJz+Er166TKSRpNB2LMzg+ZUkGRqWZgTGa3Y08WzuN0q65ZGCAUUbyry8cJBSeptjrSeXS0i6pAIbW+m1JPv954PnE9wc5yRQRrXUY+OApnv914OvJrCHb9NlghKqppjRfmngKWzgQGGMqGmddnfUNPGe7aZOPn754mIdau/nUluVWL0eIjEn2+EEIkbx7t3XhcSs+2Lz4lI+5oL6UHJeizcEBDIBAKMIVjRXs6xuleclCCV6k2UAieGBFD4xFBUbj0ECWZ2C0dg6zrLyAhQW5c3r+llWVfO+5N3hx/1HefX5NileXXkkFMJRSf3ey7VrrrybzumLu/CPGP1arS0gAaoq97A84e/SWyA52auA524rKIjYuWci927q4+fJluDLcqVsIq8jxgxDWCk/HeKi1m6vWVlNxmqvk+bluVtcU09bp3D4YR8civDEwzvXNiynMy6Gt09lNSZ0gMBPAyHwGhtulqCjMy+oSEq01bV3DXHle5Zxfo8lXSpE3hxf2DTgugJFsD4zxWbcY8G5gSZKvKZJgNs20egoJQE2pl95gWKYsCMvt6gmS73GztLzQ6qW8yU2bfXQOTvDiG0etXooQmSTHD0JY6IkdvQQnp7lp05lLK5t8pbx6ZMSxYym3HTJKRzYtW0hzQxk9I5P0SolzWpnBg8oiay6oVhXn0R/K3hKSw4MTDI1P0TzH8hGAHLeLt6wo54V9A447V0sqgKG1/tas29eBKwDJybKQPzjJglw3xd5k25skr7Ykn4mpGKFw1OqliHlutz/E6pqijM8iPxtXr6umbIGHe1qkmaeYP+T4QQhr3d3SyfKKAjYvW3jGxzY1lDE5HeP1Pmdm1bYcHCTf4+b8upKZEz4nZ5Q4gZUZGACVxd6szsAw+18kE8AAow9GbzDMvv6xVCwrY5LNwDjRAmBZil9TnIO+YJiaEq8tJi2YfTgkyi2sFI9rdveGbNf/wpSX4+b65nqe2d2f9fWaQpyGHD8IkSEd/iDtXSPctKnhrI4XmxJTDtq7nFl60XJoiOaGMjxuF6trivF6XDMngCI9AqEwLgWLLGpQbmRgZO8xVVvXMEXeHFZUJJdZvKXRHKcaSMWyMiapAIZSaqdSakfi1gHsBf45NUsTc9EbDNuifASgttQMYGTvLxBhf51DE4xForbrfzHbRzb6iMY1D2w/YvVShMgIOX4Qwjr3tHSRl+PiA031Z/X4+rJ8ygvzaOtyXtbCyMQUr/eNsmmpkWnicbu4oL6UVocGY5wiEIpQXphnWeZrVZGX4YlpItHsHFDZ1jlMk68s6d5pNSX5NFYV8cI+Z41TTbbO4JpZ30eBfq211AtYqDc4yeWnmOWdaWYgpXdEAhjCOh3+IABra+2ZgQGwrKKQS5cv4t5tR/j0FStsWeoiRIrJ8YMQFhiLRHm0vYf3ra+lZMHZjU5UStHcUEqbA0/6j/W/WDSzrbmhjH/77UHC0zG8HrdVS8tq/aPhmXGmVjCnnwRCERYvXGDZOtIhFJ5mb/8o716XmsabWxor+I8XDzMeiVKQZ30LgrORbA+Mzlm3Hjn4sNZ0LE5gNEKtDSaQAFQW5eFSUkIirLWrJ4THrVhZZb8GnrPduMlHz8gkv93vrCi4EHMhxw9CWOPR9h7Gp2LctMl3Ts9r8pXROTjB0TFnNUZsOTREbo6L9YuPXcRo9pURjWt2dActXFl2C4QiVFnUwBOYCZ4ERrPvIuqrXSNonXz/C9MVqyqYisV56Y3BlLxeJqS6B4awUGA0gtZQbZMSkhy3i8oir5SQCEt1+IOsrCwiL8feV1netaaa8sJcaeYphBAiLbTW3N3SxZqaYi5cXHpOz21qMPtgOKuMpOXQIBsWlx53DGC+F+mDkT4Bm2RgZOMkktbOYVyK44JyyWheUsaCXLejykgkgJFF+hKZDjWl9sjAAHOUqmRgCGtordntD7Guzr79L0y5OS4+eNFint3TL/9mhBBCpFz7kRH29Ib4481n17xztvPrSshxKUeVkYTC0+z2h44rHwFYWJDLsvICCWCkyXQsztGxKctGqMLsAEb2XURt6xqmsbqYIu/ZlYCdSV6Om0uXL+L5fQHHjFOVAEYW8Sd6TdTYpIQEjLVIDwxhlb5QmMHxKVv3v5jtIxf7iGu4/xVp5imEECK17n65i8K8HK69sPacn+v1uFlbW0ybg076Ww8PE9eweembR8U2NZTR1jXsmBM2JzHLjKzMwChb4MHjVlmXgRGLa9q7RmhuOLcMqjPZ0ljJkaFJDh0dT+nrposEMLJIX6JUo6bYHiUkYDTy7A2G5Q+EsERHTwjA1hNIZvMtWsDlK8u5/5UjRGNxq5cjhBAiS4xMTPHEDj9bN9RSOMdGfRt8ZezoDjrm79PLhwbxuBUbfG/uFdDcUMbQ+BSHBycsWFl2M4MGVvbAUEpRWeTNuvH0+/pHGYtEU9b/wrRlpTlO1RllJBLAyCK9wTALct0U59ung2xNiZfJ6RjByWmrlyLmoV3+IErB6hpnBDAAbtrUQG8wzHN7nfFHRAghhP091NpNJBrnxo0Nc36NpoYyJqdjvN43msKVpU/LwSEuqC8lP/fNPbCapQ9G2phBA7OMwypVxXn0Z1kTT/Pz2ux7c1ZRMnyLFrCsvEACGCLzeoOTVJd4z7muMZ3MUap+KSMRFujwh1haXuCYsVAAb19dSWVRHve0dFq9FCGEEFlAa809LV00+UpZk0RGYpPPSFt3Qh+M8UiUXT1BNp2kfARgRUUhRd4cCWCkQf+o9SUkYARQsq2EpK1rmPLCPBYvTH22/VtXVfDSG4OEp2Mpf+1UkwBGFukNhqm1yQQSk9lQtC8kTQlF5u32h1jnkP4XJo/bxYcvXszz+wboHpbUViFmU0p5lVLblFKvKaU6lFJfSWxfqpRqUUrtV0rdr5TKTWzPS/x8IHH/klmvdVti+16l1FWztl+d2HZAKXVrpt+jEKn20sFBDh4d5483zz37AqCuNJ/KojxH9MFo6xomGtdvauBpcrkUTb4yR7wXpxkIhXEpWFSQa+k6jABGdl1AbescprmhNC0Xq69orCASjdNyaCjlr51qEsDIImYGhp3USgaGsMjw+BQ9I5OO6X8x2w0bfSjgvm3SzFOIE0SAK7XW64ELgauVUpuTShkJAAAgAElEQVSBbwDf1lqvBIaBjyce/3FgWGu9Avh24nEopdYANwBrgauB7yul3EopN/A94N3AGuAjiccK4Vh3v9xF6QIP7zm/JqnXUSpx0u+AUaotB4dwu9RpewU0N5SxLzAqZc4p1h+KsKgwjxy3taeZlcV5jIajTExFLV1Hqhwdi3B4cIKmk/R0SYXNyxaRl+PiBQeUMEsAI0tMx+IERiPU2iyAUVGUh9ulZhqMCpEpHX6zgaezMjDAuMp1RWMl928/wrRDmqUJkQnaMJb40ZO4aeBK4KHE9p8BWxPfX5f4mcT9b1fGpavrgPu01hGt9SHgALAxcTugtT6otZ4C7ks8VghHCoyGebqjj+ub6vF63twL4lw1NZTSNTQxM2nCrloODbKutvi0DUubG8rQGl49Yv+AjJMERsNUWVw+AseaiAaypIzEzBZKdQNPk9fjZtMyY5yq3UkAI0sMjEbQGqptVkLidimqivLwB6WERGTWLn8QcM4EkhPduNHHwGiEZ/f0W70UIWwlkSnxKhAAngHeAEa01uZltm6gLvF9HXAEIHF/EFg0e/sJzznVdiEc6cHt3UTjmo9s8qXk9cyrv3YuvQhPx3jtSPCU5SOm9YtLcSlp5Jlq/aEIlRZOIDGZTUSzpYyktWsYj1uxri59F+auWFXBwYFxjgzZu4RZAhhZojcRIKixWQYGQHWJl14pIREZ1uEPUVeaT5nFNZhz9bbzKqkt8XJ3S5fVSxHCVrTWMa31hUA9RsbE6pM9LPH1ZIXCeg7bj6OUulkptV0ptX1gwP7ptmJ+isWN5p2XLl/E8orClLzmuroSPG5l6zKS9q4RpmLxUzbwNBXm5XBedbGtgzFOFBiN2CMDI7EGs6mo07V1DrOuriQlmVSnsqXRGeNUJYCRJXoTJRpm00w7qSnNpy9Lop/COTr8QcdmX4CRvfThi338bv9ROgfHrV6OELajtR4Bngc2A6VKKTNXvB7wJ77vBhYDJO4vAYZmbz/hOafafuK+f6S1vkhrfVFFRUWq3pIQKfXbfQP0jEwm3bxzNq/HzZraEltPImk5NIhScNGSM4+abG4oo71rmFj8TXFKMQfRWJzB8QgVNsjAqCw2S0icfw4yFY3zWneQ5jT1vzAtKy+gviyf523eB0MCGFnCzHCoKbZXCQlAbYkX/8gkWssfB5EZ45Eoh46OO7L/xWwfvngxbpfiXmnmKQQASqkKpVRp4vt84B3AHuA54PrEwz4KPJb4/vHEzyTu/402/hg9DtyQmFKyFFgJbANeAVYmpprkYjT6fDz970yI1Lvr5U4qivJ455qqlL5uk6+UHd0jtu3R1HJwiDU1xZTke8742OaGMsanYuztG83AyrLf0bEptMYWGRjF3hy8HldWlJB0+INMReNp639hUkpxRWMFf3jjKFNRe/77BglgZI3eYJgFuW6K80/drMgq1SX5RKJxhieky7PIjD29IbR2bv8LU3WJl7efV8mD24/Y+g+JEBlUAzynlNqBEWx4Rmv9BPBF4AtKqQMYPS7+PfH4fwcWJbZ/AbgVQGvdATwA7AaeAv4yUZoSBT4DPI0RGHkg8VghHKV7eILf7A3w4YsW40nxNIgmXxnh6Tiv99rvpH8qGqeta5iNZygfMZknhK02zihxEjNYYIceGEqpxChV55eQmCVbTWkOYABsWVXJxFSM7Z32Hadqv7NdMSd9IWOEajrmAifLnIzSG5xkoUP7EQhn2dVjNPBMZ6OjTLlxk4//2t3P0x19vG99rdXLEcJSWusdwIaTbD+I0Q/jxO1h4IOneK2vA18/yfZfAb9KerFCWOj+V4zMvRs2Lj7DI8+deRLV1jXM+fX2+ju7o3uESDTOpqWnb+Bpqi/Lp6Ioj7bOYf4khaU285UZwLBDBgYYk0iyIQOjrXOY+rL8mcak6XTJ8kV43IoX9g5w6fLytO9vLiQDI0v4R8K2bOAJRg8MQBp5iozp8IdYVJBrmz+gyXjrygrqy/K5R5p5CiGEOAvTsTj3vXKEtzVWUl+2IOWvX1vipao4z5Z9MFoOGVeNzzYDQylFs69MJpGkSCDRMNMOGRgAlcV5M2tyKq012zuH0l4+YirMy+HiJQtt3chTAhhZoi8YpsZmI1RNNbMyMITIhA5/iLV1JbbMSDpXLpfiIxt9vHRwkDcGxqxejhBCCJv77939DIxG+OPNqRmdeiKlFE2+MlsGMF4+OEhjVdE5Zfw2N5TRNTRBYFQutCUrEAqjFJQX2iPj2ighCTu6D58/GKY/FJkZYZwJW1ZV8HrfKH1Be/6bkABGFojG4gRG7ZuBUV6YR45LzUxKESKdItEY+/pHHd//YrYPXlRPjktxr2RhCCGEOIO7WjqpK81ny6rKtO2jyVfGkaFJW530R2NxWjvPvv+FaaYkptO+o2GdIjAaMY77U9x3Za6qivOYmIoxFolavZQ5M7ODMpWBAcfGqf7WplkY9vh0iaQERiPENbbNwHC7jCY6EsAQmbC/f4xoXLPO4RNIZqss8vKutVU81NZNeDpm9XKEEELY1MGBMV48MMhHNhpTrNKlqaEUsNdJ/y5/iImpGJuWnVsAY11dMbluF+02zChxmv5QmMoi+5Tvmj0jnNzIs61zmHyPm/OqizK2z8aqIqqLvTy/L5CxfZ4LCWBkAbM0w64ZGGCszT8iJSQi/cwGntmUgQFw48YGRiameWpXn9VLEUIIYVP3busix6X40MWpb94529raEjxuZauT/paDg8DZ978w5eW4Ob++RPpgpEBgNJKRRpNny+zFEXBwI8/WzmEuXFya0awWpRRbVlXwu/1HidpwXLIEMLKAmdlQbecARmk+fQ7+5SGco8MfojAvB9/C1Dcus9KlyxexZNEC7m7ptHopQgghbCg8HePB1m6uWlud9iaKXo+btbUltuqD0XJoiGUVBXN6780NZezoCRKJSpZjMvpDEZtlYBhr6bdRqdO5mJiKsrs3lNHyEdOWxgpGw1FePWKfLCuTBDCygNlgpdamJSRgdKzuDTq7iY5whl3+IGtqi3GlMXXWCmYzz1cOD7Ovf9Tq5QghhLCZX+3sZWRimps2pad554mafGXs6A4yFbX+Cm0srnnl8BCbzjH7wtTkK2MqGqfDH0rxyuaPaCzO4HiESjtlYDi8hGRHd5BYXFsSwLhsRTlul+L5vfbrgyEBjCzgHwmT73FTnJ9j9VJOqbrEy1Q0zuD4lNVLEVksFte83ptdDTxnu765nly3S0aqCiGEeJO7W7pYVl7AJcsXZWR/zQ1lRKJx9vRaf9K/pzfEaDjKpqVze+/HenrYJ6PEaY6OTaE1tsrAKMzLoTAvh36HZoGbZU0bfKUZ33dJvocmX6ktx6lKACML9IUmqSn12npkpNlg1K7jeER2OHR0jMnpWFY18JxtUWEeV6+r5uG2bianJM1VCCGEYU9viNbOYW7c5MvY8eDMSb8NykhaDg0BnHMDT1NlkRffwgXSByMJ5kQaO/XAAKgsziPg0AyMts5hVlQWUrrAmrG0W1ZVsLMnyNExe/33kwBGFvCP2HeEqslcnzTyFOm0q8e4CrS2LjszMABu3ORjNBzliR1+q5cihBDCJu5p6SI3x8UHmuozts+aknxqSry0dVlfI99ycBDfwgVJTeRrbihje+ewlDvPkVmmYacMDICqIq8jMzC01rR2DdNkQfaF6YpGYxSz3capSgAjC/QFw1QX27f/BUBNqRHAkFGqIp06/EFyc1wsryi0eilps2npQpZXFHDPNikjEUIIAeORKP/Z3sM1F9RQVpDZK7VNvjLLyy7iif4X5zp95ERNDWUMjEboHpaLbXNhBgnsloFRXeJ1ZBPPg0fHGZmYtqT/hWlNTTHlhbm2KyORAIbDRWNxAqNhakvt9cviROUFeXjcSgIYIq129YRYXV2EJ4OjpjJNKcWNmxpo7xphtzQbE0KIee+xV/2MRaLctKkh4/ve4CulZ2TS0jGV+wNjDE9Mz7mBp6nZZ5wo2qEkxokCoxGUgvJCa8odTqWyOI/+UMRxmTVmOZOVAQyXS/HWlRX8dt8Asbh9/vtl71H+PBEYjRDX9h6hCsY/gKpiL71BiWqL9NBa0+EPsiZL+1/M9oGmOnJzXNyzTUaqCiHEfKa15u6WTs6rLrIk1bypwfqT/pZDgwBsXpZc89LG6iIKct3SB2OOAqEwiwryyLHZRaSqImOQQHBy2uqlnJO2zmFK8j0sK7c2q3hLYwXDE9Ps7Alauo7Z7PUJE+es1wEjVE21JfmSgSHSpnt4klA4yros7n9hKl2QyzXn1/Bou5/xSNTq5QghhLDIa91BOvwhbtrcYEkz97W1xeS6XZb2wWg5OERtiZf6suSOhd0uxQZfmQQw5igwGqGq2F79L+BYSYvTRqm2dhr9L1wua4c0XL6yAqXgBRuNU5UAhsOZGQ12z8AAow+GZGCIdOnwG5HhtfMgAwOMZp5jkSi/fE2aeQohxHx198udLMh1s/XCWkv2n5fjZl1dsWV9MLTWtBwy+l+kIoDT1FDGnt6QXByYg/5Q2HYNPIGZoIqTGnkGJ6bZHxiztHzEtLAglwvqS3lhX8DqpcyQAIbD9TkoA6O6xEtfMEzcRjVUInt0+EO4XYrzqousXkpGNDeU0VhVxN0t0sxTCCHmo+DENL/c4WfrhjqKvB7L1tHkK2NHT5CpaDzj+z54dJyjYxE2JVk+YmpuKCOu4bUj1k9WcRojA8N+F1SPZWA4J4DRfsQICDbZIIABxjjVV4+MMDIxZfVSAAlgOF5vMEy+x01xfo7VSzmj2pJ8pmOawXF7fPhFdtnVE2RFRSFej9vqpWSE0czTx86eIDu77VOXKIQQIjMebusmPB3nxo0+S9fR1FDGVDTO7t7MN5ZuOTgEkHQDT9OFi0tRCikjOUfRWJyjYxFbZmBUJNYUGHVOCUlb5zBul2J9vXUjVGe7orGCuIbf7T9q9VIACWA4Xm9wkpoSryV1j+eqpsQcpSplJCL1Ovwh1tZmf/+L2bZuqMPrkWaeQggx35jNOy9cXMq6OmtLJ5vM6R0WnPS3HBqkoiiPpeUFKXm9knwPqyqLaJVJJOdkcHwKraHShhkYXo+b0gUeR2VgtHYNs7qmiII8e1ygXl9fSkm+xzbjVCWA4XC9wTA1Nh+haqpJlLn4R5zzC0Q4Q2A0TGA0wlqLD+IyrSTfw7Xra3nsVT+jYWd11xZCCDF3LYeGeGNgnJs2WZt9AUaJcG2JN+OTSLTWtBwcYlOK+l+YmhrKaOsclpLnc2AGB+yYgQHGJBKnBDCisTivdo3MBAbtwO1SXL6ynBf2Ddji34UEMByudyRMdbH9+18AM4GWPsnAECnW4TfSVudbBgbAjZsamJiK8eir0sxTCCHmi7tbuij25nDNBdY07zzRhoYy2jM8ieTI0CR9oXDKykdMzQ1lhMJR3hgYS+nrZrNAYsKHHXtgAFQW5zlmCsne/lHGp2K2aOA52xWNlQyMRtjTl/lSsRNJAMPBorE4gdEwtQ7JwFhUkEuu2yWjVEXK7U4EMNbMwwDG+voS1tQUc09LF1pbHxUXQgiRXgOjEZ7a1cv1zYvJz7VH36cmXxk9I5MZvcr98qFBgJQ18DSZJ47SB+Ps9Y8mMjBsOEYVjMBKwCEZGGYplp0yMADeurIcwBZlJBLAcLDAaIS4dsYIVTCaDlaXePFLAEOk2K6eIA2LFlBsYRd2qyiluGmzjz29Idqla7oQQmS9B1uPMB3T3GiD8hFTk89oNpjJPhgtB4dYWJDLysrClL7ukkULWFiQKwGMc9AfiqAUlBfaNYCRZ5w32aD84UxaO4epLMqjvsxeGfaVxV7W1BTzwl4JYIgkmJkMNQ4JYICxVikhEak2Hxt4znbdhXUU5Lq5R0aqCiFEVovHNfe0dLF52UJWpPjEPRlra0vIzXFltA9Gy6FBNi5Jbf8LMC4MNPnKpJHnORgYDbOoIBeP256nllXFXqJxzZBNxoCeTmvXMM0NZbYc0HBFYwWtncOW912z56dMnJW+mQCGvSJ0p1Nbmi9NPEVKBSen6RqaYG3t/GrgOVthXg7XXljHEzv8BCelmacQQmSr3+4foHt4kps2NVi9lOPk5rg4v66Etgz1wegZmaR7eJKNKe5/YWpuKOPgwDhD4/Y/4bWD/lCEyiL7XlA112b3Rp6B0TBHhiZt1//CtGVVBdG45sUDg5auQwIYDmaOI3VSBkZ1idEFOOaAFC7hDLvncQPP2W7a5CM8Hec/27qtXooQQog0ubuli/LCXK5aW231Ut6kyVfKzp4gU9F42ve1bab/RfoCGADtkoVxVgKjYaps2v8CmFlbwOaNPNs6jQBgk00DGE0NZRTl5VjeB0MCGA7WGwyT73FTku+cuv/aEiOFa3DM3r9AhHN0+IMA8zoDA2BdXQnr60u4W5p5iiymlFqslHpOKbVHKdWhlPpcYvtCpdQzSqn9ia9lie1KKfX/lFIHlFI7lFJNs17ro4nH71dKfXTW9mal1M7Ec/6fsmMer5iX/COTPLunnw9dtJjcHPsdwjf5ypiKxmf+LqdTy8Ehir05nFednosXF9SXkONS0gfjLNk9A8OcjmL3DIy2rmFyc1y2vSjncbu4bEU5L+wNWHqsab/ffuKs9QYnqSnx2rJG6lSqE+Uu0shTpEqHP0RVcR4VNp09nkk3bvKxPzDGdjngEtkrCvwvrfVqYDPwl0qpNcCtwLNa65XAs4mfAd4NrEzcbgZ+AEbAA/gysAnYCHzZDHokHnPzrOddnYH3JcQZ3ffKETTwkY32ad45m3nVOBNlJC2Hhti4dCFuV3qOgb0eN2vrSiSAcRaisTiDYxFbZ2CYx4h2H6Xa2jnMBXUl5OXYY7rQyWxprMAfDHMgYN2YYQlgOFhvMOyYCSQms9yld0QaeYrU6PAH5332hel962spysuRZp4ia2mte7XWbYnvR4E9QB1wHfCzxMN+BmxNfH8d8HNteBkoVUrVAFcBz2ith7TWw8AzwNWJ+4q11i9p4/LSz2e9lhCWmY7FuW9bF1tWVbB44QKrl3NSVcVe6krz0z6JJBAKc+joeNr6X5iafWW81j3CdCz9JTFONjg+RVxDRbF9z0k8bhflhbkz417tKBKNsbM7aNvyEdOWVRWAteNUJYDhYH3BsKMaeILRxBOOTVARIhmTUzEOBMZYZ9NUu0xbkJvD+5vqeHJnL8PSeExkOaXUEmAD0AJUaa17wQhyAJWJh9UBR2Y9rTux7XTbu0+yXQhLPbsnQGA0YrvmnSfa4CtN+ySSlkNDAGxauiit+2luKCM8HWdPbyit+3E6s69Elc0zYSuLvARsXEKyqyfEVCxOk8/eAYza0nxWVRXyvIXjVCWA4VDRWJz+UNhRDTwByhZ4yMtxzTQgzZRH23u47I7fsPTWJ7nsjt/waHtPRvcv0uP1vhBxDWskA2PGjZt8TEXjXPHN5+TzLrKWUqoQeBj4vNb6dGcXJ8sv13PYfuL+b1ZKbVdKbR8YsLaZmZgf7m7ppLbEy5XnVZ75wRZq8pXRGwyn9Tiv5dAghXk5ae8T0NRQCiBlJGdg9pWotHEGBhiNPO1cQmJmLpmfOzvbsqqCbYeGmJiKWrJ/CWA41MBYhLiGmlJ7/7I4kVKKmhJvRjMwHm3v4bZHdtIzMonGGL112yM75aQuC3QkJpCsq5MMDNPrvaMoBcHJqHzeRVZSSnkwghd3a60fSWzuT5R/kPgaSGzvBhbPeno94D/D9vqTbD+O1vpHWuuLtNYXVVRUJP+mhDiNw0fH+d3+o9yw0Ze2ng+pMtMHozN9fTBaDg7R3FBGjju9pzE1JfnUleZLAOMMAqOJDAwb98AAo8TJzk08WzuH8S1cYOtmqKYtqyqZisV5+aA141QlgOFQ/hHjH6DTMjDA+IOQyQDGnU/vZXI6dty2yekYdz69N2NrEOnR4Q9Sku+hrtRZpVTpdOfTezmxMbR83kW2SEwE+Xdgj9b6n2bd9ThgThL5KPDYrO1/mphGshkIJkpMngbepZQqSzTvfBfwdOK+UaXU5sS+/nTWawlhiXu3deF2KT588eIzP9hia2qKyctxpa2MZHAswv7AWNr7X5iaGsrS3tPD6fpDYZSC8kJ7BzAqi70cHYsQtWFPE601rV3DM+N77e7ipWXke9yWlZFkPICRiRFo80Ff0AxgOO/ErabEm9Emnv5T7OtU24VzdPhDrK0tdtQknnSTz7vIcpcBfwJcqZR6NXF7D3AH8E6l1H7gnYmfAX4FHAQOAP8G/AWA1noIuB14JXH7amIbwKeBHyee8wbw60y8MSFOJhKN8cD2I7xzddXMKEg7y81xcUF9SdoCGK8cNv6Zbl6WmQBGs68UfzAsf0NPIzAaYVFBLp40Z8Qkq6o4j7g2mo7aTffwJAOjEds38DTl5bi5dPkiyxp55liwT3MEWptSqghoVUo9A/wZxgi0O5RSt2KMQPsix49A24Qx3mzTrBFoF2HUp7YqpR5PdBPPemZtoSMzMEq99I9GiMV1RlIhK09R81YrV+0dbToW5/W+Uf7s0iVWL8VWakvz6TnJgZZ83kU20Fr/npP3qQB4+0ker4G/PMVr/QT4yUm2bwfWJbFMIVLmqV19DE9Mc9Nme45OPZkmXxk/ffEwkWgs5eMgXz44hNfj4vy6zPQJaG4wAiVtXcPyd/QUAqEwFQ4oe6hKrLE/FLZdMNAM+DXbvIHnbFsaK3j29QCHj46zpLwgo/vOeKgs3SPQMvhWLNUbDOP1uCjJ91i9lHNWU5JPLK4ZGE1/I52RiSn0ifn0gNuluOWqxrTvX6TPgcAYU9F42pt4Oc0tVzWS7zn+gDHX7ZLPuxBCONBdL3eyZNECLltebvVSztoGXxlTsTi7elI/vaPlkNH/IjcnM6cw59UUke9xSx+M0+gfDdu+/wUwE7SwYyPP1s5hCnLdNFYXWb2Us3bFKqOh8PN7A2d4ZOpZmuuTphFo80JfMExtSb4jU+fNrBF/mieRhKdjfOJn2xmZiPKZty2nrjQfBRTkuonFNSsqC9O6f5FeZgPPtTKB5DhbN9TxD390/sznPcelyM1RXL7SOQe/QgghYG/fKK8cHubGTT5cNm/eOZs5RaE9xWUkwYlpXu8LsXFJesenzuZxu1i/uET6YJxGIBSh0uYjVOFYk1E7NvJs7Rxmg6/M9k16Z/MtWsDS8gJLykgsC2CkcQTayfaVdePO/MFJqh1YPgLH+nb0pbGRZyyu+fx9r9LaNcw/fXg9f33Vebx465UcuuO9/OHWt7OoIJcvPbaLePykHxnhALt6guR73CzNcNqaE2zdUDfzeX/is29hKqq59ZGdJ81GcpTeXtiyBfr6rF6JEEKk3T0tneS6XVzfbP/mnbNVFnmpL8tPeR+MVw4PoTVsylD/C1NzQxkd/hCTU7EzP3ieicU1R8citivJOJlFhXm4lFHyYifjkSh7ekM0+ew/PvVEW1ZV8NLBQcLTmf23YUkAI80j0N4kG8ed9QXDjmzgCVCbGP2aroZIWmu++ssOnuro42/fu4ZrLqg97v6SBR5ue89q2rtGeLD1yCleRdjdbn+INbXFjopWW+G86mL+5upGntndzwPbHf55/7u/g9/9Dr70JatXIoQQaTUxFeWRth7ec341CwtyrV7OOWvylaV8lGrLoUFyc1xcuDizJ3rNDWVE45od3ekbDetUg2MR4tqY8GF3bpeioujkffGs9NqREeIaxzTwnC03RxGejnPel57isjt+w6PtPRnZrxVTSNI6Ai0jb8Ji0Vic/lDYkQ08AUryPXg9rrSNUv3hbw/ys5c6+cRblvLxtyw96WM+0FTHxUvKuOPXrzNsw27EtmWTK+DxuGZ3b0j6X5yl/3HZUi5dvoiv/HI3h4+OW72cc6c1fO978OMfG9///OfGZ/Cll+D66+GLX4Qf/QiefRYOH4aYXCUTQjjbL1/zMxqJctPmBquXMidNvlL6Qqmd3tFyaIgLF5fi9aS2MeiZbFhsnFi2pmmyipOZwQAnlJCA0Qejf9ReGRhmf5UNDmrgCfBoew8/f6lz5ueekUlue2RnRoIYVmRgZGIEWlYbSEQ7nVpCopSitiQ/LSUkj73awx2/fp1rLqjhf79n9WnXcPvWdYTCUf7x6b0pX0fWuv12+P3vja/pdIZASefQBGORqAQwzpLLpfjWh9aT41L81QOv2nIG+im1t8Nb3wqf+QzM7vlz++0wOAi7dsF3vgN//ufwjnfA0qWwc6fxmKefhv/5P437f/lL2L0bwmf5e8cmwTohxPx018tdNFYVcZEDr8rCsavJqSojGYtE2dUTZNPSzJaPAJQV5LK8okD6YJxEIBEMcEIJCRjlTXbLwGjtGmZVVaHjBjPc+fRewtPHH09OTse4MwPnVRkfo5qJEWjZzsxcMEsxnKim1JvyJp4vHjjKXz/4GpuXLeRbH1p/xoZX51UX82eXLuEnLx7iwxcvznhKouP09sJPfgLxuHEl/MILobIScnONE70FC8DvN265ueDxHPtaVwduN0QixhV0j8f4+VRmB0q+97033d3hDwLSwPNc1JTk87X3n89n723ne8+9wefesdLqJZ2Z1vCpT8GBA8ZnZnra2D41BT/9qVFK8vrrRsZFTw+88YZxW5l4b6+/bmRrhGa1WVIKjh6FhQvhscegowOWLz92K0ucLJzhMyiEEOmyo3uEnT1BvnrdWkc2awdYXVOM1+OirXPkTaW8c7H98BBxDZuWZq6B52zNDWU8s7sfrbVj/5+kg/MyMPJS3lw2GfG4pr1rhPecX231Us7ZqbKr0tUiYDZLp5CIuekdMQIY1cXO7IEBxtrN95EKu/0hPvWLVpaVF/LDP7norOeOf/4dK6kozONvH91JTBp6nt7tt0M0anw/NQU33wxbt8J73gNmc9yf/AQuvhjWr4c1a2DFCmhogJFE3eiXvwz5+ZCTYwQwvLuaknUAACAASURBVF4oKjJeD4weBw0N8K//agRK/u3fjCvsJ9jVE8LjVqyqcs64KTu4dn0tWy+s5f/9Zj+vHrFpLW80Cj/4gZFdoRTcdZfxOTvxgDEWO5YJ5HaDzwdvext84hNQkGjs+rnPGZ+9QMAoN7nrLvja144FKZ56Cv7P/4EbbjA+twsXQn29EYT76U+PBev27cvc+xdCzHt3v9xFvsfN1g3OHa7ncbu4oK40ZRkYLYeGyHGpmQknmdbcUMbwxDSHnFiGmUZmBkaFYwIYXgbHp5iK2iMT9eDRMYKT0zQ5rHwEoLb05Oehp9qeShnPwBDJ601kLjg5A6O21EtgNEw0FifHnVwcrWdkko/9xzYK8nL46ccuPqcUrCKvh7+9Zg2fvbede1o6+ZNLliS1lqzV22uc0M3uLZCXB48/DsXFUJ2IHH/4w0bwYmrKuFo+PW18X5QINLz73cbJo3m/+dWT+H+2YoXxukoZV9+np2HzZuMKustlbFOKDn+QVVVFGZsDn02+ct06th0a4q/uf5UnP/sWFuTa6M/Ac8/BZz9rBK2mpowAxMqV0NZ2LMhlmpqCP/zhzK+pFFRUGLfNm4+/7wc/gDvvhIMHj2VvjI8bQY54/Nh+Ghth9WrYtAne+U648cbUvF8hhDhBcHKax1/zc92FtRR7nZVSfqINDaX85PeHCE/Hku5b0XJwkAvqSyz7m9WcKIlp7RxmWUWhJWuwo/5QhEUFuXiSPJbPFHOU6sBYhLoMnGifidn/otmBpWK3XNXIbY/sZHLWBJJ8j5tbrmpM+75tdOQqzlZvMIzX43JcrdRs1SVe4hoCo5GkInXBiWk++pNtTERiPPjpS+b0Wu+7oIb7tnVx59N7eff5NZQXOiOKnFG3337shM6ktZGCPzu9fuXKY+n7J7Nli3E7lXe+0+hlMHtf09PGFfTKSrj4YvRllxGNrmbt2y6Z23uZ50ryPXzrQxdy449f5mtP7uHv33++1UuCzk7467+Ghx6CJUvgkUeMrAtTe3v69l1YCBdcYNzACNYtW3Z8wCQnxyiDeuIJGB4+FsC48UZYvNgIjGzaBLXJp0mnXW+vkXFy//3HAo9CCNt4tL2HyekYN21yZvPO2Zp8ZfwwdpAOf5Dmhrn3rpicirGjO8gn37oshas7N8vKjR4FbV3DfPAiZ421TaeB0bAjJpCYzLX2h8K2CWCULfCwtLzA6qWcMzND7M6n9+IfmaS2NJ9brmrMSOaYM8Jl4jjmCFUn1+DVJkbA9ibRByM8HeOTP99O1+AEP/zTZs6rnltDR6UUX71uHZPTMf7hV6/PeT1Z7aWX5n4F/FycLFBibg8GjQyNH/6Qe3/wF9z6vz8C3/72sfIVJ7BJY8hLli/i5suXcU9LF8/u6bd0LYAxReTJJ+GrXzUabb7//W8uGcmUk30GXS5YtcoIpP3iF8a2SMTI2Pj2t+GP/sgIcPh8RvkTGK8xmf460LOmtbGeTDXiFUKcM601d73cyfr6Es6vd36PJzMtPtlxqm1dw0Tjmo0WNPA0uVyKJl/pzBVzYegPRRzT/wKgqsgIYARC9phE0to5TJOvzLHndFs31PHirVdy6I738uKtV2as7E0CGA7UG5x07AhVU02i/GWuo1Tjcc0XHniVbYeH+OaH1nPp8vKk1rOispBPXL6Mh9u6eeXwvBhmc27a240ToBNvqb4yfrpASVkZ3H8/Lzz3Gn/7zk+TV5APX/gCbNtmPC4UevNz7URruPVW25w8fuFdq1hdU8wXH97B0bEMd+TWGh5+GPYmOlV/85tGw80vfcnokWKl030GlTpWDpWXBy0txufuD38wAhmXXQblid9F+/YZ5VUXXWRMUPnFL2D/fuO9n2iuga143GhI2tFhlN/8+tfH7rvjDnjf+2DjRqOvzIIFRqaI2dvjpz+1PJAmhDjeK4eH2R8Yy4rsCzD6IixemJ90H4yWg4O4FJZPZGluKGNfv9GzQBj6Q+GZsgwnMNdqh0kkw+NTvDEwPjOxR5w9CWA4UG8w7NgRqqaaRAPSuTTy1Fpz+5O7+dXOPv7Pe1Zz7frUpG3/zytXUFeaz5ce3eWsMZPZ5CwCJa9OuLi7+b3Qss3olXDVVcYd3/iGcRX885+HV1+16A3MYl7Fb2+Ha64xSmB+/vNjzUkPH7Z0eXk5bv75hgsJhaPc+vAO9MlOrNNh1y5j3On118N3v2tsq683shfs4FyDdV4vXHKJ8bm7917jfYERMPibv4GSEvjZz+BP/9TI4vjlL437Dx82xrwOD588K+LwYfiv/zICH9/8JtxyC3z608fu/+QnjSBKRQWsWwdXXgkf+9ix+w8cgO5uozHpFVcY42TLyo59Lmc3QRVC2MLdLZ0UeXO4Zn2N1UtJmSZfGW1dw0n9jXn50BDr6koosrgniHmiaacpFlaKxTVHxyJUFjnnnKRsQS4et6LfBhkY7Uec2//CatIDw2GisbjRN6LE+rqtZBTn57Ag1z2nUao//t0hfvriYf7HZUv5xOVLU7amBbk5fOmaNXzqrlb+4w+H+cTl1tVailPr8IdYVl5AQV4OrF177I53vMO4wv2DH8A//7PRTPTP//z4k7506euD1lbYvt24tbbCP/wDfPSjRoPSzk5YtMg4WY3FjL4eX/6ycWJroVVVRdx69Xl89Ynd3LvtCDduSmMQYXgY/u//NXqmFBcbX2++OX37s5rPB1//uvF9LAZ79sDLLxtZGgAPPmgEOOBY09rvf9/oBbJ0KXznO8bn2JSXZ/SsiMWMqStXXGEEL6qqjt1m97T48Y+PX8+JvT1mj6KVXhhCWG5wLMKvd/Zx4yafvZorJ6nJV8Zjr/rxB+fWcyA8HePVIyN89BLrs1LW15fidinaOoe5orHS6uVYbnAsQlzjqAwMl0tRWeS1RQZGa+cwbpdifb01k3WcTDIwHGZgLEIsrh2fgaGUoqbES985lpA8/pqfr/9qD+89v4a/fe/qlNeMXbW2iisaK/jOf++3RXRWvFlHT5C1tSepDX7b2+CBB4wTte99D3Jz4fnnj93/3HNG4CBZgYCRqm/2/xgYgJoaI8viK18x+iK84x1G2j4YV8f/67+MIMbsKS4PPmis9WMfg7vvPv6+DPqzS5fwlhXl3P7E7vSOh/vWt+Bf/sUIKu3fD3/xF0ZzzPnA7TY+B5/4hBHIAvjUp+DZZ43mnyaX61jQ49Ofht/9ziizGRkx+lccPmy8FsBNN8Hf/70xqeWGG4zP/+rVp17DyXp7SBaGELbxYGs3U7F4egPJFjjWB2NuWQuvHRlhKhpn49JFqVzWnBTk5bC6pohWycAAjEb8gKOaeAJUFufNjH+1UlvnCGtri8nPTW5Cz3wkAQyHMXtGOL0HBkBNST7+cwhg/OGNo/yvB15l49KFfOtD63G5Ut/wRinFV65dy1Qsztee3JPy1xfJGR6fwh8Ms7b2NA1bFy40To63bTuW4fD660aKfV0d/NVfwf9n777Do6rSB45/3/Te6AmEUIP0DgoqKyqKqyIWdHXXsta17K7KWta24iquuu7603VtiAW7gAUEZRVQqgSkFxEIpEAgIYWQnvP7484kk96n5f08T56Ee2fmnjMzzJz73ve8Z/Pmyts3pv7As89ahRp79rSudE+datU8AOsq+Msvw8qVVqHRHTusqSKTJlXev66Tx4cesqYmXHONlTGyYEHtNRLakI+P8Ozlwwjw8+FPH/5ESWtOn1q1yqopAVa2QVKSFVzq4PqBqMuFh1sBh82bK1/z8nJ47z3rvZiYCBMnWtNOIiNbXtTUWYV4lVJNVl5ueG/dQcb2iqF/l3BXN6dVDegWTpC/T7PrYKzbn4UIjE1wXQFPR6Pio/npYLZONYaKC32eVMQTrEKerr5IWVpWzk+HsisCfKppNIDhYQ5XBDA8ewoJYMvAaNwUkl2Hc7nl7SQSOoTy2m9Ht3g98fr07BDKbWf24YvNaazae6zNjqOabntaLgCD4xpZnT3IFujr29daAvPMM600/eHDYcQIqx6Dvf7AQw/BsmVWLY3LL69cKhOszI5t26z0/2eftTI73nijcv+tt8Lpp1cWeKyurpPHjRutnw8/tLJDpk+3rsj/8kvj+tdKukYG8eQlQ9h8KJsXv93b8gdMTbWCMhMnWtNGwJo2Mnx4yx/bmzgzK8JZhXiVUk32w95jHMw6ydVeln0B4O/rw9DuUWw82LyVSNbtz2RA1wgiQ1xb/8JuZM9o8ovL2H0kz9VNcTl7BkYXD8vA6BIR6PIpJLsO51FQUqb1L5pJAxgeJi3bOuH3igyMqGAy8ooavOKbll3AdXN+JCTQl7k3jHXKl9htk/oQHxPCI59to7hUo+zuYltaDkD9GRi18fODCy6wpm2kpVlTGUJCrO32VRneeAPOOcdaKWTjxqqrYfzwg7WqxHvvwT33WIGQiCa0ob6TRx8fuOIKayWJOXOsK+32mgTZLVt6rikuGNqN6SPiePG7vU27UuaYwVJUZK1+kZgIn3xiBYXmz2+7Rns6zYpQSmEV74wJDeC8wd5Zj2ZkfDTbU3MoLGnaVMni0nKSko8zzoXLp1ZnP+Fs7pQYb2LPYugY5lkZGJ0jgsgpKGny+7E12Zfj1QBG82gAw8MczikkyN+HKDeJRLdEt8ggjKHeNK6cghKue3M9+UWlzL1+bLMKQDVHkL8vf7toEL8czef1H/Y55ZiqYdvTcomLCiYqJKD5D9KhA9x+uzW94YUXKq+A+/pay05mZloZEI4ZFgEtOF5j+flZ9TDWrYPQUCsjY+xYa7rKxo1tf3zgsYsH0TUiiD9/+BP5RaWNu5PjChrvvQcPPGAFgnbssLaFhrZtoz2ZZkUo1e4dzilk2c4MLh/dnUA/75wLPzI+itJyw9bUnCbdb2tqDoUl5W4VwIiLCqZLRGDFCWh7lpFXRIfQAAL8POt00p4xkuHCLIyk5ON0iwwi1knnNd7Gs95xivScQrpFBrd68UpXsGeR1FXIs6i0jJvf3sD+Y/m88ttRnNKtiVfdW+hXAzpz7sAu/N//9pKa3fTVUlTrswp4ttL7ID3dyr6wXwEvK7OmkFS/Iu4q5eVW0ce1a2HUKGtay862rcsSEeTP8zOGczDrJE8s2lH/jY2xgi2vv2619c03rcDF8uVWLY/euoqPUko15IMfD1JWbvjNWO+bPmI3splZC+v2ZwIw1o0CGCLCqJ7RWsgTyMgtpJOH1b+AylVTjriwkGdS8nGtf9ECGsDwMOk5BV4xfQSoiDrWVsizvNxw90ebWbc/i2cvH8ZpfTs6u3kAPHLhQAyGWV80cDKn2lx+USn7M/MbX/+iIe6+KkNgoFX4cv9+eOQRWLLEWsnCXhSzjYztFcOtZ/bh/fWH+GbHkZo3eO89a9WL7t1h/PjKlV3KyqylY888s03bp5RS3qK0rJwP1h/ijP6d6NnBe7PVOoYFEh8T0uRCnuv2ZdGvcxgd3GyKwsj4aA5lFZDRzlery8gr8rj6F1CZgeGqQp6HcwpJzS6oCOypptMAhodJzyn0+CVU7ez9SK8lu+HJxTtZtCWdB84fwMXD45zdtArdo0O486x+LNl+mOW7M1zWDgU703Mxphn1L+riKfUHIiOt5Vn37bOWzbQvu/n111Y9jzbw57P7M6xzEO//8z1O/G2WVZDTvlLG4sXWlJExY8DfYSpbcbGVhVHfai5KKaUqfLsrg8O5hV5ZvLO6UT2j2XgwG9PIlbZKy2z1L3q7T/aFXUUdjHaehXEkt9DjViABaxUSwGWFPO3vG61/0XwawPAgpWXlZOQVeU0GRkSQP2GBfhVLw9q9/v0+Xv9hP9edlsDNZ7g+Df2m03vTu1Moj36+3aUFf9q7ban2Ap6tlIHhafUHOnWC++6zin4WF8Nvfwt9+sDMmXCsFVfL+eILAs6axIIHL2DOG3cT9tgjmI0bKwuKvvYaHDoEsbE1l/Z0pwwWpZRyc/PWHaRLRCCTB3R2dVPa3Mj4KI7mFZFyvHFTcnek53KiqJSxvdxv2e1BsZEE+Pm06zoYZeWGYyeKPTIDIyLYj0A/H5dl0CQlHyfQz4eBTp4a7000gOFBjp0opqzceMUSqnbdIoNId1hK9cstaTyxaCfnDerKw78e6Ba1PgL8fHj8osEkZ57klRVa0NNVtqfl0jEsoGLuYrsWEGBlkFx+OTz3nFVv4tFHIacJBdLS063lYe+6y1pS1h64KS6GoiJ87riDb5/8LyPvnMe8OV9BtO1KQXCwFbjwlAwWpZRyQwczT7Ly56NcOSYeP1/vH46PiG9a1sK6fVkAjHej+hd2AX4+DOse2a4DGJn5RZSVGzp74JhMROgSEeSyKSQbDx5nWPcojyt+6k70mfMgaTnes4SqXdfIoIoMjLX7Mrn7w82M7hnNv64cjq+P64MXdhP7deSCod34z/K9HMw86ermtEvb0nIZGBvpFkEtt9C7N7z9NmzbBueeC48/bv1t57i8qTHWEqdgLdfap4+VQTFjhrXaSocOlcGISy+1inM++yyT7ruZQcP68MSiHfxy9ETV43taBotSSrmR99YfxEeEq7y4eKejAV3DCQnwZdPBxi0Pvm5/Jr06htLZTa/wj+wZzbbU3HabmWtfwaNzuHu+Pg3pEhHokikkhSVlbEvN0foXLaQBDA9iX63DWzIwFm5KJSn5OFtSchj792VcO2cdPWKCef3a0QT5u99SYg9fMBA/H+GxL7Y3eg6nah1FpWX8fCSPwa1V/8KbDBwIn3wCe/bAhAnWtkcesbIzvv8eTjsNuna1CmwCxMfDsGFW5sb69dbUkGXLKmtrOPDxEZ69fBhB/r78+cOfKCkrr3EbpZxJROaISIaIbHPYFiMi34jIz7bf0bbtIiIviMheEdkiIiMd7nOt7fY/i8i1DttHichW231eEI2YtoqFm1KZMPtbet2/iAmzv2XhplRXN8mlikrL+HjDISYP6Ow1dc0a4ufrw9DukY3KwCgrN6zfn+VWy6dWNyo+muKycranNW1pWG+RYVvBw1OzYjtHBLlkFZJtqTmUlBmtf9FCGsDwIGnZ3pOBsXBTKg/M38rJYitynZFXRFGp4epx8USFBLi4dbXrGhnEn87uz7e7MmpfnUG1mZ+PnKC03LRe/Qtv1K+f9busDL77DlatsjIiDhyAM86AsWOt/eHhMH8+3H13zUKctegSEcRTlwxhS0oOL/zv57btg1INmwucV23b/cD/jDH9gP/Z/g1wPtDP9nMz8DJYAQ/gUWAcMBZ41B70sN3mZof7VT+WaiL7931qdgEGSM0u4IH5W9t1EGPp9iNk5hdz9fierm6KU42Mj2ZHWsNZC7sP55FbWOpWy6dWZ7+C3l6nkdizF9w1Q6YhXcKDKrJInMn+fhkZH+X0Y3sTDWB4iIWbUvnXsj0A/Pr/vvf4L/5nlu6moJYvsDd+OOD8xjTBdRMS6N8ljL99sYOC4vaZNugKlQU8NQOjQb6+1nKr9sCEvz907gxTpzb7Ic8f0o3LRnXnpe/2kpSc1UoNVarpjDErgepvwouBt2x/vwVMc9j+trGsBaJEpBswBfjGGJNljDkOfAOcZ9sXYYxZY6w0u7cdHks1U23f9wUlZTyzdLeLWuR689Ym0yMmmNNdtES8q4yMj6a03LAlpf6shXX7MwEY19v9CnjadQwLJKFDSLsNYNhP/ju52RK3jdUlIpATRaWcKCp12jEXbkrl+W+sc7mLXlzl8edyrqQBDA9gv3pxosgaAKRmF3r81Yu0WpZOrW+7u/D39WHWxYNJzS7gxe/0arSzbE/LJTzQj/iYEFc3xf2lp8PcuVBSYv27lZY3ffTCgcRGBfPnDzc79QtfqUboYoxJB7D9ti/pEAcccrhdim1bfdtTatmuWsBTv+/bys9H8li3P4vfjO2JjxvV+nKGEbarzg1NI1m3L4vu0cHERbn3lOmRPaNJSm780rDe5EheITGhAR5biNK+eoqzViKxzuW2UFhqTcXVTLSW8cx3XTvjjVcvYuv4UqpruzsZ17sD00fE8erKfTULG6o2sS0th1NiI9rdYK9ZZs2C8mq1KlphedPwIH+enzGclOMnefyL7S16LKWcpLYPDNOM7TUfWORmEdkgIhuOHj3agiZ6v9io2lPMI4L9KG2HdXXmrTuIv69wxejurm6K03WwZS1srCdrwRjD+gNZjHPD5VOrG9UzmmMnijiU1f6CcRm5RXQO98zsC6Bi9RRnFfJ8ZukuCkqqft55+rmcK2kAwwN449WLmVMSCa5WqDPY35eZUxJd1KKmeWDqKQT5+/LoZ1rQs62VlRt2pecxWOtfNE4bLm86JiGG2yb14aMNKSzZ1rKMDqVa0RHb9A9svzNs21OAHg636w6kNbC9ey3bazDGvGqMGW2MGd2pU6dW6YS3Gta95lxvH4GcglIufHFVu0rBLygu49ONKZw/uBsdPDT1vqVGxkez8WDdWQt7M06QlV/MuN7uW//Czl6IMelg+5tamZFX6LH1L8AhA8MJhTxLyspJza79OJ58LudKGsBwYzkFJTz62bbaL//gGdkKdZk2Io6npg8hLioYAeKignlq+hCmjfCMbN1O4YHce24iP+w9xqKt6a5ujlfbf+wEBSVlWv+isdp4edM/Tu7P4LgIHpi/xWmpl0o14HPAvpLItcBnDtt/Z1uNZDyQY5tishQ4V0SibcU7zwWW2vblich42+ojv3N4LNUMCzelsnjbYUb3jCIuKqji+/65y4fx32tGkn2ymEtfXs0D87eQfbK4wcfzdF9sSSOvsJSrx7WPpVNrM8KWtZByvPYTt7X7rWCAO69AYtevczjhgX7tKghnl5FbRBcPzsCwBzCOtPE4JqeghOveXF/nfk8+l3MlP1c3QNVUXm6YvymV2V/tJDO/mAl9OpB08DiFDqlHnpStUJdpI+I8JmBRm2vG9+SjDYeY9eUOJiV2JixQ/zu1hW2puQAMitMAhjsI8PPhXzNG8Ov/+56Zn2xh7vVj0JUmlbOIyPvAJKCjiKRgrSYyG/hIRH4PHAQut918MTAV2AucBK4HMMZkicgs4Efb7R43xtgvod6GtdJJMPCV7Uc1w9p9mfzlky2M7x3D2zeMq3Wu/MR+nfj3sj3MWXWApduP8MD5A7hsVHev/UyZt+4gfTuHufXqGm1tpEMdjB611LVaty+TrhFBHlHzytdHGB4fRVJytqub4lRl5YajJ4oqpmF4orBAP0IDfNt0CsmhrJNcP/dHkjPzuWpsDxZuSqtSEsAbzuVcRTMw3MyOtFyueGUN9368me7RIXx++0Tm3TSe2dOHemy2grfy9RFmTRvMkdwi/m1bIUa1vu1pOQT6+dC3U5irm6Js+nYO48Gpp7Biz1GGP/4Nve5fxITZ32oxKtXmjDFXGWO6GWP8jTHdjTFvGGMyjTGTjTH9bL+zbLc1xpjbjTF9jDFDjDEbHB5njjGmr+3nTYftG4wxg233ucPoHMFm2ZtxglveSaJHTDCvXDO6zkJ/YYF+/PWCgXx550R6dQxl5idbmPHKWvYcyXNyi9vettQcNh/K5upx8V4boGmMxC7hhAT41loHwxjDuv1ZjOsd4zHP0aie0ew+nEteYYmrm+I0WfnFlJWbiiwGT9UlIqjNMjA2HTzOJf9ZRUZuIW/fMI6npg/16Mxzd6OXjN1ETkEJz3+zh7fXHCAy2J+nLx3C5aN6VBQt9PRsBW81Mj6aK8f0YM6qA1w2qgeJXcNd3SSvsy01lwFdw/Hz1XirOwkP9LPNY7cGbfaK2oB+VinVjh07UcT1c9fj7yvMvX4skSH+Dd7nlG4RfHzLqXycdIinvtrF1H9/z+9P78UfJ/cjJMA7hqrz1iUT5O/D9JHtr3inIz9fH4Z1j2LjwZpZCwcyT3I0r8gjCnjajYyPptzA5kM5TOzXPpbFtZ/0e3IRT7AKeWa0QQbG4q3p/PnDn+gSEcQHN4+hb2frApyey7UePSNwMWMMnyalMPm55by15gC/GRfPd/dOYsaYeF1xwUP85bwBhAf58fBn27SgZyszxrA9LYdBcVrA0908+/Ueyqu93bWitlLtW0FxGTe+tYGjeUW8fu2YWqcI1MXHR5gxJp5v75nE9JFxvLJiH+f8cyVfb/f8gsG5hSV89lMaFw2LJTK44YCOtxvZM4qd6bkUFFddYW/dvkwAj5piMzw+ChHaVR0Me+FLTy7iCbYMjFYs4mmM4b8rfuEP8zYyKDaCBX84rSJ4oVqXBjBcaGe6NV3kHofpIk9MG0JUSICrm6aaICY0gPvOG8D6/Vks0BT6VpVyvIDcwlIt4OmGvHF1JKVU85WVG/704SY2p2Tz7ytHMLxHzdVHGiMmNIB/XDaMj289lbBAP25+J4kb3/qRQ1knW7nFzvPZplROFpdx9bierm6KWxgZH01puWFLStUsjHX7s+gYFkifTqEualnTRQT5k9glnKSD7SiAYcta8PQMDPsUkta4+FhSVs6DC7Yy+6td/HpoN967aXy7XWnIGTSA4QK5hSX87Yvt/Pr/fmBvxgmevnQI8287jSHd9Sqzp5oxugfDe0Tx5OKdFSn1quW2p+UAMEiXUHU7dVXO7ujhAxqlVPM8uXgnS7cf4eELBjJlUNcWP96YhBi+vGsiD04dwOpfMjnn+RX8Z/leikvLG76zGzHG8O7agwyOi2CojvMAGBFvLT/qOI3EGMO6fZmM6+U59S/sRvaMZlPyccqrpyV6KXvhy04e/n3fOTyQwpJycgtLW/Q4uYUl3DD3R95ff4jbf9WHF64cQZC/byu1UtVGAxhOZIxh/sYUznp2BXNXH+DKMT10uoiX8PERnpg2mKz8Yv75tabQt5btabn4+ggDtLaI25k5JZHgal/QAmSdKOLzzWmuaZRSyiXmrtrPGz/s57rTErhhYq9We1x/Xx9uPqMPy+4+kzP7d+IfS3Yz9YXvWWubauAJkpKPs/tIibYfTgAAIABJREFUHleP6+lxJ+ZtJSY0gF4dQ9nokLWQcryAtJxCxvX2nOkjdqPio8krKuXnjBOubopTZOQVEhMaQKCfZ5+k24uQtmRJ+ENZJ7ns5dWs+SWTf1w2lJlTBug5nRN4R2UkD7AzPZdHPtvGjweOM6x7JHOuG83Q7s1Lr1TuaXBcJNeM78lba5JZvO0wx/KKiI0KZuaURC3a00zbUnPo2ylMI9luyP6efmbpbtKyC4iNCua2Sb35/Kd07np/E3sO53H3Of31i1wpL/fNjiM8/uUOzj6lCw//emCbHCM2KphXfjuab3cd4ZHPtnPlq2uZPjKOB6eeQkc3T9Oet+4g4YF+XDQs1tVNcSsj4qNYuecoxhhEhHX7rZWMPan+hd2onlZGSVLy8XZRzP1IbpHHTx+BygDGkdwi+nVp+uv206FsbnxrA0WlZbx9w1hO69s+iri6Aw1gtLHcQvvqIslEBPnx1PQhzBjdQwf1XmpAN+sD8GielV6nKzO0zPa03HZT1dsT1VZR+4rR8Tzy2TZe/G4ve47k8fyM4YQG6leNUt5oS0o2d72/icFxkbxw1XB823hsc9aALpzauyMvfvczr67cx7IdR7jv/AFc5aaZrFn5xSzams6VY3ro52A1I+Ojmb8xlUNZBcR3CGHdvkyiQvzp39nzAgA9O4TQITSApOTj/GZcvKub0+aO5hV6fAFPgC4RVhCmOUupLtmWzp8+/ImOYYF8cPM4+nrg+9aT6RSSNmKMYcGmyukiM8b04Nt7JnHVWPf8klWt46Vvf6mxTVdmaJ6MvEIy8oq0/oWHCfDz4anpQ3j0woEs23mES19e7dHF95RStUs5fpIb5m6gQ1gAb1w7xmnLnQYH+DJzygC++uPpDIyN4K8LtnHJy6vZlprjlOM3xadJKRSXlreLk9qmGmmrg5F00Mq8WLc/i7EJMR45RhYRRvaMrjIlxiulp8OZZ1KSmt72GRi2Y3G47VYh6hxuy8BowkokxhheXfkLt83byCndIlh4+wQNXriABjDawK7Ducx4ZS1//nAzcVFBfHb7BJ68ZAjRobq6iLfTlRlaz/a0XAAG6wokHkdEuH5CL+ZeP5bU7AIufmkV623pwUopz5dTUML1b/5IcWkZc68f45Jifn07h/P+TeN5fsYwUo+f5KIXf+Cxz7fzwfpkJsz+ll73L2LC7G9Z6KLVwcrLDfPWJTO6ZzQDuur3WHWJXcMJDfBlz6afKZpwOgUHUxnXu0PbHrQNT4pH9Yxm/7F8Mk8UtfmxanDWsWbNwvzwA1d9/VZF9kJbHosffrB+t5HgAF8igvw4eSClUc9fSVk5f124jScX72Lq4G68f9P4pk9hc9Zr5Y3vPweaz9YCCzelVpn/fedZffg5I5+5qw8QrtNF2qXYqGBSawlWiMBL3+3l6nHxukxuI+2wBTAGagDDY53RvxMLb5/ATW9t4OrX1/LEtMHMGKNXIpXyZMWl5dz2bhIHMvN564axLr36KCJcMqI7ZyV24ZmvdzF39YEq+105jXP1L5kcyDzJH8/u59TjegpfH2FYjygGz5lNwJpV3FkQwcgHLmzbgzqeFL/0Uus8pjFQXMzoLkEEFxeyeWcKZ/XrAI8+ah3rb3+Dv/+95v1CQyEwEEpKIC+v5v6wMAgIgOJiOFFLcdDwcPD3t/b/9a/Wse6/H558EsrKoHNn6/Fzc60Ty7IyKC+v/J2YCMHB1snn/v1V95WXw4QJEBQEP/8Mu3bBsWPwxhtIeTkzflrKZ/kPWO3YuhX27KnZvksuAR8f2LQJ9u2rus/Hx9oP8OOPcPBg1f0nTsCbb1rteOMN6+S4a1fr+QgMtJ67/v2t2x4/br0GAQHWj7+/NehupC4RQYx558UG3xe5hSXcPm8j3/98jD9M6sO95yY27/yurd6DZWVQWmr9BARUHueBB2D27Kq3j4iwXvviYuv5qy4y0nrti4ogO7vm/uho6xiFhZCTYx2jtfvUAGmNtW89yejRo82GDRta/DgLN6XywPytFJSU1dh31dh4/jIlUTMu2qHa3hcBvj706hjC7iMnCPb35YrR3blhYi96dvCcdc5d4bZ3k9iRnsuKmb9ydVNUC+WcLOGO960v/usnJPDXqafg56sJgN5ERJKMMaNd3Q5XaK1xhScwxnDvx1v4dGMK/7xiGNNHdnd1k6oY88QyjtqvgDuIiwpm1f1nObUtt72bxNp9max5YLIWoq7Dy+99z/XXnk1QaTHlCNK3D+Jnu7Y6YQK8/rr19+TJkFZtdatzz4V//9v6e/x460TK0SWXWCfzAEOHQkEB/PKLdbInAvfcA888Y52E9e1b8wT+z3+Ghx6Co0ehZ8/K7fafJ5+0Agb79kGfPjU75+9vBScCA60TwermzoVrr4VVq2DixJr7P/0Upk+HJUvg/PNr7v/6azjnHHjtNbj55pr716yxnpc5c+D3v6+5f9s2GDTIeg7/9Kea+5OTIT4enngCHn64xu6US66k+/z3refg6adr3r+42HoObr8d/vOfqvsCA63nHazn4O23a+63BYYQsf521KtXZVDknHNg2bKq+0eMgI0brb9//WsryBIYWBnkGD0aXn0VgJWnTWXi2qX4mHLw9YXzzoNTT7WCQgC33ELB4Qw2HDhOflEpg+Ii6HHB2XD33db+3/0OTlabJnvWWfCHP1h/X3GF9X4B6z24ZIn17+Bg2L4dbrqpMvBg//n97+G226z33qmn1tz/6KNw551WcOmUU6z3raPZs+Gxxyqf4+reeQeuuQZWrrSCQ9UtXAgXXwyLFlnPX3X/+5/Vxw8+gKuuqtweHGy9Ll1bvoy2XV1jC83AaKZnlu6uNXjRKSyQp6YPcUGLlDuobWUG+yokO9Nzef37/by3/iDvrE1myqCu3Hh674rq1cpiz2xKzS4g2N+HhZtStQCqh4sM8efN68bw5OJdzFm1n70ZJ3jxNyOJDPZ3ddOUUk3wwv/28unGFP58dn+3C14AHKsleAHOn8Z5JLeQr3cc4fcTe2nwoh4XfTEHMbaTOwExxgo2gHWSajdgAHSsVtC7Z8/KvwcOhPz8qvt79Kj8e/BgWL++8mRYpPIE137S6uNj/fj6Wr+HDbP2h4TAHXdU7rf/TJhg7Y+JsYIZPj7MXXsQH18ffpe+0cosAOt4EyZYJ7KOxo6t7Kc9EOPI/jycckrt+xMTrd/ffWe1uazM+j1xonVyan/+zjwT3n23sl++vtaP/fmZNs16fh33+/hYGRwAN9wAY8ZYJ7QOgZjYrxZamR1/+hNcfXXN9tkDUQ8+CLfeWnWfY4bEE0/AvfdW/vvoUZg61Qpe2J+/wECrD2Fh1vYAhwvEd94JF15obbf/OL5Xxo+3/m3fV1RkZSDYDNy7GezvwbIyWL26ynsnb8duMvYk09UYYqOCCT2SXTWY9vPPNTNoTjml8u9duyoDGGlplX+XlVmBn8JC67myZ5b4+Vn9BGvb+PHWNscf++PHxFgBpOr716+vPI6vr/X+u/LKyjbZ33t9+9YMLkHle2/w4Nr327NfRo2C00+3nrOyMuvHSVkYmoHRTL3uX0Rtz5wA+2df0OLHV97rSG4hc1cfYN7aZHILSxkZH8XNZ/TmnIFd27yCu7urLYMl2N+Xp6YP0SCGl/jwx4M8tHAbPaJDeP3a0fTuFObqJqlWoBkY3p+B8WlSCvd8vJlLR3bn2cuHIk1I03aWCbO/rX0aJ3DvlESnBRT+738/89w3e/ju3kn06qjZlrVKT6c0oRd+xZUnxWWBQfge2N+qV3Dtx6J376pXpNvgavGsL3ew9JtNfP/qjUgbHwtwWr/4wx+sqRz2oAJgAgKQG29s/ZPVWo5FQAC0xbHS0ylJ6IW/w3vQ8flbuv0wf/xgEx1CA3nz+jH0b8ZSq47Hcspr5azjOOlYdY0tNIe3mWKjgpu0XSm7LhFB3HfeANY8MJnHLhzI0RNF3PruRs56bjlvrT7AyeJSVzfRJYwxPL1kV43MJl3FxbvMGBPPvBvHk11QwrSXVrFyz1FXN0kp1YDVe49x//wtnNanA09NH+KWwQuAmVMSCa4WoAj082FQbATPLN3N5OdW8PnmNNry4l1ZueH99QeZ2LejBi/qse+P91FWLfW9tLSUfXfd1/oHmzWr8oq0nf1qcSsa1TOaW1bOwzjhWIDT+sWaNVUDCoAUF1tX3ltbLceirY41a5Y1dcRRWRnm8cd5/ft93PpuEoldrZVGWhS8sB3LKa+Vs47j7GNVo1NImmnmlMRarxTPnJLowlYpTxIa6Md1E3rx21MTWLr9MK+u3Mejn2/nn9/s4Zrx8Vx7aoJXrLMNVnAit7CUwzmFpOUUkJ5dSHpOAWm23/bthSXltd5fV3HxLmN7xfDZ7RO46e0NXPfmeh66YCDXT0hw25Mipdqzn4/kccu7SSR0COXla0YR4Oe+177qm8a5eu8xnli0k7ve38Sbq/bz8K8HVizl2Zq+25VBWk4hj1w4sNUf25uU/rCawLKqF2wCy0op/WFV6x/MSSfFo3pGcyxtNz7OOgF31sn+pk0Vf/51wVYWb01n0yPntu4xajlWm1uzBt+SkqrbiotJX/ItT0RcwPmDu/LPK4YTHNAKWVvOeq2cGQBy5rGq0SkkLVB9FRL7l6RSzWGMISn5OK99v4+vdxzB38eHi4fHcuPpvUns6t5rTOcXlVYJSKRlF1YGK3IKSc8uIL+46pUWH7HW4O4WFURsZDDdIoP4OOkQOQU1M1BcUYBNtb0TRaX8+cOf+GbHEa4c04PHLx7s1idHqm46hcQ7p5Bk5BVyyUurKS4rZ8EfTqN7dIirm9QiZeWGTzem8MzS3RzNK+KiYbH85bzEVu3X9W+uZ3taLqvuPwt/LVZcJ2+dij1h9rcM7xHFS1ePdHVT2sRNb2/gUNZJlvzpDFc3pVUkJR/n0pdXM/f6MYzqGc0d721ixZ6j3HJmb+6bMkBXknQxLeLZBqaNiNOAhWo1IsLohBhGJ8Rw4Fg+b/ywn4+TDvFxUgpn9O/Ezaf3ZkLfDk6/Sl1YUkZatj1LwgpGpOVYgQp7JkVuYc2gQ6fwQGIjg+jTKZSJfTsSGxVEt8jgit+dwwNrrEQxOC5SM5vakbBAP165ZhTPfbObl777hX1H83n5mpF0aOq66kqpVneyuJQb39pAVn4xH91yqscHL8BauvOK0T24YEg3XlnxC6+s3MeS7Ye5cWIv/vCrvoQFtmxYfCjrJMv3HOXOX/XV4EUD6lp23tOnYo/qGc26/ZkYY7wyqzAjt5BO4d7zHb35kLWM6HVv/oifj1BWbnjykiH8Zpwu+e7ONIChlBtK6BjKrGmDufuc/sxbl8zc1clc88Y6BnQN56bTe3PhsFgC/HxanAVUVFrGkZwiW6ZEtSkdtr+Pnyypcb+Y0AC6RQbRIyaEcb1j6GbLoOgWGURsVDBdIoKadSW9vvRf5Z18fISZUwbQv0s4f/lkCxe9uIrXrx3NKd0iGr6zUqpNlJUb7nr/J7al5vDqb0czpHukq5vUqkID/bj73ESuHBvPM0t385/lv/DRhkPcc24iV4zu0eyC2u+vP4gAM8bqyU9DvHUq9qie0Xy+OY20nELiPDwYU5uMvCL6tbQehJtYuCmVfzjUWCstNwT4+hDSGlNGVJvSAIZSbiw6NIA7zurHjaf35vOf0njt+33c8/Fm/rF0F2MSYli280hF3YjU7AIemL8VsAIBJWXlHMkttKZw2DIn0nMKSbP9Ts8p4NiJ4hrHjAz2rwhEDI+PIjbSypiwT/XoGhnUplXcNbOpfbp4eBwJHUK56e0NXPryav41YzjnDmrlitlKeQB3mJ4668sdLNt5hMcvHsTZA7s49djOFBsVzPMzhnPtaQk88eUOHpi/lbdWH+ChCwYysV/Hhh/AQXFpOR9tOMRZAzp75Ylra/PWCxajelp1VZKSj3vd+6C83HA0r4jOXpKB8czS3TVqrxWXlfPM0t0e/z70dhrAUMoDBPn7csWYHlw+ujsr9hzlte/38eWW9Bq3KygpY+Ynm3nqq50czSuivNoE07BAPytTIiqYQbERFYGJbvYgRWQQoS1MoVWquYb1iOKLOydy89sbuPmdJGZOSeQPk/o4PQ3XHU4gVftUfSnp6oFpZ5jzw37mrj7AjRN78btTE5xyTFcb3iOKj289la+2Heapr3ZyzRvrOGtAZx6cOoC+nRt3tfnrHYc5dqKYq8f3bOPWeg9vvGAxoGs4wf6+bEw+zkXDYl3dnFaVdbKY0nJDFy8pMF9XgXgtHO/+9ExFKQ8iIkxK7MykxM51FsAqKTOc3q+TlTkRFVyRTdEtMojwIH+nt1mppugSEcSHt5zKXz7ZwjNLd7P7cB7/uGxom2b9OHKHE0jVfj2zdHedS0k74/23dPthZi3awXmDuvLg1FPa/HjuRESYOqQbZw3ozFurD/Dit3uZ8q/vuWZcPH88uz8xoQH13n/e2oN0jw7mjH6dnNRi5Y78fH0Y3iOKpOTjrm5Kq1q4KZW/L94JwL+X7SEy2N/jvxO9tQ5Le6ABDKU8VF0fvHFRwTx7+TAXtEip1hHk78u/rxxOYtdwnlm6mwOZ+UwfGcdrK/e3WVZEaVk52QUlPLl4p0tPINuSZpa4v7qu/KVmF3D7vI306hhKQsdQenUMpXfHUKIbOKluip8OZfPHDzYxrHsUz88Y3m6r7wf5+3LLmX24bFR3nl+2h3fWJrNgUyp3Te7H705NqLW+096ME6zZl8nMKYnNrp+hvEdYoC9r9mXS6/5FXvFZWz2wn3WyxCsC+95ah6U90ACGUh5KP3iVNxMRbv9VX/p1DuP29zby2Oc5FfsayoooLCnj+MlisvKLyT5ZwvGTxRw/WUJ2fjFZJ6tuO55fzPGTxeTVspKOo9TsAm5+ewO9O4XRu2MovTpZJ5AxoQEeUWleM0s8Q12B6UA/H3ak57Jk+2HKHOYGRgb7VwQz7IEN+09jpgM6BrVEICrEn9evHU2wFrGjQ1ggT0wbwu9OTeDvi3byxKKdvLM2mQfOP4Upg7pU+X//3rqD+NlWOFHt28JNqazYcwwAg+d/1hpjeHrJLq8M7HtrHZb2QIypLQnde3nzeu2q/dErqqo9GPv3ZWTkFdXYHhrgy6QBnck+WczxfHtQorhGUS5HYYF+RIX4Ex0SUPE7JrTy738t21PryjtBfj50jwkhOTOfkrLK782IIL+KoEbvTqH06hhWcQLZmJPAtv4/bA/mXPziqlqfw7ioYFbdf1aLj1PXWu3tQWuOK6oHmsAKTD81fUhFceaU4wXsP3aCfUfzOZCZz/5j+ew/mk9aTmGVx+ocHlgloGH/ie8QQqCfb63HCvTz4elLh+r3SC2W787g74t28nPGCcb2iuHhCwbyy9ET/GPJLtJyCgn29+Gp6frctXcTZn9baxDS31c4+5QudI0MomtEEF0jg+gSUfl3c6dJtvQ7JL+olPScAlKzrWLvaTn23wWkZxeSllNQ53eqAPtnX9CsdivVGHWNLTQDQykP5o0FsJSq7mgtJ94A+cVl7EzLJSrEWjlnYGwE0SH+RIUEEB0SQHSIP9GhlX9HhvgT6Ff/IDEy2L/eE8jSsnJSswvYdyyffUfzK04k1+zLZP6m1CqPFRsZRO9OVkDDCm6E0qdTGLFRwfj6SJOyIowx5BWVku0QqDluC9xk27NJatlW/apZdVqszL00dEXQ39enIhBx1oCq9y0oLiM5ywpm7M+0/T6Wz7KdR6qsOOUjEBcdTEZuEUWlVU9Mikq1An9dJiV2ZmLfjnzw4yGe/2YPF774A74ilNkuBBaUlHv0lXbVOur6TC0pM+w+ksfKPUfJL675uRwV4k/XCCuo0c0e3LAFO+zbokL8q2T+NPQdUlxazuEcKwiRnlNAWnblSnRp2QWkZReQWy37UMQKfnaLDOaUbhGcNaAzHycdIqegZpai1opQrqIZGEoppdxaXVe0Wit7oLrmXtE6WVxqXQ2vCG7ks++oFeDIK6oc/AX4+tCzQwiHjp+s9cpWSIAvE/t2rDr9xVb9vTYiVuDFnlUSExJgC+JUBnCeXbqLrFoySzQDo3Yich7wb8AXeN0YM7uu23rCuCKnoIQDx6yMDft78/PNabXeVq+qNiy3sITTnvqWE0U1T+ra6nNJeYbGfF/lFZZULHN/OKeQI7mFHM4t5HBOEYdzCzicU0RmfhHVT9EC/Xwqsja6RAbx3a6MWt+D/r5CVEhArcH/qBB/YiODiY2yVp+Ljar8u1ukFTTx961a56WhzDCl2opmYCillPJIzq730tzMppAAPwbFRjIoNrLKdmMMx04U24IbVkBj37F8fs44UevjnCwu40BmPtEhAfTpFEZ0qH9lQMKeXWLbFhMSQESwf4OFA0MCfLVmTiOJiC/wEnAOkAL8KCKfG2N2uLZlzRcZ7M+wHlEM6xFVsS0p+bhW4G+miCB/8ms5cQTNamrvGvN9FR7kT3iQf71L9JaUlZORV1QR4Ei3BzpyrGDHlpTsWoMX1n0NZyV2pltUkC1YEUy3KCuLIySg6ad+WitCuRuPD2A05SqJUkopz+PpgycRoVN4IJ3CAxnbK6Zie31X6r7+85mt2gZPfw6dbCyw1xizD0BEPgAuBjw2gFEbLQTdMroEo6pNa33W+vv6EBcVTFw976cJs/9HanZhje1xUcE8fdnQpjW8ATplWbkTjw5geONVEqWUUjV54+DJUzJL2qE44JDDv1OAcS5qS5vRoFbLaABI1cVZn7UzpwzQ96Bqlzw6gEE7uUqilFLK++gJpNuqbT5OldnoInIzcDNAfHy8M9rUJjSo1Xz6/1e5mr4HVXvl6QGMRl0l8ZaBhlJKKe+iJ5BuKQXo4fDv7kCVipfGmFeBV8Eq4um8pil3ov9/lavpe1C1Rz4N38StNXiVBKyBhjFmtDFmdKdOnZzQLKWUUkp5qB+BfiLSS0QCgCuBz13cJqWUUkrh+RkYDV4lUUoppZRqLGNMqYjcASzFKhA+xxiz3cXNUkoppRSeH8CouEoCpGJdJfmNa5uklFJKKU9mjFkMLHZ1O5RSSilVlUcHMPQqiVJKKaWUUkop1T54dAAD9CqJUkoppZRSSinVHnh6EU+llFJKKaWUUkq1AxrAUEoppZRSSimllNvTAIZSSimllFJKKaXcngYwlFJKKaWUUkop5fbEGOPqNjiViBwFklv5YTsCx1r5Md2BN/bLG/sE3tkvb+wTeGe/vLFPoP1qip7GmE6t/JgeoY3GFeCd7z9v7BN4Z7+8sU+g/fIk3tgn8M5+tVWfah1btLsARlsQkQ3GmNGubkdr88Z+eWOfwDv75Y19Au/slzf2CbRfyrW88XXyxj6Bd/bLG/sE2i9P4o19Au/sl7P7pFNIlFJKKaWUUkop5fY0gKGUUkoppZRSSim3pwGM1vGqqxvQRryxX97YJ/DOfnljn8A7++WNfQLtl3Itb3ydvLFP4J398sY+gfbLk3hjn8A7++XUPmkNDKWUUkoppZRSSrk9zcBQSimllFJKKaWU29MARiOIyBwRyRCRbbXsu1dEjIh0tP1bROQFEdkrIltEZKTzW9ywJvbpaltftojIahEZ5vwWN05T+uWwfYyIlInIZc5raeM1tU8iMklEfhKR7SKywrmtbbwmvgcjReQLEdls69f1zm9x49TWLxF5TERSba/LTyIy1WHfA7bPi90iMsU1ra5fU/okIueISJKIbLX9Pst1La9fU18r2/54ETkhIvc6v8UNa8b7b6iIrLH9v9oqIkGuaXn74o3jCtCxRbXtOrZwAW8cW3jjuAK8c2zhjeMKcL+xhQYwGmcucF71jSLSAzgHOOiw+Xygn+3nZuBlJ7SvOebS+D7tB840xgwFZuHec7fm0vh+ISK+wNPAUmc0rpnm0sg+iUgU8B/gImPMIOByJ7WxOebS+NfqdmCHMWYYMAl4TkQCnNDG5phLLf0CnjfGDLf9LAYQkYHAlcAg233+Y3tPupu5NLJPWOuAX2iMGQJcC7zjpDY2x1wa36+KfcBXbd6y5ptL499/fsC7wK22z4tJQImzGtrOzcX7xhWgYwv7dh1buM5cvG9sMRfvG1eAd44t5uJ94wpws7GFBjAawRizEsiqZdfzwF8Ax0IiFwNvG8taIEpEujmhmU3SlD4ZY1YbY47b/rkW6N72LWyeJr5WAHcCnwIZbdy0Zmtin34DzDfGHLTd11v6ZYBwEREgzHa/0jZvZDPU06/aXAx8YIwpMsbsB/YCY9uscc3UlD4ZYzYZY9Js/9wOBIlIYJs1rgWa+FohItOAfVj9cktN7NO5wBZjzGbbfTONMWVt1jhVwRvHFaBjCwc6tnARbxxbeOO4ArxzbOGN4wpwv7GFBjCaSUQuAlLtL46DOOCQw79TbNvcXj19cvR73D9KWEVd/RKROOAS4L8uaVgL1PNa9QeiRWS5LcXudy5oXrPV068XgVOANGAr8EdjTLmz29dCd9hSpeeISLRtm8d+XtjU1idHlwKbjDFFzm5YC9Xol4iEAvcBf3Nt05qttteqP2BEZKmIbBSRv7iyge2dN44rQMcWnkTHFh43tvDGcQV459jCG8cV4KKxhQYwmkFEQoC/Ao/UtruWbW6/1EsDfbLf5ldYg4z7nNWulmqgX/8C7vO0K44N9MkPGAVcAEwBHhaR/k5sXrM10K8pwE9ALDAceFFEIpzYvJZ6GeiD1fZ04Dnbdo/8vLCpq08AiMggrBTqW5zftBapq19/w0qVPOGqhrVAXX3yAyYCV9t+XyIik13SwnbOG8cVoGML57aqZXRs4XFjC28cV4B3ji28cVwBLhxb+LXmg7UjfYBewGYr64zuwEYRGYsV6ezhcNvuWJFdd1dnn4wxh0VkKPA6cL4xJtOF7Wyq+l6r0cAHtu0dgakiUmqMWeiqxjZSQ++/Y8aYfCBfRFYCw4A9rmpsE9TXr+uB2cbVlKiAAAAgAElEQVRa93mviOwHBgDrXdXYpjDGHLH/LSKvAV/a/umpnxf19QkR6Q4sAH5njPnFBc1rtnr6NQ64TET+AUQB5SJSaIx50QXNbJIG3n8rjDHHbPsWAyOB/zm9kcobxxWgYwsdW7ieV44tvHFcAd45tvDGcQW4dmyhGRjNYIzZaozpbIxJMMYkYL1QI40xh4HPgd+JZTyQY4xJd2V7G6O+PolIPDAf+K0xxhO+rCrU1y9jTC+H7Z8Af/CAAUZD77/PgNNFxM921WEcsNOFzW20Bvp1EJgMICJdgESsOYMeQarOV78EsFdx/hy4UkQCRaQXVpE+tx84Qd19EqvY2yLgAWPMKle0rSXq6pcx5nSH9+a/gCc9ZZBRz/tvKTBURELEKrp1JrDD2e1T3jmuAB1boGMLl/PWsYU3jivAO8cW3jiuANeOLTQDoxFE5H2sCqodRSQFeNQY80YdN18MTMUqmnMSK7rrdprYp0eADliVjAFKjTGjndLQJmpivzxCU/pkjNkpIkuALUA58LoxpsZSYu6gia/VLGCuiGzFSo+8zx7ZdTe19QuYJCLDsdI4D2BLfTTGbBeRj7A+2EuB290x7bgpfQLuAPpipRg/bNt2rnHDom9N7JdHaOL777iI/BP40bZvsTFmkSva3d5447gCdGzhSXRsAXjI2MIbxxXgnWMLbxxXgPuNLcTKmlJKKaWUUkoppZRyXzqFRCmllFJKKaWUUm5PAxhKKaWUUkoppZRyexrAUEoppZRSSimllNvTAIZSSimllFJKKaXcngYwlFJKKaWUUkop5fY0gKGU8kgislxE3HLJPaWUUkp5Fh1XKOUZNIChlFJKKaWUUkopt6cBDKWUU4jIX0TkLtvfz4vIt7a/J4vIuyJyroisEZGNIvKxiITZ9o8SkRUikiQiS0WkW7XH9RGRt0TkCef3SimllFKuoOMKpdonDWAopZxlJXC67e/RQJiI+AMTga3AQ8DZxpiRwAbgbtv+/wMuM8aMAuYAf3d4TD9gHrDHGPOQc7qhlFJKKTeg4wql2iE/VzdAKdVuJAGjRCQcKAI2Yg04Tgc+BwYCq0QEIABYAyQCg4FvbNt9gXSHx3wF+MgY4zj4UEoppZT303GFUu2QBjCUUk5hjCkRkQPA9cBqYAvwK6APsB/4xhhzleN9RGQIsN0Yc2odD7sa+JWIPGeMKWyzxiullFLKrei4Qqn2SaeQKKWcaSVwr+3398CtwE/AWmCCiPQFEJEQEekP7AY6iciptu3+IjLI4fHeABYDH4uIBmSVUkqp9kXHFUq1MxrAUEo50/dAN2CNMeYIUAh8b4w5ClwHvC8iW7AGHgOMMcXAZcDTIrIZa1BymuMDGmP+iZU2+o6I6GeaUkop1X7ouEKpdkaMMa5ug1JKKaWUUkoppVS9NKqolFJKKaWUUkopt6cBDKWUUkoppZRSSrk9DWAopZRSSimllFLK7WkAQymllFJKKaWUUm5PAxhKKaWUUkoppZRyexrAUEoppZRSSimllNvTAIZSSimllFJKKaXcngYwlFJKKaWUUkop5fY0gKGUUkoppZRSSim3pwEMpZRSSimllFJKuT0NYCillFJKKaWUUsrtaQBDKaWUUkoppZRSbk8DGEoptyUic0XkifZ6fKWUUkq1jIgcEJGz2+vxlfI2GsBQqh0TkcdE5F0nH/MKEdkpInkiskNEpjnz+K1FRC4QkR9EJFtEDovIayIS7up2KaWUUs7k7LGEiCSIiBGREw4/Dzvr+K1JRH4lIt+JSI6IHKhl/ywR2SoipSLymPNbqJT70QCGUqrZRMSvibePA94F7gYigJnAeyLS2dltaQWRwBNALHAK0B14xsltUEoppTxaC76/o4wxYbafWS5uS3PlA3OwxkO12Qv8BVjktBYp5eY0gKFUOyAi94lIqi3rYbeITBaR84AHgRm2qxebbbeNFZHPRSRLRPaKyE0Oj/OYiHwiIu+KSC5wnYj4iMj9IvKLiGSKyEciElNHU7oD2caYr4xlEdaXd596mt9RRL6xtX2FiPR0aI8RkdtF5GfgZ9u2f4vIIRHJFZEkETm9Wvs/EpG3bY+3XURGO+wfISIbbfs+BILqapQx5j1jzBJjzEljzHHgNWBCPf1QSimlPJYbjSWaY4wt6/O4iLwpIkG2tkwSkRRb3w4Db4pItIh8KSJHbbf/UkS6O7R/uS0zYpXtufhaRDo67P+tiCTb+vHX+hpljFlvjHkH2FfH/reMMV8Bea3yLCjlBTSAoZSXE5FE4A5gjDEmHJgCHDDGLAGeBD60Xb0YZrvL+0AKVmbBZcCTIjLZ4SEvBj4BooB5wF3ANOBM232OAy/V0ZwNwE4RuUhEfG3TR4qALfV04WpgFtAR+Ml2TEfTgHHAQNu/fwSGAzHAe8DH9oGKzUXAB7b2fw68aHueAoCFwDu2+34MXFpPu6o7A9jehNsrpZRSHsHNxhJ2ybbgw5uOAYQ6XG1rcx+gP/CQw76uWN/7PYGbsc6P3rT9Ox4owDZWcPAb4HqgMxAA3AsgIgOBl4Hf2vrRAevijVKqlWgAQynvVwYEAgNFxN8Yc8AY80ttNxSRHsBE4D5jTKEx5ifgdawvYrs1xpiFxphyY0wBcAvwV2NMijGmCHgMuKy2NExjTBnwNlZgocj2+xZjTH497V9kjFlpe+y/Aqfa2mn3lDEmy9YWjDHvGmMyjTGlxpjnbH1PdLj9D8aYxba2vAPYB1vjAX/gX8aYEmPMJ1jBkAaJyDnAtcAjjbm9Ukop5WHcZiwBHAPGYAUYRgHh1Ly4Ud2LxphDxpgs4O/AVQ77yoFHjTFFxpgC2xjiU1uGZZ7t9mdWe7w3jTF7bG3/COvCCVjBmi8dxi0P2x5fKdVKNIChlJczxuwF/oQ1GMgQkQ9EJLaOm8cCWbYvbLtkIM7h34eq3acnsECsYpbZwE6sgU6X6g8uVhXufwCTsK5YnAm8LiLDq9+2tuMZY04AWbZ21toeEblHrCKhObb2RGJlb9gddvj7JBBkGyDFAqnGGOOwP7medtmPNx4rEHOZMWZPQ7dXSimlPI07jSWMMSeMMRtsFyqOYGWGnCsiEfV0wfF4yVQdRxw1xhTa/yEiISLyim0aSC6wEogSEV+H+1QfS4TZ/o6l6rglH8isp11KqSbSAIZS7YCtXsNErAGCAZ6276p20zQgRqquphEPpDo+XLX7HALON8ZEOfwEGWNSqWk4sNI28Cg3xvwIrAPqW16sIttCRMKw0jzTamuPrd7FfcAVQLQxJgrIAaSex7dLB+JExPG28fXdQURGYE1DucEY879GHEMppZTySG40lqjRNNvv+r7rHTM346ljHGFzD1bm5jhjTATWFNGGHt8unarjlhCsaSRKqVaiAQylvJyIJIrIWSISCBRizeUss+0+AiSIiA+AMeYQsBp4SkSCRGQo8HvqT838L/B3e3FNEekkIhfXcdsfgdPtGRe2AMDp1F8DY6qITLTVqJgFrLO1szbhQClwFPATkUewVjtpjDW2+94lIn4iMh0YW9eNRWQwsAS40xjzRSOPoZRSSnkcdxpLiMg4W3t8RKQD8AKw3BiTU8/j3y4i3W2FQR8EPqzntuG2/mXbbv9oPbet7hPg1w7jlsep53zL1ocgrCmsYnu+Ahz2+9v2+2CNa4KqZYIo1e5oAEMp7xcIzMaaM3oYq+DUg7Z9H9t+Z4rIRtvfVwEJWFcnFmDNC/2mnsf/N1YWwtcikgesxSqqWYMxZgVW+uknttt+CjxpjPm6nsd/D2vwkIU11/Xqem67FPgK2IOVIlpIzTTVWhljioHpwHVYxcNmAPPrucs9QCfgDalch16LeCqllPJGbjOWAHpjXUDIA7Zh1dS6qo7b2r0HfI212sc+rGXQ6/IvIBirr2ttx2oUY8x24Hbb8dKxxhMp9dzlDKxgyWIqC4Y6joles227CqsOWAFVa4ko1e5I1eneSimllFJKKaWUUu5HMzCUUkoppZRSSinl9jSAoZRSSimllFJKKbenAQyllFJKKaWUUkq5PQ1gKKWUUkoppZRSyu1pAEMppZRSSimllFJuz8/VDXC2jh07moSEBFc3QymllPIaSUlJx4wxnVzdDlfQcYVSSinV+uoaW7S7AEZCQgIbNmxwdTOUUkopryEiya5ug6vouEIppZRqfXWNLXQKiVJKKaWUUkoppdyeBjCUUkoppZRSSinl9jSAoZRSSimllFJKKbfX7mpgKKWUal9KSkpISUmhsLDQ1U3xeEFBQXTv3h1/f39XN0UppZRyGR1btJ6mji00gKGUUsqrpaSkEB4eTkJCAiLi6uZ4LGMMmZmZpKSk0KtXL1c3RymllHIZHVu0juaMLXQKiVJKKa9WWFhIhw4ddIDRQiJChw4d9GqTUkqpdk/HFq2jOWMLDWAopZTyejrAaB36PCqllFIW/U5sHU19HjWAoZRSSrmR5cuXs3r16hY9RlhYWCu1RimllFKezpvGFloDQymlnGDhplSeWbqbtOwCYqOCmTklkWkj4lzdLFULV79Wy5cvJywsjNNOO81px1Tuw9XvP6WUUq3P1Z/t3jS20AwMpZRqYws3pfLA/K2kZhdggNTsAh6Yv5WFm1Jd3TRVTVu+VtOmTWPUqFEMGjSIV199FYAlS5YwcuRIhg0bxuTJkzlw4AD//e9/ef755xk+fDjff/891113HZ988knF49ivgJw4cYLJkyczcuRIhgwZwmeffdbiNirX0s8KpZTyPjq2aF2agaGUUm3smaW7KSgpq7KtoKSMZ5bu1iurTva3L7azIy23zv2bDmZTXFZeZVtBSRl/+WQL768/WOt9BsZG8OiFgxo89pw5c4iJiaGgoIAxY8Zw8cUXc9NNN7Fy5Up69epFVlYWMTEx3HrrrYSFhXHvvfcC8MYbb9T6eEFBQSxYsICIiAiOHTvG+PHjueiii3ROrgfTzwqllPI8OrZwLg1gKKVUG0vLLmjSduU61QcYDW1vihdeeIEFCxYAcOjQIV599VXOOOOMimXDYmJimvR4xhgefPBBVq5ciY+PD6mpqRw5coSuXbu2uK3KNfSzQimlvI+OLVqXBjCUUqqNxUYFk1rLCUhsVLALWtO+NXQ1Y8Lsb2t9reKigvnwllObfdzly5ezbNky1qxZQ0hICJMmTWLYsGHs3r27wfv6+flRXm4NcowxFBcXAzBv3jyOHj1KUlIS/v7+JCQk6BKnHk4/K5RSyvPo2MK5tAaGUkq1sZlTEgnyr/pxG+zvy8wpiS5qkarLzCmJBPv7VtnWGq9VTk4O0dHRhISEsGvXLtauXUtRURErVqxg//79AGRlZQEQHh5OXl5exX0TEhJISkoC4LPPPqOkpKTiMTt37oy/vz/fffcdycnJLWqjcr22ev8ppZRyHR1btC4NYCilVBubNiKO2yf1rfh3l4hAnpo+ROe0u6FpI+J4avoQ4qKCEayrI63xWp133nmUlpYydOhQHn74YcaPH0+nTp149dVXmT59OsOGDWPGjBkAXHjhhSxYsKCi0NZNN93EihUrGDt2LOvWrSM0NBSAq6++mg0bNjB69GjmzZvHgAEDWtp95WL2919UsD+gnxVKKeUNdGzRusQY4+o2ONXo0aPN/7N35/F111X+x18n+560SdqmvS1JoZSWNmUpmy0iIlAEAR1AcKEqUgUdnZ+KwKjDCKIyKI44KFOFARRBtgGUpZRF1rLUKd0ohTYtbZobmi65SZvcrJ/fH9/vbdM2abZ7c+9N3s/H4z6S+/lu52bG8snJ53PO0qVL4x2GiIwwz6yuZcEfvUz3ny47gblTSuIc0cixZs0apk2bFu8who3ufp5m9g/n3Ow4hRRXsZhXrNoS4pzfvMJvLjmaT80aH9V7i4jI4GluEV39mVtoBYaIyBCobdi7f3DDtl1xjEQkeZnZnWa21cxW7Tf+z2a21sxWm9l/dBm/1szW+cfO7DI+zx9bZ2bXdBmvMLM3zOx9M/uLmWUMzSfb1+Fj88lIS2HlllA8Hi8iIpKwlMAQERkCNfVh0lKMnIxUNmxrinc4IsnqLmBe1wEzOxU4D6h0zh0J/MIfnw5cDBzpX/NbM0s1s1TgNuAsYDpwiX8uwE3Ar5xzU4CdwGUx/0TdyEhLYVpZAcs318fj8SIiIglLCQwRkSFQG2pmbEEW5cW5WoEhMkDOuZeAHfsNXwH83DnX4p+z1R8/D7jfOdfinNsArAOO91/rnHNVzrlW4H7gPPOa3H8ceMi//m7g/Jh+oIOYFShk1ZYQHZ0ja6uviIjIwcQsgdHdMk8zu8HMVpjZ22b2jJmN98fNzG71l3KuMLNjulwz31/K+b6Zze8yfqyZrfSvudWfeIiIJKRgKMz4oiwqSnLZuF0rMESi6HDgZH/rx4tmdpw/PgHY3OW8an+sp/FioN45177feFxUBorY3dpBVZ0SniIiIhGxXIFxF/st8wRuds5VOueOAv4G/Js/fhYwxX8tAH4HYGajgeuAE/D+YnKdmY3yr/mdf27kuv2fJSKSMIKhMOMKsykvyWHzjibaOjrjHZLIcJEGjAJOBK4CHvD/qNHdHzbcAMYPYGYLzGypmS2tq6sbWNS9mBUoBGB5tepgiIiIRMQsgdHdMk/nXEOXt7nsnRicB9zjPK8DRWZWBpwJLHbO7XDO7QQWA/P8YwXOuSXOa6NyD3Fc5ikicjDOOWpDYcoKs6goyaO901G9szneYYkMF9XAI/4c4k2gEyjxxyd2OS8A1BxkfBve/CNtv/EDOOcWOudmO+dml5aWRvXDREwuzSM3I5WV1aqDISIiEjHkNTDM7EYz2wx8nr0rMPq7zHOC//3+4yIiCWfH7lZaOzr9BEYOABu37Y5zVJLM8vLyAKipqeGCCy446Ln/+Z//SVNT/7Yt/f3vf+ecc84ZcHxD7FG82hWY2eFABl4y4nHgYjPLNLMKvNWabwJvAVP8jiMZeIU+H/f/IPICEPmBzgceG9JP0kVqinHkhEKtwBARkSGRLHOLIU9gOOd+4JybCNwLfNMfjtkyTxiapZ4iIj0JhrwWqpEVGABVSmAktmAQTjkFamuH7JEdHR39vmb8+PE89NBDBz1nIJOMRGVm9wFLgKlmVm1mlwF3ApP9mlv3A/P91RirgQeAd4CngW845zr8GhffBBYBa4AH/HMBrga+Y2br8Gpi3DGUn29/swKFvBNsoLVdW85ERJKe5hZREc8uJH8G/sn/vr/LPKv97/cf79ZQLPUUEelJJIExrjCbUTnpFGSlaQVGorvhBnjlFe9rFGzcuJEjjjiC+fPnU1lZyQUXXEBTUxPl5eVcf/31zJ07lwcffJD169czb948jj32WE4++WTeffddADZs2MBJJ53Ecccdx49+9KN97jtjxgzAm6R873vfY+bMmVRWVvKb3/yGW2+9lZqaGk499VROPfVUAJ555hlOOukkjjnmGC688EJ27fKKRD799NMcccQRzJ07l0ceeSQqnzvanHOXOOfKnHPpzrmAc+4O51yrc+4LzrkZzrljnHPPdzn/Rufcoc65qc65p7qMP+mcO9w/dmOX8Srn3PHOucOccxdGOpvES2WgiNb2Tt77sDGeYYiISDRobhGVz53W+ynRY2ZTnHPv+2/PBd71v38c+KaZ3Y9XsDPknAua2SLgp10Kd54BXOuc22FmjWZ2IvAGcCnwm6H7JCIifVcb8updjC/MwsyoKM1jgxIY8fOxjx04dtFFcOWV0NQEp50Gb74JnZ1w++2wbBksWABf+hJs2wb7L6v8+9/79Ni1a9dyxx13MGfOHL7yla/w29/+FoCsrCxeeeUVAE477TRuv/12pkyZwhtvvMGVV17J888/z7e//W2uuOIKLr30Um677bZu779w4UI2bNjAsmXLSEtLY8eOHYwePZpbbrmFF154gZKSErZt28ZPfvITnn32WXJzc7npppu45ZZb+P73v8/ll1/O888/z2GHHcZnP/vZPv4wJZZmBYoAWF5dz4wJhXGORkREeqS5xZDNLWKWwPCXeX4MKDGzarxuIp80s6l4BbY+AL7un/4k8Em8Hu1NwJcB/ETFDXj7VQGud85FCoNegdfpJBt4yn+JiCScYChMWopRnJcJQEVxDm9t3BnnqKRHH3wAzt+V6Jz3PgomTpzInDlzAPjCF77ArbfeCrDnP+i7du3itdde48ILL9xzTUuLtwDg1Vdf5eGHHwbgi1/8IldfffUB93/22Wf5+te/Tlqa95/20aNHH3DO66+/zjvvvLMnjtbWVk466STeffddKioqmDJlyp74Fi5cGJXPLQM3cXQ2RTnprKwOeX/eERGR5KS5RdTmFjFLYDjnLulmuNu9pH7hrG/0cOxOvP2t+48vBWYMJkYRkaEQDIUZW5BFaopXvqe8JJfHltcQbusgKz01ztGNQAf7q0YoBDt37jvJ2LkT5vmduktK+vxXkf15nT0PfJ+bmwtAZ2cnRUVFvP322326fn/OuT6dc/rpp3PfffftM/7222/3eq0MPTNjpgp5iogkPs0thmxuEc8aGCIiI0Iw1ExZYdae9xUluTgHm3YMj8KKw8oNN3jLO7vq6IjKftVNmzaxZMkSAO677z7mzp27z/GCggIqKip48MEHAW9CsHz5cgDmzJnD/fffD8C9997b7f3POOMMbr/9dtrb2wHYscNbsJifn09jo1dD4cQTT+TVV19l3bp1ADQ1NfHee+9xxBFHsGHDBtavX78nPkkMswJFvPdhI82t/S/EJiIiCUBziz3xRYMSGCIiMVYbCjNuvwQGoDoYiWjJEmht3XestRVee23Qt542bRp33303lZWV7NixgyuuuOKAc+69917uuOMOZs2axZFHHsljj3ldPH/9619z2223cdxxxxEKdf/X+K9+9atMmjSJyspKZs2axZ///GcAFixYwFlnncWpp55KaWkpd911F5dccgmVlZWceOKJvPvuu2RlZbFw4ULOPvts5s6dyyGHHDLozyvRURkopKPT8U5QqzBERJKS5hZRnVuYcz12Hx2WZs+e7ZYuXRrvMERkhHDOccSPnubSkw7hB2dPB6Ah3Eblvz/DNWcdwddPOTTOEQ5/a9asYdq0aXGNYePGjZxzzjmsWrUqrnFEQ3c/TzP7h3NudpxCiqtYzys+bAhzwk+f49/Omc5X5lbE7DkiItJ3mltEV3/mFlqBISISQzub2mhp76SsMHvPWEFWOiV5GWqlKiK9GluQxdiCTFZu0QoMERERJTBERGIo6LdQ7VoDA6C8OJcqJTBGjPLy8mHxFxKJj5kTilheXR/vMEREJIGM1LmFEhgiIjEUrA8D7FMDA7w6GFqBISJ9MStQSFXdbhrCbfEORUREJK6UwBARiaFgg5fAGF+Uvc94eUkuWxtb2N3SHo+wRpyRVu8pVvRzjI/KiUUArFI7VRGRhKH/JkZHf3+OSmCIiMRQbaiZ1BSjJC9zn/HJ6kQyZLKysti+fbsmGoPknGP79u1kZWX1frJEVeWEQgCWK4EhIpIQNLeIjoHMLdJiGI+IyIgXrA8zNj+T1BTbZ7zcT2Bs3L6bGf4vJxIbgUCA6upq6urq4h1K0svKyiIQCMQ7jBFnVG4Gk0bnsHKL6mCIiCQCzS2ip79zCyUwRERiKBgKU7bf9hHwingCbKjTCoxYS09Pp6JC7Scluc0MFPL2JiUwREQSgeYW8aMtJCIiMVTbED6ggCdAdkYqZYVZbNiuBIaI9G5WoJAt9c1s39US71BERETiRgkMEZEYcc5RU99MWUH3+/rKi3NVA0NE+qQy4BXyXKE6GCIiMoIpgSEiEiP1TW20tHd2u4UEoKJUrVRFpG9mTCjEDJZXaxuJiIiMXEpgiIjESDDktVAt62YLCUBFcS47m9qob2odyrBEJAnlZaZxWGmeVmCIiMiIpgSGiEiMBEPNAN3WwACoUCtVEemHykARK6pDatsnIiIjlhIYIiIxElmBMb6w+y0kXVupioj0pjJQyLZdLXv+bRERERlplMAQEYmR2lCY1BSjND+z2+OTRueQYmqlKiJ9UxkoBGCF6mCIiMgIpQSGiEiM1ISaGZOfSWqKdXs8Iy2FwKgcNmxvGuLIRCQZTSsrIC3FWK46GCIiMkIpgSEiEiO1oXCPBTwjykty2bBt1xBFJCLJLCs9lSPK8rUCQ0RERiwlMEREYsRLYHRf/yJickkuG7c1qSifiPSJCnmKiMhIpgSGiEgMOOeoCTX32IEkorw4h10t7WzbpVaqItK7ygmFNIbb2aitZyIiMgIpgSEiEgOh5jbCbZ29biGpKM0D1EpVRPqmMlAEqJCniIiMTEpgiIjEQKTNYW9bSCqK/VaqSmCISB8cPjaPrPQUlm9WIU8RERl5lMAQEYmBYKgZoNctJBNGZZOealQpgSEifZCWmsKR4wu1AkNEREYkJTBERGJg7wqMgycwUlOMSaNztAJDRPqsMlDI6poG2js64x2KiIjIkIpZAsPM7jSzrWa2qsvYzWb2rpmtMLP/NbOiLseuNbN1ZrbWzM7sMj7PH1tnZtd0Ga8wszfM7H0z+4uZZcTqs4iI9FdtKEyKwZj8zF7PrSjJVQ0MEemzykAhzW0drKtTC2YRERlZYrkC4y5g3n5ji4EZzrlK4D3gWgAzmw5cDBzpX/NbM0s1s1TgNuAsYDpwiX8uwE3Ar5xzU4CdwGUx/CwiIv1SUx9mTH4Waam9/zNbUZLLxu276exUW0QR6d2eQp6qgyEiIiNMzBIYzrmXgB37jT3jnGv3374OBPzvzwPud861OOc2AOuA4/3XOudclXOuFbgfOM/MDPg48JB//d3A+bH6LCIi/VXb0HsL1Yjyklxa2jupbQjHOCoRGQ4qinPJz0xjuepgiIjICBPPGhhfAZ7yv58AbO5yrNof62m8GKjvkgyJjIuIJIRgKMz4or4lMCpKvE4k2kYiIn2RkmLMDBSyou0NML8AACAASURBVForMEREZGSJSwLDzH4AtAP3Roa6Oc0NYLyn5y0ws6VmtrSurq6/4YqI9ItzjtpQmHEFB2+hGqEEhoj0V2WgiHdrG2hp74h3KCIiIkNmyBMYZjYfOAf4vHMuknSoBiZ2OS0A1BxkfBtQZGZp+413yzm30Dk32zk3u7S0NDofRESkBw3N7TS1dvTagSRibH4W2empSmCISJ9VBgpp63C8G2yMdygiIiJDZkgTGGY2D7gaONc519Tl0OPAxWaWaWYVwBTgTeAtYIrfcSQDr9Dn437i4wXgAv/6+cBjQ/U5REQOJtjQDEBZH7eQpKQYhxSrlaqI9F1loBCAFaqDISIiI0gs26jeBywBpppZtZldBvwXkA8sNrO3zex2AOfcauAB4B3gaeAbzrkOv8bFN4FFwBrgAf9c8BIh3zGzdXg1Me6I1WcREemPYMgrxtnXFRigVqoi0j8TirIpzs1guepgiIjICJLW+ykD45y7pJvhHpMMzrkbgRu7GX8SeLKb8Sq8LiUiIgklWO8lMMYV9q0GBngJjMXvfEh7R2efWq+KyMhmZlQGCrUCQ0RERhTNkkVEoqw21EyKwZj8zD5fU16SS3unY0t9cwwjE5HhpDJQxLqtu9jd0t77ySIiIsOAEhgiIlEWDIUpzc8kvR8rKSb7nUiqtI1EpEdmdqeZbTWzVd0c+56ZOTMr8d+bmd1qZuvMbIWZHdPl3Plm9r7/mt9l/FgzW+lfc6uZddf1LGFUBgrpdLC6piHeoYiIiAwJJTBERKIsGAr3a/sIeCswABXyFDm4u4B5+w+a2UTgdGBTl+Gz8IqCTwEWAL/zzx0NXAecgLcV9TozG+Vf8zv/3Mh1BzwrkVQGigAV8hQRkZFDCQwRkSgLhpoZ348CngDFuRnkZ6apkKfIQTjnXgJ2dHPoV8D3Addl7DzgHud5Ha/9ehlwJrDYObfDObcTWAzM848VOOeW+N3O7gHOj+XnGazS/EzGF2apkKeIiIwYSmCIiESRc85fgdG/BIaZUVGqTiQi/WVm5wJbnHPL9zs0Adjc5X21P3aw8epuxrt75gIzW2pmS+vq6gb5CQanMlCkFRgiIjJiKIEhIhJFDeF2mlo7+tVCNaK8WAkMkf4wsxzgB8C/dXe4mzE3gPEDB51b6Jyb7ZybXVpa2tdwY6JyYiEfbG8i1NQW1zhERESGghIYIiJRVBvyWqiW9bMGBnitVGvqm2lp74h2WCLD1aFABbDczDYCAeD/zGwc3gqKiV3ODQA1vYwHuhlPaJUT/DoYW7QKQ0REhj8lMEREoigY8tqgDmQFRkVJLp0ONu9oinZYIsOSc26lc26Mc67cOVeOl4Q4xjlXCzwOXOp3IzkRCDnngsAi4AwzG+UX7zwDWOQfazSzE/3uI5cCj8Xlg/XDzEAhACtUB0NEREYAJTBERKIo6K/A6G8NDPASGABVddpGItIdM7sPWAJMNbNqM7vsIKc/CVQB64DfA1cCOOd2ADcAb/mv6/0xgCuAP/jXrAeeisXniKbC7HQqSnJZvlkrMEREZPhLi3cAIiLDSTAUxgzGFgygBkaklep2JTBEuuOcu6SX4+VdvnfAN3o4707gzm7GlwIzBhfl0KsMFPJGVXfNWURERIYXrcAQEYmi2lAzpXmZpKf2/5/Xwux0RudmqJCniPRLZaCI2oYwWxvC8Q5FREQkppTAEBGJomAoPKD6FxEVJepEIiL9U6k6GCIiMkIogSEiEkVeAqP/HUgi1EpVRPrryPEFpBisqFYdDBERGd6UwBARiaLaUHhABTwjJpfm8mFDC02t7VGMSkSGs5yMNA4fm89yrcAQEZFhTgkMEZEoaQi3saulfVBbSMqL/UKe29RKVUT6rjJQyIrqerzapSIiIsOTEhgiIlFS67dQLSsa+BaSSCtVbSMRkf6oDBSxs6mN6p3N8Q5FREQkZpTAEBGJkmAkgTGYFRglOYBaqYpI/6iQp4iIjARKYIiIREmw3vvL57iCgScwcjLSGFuQSVWdEhgi0ndHjCsgIzVFhTxFRGRYUwJDRCRKgqEwZjB2EAkM8LaRaAWGiPRHRloK08ryWa4EhoiIDGNKYIiIREltKExJXiYZaYP7p7WiRK1URaT/KgNFrNrSQGenCnmKiMjwpASGiEiU1ISaB1X/IqKiJJcdu1sJNbVFISoRGSkqA4XsammnatuueIciIiISE0pgiIhESW0oHJUERqSV6gZtIxGRfqgMFAEq5CkiIsOXEhgiIlHiJTAG3kI1YnKpl8DYqG0kItIPh43JIycjVQkMEREZtpTAEBGJgsZwG40t7YyLwgqMiaNzSDFUB0NE+iU1xZgxvlCFPEVEZNhSAkNEJApqQ2GAqGwhyUxLZXxRthIYItJvlYFC3qlpoK2jM96hiIiIRF3MEhhmdqeZbTWzVV3GLjSz1WbWaWaz9zv/WjNbZ2ZrzezMLuPz/LF1ZnZNl/EKM3vDzN43s7+YWUasPouISG+CexIYg99CAmqlKiIDUzmxiJb2TtbWNsY7FBERkaiL5QqMu4B5+42tAj4DvNR10MymAxcDR/rX/NbMUs0sFbgNOAuYDlzinwtwE/Ar59wUYCdwWYw+h4hIr6K5AgP8Vqp1u3FO7RBFpO8qJxQCsHKL6mCIiMjwE7MEhnPuJWDHfmNrnHNruzn9POB+51yLc24DsA443n+tc85VOedagfuB88zMgI8DD/nX3w2cH6OPIiLSq5pQMwBjC6KXwGhsaWf77tao3E9ERoZDinMozE5nhepgiIjIMJQoNTAmAJu7vK/2x3oaLwbqnXPt+42LiMRFbShMSV4mGWnR+We1vMRvpao6GCLSD2ZGZaCQ5Zu1AkNERIafRElgWDdjbgDj3d/cbIGZLTWzpXV1dQMMUUSkZ8FQOGrbRwAmK4EhIgNUGShk7YeNhNs64h2KiIhIVCVKAqMamNjlfQCoOcj4NqDIzNL2G++Wc26hc262c252aWlpVAMXEQEIhpqjmsCYUJRNWoqxUQkMEemnykARHZ2O1TUN8Q5FREQkqhIlgfE4cLGZZZpZBTAFeBN4C5jidxzJwCv0+bjzqtq9AFzgXz8feCwOcYuIANFfgZGWmsKk0TlagSEi/VYZ8At5qg6GiIgMM7Fso3ofsASYambVZnaZmX3azKqBk4AnzGwRgHNuNfAA8A7wNPAN51yHX+Pim8AiYA3wgH8uwNXAd8xsHV5NjDti9VlERA5mV0s7jeF2xkWphWpERUmuEhgi0m/jCrIozc9kRbXqYIiIyPCS1vspA+Ocu6SHQ//bw/k3Ajd2M/4k8GQ341V4XUpEROKq1u9AMr4oeiswwCvk+er6bXR2OlJSuiv9IyJyIDNjVqCQ5VqBISIiw0yibCEREUlawVAY8P7qGU0VJbmE2zr5sDEc1fuKyPBXGSiiattuGsNt8Q5FREQkapTAEBEZpEgCoywGW0gANtRpG4mI9E9loBDnYOUWbSMREZHhQwkMEZFBCtZ7CYyxhZlRve+eBMZ2JTBEpH8qA0UArFQdDBERGUaUwBARGaTahmZK8jLITEuN6n3HFWSRmZaiVqoi0m+jczMIjMpWIU8RERlWlMAQERmkYCjMuCi2UI1ISTHKi9WJREQGZlagSIU8RURkWFECQ0RkkIL1YcYVRLf+RYRaqYrIQFUGCqne2cz2XS3xDkVERCQqlMAQERmkYKg56i1UI8pLctm0o4n2js6Y3F9Ehq9IHYwVKuQpIiLDhBIYIiKDsLulnYZwe0y2kABMLsmlrcNRU69WqiLSPzMmFGAGKzYrgSEiIsODEhgiIoOwt4Vq7FZgAFRt2xWT+4vI8JWflc7kklxWblEdDBERGR6UwBARGYTaPQmM2NTAKC/JAVAnEhEZEK+QZwjnXLxDERERGTQlMEREBiEYagZitwKjNC+TvMw0Nm5visn9RWR4qwwUUtfYQm2DtqGJiEjyUwJDRGQQIltIxhbEJoFhZpSX5FClFRgiMgCVE71CnstVB0NERIYBJTBERAYhGApTnJtBVnpqzJ5RUZKnLSQiMiDTywpISzFWVKsOhoiIJD8lMEREBqE21ByzDiQRFcU5VO9sorVdrVRlZDOzO81sq5mt6jJ2s5m9a2YrzOx/zayoy7FrzWydma01szO7jM/zx9aZ2TVdxivM7A0ze9/M/mJmGUP36WIjKz2Vw8fms1KtVEVEZBhQAkNEZBCCoXDM6l9EVJTm0ulg0w7VwZAR7y5g3n5ji4EZzrlK4D3gWgAzmw5cDBzpX/NbM0s1s1TgNuAsYDpwiX8uwE3Ar5xzU4CdwGWx/ThDY9bEQlaokKeIiAwDSmCIiAyCl8CITQeSiPJir5XqBm0jkRHOOfcSsGO/sWecc+3+29eBgP/9ecD9zrkW59wGYB1wvP9a55yrcs61AvcD55mZAR8HHvKvvxs4P6YfaIhUBooINbfxgYoBi4hIklMCQ0RkgJpa2wk1t8V+C0mJl8BQHQyRXn0FeMr/fgKwucuxan+sp/FioL5LMiQyfgAzW2BmS81saV1dXRTDj43KQCEAy1UHQ0REkpwSGCIiAxTpQBLrLSRFORmMyklnw3YlMER6YmY/ANqBeyND3ZzmBjB+4KBzC51zs51zs0tLSwcS7pA6fGw+mWkprKhWHQwREUluafEOQEQkWdXuSWDEdgsJQHlJLhvqlMAQ6Y6ZzQfOAU5zews9VAMTu5wWAGr877sb3wYUmVmavwqj6/lJLT01henjC1ipBIaIiCQ5rcAQERmgoVqBAd42ko1agSFyADObB1wNnOuc61rk4XHgYjPLNLMKYArwJvAWMMXvOJKBV+jzcT/x8QJwgX/9fOCxofocsTYrUMSqmhAdnSrkKSIiyUsJDBGRAQrWNwPEvAYGQEVxLsFQmObWjpg/SyRRmdl9wBJgqplVm9llwH8B+cBiM3vbzG4HcM6tBh4A3gGeBr7hnOvwV1d8E1gErAEe8M8FLxHyHTNbh1cT444h/HgxVRkopKm1g3Vbd8U7FBERkQHTFhIRkQEKNoQZnZtBVnpqzJ9VUeoX8ty+m2llBTF/nkgics5d0s1wj0kG59yNwI3djD8JPNnNeBVel5JhpzJQBHiFPKeOy49zNCIiIgOjFRgiIgNUGwozriD2qy9ArVRFZHAml+SSl5nGCnUiERGRJKYEhojIANXUNw9J/QvwiniCEhgiMjApKcaMCSrkKSIiyU0JDBGRAaptCFNWNDQJjLzMNMbkZ7JRCQwRGaBZgSLWBBtpbe+MdygiIiIDErMEhpndaWZbzWxVl7HRZrbYzN73v47yx83MbjWzdWa2wsyO6XLNfP/89/02aZHxY81spX/NrWbWXf92EZGYaG7toL6pbUhaqEaUl+RqBYaIDFhloIjWjk7erW2IdygiIiIDEssVGHcB8/YbuwZ4zjk3BXjOfw9wFl57synAAuB34CU8gOuAE/CKal0XSXr45yzoct3+zxIRiZnaBq+F6lDVwABvD7taqYrIQFUGCgFYrm0kIiKSpGKWwHDOvQTs2G/4POBu//u7gfO7jN/jPK8DRWZWBpwJLHbO7XDO7QQWA/P8YwXOuSV+3/Z7utxLRCTmIi1Uh2oLCXgrMLbtaqUh3DZkzxSR4SMwKptROems2KxCniIikpx6TWCY2YVmlu9//0Mze6TrFo9+GuucCwL4X8f44xOAzV3Oq/bHDjZe3c24iMiQCIa8FRhDuYWkwi/kqToYkuyiPLeQPjIzKgNFrNyiFRgiIpKc+rIC40fOuUYzm4u3IuJu/C0eUdRd/Qo3gPHub262wMyWmtnSurq6AYYoIrJXPLaQVKgTiQwfQzG3kG7MChTy3oeNNLW2xzsUERGRfutLAqPD/3o28Dvn3GNAxgCf96G//QP/61Z/vBqY2OW8AFDTy3igm/FuOecWOudmO+dml5aWDjB0EZG9auqbGZWTTnZG6pA9c9LoHMyUwJBhIZpzC+mHykARnQ5W16iQp4iIJJ++JDC2mNl/AxcBT5pZZh+v687jQKSTyHzgsS7jl/rdSE4EQv4Wk0XAGWY2yi/eeQawyD/WaGYn+t1HLu1yLxGRmKsNhRk3hNtHALLSUxlfmK0tJDIcRHNuIf1QOdEv5Kk6GCIikoT6Mlm4CC+RMM85Vw+MBq7q7SIzuw9YAkw1s2ozuwz4OXC6mb0PnO6/B3gSqALWAb8HrgRwzu0AbgDe8l/X+2MAVwB/8K9ZDzzVh88iIhIVwVCYssKh2z4SUaFWqjI8DGhuIYM3Jj+LssIsVqgTiYiIJKG03k5wzjWZ2VZgLvA+0O5/7e26S3o4dFo35zrgGz3c507gzm7GlwIzeotDRCQWgqFmjp5UNOTPrSjJ5bG3t+Ccw1uAJpJ8Bjq3kOiYOaFQhTxFRCQp9aULyXXA1cC1/lA68KdYBiUiksjCbR3sbGqLywqM8pJcGsLt7NjdOuTPFokWzS3ia9bEIjZs202oWS2ZRUQkufRlC8mngXOB3QDOuRogP5ZBiYgkslq/hepQ18AAmBxppbpd20gkqWluEUeVAa8OxkptIxERkSTTlwRGq7/FwwGYWW5sQxIRSWw1oWYAxsdpBQZAVZ0SGJLUNLeIo8oJ3va35dUq5CkiIsmlLwmMB/xK4UVmdjnwLF6hTRGREWnvCoyhT2AERmWTmmJagSHJTnOLOCrMSae8OIcVSmCIiEiS6UsRz1+Y2elAAzAV+Dfn3OKYRyYikqCCfgKjLA5bSNJTU5g0OoeN25qG/Nki0aK5RfzNDBSxdOOO3k8UERFJIL0mMAD8SYUmFiIieB1IinLSyc5Ijcvzy4tzqFIrVUlymlvE16xAIX9dXsPWxjBj8od+NZmIiMhA9JjAMLNG/L2p+x/C63xaELOoREQSWG0ozLiC+E34K0ryeL1qh1qpStLR3CJxVAa8Ohgrq0OcNk0JDBERSQ49JjCcc6oGLiLSjWAoHJcWqhEVJTk0t3XwYUNLXOpwiAyU5haJY8aEAlIMlleHOG3a2HiHIyIi0id92kICYGZjgD0zZefcpphEJCKS4IKhMLMmFsXt+ZFOJBu27VYCQ5Ka5hbxk5ORxpj8TP77xfX85rn3GV+UzVVnTuX8oyfEOzQREZEe9dqFxMzONbP3gQ3Ai8BG4KkYxyUikpDCbR3s2N1KWVy3kOxNYIgkI80t4u/RZVuoa2ylpb0TB2ypb+baR1by6LIt8Q5NRESkR31po3oDcCLwnnOuAjgNeDWmUYmIJKgPG+LXQjVifGE2GWkpaqUqyUxzizi7edFaOty+5Uia2zq4edHaOEUkIiLSu74kMNqcc9uBFDNLcc69ABwV47hERBJSTX38WqhGpKQY5cU5WoEhyUxzizirqW/u17iIiEgi6EsNjHozywNeAu41s61Ae2zDEhFJTLUN3uS+rCi+tSfKi3PVSlWSmeYWcTa+KJst3SQrxhfFLzkrIiLSm76swDgPaAL+H/A0sB74VCyDEhFJVMGQv4UkjjUwACpKc9m0vYmOzu46UookPM0t4uyqM6eSnZ66z1h2eipXnTk1ThGJiIj0ri8JDACcc+3AErxCWw2xCkhEJJEF68MUZKWRm9nnJk4xUVGcS2tHp5Z7S1LT3CJ+zj96Aj/7zEwm+KvJ0lKMn356hrqQiIhIQutLAuMlIMvMJgDPAV8G7oplUCIiiSoYCifEEutydSKR5Ka5RQI4/+gJvHrNadx8QSXtnY7ivMx4hyQiInJQfUlgmHOuCfgM8Bvn3KeB6bENS0QkMdU2NMe1A0nEZCUwJLlpbpFAzj1qPGPyM1n4UlW8QxERETmoPiUwzOwk4PPAE/5YfNdOi4jESbA+TFkCJDBK8zPJzUhVAkOSleYWCSQzLZUvz6nglXXbWF0Tinc4IiIiPepLAuPbwLXA/zrnVpvZZOCF2IYlIpJ4wm0dbN/dGtcWqhFmRnlJLhu3K4EhSUlziwTzuRMmkZuRyh9e3hDvUERERHrU6187nHMv4e1VjbyvAr4Vy6BERBLR1oYWgITYQgJeHYxVW/TXUkk+mlsknsLsdD573CTuWbKRq86cmhC1fkRERPbX5y4kIiIjXU3I6/iRCFtIwKuDUb2zmdb2zniHIiLDwJfnlOOAu17bGO9QREREuqUEhohIH9WGwgAJsYUEoLw4l45Ox+adTfEORUSGgYmjc/jkzDL+/MYmGsJt8Q5HRETkAL0mMMxsTl/GRESGu6CfwEikLSQAG+NUyPPRZVuY8/PnqbjmCeb8/HkeXbYlLnFI8tHcInEtOHkyu1rauf/NTfEORURE5AB9WYHxmz6OiYgMa7WhZvKz0sjLTIxmCfFspfrosi1c+8hKttQ344At9c1c+8hKJTGkrzS3SFAzA4WcNLmYO1/ZqO1pIiKScHqchfvtzT4ClJrZd7ocKgBSYx2YiEiiqQmFGZ8g20cARuVmUJidHpcExs2L1tLc1rHPWHNbBzcvWsv5R08Y8ngkOWhukRwWfHQyX77rLZ5YWcOnjw7EOxwREZE9DrYCIwPIw0ty5Hd5NQAXxD40EZHEUhsKJ8z2kYiKOLVSralv7te4iG9Qcwszu9PMtprZqi5jo81ssZm9738d5Y+bmd1qZuvMbIWZHdPlmvn++e+b2fwu48ea2Ur/mlvNzKL2yZPIKYeXMmVMHgtf2oBzLt7hiIiI7NFjAsM596Jz7sfAic65H3d53eKce38wDzWzb5vZKjNbbWb/4o9FbQIiIhILwVA4YTqQRFSU5LKhbugTGD21WFTrRTmYKMwt7gLm7Td2DfCcc24K8Jz/HuAsYIr/WgD8Drz5BnAdcAJwPHBdZM7hn7Ogy3X7P2tESEkxLj95MmuCDby6bnu8wxEREdmjxwSGmf2n/+1/mdnj+78G+kAzmwFcjjdpmAWcY2ZTiO4EREQkqlraO9i2qyVhOpBEVJTkUhMKE95vO0esfePUQw8YSzXjqjOnDmkcklwGO7dwzr0E7Nhv+Dzgbv/7u4Hzu4zf4zyvA0VmVgacCSx2zu1wzu0EFgPz/GMFzrklzlt2cE+Xe4045x09ntL8TBa+XBXvUERERPY4WCW6P/pffxHlZ04DXnfONQGY2YvAp/EmGh/zz7kb+DtwNV0mIMDrZhaZgHwMfwLi32cx3l9K7otyvCIibG1oAUi4FRh7OpFs380R4wqG7LlvbNiBASX5mWxrbCE3M41dLe1MHJ0zZDFIUorF3GKscy4I4JwLmtkYf3wCsLnLedX+2MHGq7sZH5Ey01L50kfKuXnRWtYEG5hWNnT/voiIiPSkxwSGc+4f/tcXo/zMVcCNZlYMNAOfBJYSvQnIAcxsAd7qDSZNmhS9TyIiI0aitVCNqCje20p1qBIYT64M8tjbNXzn9MP51mlTANjd0s7Hf/l3fvzX1Tx65RxSUkZk6QDpRQznFt3p7v8J3QDGD7zxCJlXfP6ESdz2wjp+/3IVt1x0VLzDERER6b2NqpnN8WtSvGdmVWa2wcwGvJ7QObcGuAlvyebTwHKg/WAhdHebg4x398yFzrnZzrnZpaWl/YxYRASCIa845fiixEpglJd4Kx6qhqgTydbGMD/435VUBgq54mN7t5HkZqZx7VnTWFEd4qF/VB/kDiJRn1t86K/MxP+61R+vBiZ2OS8A1PQyHuhm/AAjZV5RlJPBRbMn8vjbNXv+DRQREYmnXhMYwB3ALcBc4Dhgtv91wJxzdzjnjnHOfRRvL+v7RG8CIiISdXtXYCRWDYz8rHRK8jLZOAQJDOcc//rISna3dnDLRbNIT933PyHnHTWeYw8ZxU1Pv0uouS3m8UhSi+bc4nEgUsh7PvBYl/FL/WLgJwIhf6XnIuAMMxvl1846A1jkH2s0sxP97iOXdrnXiHXZ3Ao6neOu1zbGOxQREZE+JTBCzrmnnHNbnXPbI6/BPDSyPcTMJgGfwatbEZUJyGDiEhHpSW0oTH5mGnmZBysdFB+TS3LZuK0p5s956B/VPLtmK98/cyqHjck/4LiZ8eNzj2RHUyu3PjeoZlUy/A1obmFm9wFLgKlmVm1mlwE/B043s/eB0/33AE8CVcA64PfAlQB+7awbgLf81/WRelrAFcAf/GvWA09F5+Mmr4mjczhrZhl/fn0TjWElJkVEJL76MhN/wcxuBh4BWiKDzrn/G8RzH/ZrYLQB33DO7TSznwMP+JORTcCF/rlP4tXJWAc0AV/2n7/DzCITENh3AiIiElU19c2UJdj2kYjykhyef7cups/YUt/M9X99h+MrRvOVORU9njdjQiEXHzeJu1/byCXHT+w20SHCAOcWzrlLejh0WjfnOuAbPdznTuDObsaXAjMOFsNItODkyTyxIshf3trMV0+eHO9wRERkBOtLAuME/+vsLmMO+PhAH+qcO7mbse1EaQIiIhJttQ3hhNs+ElFRkse2XdU0htvIz0qP+v07Ox1XPbicTuf45YWzei3Q+b0zDudvK2r48V/f4Z6vHI+3Gl9kH1GfW0jszJpYxAkVo/mfVzcy/yPlB2wfExERGSq9/hfIOXdqNy9NMERkRAmGwpQVJOYKjAq/kGestpH88fUPeG39dn54zvQ+tUktzsvkO6cfzsvvb2PxOx/GJCZJbppbJJ8FH53MlvpmnlwZjHcoIiIygvW6AsPM/q27cefc9dEPR0Qk8bS2d7JtV0sCbyHxWqlu2L6bmYHCqN67qm4XP3tqDR+bWsrFx03s/QLfF048hPve3MQNT7zDRw8vJSs9NapxSXLT3CL5nDp1DIeW5rLwpSrOnTVeK6tERCQu+rIGcHeXVwdwFlAew5hERBLKhw1hnIOywgRNYBT7CYy66HYiae/o5LsPLiczLZWb/qmyX7+wpKemcN2njmTzjmb+8PKAO2/L8KW5RZJJSTEuP3kyq2saWLJ+ULXcRUREBqzXFRjOuV92fW9mv8DrDCIiMiLUNiRmC9WIrPRUxhdmsXF7dBMYdeYWQQAAIABJREFUC1+uYtmmen598VGMHcD2mTmHlTDvyHHc9sJ6/unYAGUJ+vOToae5RXI6/+gJ/OKZ91j4chUfOawk3uGIiMgINJAqTDmASlCLyIhRU98MwPgEXYEBUFGay4Zt0UtgrAk28KvF73H2zDLOnTV+wPf5wdnT6HSOnz35btRik2FJc4skkJWeypc+cgh/X1vH2trGeIcjIiIjUK8JDDNbaWYr/NdqYC3w69iHJiKSGGpDkRUYiZvAKC+OXgKjtb2T7zywnMLsDG44f8ag9rpPHJ3D1045lMeX1/DmBnW6Fo/mFsnr8yccQnZ6qraGiYhIXPSljeo5Xb5vBz50zrXHKB4RkYQTDIXJy0yLSYvSaKkoySXU3MbO3a2Mys0Y1L1ufe591gQb+MOlsxk9yHsBXHHKoTy0dDPXPb6av/3zXFJ7acMqI4LmFklqVG4GF80O8Oc3N/G9M6cOaHuZiIjIQPWljeoHXV5bNMEQkZEmGGpO2AKeERV+J5KqQa7CWLZpJ7/9+zouPDbAJ6aPjUZoZGek8q9nT2NNsIH739oUlXtKctPcIrl9ZW4FHZ2Ou17bGO9QRERkhBlIDQwRkRGlNhRO6O0jsLeV6sZBJDCaWzv47gPLKSvM5kefmh6t0AA4e2YZJ1SM5heL1lLf1BrVe4vI0DqkOJd5M8Zx7+sfsKtFuScRERk6SmCIiPQiGAon/AqMiaNySE2xQdXB+I9F71K1bTc3X1BJQZS3y5gZ/37ukYSa2/jV4veiem8RGXqXnzyZhnA7D7y1Od6hiIjICKIEhojIQbS2d1K3qyXhW4BmpKUQGJXNhgG2Un1t/Tb+59WNfOkj5TFrjzitrIDPn3AIf3z9A96tbYjJM0RkaBw9aRTHl4/mjlc20N7RGe9wRERkhFACQ0TkILY2hnGOhF+BAV4djIFsIWkMt3HVgyuoKMnl6nlHxCCyvb5z+uEUZKfz48ffwTkX02eJSGxd/tHJbKlv5qlVtfEORURERgglMEREDiIZWqhGRFqp9jcxcMPf3iEYauaXF80iOyM1RtF5RuVm8N0zprKkart+6RFJcqcdMYbJJbksfKlKCUkRERkSSmDIAR5dtoU5P3+eimueYM7Pn+fRZVviHZJI3NT4CYzxRYm9hQS8FRhNrR3UNbb0+Zrn1nzIA0ur+foph3LMpFExjG6vzx0/iSPG5XPjE2tobu0YkmeKSPSlpBhfPXkyK7eEeL1qR7zDERGREUAJDNnHo8u2cO0jK9lS34wDttQ3c+0jK5XEkBGrNtQMJMcKjP62Ut25u5VrHlnJEePy+fYnpsQytH2kpngFPbfUN3P7i+uH7LkiEn2fOWYCxbkZ/P7lqniHIiIiI4ASGLKPmxetpblt37+INrd1cPOitXGKSCS+gqEwuRmp5GemxTuUXlX0s5XqDx9bRX1TK7dcdBSZabHdOrK/EycXc05lGbe/uJ7qnU1D+mwRiZ6s9FTmf6Sc59/dyvsfNsY7HBkkrcIVkUSnBIbso6a+uV/jIsNdsD5MWVE2ZhbvUHo1viibjNSUPrVS/evyGp5YEeRfPnE408cXDEF0B/rXT07DDH765Jq4PF9EouMLJx5CVnoKf3h5Q7xDkQFwzhFu6+CPr2/k6odXaBWuiCS0xP+TogypsqIsaurDB4wnw/5/kVgINoSTogMJeFszJhXn9JrA2NoQ5kePreKoiUV87aOThyi6A40vyubKjx3GLYvf47X12/jIobFp3yoisTU6N4MLj53IX97azHfPPJwx+cnxb+ZgPbpsCzcvWktNfTPji7K56sypnH/0hCF7vnOO5rYOdoXbaWxpZ1e4nV0t7TT6X3eF27z3/rG94/5YS9uea9o6ui/CGlmFO5SfS/opGISLL4a//AXGjYt3NCIxpwSG7GPOYSU8uLR6n7Hs9FSuOnNqnCISia/aUDOHjymNdxh9VlGSy8btPScwnHNc/fAKwm0d/PKiWaSlxnch3oKPTuaBpZv58ePv8MS35sY9HhEZmMvmVvCnNz7g7tc2ctWZsW3HnAgiNcMi224jqxWAXn/Z7+x0NPmJh10tbQcmFvYkG9r2S0jsl6Boaaejs/fuLxlpKeRnppGXlUZeZhr5WWlMKMomPyufvC7jPW0X1ircARjKpMINN8Arr3hfb7stts8SSQBKYMgeoaY2nluzlckluYSa29i+u5WSvAx+ePZ0Zd5lRGrr6GRrYwtlSbQCqaIklxffq6Oz05GScuC2lweWbuaFtXVc96npHFqaF4cI95WVnsoPz57O1//0D+59YxPzP1Ie75BEZADKS3I5c/o4/vT6Jq782GHkJkHdoMHoqWbYjx5bxcotob3Jhi4rIfYkJlrb6UvX2az0FPIy0ynI2ptkmJSbQ15WWpeERPqe9/n+Od57bzw3M7XPNY7+/MYmtnSTrNAq3AHoa1LBOWhrg3AYWlr2fp04ETIzoaYG1q71xrq+Pv1pyMuDv/4Vfv976OyE//kf+NGPtApDhr3h/V8X6ZdfPfse9U2t/PGy4zmkOJejfvwMF86eqOSFjFhbG1twjqTZQgJQXpxLa3snNaFmAqNy9jm2eUcT1//1HU6aXMz8k8rjE2A3zjxyLHMPK+GXz6zlU7PGMzo3I94hicgAXP7RyTy9upYHl27mS3Mq4h1OTPW0KqEx3M79b27ak3DIy0onPzONMflZ+6yA8L6m75eM2Hs8NzON9CFekXbVmVP3WVUCkGqmVbgH09gIK1dCba236qK2Fqqq4OGHvaTCHXd4iYzOzr3JiZYWePxxOOEEuOce+NKXDrzv22/DrFnwyCPwz/984PF167wExo03Qnu7N9baCtde6yUyRIYxJTAEgLW1jfzx9Q/43AmTOHJ8IQBHTSzi1XXb4hyZSPwkUwvViEgnkg3bdu+TwOjsdHzvweWYGTdfWNnt6ox4MTOu+9R05v36ZX7xzFp++umZ8Q5JRAbg2ENGMfuQUdzx6ga+cOIhw3pLWM81w7J47ZrT4hDR4EX+YBWp65GbmcaulnZmTSyK3UOHcqtFX57V0QHbtnmrH4qKoK7OS0LU1u6bpPjZz+Azn4Fly+CUU/Zen5LiXdvhJ4E6OyEUgmOP9cYzMyErC0aP9o4fcwz85CfeWORYZqa3AgPg/PNhxox9j2VmwqRJXizLl+8b+113eZ/tZz+L+o9PJFEogSE457j+b6vJy0zju6fvzbLPOayEW59/n1BTG4U56XGMUCQ+giFvcppMKzC6tlI9ecre2h13vbaRNzbs4D/+qfKAlRmJYMrYfC496RDuem0jnzt+EjMmFMY7JBEZgMs/Opmv/fEfLFr9IWdXlsU7nJiZOb7ggARGdnoq30/y+h/nHz1hTyKjrrGFuTc9z+1/X89NF1TG5oGxqN/Q0eElDtLTvS0amzd7qx5++EN4+WWYP99buTB7NuzYAV/4wt4Exdat3vX/8R9w1VXeCotrr4WCAi8xMG4cHHXU3gREZSU89RSUlXnH2tpgypS9qyLa2rx73nZb90mTmTO9V08CAe/VnRtu8D5nVykp8OyzXgLDOdi1C/Lz+/8zFElgSmAIi1bX8uq67Vx/3pGM6rJ0e+6UEn793PssqdrGvBnDdxIi0pNgfSSBkTz7f8cWZJKdnkpVl04k67bu4qan3+XjR4zhwtk9TIQSwL984nAee7uGH/91NQ987aSkaF0rIvv6xLSxVJTksvCl9Xxy5rhh+b/jf3ywk8VrtjL7kCKCoZa4dSGJtdL8TD573ETue3MT3/7ElOjXwggGve0OnZ2wcCGYeUmHlhY44gj41re8877yFa8WRGvr3i0YH/+4l2QAL2GwbdveY52d8NWverUhAA45ZN/nPvOMt8LhD3+A3FwvwTB+vLdKIpKkOPlk79zyci8JkJvb/WcoKoJ58/a+v/LKA5MKHR2xKbC5ZIn3M+mqs3Nv8uSxx+Cyy+D734dvfrPnzyCSZJTAGOHCbR3c8Lc1HDEun88dP2mfY7MCReRkpPLquu1KYMiIFAyFyclIpSAref6pNDPKS3LZ6Ccw2js6+e6Dy8nOSOXnn5mZ0L9MFGan79mD/fjyGs47avj8IiAyUqSmGJfNreCHj67irY07Ob5idLxDiqrdLe1854G3KSvM5s4vH09B1vBeobrgo5P58xub+P3LVVz3qSOje/OuKwja2+F3v/N+yc7MhE98Ym8C48MPYedObzwnx0saFBfvvc+553orHTIzISPD+3rMMd4xM7jzTvjTn+Cll7znpHf5v1lmJixd2nOMKSn9+8W/u6RCayu89lrf79FXy5Yd/HhFhVdn45pr4JZb4F//Fb72NW8rSqJTa1g5iLjMys3s/wFfBRywEvgyUAbcD4wG/g/4onOu1cwygXuAY4HtwGedcxv9+1wLXAZ0AN9yzi0a4o+S9P77xSq21Ddz3+UnHrBXNSMthRMqRqsOhoxYtQ3NjCvMSuhf+rszuSSXd4INANz+4nqWb67nvz53NGMKEn/SctHsidz7xgf87Ml3OX36WHIykid5JCKeC44NcMvi91j40vphl8D4yRPvsGlHE39ZcNKwT14ABEblcP7RE7jvzU1849TDKMnLjM6NI6svuv6yn5kJ77134C+sTzxx8Hv98pcHPz5vnrcyouu2jj//2as9Ee1fjntLKgylWbPgySe95MmPfgT/8i/wwAPw6qvxjqx3ag0rBzHk1ZXMbALwLWC2c24GkApcDNwE/Mo5NwXYiZeYwP+60zl3GPAr/zzMbLp/3ZHAPOC3Zta3PlECeD3Lf/fiOs6eWcZJhxZ3e86cw0qo2rZbPcBlRKqpDzM+ibaPRJSX5LBpRxPLN9fz6+fe55zKMs6pHB/vsPokNcX4908dSW1DmN++sD7e4YjIAGSlp3LpSYfw7JqtrNu6K97hRM3idz7kvjc387WPHjrsEjMH8/VTDqWlvZP/eXVD9G7aXf2GyFaLaBvKZyWij3wEnnsOnn/eW4UBXkeUP/1pb1InUYTD8NBD+7aGra2Nd1SSYOJVHjoNyDazNCAHCAIfBx7yj98NnO9/f57/Hv/4aeb9OfQ84H7nXItzbgOwDjh+iOIfFn765BoArv1kzwWn5hxWAqBVGDIi1YbCSdWBJGLH7lY6Oh3n3fYqHZ2OkyZ3n6BMVLPLR/Ppoyew8KUqPti+u/cLRCThfPHEQ8hMS+GOV6riHUpUbNvVwjUPr2BaWQH/7/Qp8Q5nSB02Jo+zZozjntc+oCHcFp2bDuVWi6F8ViI79VQ4+2zv+4cegi9+EaZP91ajdHQc/NpYaW/36puAl7wYMwYuvHBvYiUchu99Lz6xScIa8gSGc24L8AtgE17iIgT8A6h3zkXSgNVAZPPzBGCzf227f35x1/FurtmHmS0ws6VmtrSuri66HyhJLVm/nSdWBLnilMMO2pFg6th8SvIylMCQEae9o5OtjeGk6kAC8OiyLTzyf1v2vO908JMn1vDosi0HuSrxXHPWEaSlGj95Yk28QxGRASjOy+SCYwM8/H9bqGtsiXc4g+Kc45qHV9DY0s6vLz6KzLSRt+D3yo8dRmNLO39c8kF0brhsmdclY/9XLLZgDOWzksXnPw+PPgrZ2d73lZXw8MPezyWWOjvh7be9mhznnON1c/nc57xjWVnw3e96dUwinPOSLVqFIV3EYwvJKLzVExXAeCAXOKubUyP/C+pu87k7yPiBg84tdM7Nds7NLi0t7e6UEaW9o5Mf/3U1E4qy+dopkw967v9n7zzDoyraMHyfbHooqbSEkJBA6DXU0ESaWCiKYgEbomJFBcFPREUBRVRQQFBQQBEVqSIC0jsECb0loaURIKQQ0ne+H7OhJqRtDXNf1167OXvOzJzkZPfMO+/7PHZ2Gu2CvNkWdQlh6g81hcKKSEzLQi9sy4EEYNLq42Tl3pwqm5GTx6TVxy00otJRtZIzr3YNZu2R82w+YQg8x8dD587qRkahsBGe7xBITp6e+TtOW3ooZWLhnnP8ezSRd3vVo27Vu9OSspFvZbqE+DB76ykysi20Wq8wHpoGffrIIM5vv8nAwqRJxu9HCDh1Q+nRgAHQvLkMVERGSgvbN9+8/v758wW38fHHUutELUQrsEwJSTfglBDighAiB1gMtAfcDSUlAH6AIZ+IGKAmgOH9ykDSjdsLOEZxB37dfZZjCWm8f399nB2KXkXoEOzFhbQsTpajOlaFoijiU/ItVG0rA6MwvRpb1LF5vkMgtbxc+WjFYXLy9DeLeikUCquntk8FutevyrydZ2x20nv6Yjrj/jpCWLAXz7YPsPRwLMor9wSTlJ7Nwj1nLT0UhbGws4NHH4VDh2DxYhnYuHAB7r0X1q4tXUbGmTPS+eWpp8DXF4KCpIsMSFvXefMgJgaOHYPp06Fv3+vHFlbus2GD1O9o3BhWrSr9+SqMjwUWlywRwDgLtNU0zdWgZXEvcATYADxi2OdpYJnh9XLDzxjeXy9kKsByYKCmaU6apgUCdYDdZjoHm+VyejZfrDlB+yAvejUqnvJyvg7G1pOqjERx95BgCGDYmgZGDfeCM0YK227NONnr+OCBBkRdSOf35bvlDZES9VIobIqhnWqTfDWHP/aeK3pnKyM3T8/w3yOwt9P4YkBT7Oxsy5HK2LQK8KR1gCezNkeTfUumn8LG0emghkHsOypKZkf06CEnpps3y+2FTVQTEiAtTb6eMwcCAmSgYu1auf/MmWBvWKPu3Vtqb/gWYpNeWLnP0aOwZ4/UyOjdG155Ba5eNfqvQVEKLLC4ZAkNjF1IMc7/kBaqdsAs4F3gLU3TIpEaF7MNh8wGvAzb3wJGGdo5DPyODH78A7wihLDN8L4Zmbz2OFeychn7YMNiW0P6ebhSy8uV7VEqgKG4e4hPkRkLtuZCMqJnCC63ZFa5OOgY0TPEQiMqG13rVaFzXR8cPvkYkWWoo8/NVVkYCoWNEBrgSS1PFz5acYTAUSsJm7jeZjR5pm+MYt/ZZD7p19jmyglNxStdg4lPyWTJvhhLD0VhKtq2lXa2334rAxmdO0PPnvDhh3Ki+v77sGQJvPYaNGwI1avDMsO6c9euMHWqzOhISIBff4UXXoCKRii9atIEdu+Gt96SmRu9eples0NxO0JAYqK04129Wi4qmXlxSbvbdA1CQ0NFeHi4pYdhEY7EpfLAN1sY3C6ADx9qWKJj31tykOURcez7oDsOOkuZ1ygsydJ9sUxafZy45AxquLswomcIfZsXEkEvB4z76wgLdp3lyMc9ix3ssxbK29/q9KFI/JrWw15/PUad5+SM7vQpqFa8TDKFadE0ba8QItTS47AEd/N9RXFYui+WkYv2k513/X7TxUHHhP6Nrfpzaf+5ZPrP2M4DTaozZWBzSw/HahBC8OC3W7mSmcu6t7ugu8uzUso9GRkwY4YU3vzjD+kKko+rK3TsKIMW/ftDcLD5xrVuHeTkyCBGvoOKzgbEdePjYeBAqTti7fcvqamQlCQzagCGDYPwcBncSkmR2wIDITZWlvk4OsKQITBtmtGGUNi9hZqJ3iUIIfhwxWEquzgwvFvdEh8fFuTNlaxcDsQkm2B0Cmtn6b5YRi8+SGxyBgKITc5g9OKDNrOKVhoSUqQDia0FLwD6Nvdl26iunJp4P9tGdbXqSUJxsH/7bXT6mxPs8nJyiH51hIVGZGSUOKmiHDNp9fGbghdg/cLCV7NzGf5bBFUqOvHxQ40sPRyrQtM0XukSzOlLV/n7YLylh6MwNS4uMuOhQgW5yg4yUNC3r9S1+OcfGDnSvMELkBodvXrJ15MmQZcuN4uFWisjR8KWLTKLJd8q1hQU977ixjH89JMMQHTqJIMrlSvDY49dfz8uDtzdpWvN11/Dzz/LbfmaJdnZZsvCUAGMu4S/DsSz+1QSI3rWo7KrQ4mPbxfkhabBtshLJhidwtqZtPoYGTk3TyCt/Qa0rMSlZFDd3bb0L8orFbZuvM12ylGfR8XVKzmWkEpaZo5FxmU0lDipohxji8LCE/4+RvTFdCYPaFqqe6byTs+G1QjycWPahkjlUHc3EB8vJ6b5E9W8PFk6kJRk2XHlU6sWHDgATZvC3LnWW1Yye7ac9AshXzs4gJsbrF8v39+4Ebp1k9kszz4Lb7wBH3wgBU9BiqOuWiVLNw4dgrNnITn5emDpRgq6r9izB6ZMkfohPXrIzIr87AqA5cvhr7/k6/vvh4kTYezY6+8vXQpr1sgMizfekOO49Xedl2eWexn7ondRFIatpGlfzc5lwt9HaVijEo+1qln0AQXg6eZIwxqV2Bp5kdfvrWPkESqsFSEEW05eJDY5s8D3rfkGtKwkpGTSPsjb0sNQAC1e/ZmApDiivfyubft6xSQeOLqFF0b+QESNECo52+Pn4Yqvhwu+7i74eciHr7vc5uHqUOxsGrN+tp87d3P96Jgx1p9WaqVomjYcGIK0VD8IPAtUBxYCnkjtrUFCiGxN05yAeUBL4BLwmBDitKGd0cDzQB7wuhBitZlPpVxRw92F2AK+K6pWss4A8YbjiczfeYYhHQJpH6y+AwrCzk5jWJdg3v5jP+uPJXJv/aqWHpLClIwbd/skOX+iasRygVLz+OPQvj0MHgzPPCMn4d99B15elhuTXg+bNslARYcO8NJL0mFFp5O/O50OWrSQ2Q61asljcnJkyc7587JEIzVVPvr3Bz8/+PtvWcZxK8ePQ926MGuWzIxwdob9++UYZsyAd98Ff38ZPJk6VWZW1K0rx1W3rgxCaBr8/vt1sdXiUJhjzPbtpf+9FRMVwCgl+Sn1+avS+Sn1gNUFMb7bGEVcSiZTHm9eplrFsCBv5mw7xdXsXFwd1aVTnhFCsP5YIlPXR7L/XDJ2GugLCGjborNFccjN05OYlmVzFqrljpgYcHCguocb0ZrfTW990P1l2sQe5ZeN3/DrzGWcybIj5vJVzlxKZ3vkRdJvsWx0ddTh6+6C7y2BDV93F2p6uOBdwQk7O838n+333w/54qTWdENoY2ia5gu8DjQQQmRomvY7MBDoDXwlhFioadp3yMDEDMPzZSFEsKZpA4HPgMc0TWtgOK4hUAP4V9O0ukokvPSM6Bly0/9UPtl5eURfuEJtnwoWGtntJKVnM3LRAUKqVuQdGxU+NhcPNavBl2tP8O2GSLrWq2KT5ZaKYmLBiWqxqVVLZjJMnizFRk+cgHbtzD+O2FhZijFnDkRHy2BBkyYyi+WXX67rdeTlySyK5cuvL1p07y4fN3Jj4OiRR6B5cxnUuDHAkX981arQqJH8e+VnRmgafPSRDKSMHi1LV7y95fZbKUnwAqRjjIVQs9BSMmn18UJT6q0pgHEu6SrfbY6mT7MatArwLFNbYcHezNwcze5TSXQJqWKkESqsCb1esOZIAt+sj+RwXCp+Hi6M79cYR53GmGWHb7vma/u4kacX5U7E68KVLPL0QpWQWBIh4Lnn4MQJRv6+kVErbi5jyqlYmcjJM+g4dABDFk2RX87XDhWkZOQQczmDmMsZxCZnEHP5KrGG1xHnkkm+enPZiaPOjhruzsSnZJJ1iz2gyT7bv/4aDh68/nN2trzpUVkYpcUecNE0LQdwBeKBrsAThvfnAh8iAxh9DK9BOqN9a7B27wMsFEJkAacMDmitgR1mOodyR/7/zY1ZTY+28mPe9jM8PGM7PzwdSstaZbs/MQZCCEYvPkDK1RzmPtsaZwcbEAS0IA46O17qXJsxyw6zMzqJdkEWXO1WmBYLTlRLhE4nNSaefRZ8fOS2JUukVoaLCRfc9HqwM6gyDB4sAyn33CMDB/37S7HTYcNKl8Vid4Pag4/P9fMqiD59oHVrqF37egBDr5dOMJ9+Wq7uK1QAo5TYSk3nJyuPYG+nMfq++mVuq1WAJ446O7ZFXlQBjHJGnl6w8mA809ZHcvx8GoHebkx6pAl9m/tec52x19lduwGt7u5MnSoV2HTiIkPnhTP18ea4OZWfj5P4FFkyozIwLMjcudJDfto0+rQOQDg43FbW0bG5L5x+T6qi33ADoWka7q6OuLs60si3coHNX8nKNQQ0ZGAj5nIGMckZnL5UsK+80T/bd+2Ct9+WqyA31pBmZ8PHH0uLOEWxEULEapr2BXAWyADWAHuBZCFEvkpZDJAfhfIFzhmOzdU0LQVp4e4L7Lyh6RuPUZSSvs19bwsA9m3my9NzdvPE97uYMrA5vRpZ9uZ60d4YVh8+z+j76tGgRiWLjsVWGBBakynrIpm2IVIFMBTWQ/4k/8QJePhhqF9fZj80a2bcfg4flosnCxfKIE/VqjIDpGJFCAq6eV9zZbFYe7mPkSg/Mw4zU1hNpzVNeLaevMjqw+cZ0TOEakYYl4ujjha13JWQZzkiN0/Psog4pm2MJPpCOnWqVGDKwGY80KTGbVkVBd2Azt95hrHLDjHgux3MfiaU6pVtsKSkAEurBEMAo1olGzyf8kBCAgwffr1ulIKvP0BO9kuRulzByZ6QahUJqXazN33E2fUFfrYbtVwqLg769ZPpmrfe0Oj1MqVUBTBKhKZpHsjsiUAgGfgDuK+AXfOjRQVdNOIO22/tbygwFMDf378UI1bU8nLjz5fbM2ReOC//spcPH2zI0+0DLDKWc0lX+WjFEdoEejKkY22LjMEWcXbQ8ULHQCasOkbEuWSa1XS39JAUiuvUrStdUp55RmYmfPqpdFQpi93qlSsyo2H2bLkQ4eAADz0kt1etWniQxFxZLLZQ7mMElAtJKRnRMwSXAtILXR11pFy1vCJ+Tp6ej1Ycxt/Tlec7BBqt3Q7B3hyJT+XSlSyjtakwP9m5ehbuPkvXyZt4+4/9ONnrmP5kC1a/2Yk+zXwLLwm5xZZpUNtazHmmFWeTrtJ32jYOxaaY8SyMRAFKzfmr7TVsuYTElq05X31VCln98MPN6ZMFkR+82LpVlpwUpMZdAgr6bHfU2THCmPXw6elQvbr0Uxfi+iMvDx7G+RnKAAAgAElEQVR4QAp47VAVCyWkG3BKCHFBCJEDLAbaA+6apuUv1vgBcYbXMUBNAMP7lYGkG7cXcMw1hBCzhBChQohQnzul9CruiFcFJxYMaUu3+lUZu/ww4/8+ir4gwSUTkqcXDP8tAg2Y/GjTclcSaWqebFuLyi4OTN8QaemhKBS306OHLNV86CFZXvLQQyV3KRFCWsaCdF558UUZsPjyS6l5sWjR7RkXlmLfvpvvK/IftlIGVExUAKOU9G3uy4T+jfF1d0EDfN1deLJtTc4mZdBvxjbOXEq36Pjm7zjDycQrjHmggVHrOPMVuXdEqywMWyQzJ4/5O05zzxcbGbX4IO6uDnw/OJS/X+9A78bVsSvqxq2AyX6XkCoserkdOk1jwHc7+PfIedOehDGJj5eaA/kOEIbJfkJKJs4OdlR2sWH7PFu15szKkpkJY8dCSAmCBkePyr/hlCll6v7Wz3Z7O40Kzjp6NjRCenv+jUSdOjJ40bjxze/b2cG8eVCzprQ5s1YrOOvkLNBW0zRXg5bFvcARYAPwiGGfp4FlhtfLDT9jeH+9kH6Qy4GBmqY5aZoWCNQBdpvpHO5KXBx1fPdUSwa3q8WszdG8vnAfWbnm00yduTmK8DOX+ahPQ/w8XM3Wb3mhgpM9z7QPYM2R8xxPSLP0cBSK2/Hygj/+kOKa/fvfXrpZGPHx0ko0JASeekpu8/eHI0dkUGT48DtrUihMhna3+TeHhoaK8PBwk7W/+1QSL86X7X8/OJTQMgpnloZLV7Lo8sVGmvt7MPfZVkZVhs7N09P847U80LQ6E/o3MVq7CtOSkZ3Hr7vPMnNzFOdTs2hZy4PXugbTua5P8a+P+HgpDJSZKcWQoqNvEgRKTM1kyLxwDsam8P79DXguLMD6VcmfeUZqLYCcNA8dCtOm8cqC/zgSl8qGd7pYcnSlJzYWAgOlJVcBfyubIN/WqyT79+snPdJ375Z+8EZgR9QlHv9+Jy91DmLUffXK1tg338DevdLqzNGx8P0OHQJ3d2mbZiNomrZXCBFq4TF8BDwG5AL7kJaqvly3Ud0HPCWEyNI0zRmYDzRHZl4MFEJEG9r5H/CcoZ03hRCr7tSvqe8r7haEEMzaHM2EVcdoE+jJrEGhVHY1bRD5UGwK/aZvo0eDanz7RHPr/86yUi6nZxP22Xp6NKjK1wObW3o4CkXR/PwzrFwpyzUzM28uJV63Topsr1olMyM7dYIXXrgexFCYjcLuLVQGhpFpHejJkmFhuLs68sT3u1gWEWv2MXyx5jgZ2Xl88EADo38Z2+vsaBvkxdbIi0ZtV2Ea0rNymbkpio6fr+fjv44Q6O3GgiFtWPRSO7qElND2bNy463V1+YJAN1ClkjO/DW1HjwZVGffXET5YdpjcvLKl85uU+HhYsOD6z7m5sqYxIYH45Ayr0rMpEULAfffJ4AUU+LeyWiZNkisbUHJdC02TJSeenvDkk7IExQi0C/JiQEs/vt8SzdH41NI3tH69XK1JTi7aqqxRIxm80Oth48bS93mXIYQYK4SoJ4RoJIQYJITIEkJECyFaCyGChRADDO4iCCEyDT8HG96PvqGdT4UQQUKIkKKCFwrjoWkaL3YOYsrAZuw7m8wj320n5nLBorrGIDMnjzd/i8DD1ZFP+zVSwYsy4OHmyJNt/Fm+P46zhQghKxRWxcWLsvSjSRNZErJli8z8BNizRy42jBwphUA3bVLBCytDBTBMQIC3G0uGtae5vztvLIxgyr8nMVemy8GYFBbuOccz7QMIrmIab/WwIC/OJWWoLykrJjUzh2/Xn6TDZ+uZsOoY9atX4vcX27FwaDvaB3uX/EYtPl6m5+frC2Rn31RykY+Lo44ZT7bkxU61mb/zDEPmhZOWaXlNmAIZN+72SXJWFnz0EQkpmUYRvrUI779/uzVnAX8rq2PtWnmz8PPPpW/D21umiOYrgxuJ93rXp7KLA6MWHySvNPX5p07BgAEyDXX+/KJ1PfKZOhW6dpUiZArFXUKfZr7Mfa41CamZ9J++ncNxptFWmrjqGJGJV/hiQFPcXe+QEaUoFkM61sbezo7vNkdZeigKRdG8+abUmnJyghUr5OLPTz/Je6XXX4ezZ2H8eFnyqbA6VADDRLi7OjL/+Tb0b+HLV/+e4O3f95u8plMIwYcrDuPl5sjr3Uz3D9ehjtTB2BalsjAszdJ9sYRNXE/gqJWETVzPgl1n+HLtCTpMXM8Xa07Q3N+DJcPaM//5NrQOLEM5U0G2TFlZ0gHiFuzsNEb3rs+E/o3ZcvIiA77bUaCrg0UZOxbWrLldqRkQO3ZyPi3LdjMw9u69fYJs7VkY6emyfKduXRgzpmxt9ewpsx2GDTPO2JCrix880ID955L5eeeZkh185Qr07Sv/f5Ytk/ZqxWXoUKmT8eSTcKaE/SoUNky7IC/+fLk99nYaj363g80nLhi1/S0nL/DT9tM80z6ATnVVDbsxqFrJmQGhfiwKj7nm5KVQWDWhoXDPPTe7kowbB66uRWdKKiyKCmCYEEd7OyYPaMrb3euyeF8sg37YzeX02ydMxmJZRBx7z1xmZK96VHI2Xd1okE8FqlZyUmUkFmbpvlhGLz5IbHIGAohNzuC9JYeYuu4k7YK8+Ou1Dsx5phXN/T3K3llBtkx6PSxdWughj7f256dnWxF7OYO+07ZxICa57OMwBtOny8DLAw8UqNR8ftMO2kX9Rw03GxPwzFfIPn/+9mBTdjb89ZcMZFgj778Pp0/LEhAXI9iV3nOPDOLExck0USPQp1kNOtbxZtLq4yW7OT96FGJiZG1tcHDJOnV1hT//lOVNjzwig4YKxV1C3aoVWfJKGP5ebjz30x7+CD9nlHaTr2bzzh/7Ca5Soey6NoqbeLFTEHlC8MOW6KJ3VigsTXy8zPrMvzeylYxVhQpgmBpN03jt3jpMGdiMiJhk+k3fRvSFK0bv50pWLuP/PkpTv8o80sK0wm+aphEW5M2OqEtmtztTXOezf46RkXP7hLRKRSdmDgqlkW9l43V2qy2TXg9vvy0FkO5Axzo+/DmsPY46Ox6duYN/Dln4S+Hvv+G112TwYvLkAndJ3r6bn38fQ5cpY23HBWLXLinauWxZwRZaq1fLdEhrdLbYvVs6hwwbBh07Gq/djAxo1Qqef94o56xpGp/0bUROnp6xyw8V/8BWrWQJSY8epes4OFimtYaHy/85heIuomolZ35/sS1ta3sxYtEBpq4rW0muEIL/LT3EpSvZfP1YM6O6tCnA38uVh5rW4JddZ026YKdQGIWCsoutPWNVAagAhtno08yXX19oQ2pmLv1nbGeXkW1Ip22IJDEti7EPNSzaCtMIhAV7k5SezdGEMojaKUpEYlomfx2IY8zSQ/T8ajPxhawCX0gzwyqtpsEXX0Bzg9r42bOF7lq3akWWvhJGvWqVePmXvczaHGU2TZibiIiAxx6T7hS//npzyuANnPKrwzftHsN30S8wYYKZB1kKjh+H+++XNmFt2xa8T48eMHo0zJx5XaTKWmjUCD780Pi/axcXeOcdWL5cun4YgVpebrzRrQ6rD59n9eEignErVsggmRBQqVLZOu7XT1q5PfFE2dpRKGyQis4OzHmmFf1b+PLl2hOMXnyQnFIKRC+LiGPlgXiGd69r3CC/4hrDugSRkZPHj9tOWXooCsWdKSi7ODsbtm+3zHgUxUYFMMxIy1qeLBnWHi83R56avYs/98YYpd3TF9OZveUUD7fwo4UxygWKQViw1MHYHmncQIziOnHJGSzZF8PoxQfo+sVGWn+6jlcX7OPP/2KoUsmJSs4F1+fVcDdCCn5J+OYbaNBAai8Ugk9FJxYObUvvRtUZ//cx/rf0UKlvQEvN/Png4SFLKSoULnAbl5LJ5I5PkTXwCfjf/8omKmlq4uKk5oNOJ7MsqlYtfN9PP5XZCOPGyb+ZNaDXyzKJDz4o+yS/IN54A7p3l+4fx44ZpckXOtamXrWKjF12uHCB2iNHpG7FwoUF6qyUinffhfbt5ev0dOO0qVDYCPklua93DWbhnnO8MC+c9KzcErURm5zBmGWHCK3lwUudg0w0UkWdqhXp2bAqP20/bb0i3goFFJyxKoTcrigWt2rxLd1nHvdNFcAwM7W83Fj8chitAjx5+4/9fLnmeJlXoz9ZeQRHezve7RVipFEWTbXKzgT5uCkdDCMhhODMpXR+33OOt3/fT4fP1tN+4nqG/7afvw7EE+jtxnu967H0lTAOjO3B/Ofb8HGfRrjckv7q4qBjRE/zXQeArM339pZZAKcKX3FxdtDxzePNGdYliAW7zvLcT3tINefNzRdfyFKLGjXuuFtCSgZODjocf5ojtRSeew6irbCe9+pV6N1bajz8/XfR+gqaBt99JwUlR4yAWPNbPN/EwYPQsCHs32+6PuzsZPmFq6sMKBghmOCgs2NC/8acT8tk8poTt+9w+TL06SP7XLJEKpwbk4kTpfBYWppx21UorBxN03irR8g1gejHZu0gMa14ejR6veDt3yPQ6wVfPtoMnRkyVe9mhnUJJjUzl192FZ6dqVAobJuCtPhGLz5oliCGCmBYgMquDvz0bGseDfVj6vpI3lgYQWYBWgbFYcPxRP49mshrXYOpUsm8rgkdgr3ZfSqJ7Fwzr6SXA4QQRCam8fPOM7z+6z7aTVhP50kbGfnnATYcT6RRjcqMfbABK1/vQMQHPZj9TCuGdgqiWU137HXy37Zvc18m9G+Mr7sLGuDr7sKE/o3p29zXvCdTvTqsWiUnh7163VE00c5OY2Svenz+SBN2RF3ikRnbOZdkQjve3FyprRAZKSfw1asXeUh8SibVKzujOTnB4sUwdy7Urm26MZYWFxfo31+OsWXL4h1jby/LZzZuBF8zXyc3kpcns0EuXTL9OGrUgO+/lw4nRhLBbO7vwaC2tZi74zQR524Qp83Lg8cfl44hf/4JfibQI2rXDk6eNJq2h0Jhazze2p8fBocSlZhO/+nbiUwsWlfsh63R7IxOYuyDDfH3cjXDKO9umtZ0p2Mdb37YcqrU97cKhcK6mbT6+G1afBk5eUxafdzkfWsWqUW3IKGhoSI8PNzSwwDkJHbGpig+/+c4LWt5MGtQS7wqFH+1LjtXT6+vNwPwz5udcLQ3bzxq9eEEXpy/l9+GtqVNbS+z9m1r6PWCYwlp7D51iV2nkth9KolLBoGrKhWdaFPbi9aBnrQN9CS4SgU0zQZXh7Ztg3vvlavDmzffbuV5C9ujLvLS/L042tvx/eBQ47il3IgQ8PLLUvdhzhx49tliHfbIjO046Oz4degtehJ79sjJsCUn/iAnybGx4O9f9rZ++02Kf7ZuXfa2SsKXX0pByoULpS6JDZKWmUO3Lzfh6ebE8lfDcNDZycBQ167ymnvhBdN1/vnnsqTk669lmYwVoGnaXiFEqKXHYQms6b7ibuJATDLP/bSHnDzBD0+H0iqgYKvwo/Gp9Pl2G11CfJg5qKVtfr/aIDujLzFw1k4+7tOQwe0CLD0chUJhZAJHraSgKIIGnJp4v1H6KOzeQmVgWBBN0xjWJZhpT7TgUGwK/Yq5kpDP3O2nib6YzpgHG5g9eAHQtrYXdhpsU2Ukt5Gbp2f/uWS+3xzNkLl7aPbxGnpP3cKHK45wICaFziE+fPZwYza+04Vd793LN483Z1DbWtSpWtF2b67CwmDBAunyUUTwAqB9kDeLh4Xh6mjPwFk7+ftgvHHHM3mynEi++26xgxdwPQPjJq5ehQcflGUylkzdF0JOWFu0kPZfZSErS9qX9u4trT7NRVSU7Pehh+DRR83XL0jB0759r1vOloGKzg589FAjjsanMnuroXSqSxc4dMi0wQuQJUB9+kiRUiU2prhLaeLnzuKXw/Byc+TJH3YV+B2SmZPH8N8iqOTiwIT+jW33+9UGaRPoSctaHszcFG1+zSuFQmFyCtPcM4cWnwpgWAH3N6nOwqFtuZqdS//p29hejIBAYlomU9adpGu9KtwTUsUMo7ydyi4ONPFzZ1uUEvLMztUTfjqJaRsiGTxnN00/WkOfadv49O+jRF1Ip3fj6nz5aFO2vnsP20Z15ctHm/FYK38CvN3K1w1V//7XV9SPHSsyxT24SgWWDGtPI9/KDPvlP2ZsNJJDyZ9/yknegAEwfnyxD8vTC86nZlLt1gCGq6ssJTl0SGp+5FhImGz8eJg2DZ55pljlMHfEyQn++UeWlfTsCefOGWWIRTJ9Ojg4yGdzX/spKVLEddgwo5Rf9GpUje4NqrJ2/kouLFomNzZoUOZ2i0TTpLZHSAicPm36/hQKK8Xfy5U/X25PY9/KvLLgv+vBRAOT1xznWEIakx5pUqIMV0XZ0TSNV+4JIjY5g2URcZYejkKhMDJPtb09E9hcWnyqhMSKOJd0led+2sOpi+mM79+YR0NrFrrvO3/sZ1lELGuGdybQ282Mo7yZSauP8d2maCI+6E5FZweLjcPcZObk8d/Zy+w+lcSu6CT2nbtMZo5cYahbtQJtAmVJSJtAT7Nrk1gF//0nLT0//hhGjSpy98ycPEYuOsDy/XG0DfTk7OWrxCdnUsPdhRE9Q0qm6yGEFN/MzoZ166RWRDFJTM2k9fh1jOvbiEFta92+w+zZMGSIFPb84QfzTsDnzJG6B08+CfPmFSvLpVhEREDnzrI0ZssWacdqSvR6Gdwyx0S/ID75BMaMka40Tz1V5uYSTpxGtGqFztERn3NRaM5m/H/PzZUBKCtAlZBY533F3UJ+psWqQwl0ruvNycQrxCVLgc/2QZ4seKGdhUd4dyKEoPfUrWTl5rF2eGclnqpQlBOEEAyes5s9py7h4eZEQkop79mLoLB7C+u481EAUNPTlT+HteeVX/5j5KIDnL6Yzjs9QrC75QN/39nLLNobw0udgywavABppzptQxS7opPo1uAOFo42TnpWLnvPXGbXqUvsPpXE/nMpZOfp0TRoUL0ST7SuRetAT1oHeuLp5mjp4VqeZs1kpsLo0XJiPGjQHXd3dtAxZWAzsnJyWX0k8dr2fEVjoPgfiJomXTkyMkoUvABpoQpQvbCg0/PPS4HGceOgWzcp2GgONm2CoUOhRw8ZyDBW8ALk32r5cpmF8ccf8NJLxmv7RhIS5HO1apYLXoC8Jv/5B155RZY9BQaWvq3sbKo9P4jcrCv06f8ZQ49dok8zM2qk5AcvfvlFXpfvvWe+vhUKK8LZQce3T7Tg2R93s+nEzVms/51NZum+WPMLXCuuZWG8umAfqw8n0LtxGTMHFQqFVbDx+AW2nLzImAca8HyHMtxHlRIVwLAyKjk7MOeZVnyw7DDTN0Zx5tJVJj/aFGeDXaZeL/hwxRGqVHTi1a5F2CaagRb+HjjZ27Et6mK5CmCkZOQQfjqJXafk41BsCnl6gc5Oo7FvZZ7tEGCo7/Skssvdk3lSbOzs4Mcf5aT1uedkuUO3bnc8RNM0DsXdri+Rr2hc5M3n5cvwv/9Jm8lKlWTZRwlJSMkAuL2E5EY++gjq1DGvfkPr1rIk5n//A0cTBMg6d4bDhyEoyPhtg8yKefFF2LtXOsKYM0vhVnQ6+PlnaNpUZmPMnl36tl5/HbZuxW7Br9hf8uPjFUfoXNcHd1czBzHXr5eBrWbNpKaJQnEXorPTiLqQftv2zBx98b5DFCbhvkbVqe19gmkbIrmvUbXyVTarUNyF5OTpGbfyCIHebgVnK5sBswcwNE0LAX67YVNt4ANgnmF7AHAaeFQIcVmTn3RTgN7AVeAZIcR/hraeBt43tPOJEGKuOc7B1Djo7BjfrxGB3q5MWHWM2OQM+rfwZeamaGKT5QTryTY1qeBk+fiTs4OO1oGeVi/kuXRfLJNWHycuOaPAFKdLV7LYczqJndHSIeRoQipCgKPOjmY13RnWJYjWgZ608PfAzQp+7zaBkxMsWQIdO0ptjP37i1ztjjNc38Xdfo3sbHj4YemEMmiQtJosBfGGDIw7ChBp2vWMkrg4iI6GDh1K1V+RREaCtze4u8OECabpI5/84MW+fVJf4auvjJfp8ccfMstj0iTLBi/yCQiAf/+Fxo1L38a//0qR2FGjsHt8IBPiUnnw261M+PsYnz3SxGhDLRbffivLtp56Sj4HBJi3f4XCSij1d4jCZOjsNF7qEsTIRQfYdOICXSyk26ZQKIzDLzvPEH0hne8Hh1rERAIsEMAQQhwHmgFomqYDYoElwChgnRBioqZpoww/vwvcB9QxPNoAM4A2mqZ5AmOBUEAAezVNWy6EKLu8vBWgaRpDOwXh7+nGqwv2sv9c8k1WNYv/i6VVgJdVrCiEBXszcdUxEtMyqVLRCiYnt7B0XyyjFx+85lUcm5zBqD8PsPfsZfR6we5TSZw0uL84O9jRspYHb95blza1PWlW0/1a9ouiFFSuLMs5fv65WJOqGu4u14J0N3KbK8iNCCFdHzZskP2UMngBMoDhaG+Hh2sxs2qGDpWWsVu3QhMjT1pjY6UlZ716sGaNcdu+E+vWwdSpMlDz1Vdl1/m4dAlefVXa6775pnHGaAxatZLPaWkyEBVSQtGpe++VgZl+/QBoUKMSQzoEMnNzNP1b+JrXWtrFBRYtgpYtZenW1q3WEShSKMxMYd8h5lDFVxRO32a+fL1WZmGoAIZCYbukXM3h63UnCQv2olt9y/0vW9qF5F4gSghxBugD5GdQzAX6Gl73AeYJyU7AXdO06kBPYK0QIskQtFgL9DLv8E1Pr0bV8HB1us1nN8OQEmkNhAV5A7A90jrdSCatPn4teJFPZq6e+TvOsCwiDl8PF0b2CuHPl9tzYGxPfhnSlje61aFtbS8VvDAGfn5SyFPTZLbCHSwsR/QMwaWA37l3RUfy9IUIDo8bJ0UtP/pIClyWgXwL1WKnuH73nSxX6d0bYmLK1PdNXL4MvXpBcjJ89pnx2i0Ob78tAw1TpshynLIyfLg8n9mzrUZw8iYeeggeeACuFNPC+uxZaceqaTJYoLt+vb7RrQ5+Hi6MXnKQrNy8OzRiAoKCpFPO3r0y20WhuAsp6DvEXKr4isJxtLdjaKfa7Dktxc8VCoVtMmXdSVIzcnj//gYWLQezdABjIPCr4XVVIUQ8gOE5P6zjC9zo7xdj2FbY9nLHxStZBW63lpTIBjUq4e7qwFYrLSMp7PekAREfdOenZ1szrEswLWt5WCwV6q4gMxO6dIE+feTrAujb3JcJ/Rvj6+6CBvi6u9C3WQ0OxKTywbJDt1uspqTINP6nn5bOEmUkISXjztket+LnJzNMUlNlECMlpcxjICND/o6OH5clOM2bl73NkqBpMHmyDAa99550WyktubnScnb0aONnqBiLDz+EqCgZaCmKq1ehb18pppqdfdvbro72fNK3EdEX0pm+Icr4Yy2KPn2kq4w59VkUCiuioO+QCf0bW0W26t3OY6388XJzZNqGSEsPRWHlLN0XS9jE9QSOWknYxPUs3Rdr6SEpgOgLV5i34zSPtapJ/eqVLDoWiy2HaZrmCDwEjC5q1wK2iTtsL6ivocBQAH//2z1rrR1rT4nU2Wm0D/Jie+RFhBBWJ9B0p9+fvU4FLMyGszN8/rl07hg8GBYuLFBjoW9z39tuNqtWdmbmpmh8KjrxZre619+oXBl27wYfH6NYmsYlZ9I60LNkBzVpAn/+KQMYo0bBjBllG8Q770g7019/lWUKliBfhDUpCZYtk+4rpfn92tvL89DrjT9GY9G5M7z7rsw26d37WknIbQghLXQjImDFikLFVLuEVOGhpjWYsTGKB5vWILhKBRMOvgCaNpXP4eHyf65RI/P2r1BYmIK+QxSWx8VRx/MdA/n8n+McjEmhsV9lSw9JYYUUVPZdYjc6hUkY//dRnB10vNXd8hltlpy93Qf8J4Q4b/j5vKE0BMNzvpdiDFDzhuP8gLg7bL8NIcQsIUSoECLUx8fHiKdgHmwhJbJ9kDdxKZmcuni7ArilGdEzhFutx63t93fXMHCgFHL84w9ZqlBMRvWqxyMt/fj635P8vPOMzE4YM0ZOjH19jeLModcLzqdm3tmBpDC6d5cT/fHjyzwORo+WJTEDB5a9rbLg4CB1FRYvlsGLW7NfimLqVDhyRL42pu2rKfjoI2jRQgYo4gr8GpHX7a+/wqefwv3337G5MQ80wNnBjveWHERfWOmTKcnJgQEDpHhuaqr5+1coFIoCeKptLSo62zN9o8rCUBRMQWXf+W50CsuxLfIi/x5NZNg9QfhUdLL0cCwawHic6+UjAMuBpw2vnwaW3bB9sCZpC6QYSkxWAz00TfPQNM0D6GHYVu6whZTIDsFSB8Ma3UhCqlVEL6Cis73V/v7uKt5+W9pPfv01zJ9frEM0TWNi/8bcW68KX/26jfRuPWXpSEKC0YZ1MT2LXL2gRmkCGCBX7z08ZHnMokUlP37VKsjLk2Up+S4nlsbVVQYyEhNlNsi+fcU7butWqaPx/femHZ+xcHSEBQugTZuCs0U2b5bZNY89Jp+LwKeiE+/1rs/uU0n8sfdckfsbHQcHGQSLjpY2xiUNPikUCoUJqOTswNPtAvjncAKRibfbpisUyknI+sjTC8b9dQQ/DxeeC7uzm6C5sEgAQ9M0V6A7sPiGzROB7pqmnTS8l68e9zcQDUQC3wPDAIQQScA4YI/h8bFhW7mkb3Nfto3qyqmJ97NtVFerm3zX8nLF192FbVYo5DltQyQVnOzZOtJ6f393FZoGX34py0n69y/2YfY6O77tV58FKyagS4jnwPT5UKOG0YYVnyx1OapVLmNp1tSpcvX7xx+Lf8ysWTIAMnNm2fo2FdnZ0tK1Vy/5fCcyM2Umg7+/FFi1FUJCpJ6Jn9/t77VuLTN+Zs8udinNo6E1aR3gyacrj3IhrWAdI5PSsaMsi/nzT+kmo1AoFFbAcx0CcbbXMWNjtKWHorBCKrsU7AJnLWXzdyO/h5/jWEIao++rbzXmBhYJYAghrraRoeQAACAASURBVAohvIQQKTdsuySEuFcIUcfwnGTYLoQQrwghgoQQjYUQ4TccM0cIEWx4lGC2oDA2mqYRFuzF9qiLhbtFWIDoC1dYeTCeQe1qUbm41pgK06PTwYgR4OYmbSz/+6/oY/R6XF54jrqnD/P5k//jiYNwKNYIopkG4lNkAKNEIp4FMXy4LCkZOrR49qfLlsHLL8sAxgsvlK1vU+HnJ88lL08KWMbHF77vuHGyxGfWLKhgZv0HY5CYKHUw1q2DsDB5Ls7OsszEza3YzdjZaYzv34jMHD3j/jpiwgHfgbfflucycmTxs2cUCoXChHi6OfJ4a3+WRsRyLumqpYejsCL2nE4iNTPntrJvB52myr4tRFpmDpPXHKdVgAe9G1ez9HCuYeWFyQpbIizYm9TMXA7HGW9SWVZmbIzCyd6O5ztYR8qTogBefFGWJxw+fOf9DhyA5cvRPv+coVNGUtnFgWd+3M1pI+muJKTI9MRSaWDcSL52RMOG8PDDUvSxMLZtk1oXrVrB77/LY62VevVkhkJi4nWL11vZv1/avj7zjAx02CKaBjt3yiya7duhXTupKVEKgqtU5OUuQSzfH8fG44lFH2BsNE1mAo0fD40bm79/hUKhKIAXOgVip8GszSoLQyGJuXyVl+bvJcDLjU/6NrpWNu+os8PZ3o6eDa1n8nw3MW1DFBevZFvcNvVWVABDYTTaB0kdDGuxU425fJUl+2IZ2Mof7wqWF5xRFMKECeDiAvfdB7F3sMpq1gwOHYK336ZaZWfmPteaPL1g8JzdJKYVbMtaEuJTMnHU2eHlVnZBUCpVgpUrwd1d6lkUpKuQmSk1Ffz94a+/SrS6bzFat5bWrnp9weKQdevC++9LG1ZbxcdHjv/yZfnzlStwqfSlccPuCaK2jxtjlh0iIzuv6AOMTeXKMgPD3h4uXICYGOm8YkT9GIVCoSgJ1Su78HALP34LP2eU72+FbZOelcuQueFk5+n5/ulQnmhT61rZ/M9D2pCWlceP209Zeph3HeeSrjJn6yn6t/ClaU13Sw/nJlQAQ2E0fCo6Ua9aRasR8py5KRpNgxc717b0UBR3olYtubKfnCzLKFJuyeBZs+a62Gdw8DUNguAqFfjx2dZcSMvi6Tl7SM0s3Sp5PvEp0oHEaBFmX18pzPn77wW7cDg7SzeW1avB29s4fZqD7t1lVom/vwxk5ObK7Xq9DER9+CF4ltCK1trYulWWOYG83sqg5eFkr2N8v8acS8rg63UnjDTAUpCYKC1W+/SR52dL+iQKhaLc8VLnIHLz9MzeoiamdzN6veCt3yM4cT6Nb59oQZDPzaWnrQM96VqvCjM2RpF8NdtCo7w7mbjqGDo7jZE961l6KLehAhgKoxIW7M2e05fJzLHASuMNJKZm8lv4OR5p6Uf1sooyKkxPs2ZSbPDIERg2TGosdO4M69fDI4/IFfEC0vib1XTnu0EtOXk+jaHzwst03SWklNJC9U40agT160sXiJ9/hjNnpK5Cvlhnu3YQEGDcPs2BTicDFoMGyUerVvI8i6NlYu3Ex8uyizzDtZSdLX8uQ8ZC29pePBZakx+2nLJciV2VKtC1q9TC0OvLfE4KhUJRFgK83Wjm586szdEEjlpJ2MT1LN13hyxMRbnkq39PsPrwed7rXZ/OdX0K3GdEzxCuZOUyY1OUmUdnXJbuiyVs4nqbuN73nE5i5cF4Xuxc2/j3xkZABTAURiUs2IvsXD17z1y26Di+3xJNbp6elzoHWXQcihLQvbvMVhg/Xq4Ob9kCDz0EFSvKEotC9CE61/XhiwFN2RmdxJsLI0otIhuXklF6C9Wi2LlTTvS7d5e6CsOGwdmzpunLXNjZQZ06sHAhhIfD6dNQvbqlR1V2xo27veQnL6/MGQuje9fDw9WB9xYftJzQcb4tLhjlnBQKhaK0LN0Xy+H4VAQggNjkDEYvPmjVkzqFcVmxP45v1kfyaKjfHbXq6levRN9mvvy07TTxKbZpp7p0XyyjFx8kNjnD6q93vcE2tVolZ4Z2ss4sdhXAUBiV1oFe2NtpFi0juZyezS+7ztKnmS+1vGxAV0BxnX79wNFRrg4LAenpMHduwdaWN9C3uS9jHmjAP4cTGLPsEEKUbIKo1wvOp2aW3UK1MNq1kzoEJ0/Kn+3t5XnaOkOHXi+1EKLYFqNWzY4dMuviRrKzZeCpDLi7OjLmgQbsj0lh/o7TZWqrVMTHy1Ks/HMzQmaJQqFQlJZJq4+TlXtzsDgjJ49Jq49baEQKc3IwJoV3/thPaC0PxvVtVGT57lvd66IXgin/njTTCI3LpNXHybglS9har/cl+2I5EJPCyF4huDraW3o4BaICGAqjUsHJnmY13S0awPhx2ymuZucxrIvKvrBJxo27Xi5iby9FI4vB8x0CeblLEAt2neWrEn7BXUrPJidPlN1C9U6kpl6f7EP5WP3+5BOjaUVYDfv2yWDMrQ8j2JA+1LQGHet4M2n1ceKSzbyKZKLMEoVCoSgNhX0GxiZnWLwMWWFaElMzeWFeON4VnPhuUEuc7HVFHlPT05Un29Ti9/BzRCZeMcMojUth17vZ7wWK4Gp2Lp+vPkZTv8r0beZr6eEUigpgKIxOWLA3B2JTSLlaNlHF0pCamcNP20/Tq2E16lStaPb+FWXkVv2B3NwSrRKP7BnCo6F+TF13skSr3PkpiSYLYMTHw08/GVVXweLk/63Uin6x0TSNT/s2Jk8Ixi4vwjbY2Jgos0ShUChKQw33wjMe7528iaX7YtFbqtxOYTIyc/IYOn8vKRk5zBrcskQuga92DcbFQcfkNdaXtVAUbk4FZzJUd7cufYmZm6I5n5rFmAcaYGdnvVm1KoChMDod6ngjBOyILr31YGmZv+MMqZm5vNo12Ox9K4xAGVeJNU1jfL/GdKtflQ+WH+avA3HFOi4+Rdq4mUzwtTyufpfHczID/l6uvNmtLmuPnOefQ2YM9pgws0ShUChKyoieIbg43Lzy7uKgY1iXINxdHXjztwj6TNvG9ijrcLZTlB0hBKMXHyTiXDJfPdaUhjUql+h47wpODOlYm1WHEog4l2yiURqfQ7EppGfloisgIFCjsrPldLFuIT4lg5mbo7i/SXVCA6zbTU4FMBRGp6mfO66OOrOXkWRk5zFn6ym6hPjQyLdkH4oKK8EIq8T2Oju+faI5obU8GP5bRLGuwwRDAMNkSsvlcfW7PJ6TmXi+QyD1qlXkw+WHSSuj/a9CoVDYIn2b+zKhf2N83V3QAF93Fyb0b8zIXvVY8WoHvny0KZeuZPHE97t47qc9nDyfZukhK8rIzM3RLNkXy1vd69KrUelEv1/oVBtPN0c+W3WsxHpnliAnT8/IRQfwqejEuL4Nb7reezeqRviZZN7+vfQC9MZk0j/H0QsY1cv6bFNvxTqVORQ2jaO9HW0CPdlm5qj5r7vPcik9m1fvUdkXNouRVoOdHXT8MLgVj87cwdB54Swc2o7GfoUHteJSMnDU2eHlZiJhzfK4yl0ez8lMOOjsmPhwE/pN38YXq4/zUZ9Glh6SQqFQmJ2+zX3p2/z2Ons7O43+Lfzo3bg6P247zfQNkfT8ejOPtarJ8G51qVLJutLuFUWz7uh5PvvnGPc3qc5rZciSruBkz6v3BPPxX0fYcvIinQqxXrUWZm2O5kh8KjMHtaRnw2o80brWTe9P2xDJpNXHEcDkAU2x11kmtyDiXDKL98Xycpcganq6WmQMJUFlYChMQliwN9EX0s0mTpOVm8fMzVG0CfS0+rQnhXmo7OrA3Oda4+7qyDM/7ubUxfRC901IyaRqZSerrvdTlC+a1XTn6XYBzN1xhlaf/GsTvvAKhUJhTpwddLzcJYhNI+9hcLsA/giPocsXG/lq7QnSs3ItPTxFMTlxPo03FkbQsEYlvnikaZGOI0XxZFt//Dxc+OyfY1atkxKZeIUp605yf+Pq9GxYrcB9XrknmJG9QlgWEcfw3/eTm6cvcD9TIoTgk7+O4F3ByWYMEFQAQ2ESwoK9AcxWRvLn3ljOp2bxWtc6ZulPYRtUq+zMvOdbI4DBc3aRmJpZ4H7xKZlUr2Qi/QuFohDqVasAwIUrWVbvC69QKBSWwtPNkQ8fasi/b3WmS4gPU9adpMsXG/l191mLTPgUxedyejZD5obj7KBj1qBQXByLdhwpCid7HW91r8vhuFRWHow3wiiNj14vGL34AC4OOj58qOEd9x3WJZhR99Vjxf443vgtwuzX9MqD8YSfucw7PepS0dnBrH2XFhXAUJiEkKoV8a7gyPYo0wt55ubpmbEpkqY13QkL9jJ5fwrbIsinAj8+04pLV7J5+sc9pBagORCfkmF1StCK8s8366Nu25aRk8dn/xyzwGgUCoXCugnwdmP6ky358+X2+Hu6MnrxQe6bsoX1x87bhB7C3UZOnp6Xf9lLQmomswa3vKPzTEnp08yXkKoVmbzmODlWGMT6ZdcZ9py+zJgHGuBTsWinlZc6B/Fe73qsPBDP6wv3me2cMnPymLjqGPWrV2JAaE2z9GkMVABDYRLs7DTaBXmzNfKiyb9Ulu+P41xSBq/eE1zmtDRF+aRpTXe+e6olkYlpvDA3/CaPeb1ecD4ly3QCngpFIRRWYhefkkn/6duYuOoYG44nKqHPYqJpmrumaYs0TTumadpRTdPaaZrmqWnaWk3TThqePQz7apqmTdU0LVLTtAOaprW4oZ2nDfuf1DTtacudkUKhKIiWtTxY9FI7vnuqJbl6wXM/hfPE97s4FJti6aEpbuCjFYfZGZ3ExP6NaeHvYdS2dXYaI3uFcPrSVRbuOWfUtstKbHIGE1cdo2Mdbx5ucbvGS2EM7RTE+/fX5++DCby2wDxBjDnbThFzOYMx99cv0CXFWlEBDIXJ6BDsxYW0LE4mXjFZH3q9YPrGKOpVq8i99aqYrB+F7dOprg9fDGjKrlNJvLFw3zXF56Sr2WTn6amuRMEUZqaw1agKTvZomsbsrdE8++Memn60hge/2confx1hzeEEkq9mF3icginAP0KIekBT4CgwClgnhKgDrDP8DHAfUMfwGArMANA0zRMYC7QBWgNj84MeCoXCetA0jV6NqrFmeCc+7tOQ4+fTeOCbrby5cB8xl69aenh3PfN3nuHnnWd5sVNt+rfwM0kfXetVoVWAB1PXneRqtnVooggh+N+SgwhgfL/GJV5YHdKxNmMeaMA/hxN4dcF/ZOeaLoiRmJbJtPWRdG9QlfaG0n9bQQUwFCbDHDoYqw8nEJl4hVfuCVYCjIoi6dPMl7EPNmD14fO8v/QgQohrFqrVjZjaqFAUhxE9Q3BxuLke2MVBxyd9G/Hny+05MLYnC4a04dWudXBz0jFv5xmGzt9Ls4/X0uvrzYxddoiVB+K5kJZloTOwHjRNqwR0AmYDCCGyhRDJQB9grmG3uUBfw+s+wDwh2Qm4a5pWHegJrBVCJAkhLgNrgV5mPBWFQlECHHR2DG4XwMYRXRjWJYhVhxLoOnkTE/4+SkqGyl6zBNujLvLh8sN0rVeFkSa05NQ0jXd71eNCWhY/bjttsn5KwtKIWDYev8DIniGldvN4vkPgtXvVV0wYxPhyzQmy8/S817u+Sdo3JcpGVWEy/DxcqeXlyrbIizwbFmj09oUQfLshktrebvRuXDo/acXdx7NhgVy8ksW0DVFcupJF+JlkAN5feoiM7LwCLd0UClOQf61NWn2cuOQMari7MKJnyLXtLo462gd7X1sZycrNY/+5FHafusSuU0n8sTeGuTvOAFDbx402gV60CfSkTW1Pqle+PSC3dF9soX2VA2oDF4AfNU1rCuwF3gCqCiHiAYQQ8Zqm5afq+QI35h3HGLYVtl2hUFgxlZwdGNmrHk+1rcXkNSeYtSWa38LP8VrXOgxqW4u/D8aX588/q+HMpXSG/fIfgd5uTBnYzORlCaEBnnSrX4XvNkbxRGt/PNwcTdrfnbh4JYuPVhyhZS0PBrULKFNbz4YForPT+GDZYYb9spdpT7bAyb7sAqj5HIlL5bfwczwXFkigt5vR2jUXKoChMClhwd4sj4gjN09vdG/jjccvcDgulUmPNLGpui2F5XmnRwh7T19mzZHEa9supGUxevFBAHVTozAbfZv7Fvt6c7LX0TrQk9aBnryKFEg7FJvC7lNJ7DqVxF/74/h191kAanq6XA9oBHqx90wS7y05RIZB/yXf8SR/DOUAe6AF8JoQYpemaVO4Xi5SEAV9aYg7bL/5YE0biiw9wd/fv+SjVSgUJqGGuwuTH23K8x0CmbDqKOP+OsK0DSdJy8wlJ0/+K5fDzz+rIC0zh+fnhgPww+BQszlajOhZj15TNjNjU5RFswk+XH6Yq1l5fPZwY6PMSwa3C0ADxiw7zLCf/2P6U8YJYggh+GTlEdxdHHjdRt0bVQmJwqSEBXlzJSuX/THGFVbKz77wdXdRXz6KEqNpGmcLqJHNyMlj0urjFhiRQlFyHHR2NPf34MXOQcx5phURY3vw12sdGPNAAxpUr8S6o+cZsegAnSZt4O0/9l8LXuRTzq73GCBGCLHL8PMiZEDjvKE0BMNz4g373yi57gfE3WH7TQghZgkhQoUQoT4+PkY9EYVCUXYa1KjE/OfbMO+51qRmXA9e5FPOPv8sTp5e8MbCCE5dTGf6Ey0IMOOqfki1ivRr7stP208XKo5tatYcTuCvA/G8fm8wwVUqGq3dQe0C+KRvI9YdS+Sl+XtvEqEvLf8eTWR71CXe7FaXyq62YZt6KyqAoTAp7YK80DTj62DsjE5i75nLvNS5Ng5GzuxQ3B3EJ2cWuN1SX34KRVnR2Wk08q3M8x0CmTkolL3vd2fN8E6M69MQfSFmUOXlehdCJADnNE0LMWy6FzgCLAfynUSeBpYZXi8HBhvcSNoCKYZSk9VAD03TPAzinT0M2xQKhQ3Sqa7PNdHuW4lNziArt+wTQgV8vvoY648l8uGDDSwiCPlW97og4Ot/T5i975SMHMYsO0S9ahV5sXOQ0dt/qm0txvdrzIbjF3jp57IFMbJz9Xy68gjBVSrwRBvbzR5UMz+FSfF0c6RhjUpGD2B8u+EkPhWdbMqzWGFdFOYAYUyfcoXCktjZadStWpFB7QLwvTuu99eAXzRNOwA0A8YDE4HumqadBLobfgb4G4gGIoHvgWEAQogkYBywx/D42LBNoVDYKHf6nAsd9y/Df4tg7ZHzRlndvhtZ/F8MMzdF82Qb/zJrP5QWPw9Xnmpbi0V7Y4hMTDNr3xNXHeVCWhaTHmlqskXVJ9r4M7F/YzYev8DQMmRizNtxmtOXrvK/++vb9AKw7Y5cYTOEBXnz39nLRrM42nf2MtsiLzG0Y22cHYwnaKO4uyjMAWJEz5BCjlAobJe74XoXQkQYyjqaCCH6CiEuCyEuCSHuFULUMTwnGfYVQohXhBBBQojGQojwG9qZI4QINjx+tNwZKRQKY1DQ55+zgx1DOwXSq1E11h9L5IV54YR+8i9vLNzH6sMJKphRTP47e5lRiw/StrYnHz7U0KJjeeWeIFwd7c1aGrQ98iK/7j7HC51q09ivskn7Gtjan88fbsKWkxd4YV54ia/Ry+nZTF13kk51fbgnpErRB1gxSsRTYXLCgr2ZuTmaPacv07lu2WuFp22IxN3VwaZTnxSWpygHCIWiPKGud4VCcbdS1Off+Dw926Mu8feBeFYfSWBZRBxujjq61q/K/Y2r0bluFVwc1YLZrcSnZDB03l6qVXJmxpMtLb6i71XBiRc61uarf0/w39nLtPD3MGl/Gdl5jFp8kAAvV4Z3q2vSvvJ5tFVNNA1G/nmAIXPD+X5waLGvza//PUF6dh7v3297tqm3ogIYCpPTKsATR50d2yIvljmAcSQulX+PJvJW97q4OanLV1E2SuIAoVDYOup6VygUdyt3+vxz0NnRua4Pnev68EleI3ZGX+LvgwmsPpzAiv1xuDrquKdeFXo3qs499XxwdVT3nxnZedeyABa80Mai9qU3MqRjIPN2nOazVcdYOLQtmmY6l8Iv1x7nbNJVFg5ta9aM8AGhNbHTNN5ZtJ/n5+5h9tOtigxiRCam8fOuszzR2p+6VY0nMmopLBIq0zTNXdO0RZqmHdM07aimae00TfPUNG2tpmknDc8ehn01TdOmapoWqWnaAU3TWtzQztOG/U9qmvZ04T0qLImLo44WtdzZerLsOhjTNkZS0cmep9sHlH1gCoVCoVAoFAqFAQedHR3r+DChf2N2v3cvvwxpQ7/mvuyKvsQrC/6j5bh/GfbLXlbsjyM9yzil0baGEIIRi/ZzOC6VKQObWdWE2M3Jnte6BrPrVBKbTlwwWT8R55KZvfUUT7bxp21tL5P1UxgPt/Tjy0ebsjP6Es/9tKfIMv1PVx7F1VHH8O7myRQxNZYKIU4B/hFCPKJpmiPgCrwHrBNCTNQ0bRTSv/1d+D97dx4fZX3u//91ZSEBQoCEfZEEpKAoIAaEQq2Uo+CK9Vi7eKq2PVK3tuf7q9bac6xttavd1FYtrRZtqVatW1s32krdQAFBcAFlJywJEEjCkpDl+v1x38EBhmzMZCaT9/PxmEdmPnPf91wfE8mV6/4snA0MDx+nAfcAp5lZHnALUESwR/sSM3va3Xe1fXekKVOO78VPX3ifsr0HyGtllXbN9j08s2IrV398GN07t89tf0REREQk+WWkpzH5+F5MPr4X35t5Em+sK+OZFVt59u1tPLNiG1kZaZwxojfnnNyfaSf0JSccGfzk0s0pN10vsk852RlUVtVy44yRTDuhb6JDO8LnThvCfa+u48fPreL04b1JS4vtKIwDtfXc+Nhy+uZm882zR8b02i3xyVMGYRj/3yPL+MLvF/H7L4yPOjro3+9v58VV2/nfc05o9d9gyabNCxhmlgucDlwB4O4HgANmNhM4IzzsAWA+QQFjJvCguzuwMBy90T88dl7DglxmNg+YATzUVn2R5vvo8b3ghfd5bc0Ozhs9oFXXuPvFNWRlpPGlKYUxjk5EREREJLr0NGPSsHwmDcvnOxeMYvH6D4sZz79TQqeMYBpK39wsHltSTFVNPRBs1XrT4ysA2m0R48mlm7np8RXsDxeNrKyqJd2MfrlZCY4suk4ZaXz9zBH8z5+X8dflW5g5Nrb/3e+Zv4ZVJZXcf0UR3bITe0P1wlMGYgb/78/LuOL3i/j9FeMPmWJfW1fPbX97lyH5Xbjso0MSGGlsJWIKyVBgO/B7M1tqZr8zs65A33APdsKvDcujDgQ2RZxfHLYdrV2S0OiB3emWlcGrq3e26vxNZft4ctlmPjvhOPJzkvMfTBERERFJbelpxmlD8/nuzJNYeNM0Hr1qEpeedhwrisv548KNB4sXDfbX1LXpzhixdvvzqw4WLxrUufPTF95PUERNu2DMAEb268bPXnifA7X1TZ/QTO+XVPKrFz/ggjED+MTI5Bh9MnPsQO74zCks2bCLK37/BnsipjY9tGgTH5Tu4aazTyArI3UWok3EFJIMYBzwFXd/3czuIJgucjTRxv14I+1HXsBsFjAL4LjjtHNFImSkpzFxWD6vrm7dOhi/eWkN6WbMOn1ojCMTEREREWm5tDRjfEEe4wvyuPncExn2rWei/jGyZff+No8tVo4WezL3KS3NuHHGSL4wZxEPL9rIZZMKjvmadfXONx5bTk5WBrecf+KxBxlD548ZQJoZX314Keff+TJVtfVsK6/CDIb17sr0UclRbImVRIzAKAaK3f318PVjBAWNknBqCOHX0ojjB0ecPwjY0kj7Edx9drg3fFHv3se+jae0zuRh+Wws28emsn0tOq+koopHFhfzn6cOon/3znGKTkRERESkddLSjAE9ouep/bpnt3E0sbH/QN1Rd9g4Wl+TxRkjejOhMI87/7k6JguuznltPcs27eY7F4xKytHg547uz2UTj2Pdzn1sLa/CgXqH4l37eWpZ1D+R2602L2C4+zZgk5mNCJumAe8CTwMNO4lcDjwVPn8auCzcjWQiUB5OMXkeOMvMeoY7lpwVtkmSmjK8F0CLR2H89qW11NU7V398WDzCEhERERE5ZjdMH0HnKH/wuztrtu9JQEStt27HXj5596vsr6kj47CFMDtnpnPD9BFHOTM5mAWjMHbsqeb+V9Yd07U2le3jp8+v4hMj+3DBmNat5dcWXni39Ii26tr6dj2FKZqEbKMKfAWYa2bLgbHAD4AfAWea2QfAmeFrgGeAtcBq4LfANQDh4p23AovCx/caFvSU5DSsdw59c7N4pQUFjLK9B5j7+kZmjhnAcfld4hidiIiIiEjrXXjKQH540ckM7NEZAwb26MxVHx9KdW09M3/1Ks+s2JroEJvlube3csFdr1BSUcUDX5zATz815pA+/fCik9vFoqSnDunJmSf25TcvraVs74FWXcPduenxFaSnGbddeBJmsd3VJJba43Sf1kjINqru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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "num_samples = 6\n", + "min_week = 140\n", + "sales = pd.read_csv(os.path.join(DATA_DIR, \"yx.csv\"))\n", + "sales[\"move\"] = sales.logmove.apply(lambda x: round(math.exp(x)) if x > 0 else 0)\n", + "\n", + "result_df[\"move\"] = result_df.predictions\n", + "plot_predictions_with_history(\n", + " result_df,\n", + " sales,\n", + " grain1_unique_vals=store_list,\n", + " grain2_unique_vals=brand_list,\n", + " time_col_name=\"week\",\n", + " target_col_name=\"move\",\n", + " grain1_name=\"store\",\n", + " grain2_name=\"brand\",\n", + " min_timestep=min_week,\n", + " num_samples=num_samples,\n", + " predict_at_timestep=145,\n", + " line_at_predict_time=False,\n", + " title=\"Prediction results for a few sample time series\",\n", + " x_label=\"week\",\n", + " y_label=\"unit sales\",\n", + " random_seed=2,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Reading\n", + "\n", + "\\[1\\] Rob J Hyndman and George Athanasopoulos. 2018. Forecasting: Principles and Practice. Chapter 8 ARIMA models: https://otexts.com/fpp2/arima.html
\n", + "\n", + "\\[2\\] Modern Parallel and Distributed Python: A Quick Tutorial on Ray: https://rise.cs.berkeley.edu/blog/modern-parallel-and-distributed-python-a-quick-tutorial-on-ray/
" + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "forecasting_env", + "language": "python", + "name": "forecasting_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/grocery_sales/python/02_model/dilatedcnn_multi_round.ipynb b/examples/grocery_sales/python/02_model/dilatedcnn_multi_round.ipynb new file mode 100644 index 00000000..5418030c --- /dev/null +++ b/examples/grocery_sales/python/02_model/dilatedcnn_multi_round.ipynb @@ -0,0 +1,947 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dilated Convolutional Neural Network (CNN)\n", + "\n", + "This notebook introduces Dilated Convolutional Neural Network (CNN) model and carries out multi-round training and evaluation of this model on the Orange Juice dataset.\n", + "\n", + "The Dilated CNN is built upon dilated causal convolution inspired by [WaveNet](https://arxiv.org/abs/1609.03499). [Recently study](https://arxiv.org/abs/1803.01271) shows that it outperforms canonical recurrent networks such as LSTMs over a diverse range of tasks and datasets. Dilated CNN has many advantages when handling sequential data like time series\n", + "* Capturing long-range input information with less parameters\n", + "* Handling temporal flow with causal connection structures\n", + "* Better training efficiency than recurrent neural networks\n", + "\n", + "Dilated CNN has been applied in several machine learning competitions and achieved impressive performance, e.g. [the Favorita Grocery Sales Forecasting competition](https://github.com/LenzDu/Kaggle-Competition-Favorita)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Settings and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext tensorboard" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "System version: 3.6.10 |Anaconda, Inc.| (default, Mar 23 2020, 23:13:11) \n", + "[GCC 7.3.0]\n", + "TensorFlow version: 2.0.0\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "import math\n", + "import shutil\n", + "import random\n", + "import datetime\n", + "import warnings\n", + "import numpy as np\n", + "import pandas as pd\n", + "import tensorflow as tf\n", + "import scrapbook as sb\n", + "\n", + "from tensorflow.keras import optimizers\n", + "from tensorflow.keras.models import load_model\n", + "from tensorflow.keras.callbacks import ModelCheckpoint\n", + "from fclib.common.utils import git_repo_path, module_path\n", + "from fclib.dataset.ojdata import download_ojdata, split_train_test, FIRST_WEEK_START\n", + "from fclib.feature_engineering.feature_utils import (\n", + " week_of_month,\n", + " df_from_cartesian_product,\n", + " gen_sequence_array,\n", + " static_feature_array,\n", + " normalize_columns,\n", + ")\n", + "from fclib.models.dilated_cnn import create_dcnn_model\n", + "from fclib.evaluation.evaluation_utils import MAPE\n", + "from fclib.common.plot import plot_predictions_with_history\n", + "\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "print(\"System version: {}\".format(sys.version))\n", + "print(\"TensorFlow version: {}\".format(tf.__version__))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parameter Settings\n", + "\n", + "In the following cell, we define global settings related to the model and feature engineering. We initialize several key parameters of the model including `SEQ_LEN` and `DROPOUT_RATE` that decide the deep learning network structure as well as `BATCH_SIZE`, `LEARNING_RATE`, and `EPOCHS` that control the optimization algorithm. We use historical data of a number of dynamic features and several static features to form input sequences to the model. The dynamic features include `deal`, `feat`, `month`, `week_of_month`, `price`, `price_ratio`; while the static features are `store` and `brand`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Use False if you've already downloaded and split the data\n", + "DOWNLOAD_SPLIT_DATA = True\n", + "\n", + "# Data directories\n", + "DATA_DIR = os.path.join(git_repo_path(), \"ojdata\")\n", + "TRAIN_DIR = os.path.join(DATA_DIR, \"train\")\n", + "TEST_DIR = os.path.join(DATA_DIR, \"test\")\n", + "\n", + "# Forecasting settings\n", + "N_SPLITS = 10\n", + "HORIZON = 2\n", + "GAP = 2\n", + "FIRST_WEEK = 40\n", + "LAST_WEEK = 156\n", + "\n", + "# Parameters of the model\n", + "SEQ_LEN = 15\n", + "DROPOUT_RATE = 0.01\n", + "BATCH_SIZE = 64\n", + "LEARNING_RATE = 0.015\n", + "EPOCHS = 25\n", + "\n", + "# Feature columns\n", + "DYNAMIC_FEATURES = [\"deal\", \"feat\", \"month\", \"week_of_month\", \"price\", \"price_ratio\"]\n", + "STATIC_FEATURES = [\"store\", \"brand\"]\n", + "\n", + "# Maximum store ID and brand ID\n", + "MAX_STORE_ID = 137\n", + "MAX_BRAND_ID = 11" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also fix random seeds so that the results obtained by Dilated CNN can be reproduced." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Fix random seeds\n", + "random.seed(2)\n", + "np.random.seed(2)\n", + "tf.random.set_seed(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preparation\n", + "\n", + "We need to download the Orange Juice data and split it into training and test sets for multiple forecast rounds. By default, the following cell will download and spit the data. If you've already done so, you may skip this part by changing `DOWNLOAD_SPLIT_DATA` to False." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data already exists at the specified location.\n", + "Finished data downloading and splitting.\n" + ] + } + ], + "source": [ + "if DOWNLOAD_SPLIT_DATA:\n", + " download_ojdata(DATA_DIR)\n", + " split_train_test(\n", + " DATA_DIR,\n", + " n_splits=N_SPLITS,\n", + " horizon=HORIZON,\n", + " gap=GAP,\n", + " first_week=FIRST_WEEK,\n", + " last_week=LAST_WEEK,\n", + " write_csv=True,\n", + " )\n", + " print(\"Finished data downloading and splitting.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Feature Engineering\n", + "\n", + "Next we create a function to extract a number of features from the data for training the forecasting model. These features can be divided into dynamic features and static features:\n", + "\n", + "* Dynamic features:\n", + " - datetime features including week of the month, month, etc.\n", + " - historical weekly sales of each orange juice in recent weeks\n", + " - absolute price and the ratio between absolute price and average price of all brands\n", + " - promotion information captured by `deal` and `feat` columns\n", + "* Static features:\n", + " - store ID and brand ID\n", + "\n", + "Note that the logarithm of the unit sales is stored in a column named `logmove` both for `train_df` and `test_df`. We compute the unit sales `move` based on this quantity and treat the unit sales as the prediction target." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def create_features(pred_round, train_dir, pred_steps, offset):\n", + " \"\"\"Create a dataframe of the input features.\n", + " \n", + " Args: \n", + " pred_round (int): Prediction round (1, 2, ...)\n", + " train_dir (str): Path of the training data directory\n", + " pred_steps (int): Number of prediction steps\n", + " offset (int): Length of training data skipped in retraining\n", + "\n", + " Returns:\n", + " pd.Dataframe: Dataframe including the input features in original scale\n", + " pd.Dataframe: Dataframe including the normalized features \n", + " int: Last week of the training data \n", + " \"\"\"\n", + " # Load training data\n", + " train_df = pd.read_csv(os.path.join(TRAIN_DIR, \"train_\" + str(pred_round) + \".csv\"))\n", + " train_df[\"move\"] = train_df[\"logmove\"].apply(lambda x: round(math.exp(x)))\n", + " train_df = train_df[[\"store\", \"brand\", \"week\", \"move\"]]\n", + "\n", + " # Create a dataframe to hold all necessary data\n", + " store_list = train_df[\"store\"].unique()\n", + " brand_list = train_df[\"brand\"].unique()\n", + " train_end_week = train_df[\"week\"].max()\n", + " week_list = range(FIRST_WEEK + offset, train_end_week + GAP + HORIZON)\n", + " d = {\"store\": store_list, \"brand\": brand_list, \"week\": week_list}\n", + " data_grid = df_from_cartesian_product(d)\n", + " data_filled = pd.merge(data_grid, train_df, how=\"left\", on=[\"store\", \"brand\", \"week\"])\n", + "\n", + " # Get future price, deal, and advertisement info\n", + " aux_df = pd.read_csv(os.path.join(TRAIN_DIR, \"auxi_\" + str(pred_round) + \".csv\"))\n", + " data_filled = pd.merge(data_filled, aux_df, how=\"left\", on=[\"store\", \"brand\", \"week\"])\n", + "\n", + " # Create relative price feature\n", + " price_cols = [\n", + " \"price1\",\n", + " \"price2\",\n", + " \"price3\",\n", + " \"price4\",\n", + " \"price5\",\n", + " \"price6\",\n", + " \"price7\",\n", + " \"price8\",\n", + " \"price9\",\n", + " \"price10\",\n", + " \"price11\",\n", + " ]\n", + " data_filled[\"price\"] = data_filled.apply(lambda x: x.loc[\"price\" + str(int(x.loc[\"brand\"]))], axis=1)\n", + " data_filled[\"avg_price\"] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols))\n", + " data_filled[\"price_ratio\"] = data_filled[\"price\"] / data_filled[\"avg_price\"]\n", + " data_filled.drop(price_cols, axis=1, inplace=True)\n", + "\n", + " # Fill missing values\n", + " data_filled = data_filled.groupby([\"store\", \"brand\"]).apply(\n", + " lambda x: x.fillna(method=\"ffill\").fillna(method=\"bfill\")\n", + " )\n", + "\n", + " # Create datetime features\n", + " data_filled[\"week_start\"] = data_filled[\"week\"].apply(\n", + " lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7)\n", + " )\n", + " data_filled[\"month\"] = data_filled[\"week_start\"].apply(lambda x: x.month)\n", + " data_filled[\"week_of_month\"] = data_filled[\"week_start\"].apply(lambda x: week_of_month(x))\n", + " data_filled[\"day\"] = data_filled[\"week_start\"].apply(lambda x: x.day)\n", + " data_filled.drop(\"week_start\", axis=1, inplace=True)\n", + "\n", + " # Normalize the dataframe of features\n", + " cols_normalize = data_filled.columns.difference([\"store\", \"brand\", \"week\"])\n", + " data_scaled, min_max_scaler = normalize_columns(data_filled, cols_normalize)\n", + "\n", + " return data_filled, data_scaled, train_end_week" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Modeling\n", + "\n", + "We then perform a multi-round training by fitting a Dilated CNN model using the training data in each forecast round. To speed up the training process, we only train the model on full training set in the first round. In the subsequent rounds, the model will be retrained using the latest data. After the model is trained in each round, it is applied to generate forecasts for the target weeks.\n", + "\n", + "We use a utility function `create_dcnn_model()` to define the Dilated CNN. As introduced in [literature](https://arxiv.org/abs/1609.03499), the core structure of the Dilated CNN is a stack of dilated causal convolutional layers. Below is an example of such stack involving 4 dilated convolutional layers.\n", + "\n", + "\n", + "\n", + "The number of dilated layers can be specified via input argument `n_dilated_layers` of the model definition utility function. After creating the model, we can print out the structure of the network via executing `model.summary()`.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prepare Input and Output\n", + "\n", + "Next, we define two functions that help prepare input and output data for model training and testing." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_training_io(data_filled, data_scaled, train_end_week):\n", + " \"\"\"Prepare input and output for model training.\n", + " \n", + " Args: \n", + " data_filled (pd.Dataframe): Dataframe including the input features in original scale\n", + " data_scaled (pd.Dataframe): Dataframe including the normalized features \n", + " train_end_week (int): Last week of the training data\n", + "\n", + " Returns:\n", + " np.array: Input sequences of dynamic features\n", + " np.array: Input sequences of categorical features\n", + " np.array: Output sequences of the target variable\n", + " \"\"\"\n", + " # Create sequence array for 'move'\n", + " start_timestep = 0\n", + " end_timestep = train_end_week - FIRST_WEEK - HORIZON - GAP + 1\n", + " train_input1 = gen_sequence_array(\n", + " data_scaled, SEQ_LEN, [\"move\"], \"store\", \"brand\", start_timestep, end_timestep - offset,\n", + " )\n", + "\n", + " # Create sequence array for other dynamic features\n", + " start_timestep = HORIZON + GAP - 1\n", + " end_timestep = train_end_week - FIRST_WEEK\n", + " train_input2 = gen_sequence_array(\n", + " data_scaled, SEQ_LEN, DYNAMIC_FEATURES, \"store\", \"brand\", start_timestep, end_timestep - offset,\n", + " )\n", + "\n", + " seq_in = np.concatenate((train_input1, train_input2), axis=2)\n", + "\n", + " # Create array of static features\n", + " total_timesteps = train_end_week - FIRST_WEEK - SEQ_LEN - HORIZON - GAP + 3\n", + " cat_fea_in = static_feature_array(data_filled, total_timesteps - offset, STATIC_FEATURES, \"store\", \"brand\")\n", + "\n", + " # Create training output\n", + " start_timestep = SEQ_LEN + GAP - 1\n", + " end_timestep = train_end_week - FIRST_WEEK\n", + " train_output = gen_sequence_array(\n", + " data_filled, HORIZON, [\"move\"], \"store\", \"brand\", start_timestep, end_timestep - offset,\n", + " )\n", + " train_output = np.squeeze(train_output)\n", + "\n", + " return seq_in, cat_fea_in, train_output" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_testing_io(data_filled, data_scaled, train_end_week):\n", + " \"\"\"Prepare input and output for model training.\n", + " \n", + " Args: \n", + " data_filled (pd.Dataframe): Dataframe including the input features in original scale\n", + " data_scaled (pd.Dataframe): Dataframe including the normalized features \n", + " train_end_week (int): Last week of the training data\n", + "\n", + " Returns:\n", + " np.array: Input sequences of dynamic features\n", + " np.array: Input sequences of categorical features\n", + " \"\"\"\n", + " # Get inputs for prediction\n", + " start_timestep = train_end_week - FIRST_WEEK - SEQ_LEN + 1\n", + " end_timestep = train_end_week - FIRST_WEEK\n", + " test_input1 = gen_sequence_array(\n", + " data_scaled, SEQ_LEN, [\"move\"], \"store\", \"brand\", start_timestep - offset, end_timestep - offset,\n", + " )\n", + "\n", + " start_timestep = train_end_week + GAP + HORIZON - FIRST_WEEK - SEQ_LEN\n", + " end_timestep = train_end_week + GAP + HORIZON - FIRST_WEEK - 1\n", + " test_input2 = gen_sequence_array(\n", + " data_scaled, SEQ_LEN, DYNAMIC_FEATURES, \"store\", \"brand\", start_timestep - offset, end_timestep - offset,\n", + " )\n", + "\n", + " seq_in = np.concatenate((test_input1, test_input2), axis=2)\n", + "\n", + " total_timesteps = 1\n", + " cat_fea_in = static_feature_array(data_filled, total_timesteps, STATIC_FEATURES, \"store\", \"brand\")\n", + "\n", + " return seq_in, cat_fea_in" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Model Training and Prediction\n", + "\n", + "With the above helper functions, now we are ready for model training and applying the trained model to generate predictions. We save the training log information in the directory `log_dir` so that we can visualize the training process with [TensorBoard](https://www.tensorflow.org/tensorboard/get_started), which is a tool for providing the measurements and visualizations needed during the machine learning workflow." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---- Round 1 ----\n", + "Train on 72127 samples\n", + "Epoch 1/25\n", + "71616/72127 [============================>.] - ETA: 0s - loss: 56.5520 - mape: 56.5520 - mae: 7724.2822\n", + "Epoch 00001: loss improved from inf to 56.51509, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 6s 84us/sample - loss: 56.5151 - mape: 56.5151 - mae: 7720.3770\n", + "Epoch 2/25\n", + "71808/72127 [============================>.] - ETA: 0s - loss: 47.1695 - mape: 47.1694 - mae: 7017.5864\n", + "Epoch 00002: loss improved from 56.51509 to 47.16605, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 47.1660 - mape: 47.1660 - mae: 7016.5732\n", + "Epoch 3/25\n", + "71808/72127 [============================>.] - ETA: 0s - loss: 45.7213 - mape: 45.7213 - mae: 6850.9878\n", + "Epoch 00003: loss improved from 47.16605 to 45.71347, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 45.7135 - mape: 45.7135 - mae: 6850.3550\n", + "Epoch 4/25\n", + "71424/72127 [============================>.] - ETA: 0s - loss: 44.6667 - mape: 44.6667 - mae: 6717.0830\n", + "Epoch 00004: loss improved from 45.71347 to 44.66833, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 44.6683 - mape: 44.6683 - mae: 6713.0122\n", + "Epoch 5/25\n", + "71616/72127 [============================>.] - ETA: 0s - loss: 43.2272 - mape: 43.2272 - mae: 6515.4497\n", + "Epoch 00005: loss improved from 44.66833 to 43.20723, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 43.2072 - mape: 43.2072 - mae: 6508.6270\n", + "Epoch 6/25\n", + "71552/72127 [============================>.] - ETA: 0s - loss: 41.1341 - mape: 41.1341 - mae: 6276.3589\n", + "Epoch 00006: loss improved from 43.20723 to 41.13340, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 41.1334 - mape: 41.1334 - mae: 6273.2939\n", + "Epoch 7/25\n", + "71744/72127 [============================>.] - ETA: 0s - loss: 39.7776 - mape: 39.7776 - mae: 6087.9951\n", + "Epoch 00007: loss improved from 41.13340 to 39.76846, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 39.7685 - mape: 39.7685 - mae: 6086.8159\n", + "Epoch 8/25\n", + "72064/72127 [============================>.] - ETA: 0s - loss: 38.4566 - mape: 38.4566 - mae: 5858.4277\n", + "Epoch 00008: loss improved from 39.76846 to 38.45820, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 38.4582 - mape: 38.4582 - mae: 5857.4014\n", + "Epoch 9/25\n", + "71808/72127 [============================>.] - ETA: 0s - loss: 37.5734 - mape: 37.5734 - mae: 5705.5396\n", + "Epoch 00009: loss improved from 38.45820 to 37.58665, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 37.5866 - mape: 37.5867 - mae: 5701.1484\n", + "Epoch 10/25\n", + "72064/72127 [============================>.] - ETA: 0s - loss: 37.2489 - mape: 37.2489 - mae: 5598.1396\n", + "Epoch 00010: loss improved from 37.58665 to 37.24802, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 37.2480 - mape: 37.2480 - mae: 5596.7349\n", + "Epoch 11/25\n", + "71680/72127 [============================>.] - ETA: 0s - loss: 36.7482 - mape: 36.7482 - mae: 5497.1836\n", + "Epoch 00011: loss improved from 37.24802 to 36.74330, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 36.7433 - mape: 36.7433 - mae: 5500.9717\n", + "Epoch 12/25\n", + "71360/72127 [============================>.] - ETA: 0s - loss: 36.4275 - mape: 36.4275 - mae: 5431.5015\n", + "Epoch 00012: loss improved from 36.74330 to 36.41299, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 36.4130 - mape: 36.4130 - mae: 5432.9189\n", + "Epoch 13/25\n", + "71104/72127 [============================>.] - ETA: 0s - loss: 36.1517 - mape: 36.1517 - mae: 5387.0752\n", + "Epoch 00013: loss improved from 36.41299 to 36.15361, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 36.1536 - mape: 36.1536 - mae: 5391.8271\n", + "Epoch 14/25\n", + "71808/72127 [============================>.] - ETA: 0s - loss: 35.9469 - mape: 35.9469 - mae: 5346.2378\n", + "Epoch 00014: loss improved from 36.15361 to 35.94919, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 35.9492 - mape: 35.9492 - mae: 5343.6650\n", + "Epoch 15/25\n", + "71424/72127 [============================>.] - ETA: 0s - loss: 35.8748 - mape: 35.8748 - mae: 5292.9468\n", + "Epoch 00015: loss improved from 35.94919 to 35.88297, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 35.8830 - mape: 35.8830 - mae: 5301.1138\n", + "Epoch 16/25\n", + "72000/72127 [============================>.] - ETA: 0s - loss: 35.7022 - mape: 35.7022 - mae: 5275.9946\n", + "Epoch 00016: loss improved from 35.88297 to 35.69789, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 35.6979 - mape: 35.6979 - mae: 5275.7202\n", + "Epoch 17/25\n", + "71040/72127 [============================>.] - ETA: 0s - loss: 35.5128 - mape: 35.5128 - mae: 5253.6084\n", + "Epoch 00017: loss improved from 35.69789 to 35.48755, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 35.4876 - mape: 35.4876 - mae: 5249.2109\n", + "Epoch 18/25\n", + "71424/72127 [============================>.] - ETA: 0s - loss: 35.4470 - mape: 35.4470 - mae: 5227.4438\n", + "Epoch 00018: loss improved from 35.48755 to 35.42664, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 35.4266 - mape: 35.4267 - mae: 5216.9648\n", + "Epoch 19/25\n", + "71488/72127 [============================>.] - ETA: 0s - loss: 35.3327 - mape: 35.3327 - mae: 5182.2876\n", + "Epoch 00019: loss improved from 35.42664 to 35.33811, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 35.3381 - mape: 35.3381 - mae: 5188.2520\n", + "Epoch 20/25\n", + "71104/72127 [============================>.] - ETA: 0s - loss: 35.5015 - mape: 35.5016 - mae: 5198.1392\n", + "Epoch 00020: loss did not improve from 35.33811\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 35.4936 - mape: 35.4936 - mae: 5191.4199\n", + "Epoch 21/25\n", + "71872/72127 [============================>.] - ETA: 0s - loss: 35.1813 - mape: 35.1813 - mae: 5150.4614\n", + "Epoch 00021: loss improved from 35.33811 to 35.18649, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 35.1865 - mape: 35.1865 - mae: 5162.1743\n", + "Epoch 22/25\n", + "71744/72127 [============================>.] - ETA: 0s - loss: 35.1639 - mape: 35.1639 - mae: 5124.0410\n", + "Epoch 00022: loss improved from 35.18649 to 35.16992, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 35.1699 - mape: 35.1699 - mae: 5127.2227\n", + "Epoch 23/25\n", + "72000/72127 [============================>.] - ETA: 0s - loss: 35.0720 - mape: 35.0720 - mae: 5120.6782\n", + "Epoch 00023: loss improved from 35.16992 to 35.06942, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 35.0694 - mape: 35.0694 - mae: 5118.3569\n", + "Epoch 24/25\n", + "71680/72127 [============================>.] - ETA: 0s - loss: 35.0583 - mape: 35.0583 - mae: 5102.2280\n", + "Epoch 00024: loss improved from 35.06942 to 35.06686, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 50us/sample - loss: 35.0669 - mape: 35.0669 - mae: 5103.9692\n", + "Epoch 25/25\n", + "71488/72127 [============================>.] - ETA: 0s - loss: 34.9209 - mape: 34.9209 - mae: 5069.0962\n", + "Epoch 00025: loss improved from 35.06686 to 34.92286, saving model to dcnn_model.h5\n", + "72127/72127 [==============================] - 4s 49us/sample - loss: 34.9229 - mape: 34.9228 - mae: 5068.9219\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 137 1 9910.0\n", + "1 2 1 138 1 12029.0\n", + "2 2 2 137 1 7981.0\n", + "3 2 2 138 1 28129.0\n", + "4 2 3 137 1 1061.0\n", + "\n", + "---- Round 2 ----\n", + "Train on 35607 samples\n", + "35264/35607 [============================>.] - ETA: 0s - loss: 33.9054 - mape: 33.9054 - mae: 5311.6572\n", + "Epoch 00001: loss improved from inf to 33.92596, saving model to dcnn_model.h5\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "35607/35607 [==============================] - 2s 70us/sample - loss: 33.9260 - mape: 33.9260 - mae: 5309.5166\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 139 2 3998.0\n", + "1 2 1 140 2 4596.0\n", + "2 2 2 139 2 6158.0\n", + "3 2 2 140 2 6448.0\n", + "4 2 3 139 2 1554.0\n", + "\n", + "---- Round 3 ----\n", + "Train on 35607 samples\n", + "34752/35607 [============================>.] - ETA: 0s - loss: 33.5213 - mape: 33.5213 - mae: 5126.2217\n", + "Epoch 00001: loss improved from inf to 33.46539, saving model to dcnn_model.h5\n", + "35607/35607 [==============================] - 3s 72us/sample - loss: 33.4654 - mape: 33.4654 - mae: 5107.3125\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 141 3 6915.0\n", + "1 2 1 142 3 6761.0\n", + "2 2 2 141 3 5557.0\n", + "3 2 2 142 3 6409.0\n", + "4 2 3 141 3 1428.0\n", + "\n", + "---- Round 4 ----\n", + "Train on 35607 samples\n", + "35200/35607 [============================>.] - ETA: 0s - loss: 33.2054 - mape: 33.2054 - mae: 5057.2705\n", + "Epoch 00001: loss improved from inf to 33.20649, saving model to dcnn_model.h5\n", + "35607/35607 [==============================] - 2s 65us/sample - loss: 33.2065 - mape: 33.2065 - mae: 5055.4448\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 143 4 18794.0\n", + "1 2 1 144 4 17115.0\n", + "2 2 2 143 4 5900.0\n", + "3 2 2 144 4 5871.0\n", + "4 2 3 143 4 1976.0\n", + "\n", + "---- Round 5 ----\n", + "Train on 35607 samples\n", + "35072/35607 [============================>.] - ETA: 0s - loss: 33.4395 - mape: 33.4395 - mae: 5141.1123\n", + "Epoch 00001: loss improved from inf to 33.43004, saving model to dcnn_model.h5\n", + "35607/35607 [==============================] - 2s 66us/sample - loss: 33.4300 - mape: 33.4300 - mae: 5135.1890\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 145 5 23389.0\n", + "1 2 1 146 5 9354.0\n", + "2 2 2 145 5 5825.0\n", + "3 2 2 146 5 7065.0\n", + "4 2 3 145 5 1998.0\n", + "\n", + "---- Round 6 ----\n", + "Train on 35607 samples\n", + "34816/35607 [============================>.] - ETA: 0s - loss: 33.1314 - mape: 33.1314 - mae: 5129.1152\n", + "Epoch 00001: loss improved from inf to 33.11792, saving model to dcnn_model.h5\n", + "35607/35607 [==============================] - 2s 66us/sample - loss: 33.1179 - mape: 33.1179 - mae: 5124.7051\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 147 6 13091.0\n", + "1 2 1 148 6 7817.0\n", + "2 2 2 147 6 5191.0\n", + "3 2 2 148 6 6077.0\n", + "4 2 3 147 6 2291.0\n", + "\n", + "---- Round 7 ----\n", + "Train on 35607 samples\n", + "35008/35607 [============================>.] - ETA: 0s - loss: 33.1471 - mape: 33.1471 - mae: 5115.1094\n", + "Epoch 00001: loss improved from inf to 33.11932, saving model to dcnn_model.h5\n", + "35607/35607 [==============================] - 2s 66us/sample - loss: 33.1193 - mape: 33.1193 - mae: 5113.9355\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 149 7 6490.0\n", + "1 2 1 150 7 7105.0\n", + "2 2 2 149 7 6028.0\n", + "3 2 2 150 7 18761.0\n", + "4 2 3 149 7 2231.0\n", + "\n", + "---- Round 8 ----\n", + "Train on 35607 samples\n", + "35392/35607 [============================>.] - ETA: 0s - loss: 33.1963 - mape: 33.1963 - mae: 4968.2534\n", + "Epoch 00001: loss improved from inf to 33.17502, saving model to dcnn_model.h5\n", + "35607/35607 [==============================] - 2s 67us/sample - loss: 33.1750 - mape: 33.1750 - mae: 4969.2456\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 151 8 8015.0\n", + "1 2 1 152 8 7308.0\n", + "2 2 2 151 8 6558.0\n", + "3 2 2 152 8 8073.0\n", + "4 2 3 151 8 2495.0\n", + "\n", + "---- Round 9 ----\n", + "Train on 35607 samples\n", + "34880/35607 [============================>.] - ETA: 0s - loss: 33.0961 - mape: 33.0961 - mae: 4771.2114\n", + "Epoch 00001: loss improved from inf to 33.10128, saving model to dcnn_model.h5\n", + "35607/35607 [==============================] - 2s 67us/sample - loss: 33.1013 - mape: 33.1013 - mae: 4765.5112\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 153 9 6429.0\n", + "1 2 1 154 9 10321.0\n", + "2 2 2 153 9 6320.0\n", + "3 2 2 154 9 6201.0\n", + "4 2 3 153 9 2790.0\n", + "\n", + "---- Round 10 ----\n", + "Train on 35607 samples\n", + "35392/35607 [============================>.] - ETA: 0s - loss: 33.3706 - mape: 33.3706 - mae: 4863.7505\n", + "Epoch 00001: loss improved from inf to 33.35374, saving model to dcnn_model.h5\n", + "35607/35607 [==============================] - 2s 65us/sample - loss: 33.3537 - mape: 33.3537 - mae: 4861.4824\n", + "\n", + " Prediction results:\n", + " store brand week round prediction\n", + "0 2 1 155 10 5501.0\n", + "1 2 1 156 10 9760.0\n", + "2 2 2 155 10 4968.0\n", + "3 2 2 156 10 6416.0\n", + "4 2 3 155 10 2555.0\n", + "\n", + "CPU times: user 6min 43s, sys: 25.5 s, total: 7min 9s\n", + "Wall time: 4min 35s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "# Model file name and log directory\n", + "model_file_name = \"dcnn_model.h5\"\n", + "log_dir = os.path.join(\"logs\", \"scalars\")\n", + "\n", + "# Remove log directory if it exists\n", + "if os.path.isdir(log_dir):\n", + " shutil.rmtree(log_dir)\n", + " print(\"Removed existing log directory {} \\n\".format(log_dir))\n", + "\n", + "# Train models and make predictions\n", + "pred_all = []\n", + "for r in range(1, N_SPLITS + 1):\n", + " print(\"---- Round \" + str(r) + \" ----\")\n", + " # Use offset to remove older data during retraining\n", + " offset = 0 if r == 1 else 40 + (r - 1) * HORIZON\n", + " # Create features\n", + " data_filled, data_scaled, train_end_week = create_features(r, TRAIN_DIR, HORIZON, offset)\n", + "\n", + " # Prepare input and output for model training\n", + " seq_in, cat_fea_in, train_output = prepare_training_io(data_filled, data_scaled, train_end_week)\n", + "\n", + " # Create and train model\n", + " if r == 1:\n", + " model = create_dcnn_model(\n", + " seq_len=SEQ_LEN,\n", + " n_dyn_fea=1 + len(DYNAMIC_FEATURES),\n", + " n_outputs=HORIZON,\n", + " n_dilated_layers=3,\n", + " kernel_size=2,\n", + " n_filters=3,\n", + " dropout_rate=DROPOUT_RATE,\n", + " max_cat_id=[MAX_STORE_ID, MAX_BRAND_ID],\n", + " )\n", + " adam = optimizers.Adam(lr=LEARNING_RATE)\n", + " model.compile(loss=\"mape\", optimizer=adam, metrics=[\"mape\", \"mae\"])\n", + " # Define checkpoint and fit model\n", + " checkpoint = ModelCheckpoint(model_file_name, monitor=\"loss\", save_best_only=True, mode=\"min\", verbose=1)\n", + " tensorboard_callback = tf.keras.callbacks.TensorBoard(\n", + " log_dir=os.path.join(log_dir, datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")), histogram_freq=1,\n", + " )\n", + " callbacks_list = [checkpoint, tensorboard_callback]\n", + " history = model.fit(\n", + " [seq_in, cat_fea_in],\n", + " train_output,\n", + " epochs=EPOCHS,\n", + " batch_size=BATCH_SIZE,\n", + " callbacks=callbacks_list,\n", + " verbose=1,\n", + " )\n", + " else:\n", + " model = load_model(model_file_name)\n", + " checkpoint = ModelCheckpoint(model_file_name, monitor=\"loss\", save_best_only=True, mode=\"min\", verbose=1)\n", + " callbacks_list = [checkpoint]\n", + " history = model.fit(\n", + " [seq_in, cat_fea_in], train_output, epochs=1, batch_size=BATCH_SIZE, callbacks=callbacks_list, verbose=1,\n", + " )\n", + "\n", + " # Prepare input for model testing\n", + " seq_in, cat_fea_in = prepare_testing_io(data_filled, data_scaled, train_end_week)\n", + "\n", + " # Make prediction\n", + " pred = np.round(model.predict([seq_in, cat_fea_in]))\n", + "\n", + " # Create dataframe for submission\n", + " exp_output = data_filled[data_filled.week >= train_end_week + GAP].reset_index(drop=True)\n", + " exp_output = exp_output[[\"store\", \"brand\", \"week\"]]\n", + " pred_df = (\n", + " exp_output.sort_values([\"store\", \"brand\", \"week\"]).loc[:, [\"store\", \"brand\", \"week\"]].reset_index(drop=True)\n", + " )\n", + " pred_df[\"round\"] = r\n", + " pred_df[\"prediction\"] = np.reshape(pred, (pred.size, 1))\n", + " pred_all.append(pred_df)\n", + "\n", + " # Show the current predictions\n", + " print(\"\\n Prediction results:\")\n", + " print(pred_df.head(5))\n", + " print(\"\")\n", + "\n", + "pred_all = pd.concat(pred_all, axis=0)\n", + "pred_all.rename(columns={\"move\": \"prediction\"}, inplace=True)\n", + "pred_all = pred_all[[\"round\", \"week\", \"store\", \"brand\", \"prediction\"]]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TensorBoard Monitor (Optional)\n", + "\n", + "We can monitor the model training process from TensorBoard. In the cell below, please switch `CHECK_TENSORBOARD` to True if you want to do so. Note that the following cell will try to find the path of the TensorBoard binary if it is not specified. In case the path can't be found, you can run `which tensorboard` (for Linux) or `where tensorboard` (for Windows) from a terminal where `forecasting_env` is activated to look for the path and replace the TensorBoard path in the second line of the code with the path that you find. \n", + "\n", + "To view the TensorBoard, you will need to forward port 6008 to your local machine via `ssh @ -L 6008:localhost:6008` if you're running this notebook in a remote VW. On the Tensorboard, you will see a dashboard similar to the following one:\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "CHECK_TENSORBOARD = False\n", + "tensorboard_path = \"\" # Replace this with the path you find from terminal\n", + "if CHECK_TENSORBOARD:\n", + " if not tensorboard_path:\n", + " # Try to find path of the TensorBoard binary\n", + " tensorboard_path = module_path(\"forecasting_env\", \"tensorboard\")\n", + " if tensorboard_path:\n", + " os.environ[\"TENSORBOARD_BINARY\"] = tensorboard_path\n", + " # Display TensorBoard\n", + " %tensorboard --logdir logs/scalars --port 6008\n", + " else:\n", + " print(\"Can't find TensorBoard binary. TensorBoard visualization is skipped.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Evaluation\n", + "\n", + "To evaluate the performance of the model, we compute MAPE of the forecasts from all the forecast rounds below." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/scrapbook.scrap.json+json": { + "data": 37.66172255231067, + "encoder": "json", + "name": "MAPE", + "version": 1 + } + }, + "metadata": { + "scrapbook": { + "data": true, + "display": false, + "name": "MAPE" + } + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of the predictions is 37.66172255231067\n" + ] + } + ], + "source": [ + "# Evaluate prediction accuracy\n", + "test_all = []\n", + "test_dir = os.path.join(DATA_DIR, \"test\")\n", + "for r in range(1, N_SPLITS + 1):\n", + " test_df = pd.read_csv(os.path.join(test_dir, \"test_\" + str(r) + \".csv\"))\n", + " test_all.append(test_df)\n", + "test_all = pd.concat(test_all, axis=0).reset_index(drop=True)\n", + "test_all[\"actual\"] = test_all[\"logmove\"].apply(lambda x: round(math.exp(x)))\n", + "test_all.drop(\"logmove\", axis=1, inplace=True)\n", + "combined = pd.merge(pred_all, test_all, on=[\"store\", \"brand\", \"week\"], how=\"left\")\n", + "metric_value = MAPE(combined[\"prediction\"], combined[\"actual\"]) * 100\n", + "sb.glue(\"MAPE\", metric_value)\n", + "print(\"MAPE of the predictions is {}\".format(metric_value))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Result Visualization\n", + "\n", + "Let's visually check the forecasts by plotting out the forecast results of a few sample store-brand combinations. Note that there could be gaps in the curve of actual sales due to missing sales data." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAARRCAYAAADQPHLpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdeXydZZn/8c+VPWnSNqcLS7dURTZpWVoEQQQrUlSkw6CIKDA4oKIjM44L+Bt+oOi4zYDiqPw6woAjmzAgOCrIYkH2FgrKqoW2dIE0TdpmaZM0yfX7475PepqeJCfJyXbO9/165ZWc+9nu58lzznme67nv6zZ3R0RERERERERkLCsY7QqIiIiIiIiIiPRHAQwRERERERERGfMUwBARERERERGRMU8BDBEREREREREZ8xTAEBEREREREZExTwEMERERERERERnzFMAQERkmZlZjZm5m1/covz6W1wzTdo+P6798ONafD8zs8ngMjx+FbU80s6vNbI2ZdcR6HDrS9cgmM9vbzG4ws/Vm1hn3afJo1ytf9PZZNMJ1cDNbNlrbH090rEREelc02hUQERkKM/MeRV3AFuBPwLXufuPI12p4xcDHauAGdz93VCuTZ+L59pC7Hz+Mm/ke8Gngf4H/BjqBN4dxeyPheuD9wM3AKsCB1tGskGSXma0BcPea0a2JiIjkMgUwRCRXfD3+Lgb2B5YAJ5jZEe7+xdGrVlqXAN8BNgzT+p8CDgQ2D9P6ZXh9CPiLu58y2hXJBjMrAU4E7nf3s0a7PjJqDgS2j3YlxgkdKxGRXiiAISI5wd0vT31tZouA+4B/NLOr3X3NaNQrHXd/A3hjGNe/HXh5uNYvw25f4OHRrkQW7U3osrpxtCsio8fd9ZmUIR0rEZHeKQeGiOQkd3+AcBNvwELYvR+4mb3dzG41s01m1pWa68DMEmb2bTN7ycx2mNk2M3vAzN6fbltmVmVmV8b+/a1m9rKZfZFePmP7yoFhZkfGem0wszYze8PMfm9mH43TLyd0HwE4J64n+XNunKfXHBhmtp+Z/Tyuv93MNsbX+6WZtzsPhJmdbmZPmdl2M2sws1vMbEZvxz/Nus5N1tHMFpvZsnhcvcd8B8Tjsy7uf62Z3WRm+6dZ515m9m9m9oqZtZjZ1vj39Wb2lnTb7qVu/fY3T64jvnxPj+N+ecp8H47nyhux/hvN7CEzuzCDY7QsbsN6bGNZyjwFZvYZM1tuZs1xv5eb2WfNbI/zLbm8hRwUP4v/987ejkXKciVm9nkz+62ZrY370mBm95vZyf3tS8p61gBr48vU8/X6HvOdaWZ/MLMt8T30kpn9i5mV9phvo5mtT7OdtXG9l/Yo/0As/0YGdTUzO8fMHjOzuliPdWZ2r5md0WPeE8xsqZm9aGaNFj4nnjezy8ysLM26U99LZ5rZ0/G9tNHCZ0dpnO+98f/VGI/Ff5vZlHTHNf5MMrP/iP/X1lifL5iZ9be/KeuqMLNLzOzZeD41m9njZnZmhssfH8/bOcCcHu+N61Pm2+N9lu3jEuedGY/Ja/G8rTezu81sYabHJK4n4/eyDeA7wzL4LEx3rGJ5kZldaGZPxGOx3cxWWnivpnv/D/rzSERkrFILDBHJZcmL+J55Mt4KPAn8BbgRKAcaAcxsDrAMqAH+CNwDTCA067/HzD7t7v/ZvYFwgf0AIUjyXFzfZOBS4D0DqqzZ+cBPCTkP7gb+CkwHFgAXAr+MdZsMXBS396uUVTzbz/oXAvcDVXH9LwIHAGcBp5rZIndfkWbRC4EPx2UeAt4JnAHMN7ND3b1tALt5OrAY+B1wDeE4J+u3GLiD0A3o14RcCTOB04APmtkJ7v5MnLcCeJTwv7wvzm+Em6hTgduB1wZQr/48S+imdBnhhvz6lGnLYp0uAP4fIV/FrwldeKYD84C/A37Szzauj+vquY01KfP8N/BxYB3wM8K5/Tdx3ccS/pc9JYAngGbC8e0CavupSwL4IfAY4fjWAfsApwC/NbPz3f1n/awD4AeE/3HP87X7XDWza4HzgPWxfluBo4ArgEVmdqK7d8TZHwTOMrMDkk+pzextwOw4fVFcLum98fcDGdT1W4TuXasJ77VtcZ8XAh8Bbk2Z96uE985jwG+AMuAY4HLgeDN7n7t3ptnGPwAnx+OwjJAX5J+AhJndBdwS17cUeBfwCWBqXKanEsL7eXJcrgT4W8L/bX/gc/3tsIVEqg8ChwHPANcRAq8nATeZ2cHu/i/9rGYN4b3xj/H1D1Km9fmZlCIrx8XMDgd+Tzh/7yWcT1MJXQofMbO/cfff9leZgbyXB/qdkaLXz8Je6pT8XDwJeAW4iZBH5gTgR4TP5U8OZh9ERMYVd9ePfvSjn3H7Q7iB8zTl7yPcqHUBc2JZTXJ+4F97Wd+yuMzHepRPJlyM7wD2Sin/Wlzf/wAFKeVzgYY47foe67o+lteklB0E7IzLHJymXjNT/q5Jt96U6cfH6ZenlBnwUiw/q8f8Z8Tyl3vsw+WxvBE4pMcyN8VpH83w/3RunL8LWJxmejUh+epm4KAe0w4m3Hw/k1J2SlzfVWnWVQJUpdn2uX2cQ8t6lCX3/fj+5k2Z9jTQBkxPM23qAM/pPbYBnBmnPQNUppRPAFbEaR9P9/4Afg4UDaAOpannXEr5JOD5eJ6WZ7iuXs/XlP/NHT3Xl/I/uCil7LxY9rmUsk/Hst/H41+RMm0lIZdASQb1rCcEUSrSTJva4/VbAEsz3xWxLmf0si/bgAN7HOcXCEHLeuA9KdMKCMEjBw7tsb41sfwRoDSlPAG8Gqcd19//gF2fRV/pUV5GuBHv6rntPo7fGmDNQM7rbB4XwkO5VYSb+vf02M6+hJxDb6Qerz7qmvF7mYF/Z5xLH5+FGRyrHwGFKeWFwLVx2qmD2Qf96Ec/+hlPP+pCIiI5ITZFvtzMvmVmtxMuvg34gbuv7TF7LbuSfqauYz6h1cT/uPstqdPcfSvhyXgZ4Sln0t8RLkS/4u5dKfOvBq4ewC58lnABfoW7v9Bzorvv0Wx+gN5FeGL8uPcYmcXdbyXcCO1PeIrf09Xu/uceZcknikcOsB53ufs9acrPJlzwX+buL/ao3wtxe4eZ2UE9ltvRc0Xu3u7uTQOsV7Z0EAJRu3H3bCRUPS/+vtjdm1PW3UJoEQDw92mWawe+5LtaMfTL3dvSnXPuvo3wlL6a2DVriC4iHLPz3L3n//IKws1raquSZEuKRSlli4BNhPdbCfEcjl0M5gOPuHt7hvXZSbhp3k3P/5+7v+buPVt2wa7WByf1sv6r3f2llPW0EVp2FAC/cfeHUqZ1Ab+IL+f3sr5LPKUFlLs3sKsFyt/1sgzQfXw+Aaxw9++lTnP3VsI5ZYQWP8MtG8flg4QWWT9KnT8us5Ewus/e7H7u9KXf9/IgvzOSevss3EPsHvJ5QmuKf/KU1j3x738mBqcHug8iIuONupCISK64LP52QhP0PxKGUf1Fmnmf8/TdHo6OvydZmvwRwLT4+0AIuS+AtwHr3P3VNPMvS6lXf46Kv3+X4fwDdXj8/WAv0x8k3Pgdxp4JJNN1K1kXf1cPsB5P9VKePPbzezn2b4+/DyR0fXmI8ET14ths/LeELiXPevqm+yPhRuDfgRfM7NZYx0fdvS5L6z+cECxblmbaQ4Qb78PSTFvj7psGujEzOxj4MnAcoStFz9wOGedA6WX9FYQb0M2EZLvpZmsjvt8A3H2tmb1GGGGogNhKhtCV4iHCDdsiQmuMEwg34L2d8z3dSOjK8IKZ3RbX93gM2vSs+wRC8OVvCOdmFbu6rEHvxybdeymZ3PTpNNOSIxXNTDOtg9CFpadl8Xe6cyHVQsLT+7T5cghduSDl+A+jbByX5GfInF72J5nn50DC50VfMn0vD+g7o4fePgvTeTswhdCt8F96ea/s6LGd4f48EhEZFQpgiEhOcPeMk9YRnmKlk0wKd2L86U1l/D0p/u4tn0Bv20lncvw9XEOrJuva2+gnyfLJaaZtTVOWfJpfOMB69Hfsz+9n+UoAd280s6MILWk+zK4n3pvN7CfAN919jyePw8ndrzSzzYScIV8g5ARwM3sI+LKnzy8yEJOAhnStCdy9I257eprlBnIeAhCP7YOE64QHCPlPGoldCgh5Rkp7XUFmqgk3/dPIPNBHrM/5hIDOzrj8A+7eZGbL2fWEfVHK/Jn4J0L3i/OAi+NPh5n9Fvhnd18F3bkIHiS0Pnqe0FKgjl1Pui+j92OzRzCEXe+lvqYVp5m2uZdgXfL/PSnNtFTJ99xC+m5NU9nHtGzJxnFJ7s9H+tlWv/szgPfyQL8zUg3kfZnczn70/V7p3s4IfB6JiIwKBTBEJB+la/oNuy6UL3L3TLp/JOffq5fpew+gTskgwQyGZwjUZF17q9M+PeYbLv0d+/nu/qeMVhS6OHzKwuPIgwgJGz8H/F9C0/PkiBTJrj17fOfFJIZZ4+4/B34e1/suwhP684B7zezAwbSESLGNkNSwuGdwxsyKCMkKG9NVaxDb+hdCctsT3H1Zj21dQghgDFXyf77S3Q/vc87dPUgIYLyP0D0mWZb8fYmZJQgBjG2EnCH9isGAHwI/NLPphBZJHyPcEB8cE1q2Efb9SOAGdz83dR1mtg8DC8YMxVQzK0wTxEi+x/t7LyenX+XuX8xu1UZFcn9Odfe7h7qyDN/LA/3O2G0TA5g3uZ073f20jDcwvJ9HIiKjQjkwRER2eSL+fncmM8c8C6uAGWb21jSzHD+IbWcyRGXyhmUgrR9Wxt/H9zI9WZ7Rzd4wGNCxT+XBC+7+I3Y9BV2SMsuW+HtWmsUXDHBzXWRw3N19q7v/1t3PJyRKTDCIfethJeF7+7g0046L9crW/+9thNYey9JMe082NhDzeLxACA4kBrDog4Sbv0WEoNVrMecMhNYWBYTRGPYjJEIccJcid9/k7ne4+0fj9t4KvCNOflv8/T9pFs3KsclQEeGmtKfj4++VaaaleopwPg/1vEzqZOAtsrJp0J8hfennvTws20zjZeLoPLEF0IAM0+eRiMioUABDRCSKTWr/CJxmZuelm8fMDolPZ5P+i/BZ+t3YJz8531xCs91M/ZTQLPrSNIkqMbPUvt5bCDdws3vO14dHCUPvHWtmp/dY9+mEG+C/EJJ5job/IlygX2ZmeyQGNbMCMzs+5fU7zKwmzXqSrWG2p5StINyofTzmXUiuI0FI7DcQ9aQPhGBmi2NLiJ6S58v2NNMG4rr4+9s99qMC+E58ee0Qt5G0htDaY15qoZl9it4TVA7GlYTEm9elaw1jZtUxx0m3+NT4BcKwpcexexeRxwijUHwtvs4o/4WZlZrZIuuRXCDeLCaDK8n/35r4+/ge874F+G4m28uib8ehnJN1SBBaz0B4T/UqHscbgQVmdmm6c9fM3ho/yzJRD0wzs/IM58+2uwhdgD5nZh9IN4OZHZ363ulNpu/lQX5nDFhMwPsjQku5q9MdYzPbJ/W7YwQ+j0RERoW6kIiI7O7jhJuea83sC8CThBvrmcA8wlPYowmjHkBIkraEkGX+GTO7l9D3/AxCMswPZ7JRd3/RzC4ErgFWmtldhIRtUwitBJoISQlx92YzexJ4t5ndSAg8dAJ399b9wt3dzM4hDD94a1z/y4SRR5bE9Z+dOpLKSHL3+hhIuRN4wsweINykdhECNUcTjkUykeT7gCvN7DHCfmwi/I9Ojct8P2Xdb8Tj9EngWTP7DTAR+ADhf9RfssNUDwAfM7NfE5ILdgAPu/vDwC1Aq5k9QrjJNcJTzoVx3vsHckx6cvebzOxU4KOExHy/IgSylhCG7f1lzxFmhuAHhEDFI2b2S0IT9gWEbhW3A6f3sWzG3P06MzuC0E//1fj+eZ0QNJhLCFD8F/CZHos+wK4WEd0BDHdvM7NHGXj+i3LC/2dNfG+tJZxrJxISI96dMkrGrwktr75oZocQWjrMBj4E/IaBBRaH4g1Cro3nzexuQj6I0wk3uT+J52R/Pk9oqfIN4JPx3K0lDDt6IOHcPRNY3esadnkgzn+PmT1MSMD6nLv/ekB7NUjuvtPMTgPuBX4TPxueJdyoz4p1ewvh+PR38z6Q9/JAvzMG6wpC0tvPAKeY2YOEnEnTCf/DY4D/Q0hyPNB9EBEZNxTAEBFJ4e7r4w3VPxCCEmcRmkW/Sbgw/BHw55T528zsfcDlhKDFRYSLxW8SbsYzCmDEdf2nmT0PfInwdHcJYYSGPwE/6zH7J4GrgMWEGwwD1sd5e1v/k2a2kPCE9n3AKXH9NxOGb30l07oOB3d/ID7x/xLh5vndhBwHGwk3CKlN9u8l3GQfRwhaTCTc0N0HXOnuPUdnOJ9wY3YmIU/G64RhN79PCAhk6iJ2dV/4AKH1zdcJgZCLY70Pj9NaCTfCXwV+mqWkomcSRhM4D/h0LHuJEEj7aRbWD4C732NmpxDOlTMIAbKnCEG0t5ClAEbc1ufM7HeEG7P3ERLJNhD+R99n15CZqR5g1//iD2mmLQJqPc2QxL1IDkV7AqFbRjKo9yphiONk6xfcvcXM3kto9XI84Tx9jXCDeSXheI2EdsLx+ldCro6psR7fIXxO9Ssmw30PcAHhRvxvCYGbWkIA9Z8I76lMfJPwvzuFcDNdCNxACPiMCHf/k4WhTb9ICCglh7l+gxBouozwmdefjN/LA/3OGMK+7TSzJYShb8+N+1dJSCC7mpDzJzWAORKfRyIiI8487TDmIiIiIjIWmdkaAHevGd2aiIiIjCzlwBARERERERGRMU8BDBEREREREREZ8xTAEBEREREREZExTzkwRERERERERGTMUwsMERERERERERnzFMAQERERERERkTFPAQwRERERERERGfMUwBARERERERGRMU8BDBEREREREREZ8xTAEBEREREREZExTwEMERERERERERnzFMAQERERERERkTFPAQwRERERERERGfMUwBARERERERGRMU8BDBEREREREREZ8xTAEBEREREREZExTwEMERERERERERnzFMAQkXHBzC43s1/k6/ZFRERkeJnZ9Wb2zXzdvsh4oACGSA4Z6ZtsMysxs9vNbI2ZuZkd32P6l83seTNrMrPVZvblHtP/YGZ1ZtZoZs+Z2akjVfdsyuA4mJl918zq48/3zMxGqboiIiKDNgavNfr8jjWzpWb2ipl1mdm5I1XvbDOz4+M+NKf8nDPa9RIZaQpgiEg3MysaxGKPAJ8A3ky3SuBsoBpYDHzezD6WMv0iYB93nwhcAPzCzPYZRB123+jg9mOo+joOFwBLgPnAPOBDwKdHrmoiIiJjwzBca/T3HfsccCHwzCC226tRutbY6O6VKT83jEIdREaVAhgi45CZfdXMNsSWDa+Y2SIzWwx8DTgjRuWfi/Pua2Z3m1mDma0ys/NT1nN5fKrxCzNrBM41swIzu9jMXo1PMn5pZol09XD3dnf/gbs/AnSmmf49d3/G3Tvc/RXgLuCYlOl/cveO5EugGJjVx66Xmdmtcb+fMbP5KfuyJh6XPwEtZlaUsh9NZvaimf1NyvznmtkjZvZvZrYlthA5OWX6XDN7KC57HzC1t0r1dxyAc4B/d/f17r4B+Hfg3D72U0REZFSNl2sN+vmOdfcfu/sDQGuGuz7VzO6L+/2Qmc1J2Rc3s8+Z2V+Bv8ayH5rZOgutSZ82s3f32PdfmtnP4/peMLMFKdMPi9czTWZ2K1CWYR1F8pYCGCLjjJntD3weWOjuVcBJwBp3vwf4V+DWGJVP3tzfDKwH9gVOB/7VzBalrPJU4HZgMnAj8AXCk4z3xGW2AD/OQr0NeDfwQo/y/zWzVuBJYBmwoo/VnArcBiSAm4BfmVlxyvQzgQ8Ck2Ng5NW4zUnA19mzhcc7gVcIwYnvAdemNDu9CXg6TruCcIE0WAcTngAlPRfLRERExpxxdq2R7e/Yswjf+1OBZwn1TbWEcP1wUHy9HDiUXdcmt5lZaiDiw8AthH2/G/gPCF1jgF8B/x2XvQ34237qNt3MauNDl6vMbMKg9lBkHFMAQ2T86QRKgYPMrNjd17j7q+lmNLNZwLHAV9291d2fBX4GfDJltsfd/Vfu3uXuOwjNLv9PfJLRBlwOnJ6FppKXEz5z/iu10N0/BFQBHwDudfeuPtbxtLvf7u47gSsJTyqOSpl+tbuvi/uBu9/m7hvjvt1KeFpyZMr8a939P929E7gB2AfYy8xmAwuBS929zd0fBn49+F2nEtiW8nobUJkSLBERERlLxtO1Rra/Y3/j7g/Hev0f4Oi4j0nfdveGlGuNX7h7fWxt+u+E47Z/yvyPuPtv47XGfxO6ukC4fikGfuDuO939dkIwpDcvEwIl+wDvBY4gXAuJ5BUFMETGGXdfBfwj4ct+k5ndYmb79jL7vkCDuzellK0FZqS8XtdjmTnAnWa21cy2Ai8RLmT2GmydzezzhFwYH4wXBLuJX9y/A04ysw/3sap1Kct0setpzx7T43bPNrNnU/blHezeFaS7L627b49/VsZ1bnH3lpR51/a1j/1oBiamvJ4INLu7D2GdIiIiw2KcXWtk+zs29VqjGWig72uNfzazl8xsW9yXSfRyrQFsJ3SHLYrr3NCjnr1ea7j7m+7+YgwCrQa+QmjtIpJXFMAQGYfc/SZ3P5ZwAeDAd5OTesy6EUiYWVVK2WxgQ+rqeiyzDjjZ3Sen/JTFfqUDZmbnARcDi9x9fT+zFwFv7WN69xMQMysAZhL2MclTps8B/pPQBHaKu08GnickFu3PG0B1j6aZszNYrjcvsOuJC/HvF3qZV0REZNSNo2uNbH/Hpl5rVBK6d/R2rfFu4KvAR4HqeK2xjcyvNWb0aCkykGsNz3A7IjlFAQyRccbM9jez95pZKSEh1Q52JbWqBWrizT3uvg54DPi2mZWZ2TzgU+zZnzPVNcC3kkmrzGya9TG8qZmVpvT1LInbsTjtLEJf2RPd/bUeyx1gZiebWbmZFZvZJ4DjgIf6qNsRZnZafHLxj0Ab8EQv804gfLnXxe39HaEFRr/cfS0hF8fXLQzfdixwSl/L9HUcgJ8DXzSzGfEJ1j8D12dSFxERkZE2nq416Oc7Nn6PlxFu9ovjsn3dA33AzI6NOSquAJ6M+5hOFdBBuNYoMrP/y+6tQfryeFz2CxYSj5/G7t1cd2NhGNXZFswCvkNIji6SVxTAEBl/SglfWpsJzRKnEzKCQ0gABVBvZsnhws4EaghPD+4ELnP3+/pY/w8JSaZ+b2ZNhADBO/uY/xXChc0M4N74dzJj9zeBKcBy2zVm+TVxmhGbphK++C8CznD3voY5uws4g5Ds65PAaTEfxh7c/UVCJvLHCRdbhwCP9rHunj5O2O8G4DLCBVJf+joO/4+QQ+PPhFYgv4llIiIiY9F4utbo7zv293H+dwFL49/H9bGtmwjf+w2EPBNn9THvvcDvgL8Qun+0smd3mbTcvR04jTBiyhbC9c0dfSxyOOGapoUQMHqekAxVJK+YumCLiIiIiIiIyFinFhgiIiIiIiIiMuYpgCEiIiIiIiIiY54CGCIiIiIiIiIy5imAISIiIiIiIiJjXtFoV2CkTZ061Wtqaka7GiIiIjnj6aef3uzu00a7HqNB1xUiIiLZ19u1Rd4FMGpqalixYsVoV0NERCRnmNna0a7DaNF1hYiISPb1dm2hLiQiIiIiIiIiMuYpgCEiIiIiIiIiY54CGCIiIiIiIiIy5uVdDgwREckvO3fuZP369bS2to52Vca9srIyZs6cSXFx8WhXZUzTOZc9OudERCSVAhgiIpLT1q9fT1VVFTU1NZjZaFdn3HJ36uvrWb9+PXPnzh3t6oxpOueyQ+eciIj0pC4kIiKS01pbW5kyZYpuJIfIzJgyZYpaFWRA51x26JwTEZGeFMAQEZGcpxvJ7NBxzJyOVXboOIqISCoFMERERERERERkzBvWAIaZ/ZOZvWBmz5vZzWZWZmZzzexJM/urmd1qZiVx3tL4elWcXpOynkti+StmdlJK+eJYtsrMLh7OfRERERkJy5Yt47HHHhvSOiorK7NUG8kHOudERGS8GLYknmY2A/gCcJC77zCzXwIfAz4AXOXut5jZNcCngJ/G31vc/W1m9jHgu8AZZnZQXO5gYF/gfjN7e9zMj4ETgfXAcjO7291fHK59ktzzq5Ub+P69r7Bx6w72nVzOl0/anyWHzRjtaonIKBrtz4Vly5ZRWVnJu971rhHbpowunXMiIuPDaH9ey/B3ISkCys2sCKgA3gDeC9wep98ALIl/nxpfE6cvstDx8VTgFndvc/fVwCrgyPizyt1fc/d24JY4r0hGfrVyA5fc8Wc2bN2BAxu27uCSO/7Mr1ZuGO2qicgoGc7PhSVLlnDEEUdw8MEHs3TpUgDuueceDj/8cObPn8+iRYtYs2YN11xzDVdddRWHHnoof/zjHzn33HO5/fbbu9eTfNLd3NzMokWLOPzwwznkkEO46667hlxHGXk650RExgfdO4wNw9YCw903mNm/Aa8DO4DfA08DW929I862HkiGrGYA6+KyHWa2DZgSy59IWXXqMut6lL9zGHZFctT3732FHTs7dyvbsbOT79/7iiKpIjnq679+gRc3NvY6feXrW2nv7NqtbMfOTr5y+5+4+anX0y5z0L4TueyUg/vd9nXXXUcikWDHjh0sXLiQU089lfPPP5+HH36YuXPn0tDQQCKR4DOf+QyVlZV86UtfAuDaa69Nu76ysjLuvPNOJk6cyObNmznqqKP48Ic/rKSHY4zOORGR3KB7h7FhOLuQVBNaRMwFtgK3ASenmdWTi/QyrbfydK1HPE0ZZnYBcAHA7Nmz+6y35I+NW3cMqFxEcl/PG8n+ygfi6quv5s477wRg3bp1LF26lOOOO465c+cCkEgkBrQ+d+drX/saDz/8MAUFBWzYsIHa2lr23nvvIddVRo7OORGR8UH3DmPDsAUwgPcBq929DsDM7gDeBUw2s6LYCmMmsDHOvx6YBayPXU4mAQ0p5Umpy/RWvht3XwosBViwYEHaIIfkn30nl7MhzQfOvpPLR6E2IjIS+ntqfcx3Hkz7uTBjcjm3fvroQW932bJl3H///Tz++ONUVFRw/PHHM3/+fF555ZV+lzQ5cgYAACAASURBVC0qKqKrK9zMujvt7e0A3HjjjdTV1fH0009TXFxMTU0Nra2tg66jDA+dcyIiuUH3DmPDcObAeB04yswqYi6LRcCLwB+A0+M85wDJDpR3x9fE6Q+6u8fyj8VRSuYC+wFPAcuB/eKoJiWERJ93D+P+SI758kn7U1q0+1ugvLiQL5+0/yjVSGTs+tXKDRzznQeZe/FvOOY7D+Zsf88vn7Q/5cWFu5Vl43Nh27ZtVFdXU1FRwcsvv8wTTzxBW1sbDz30EKtXrwagoaEBgKqqKpqamrqXramp4emnnwbgrrvuYufOnd3rnD59OsXFxfzhD39g7dq1Q6qjjA6dcyIi48OXT9qf4sLdOwfo3mHkDVsAw92fJCTjfAb4c9zWUuCrwBfNbBUhx0Wyo+W1wJRY/kXg4rieF4BfEoIf9wCfc/fO2ILj88C9wEvAL+O8IhlZctgMLjjuLd2v955YxrdPO0R92ER6yKekVUsOm8G3TzuEGZPLMcJT8Gx8LixevJiOjg7mzZvHpZdeylFHHcW0adNYunQpp512GvPnz+eMM84A4JRTTuHOO+/sTqh4/vnn89BDD3HkkUfy5JNPMmHCBADOOussVqxYwYIFC7jxxhs54IADhrr7Mgp0zomIjA9LDpvBe94+rfv1XhNLde8wCiw0csgfCxYs8BUrVox2NWSM+PVzG/mHm1cCcNtnjmZhzcD6A4vkg76auD968XtHoUYD89JLL3HggQeOdjVyRrrjaWZPu/uCUarSqEp3XaFzLrt0PEVkrLj4f/7ErSvW4Q5XfnQ+px0+c7SrlLN6u7YY7mFURca02sZdfXdfr98+ijURGbuUtEpEREQENje3s9/0SqrKili+ZstoVycvKYAheW1TUxslhQUUGLzeoACGSDq9JadS0ioRERHJJw0tbUytLGXBnGqWr2kY7erkJQUwJK/VNray96Qy9plUrgCGSC+U8FZEREQEGlramVJZyoKaBKs2NdPQ0j7aVco7CmBIXqttbGWviaXMTlQogCHSiyWHzeD8d8/tfp2tJIMiIiIi40l9cztTJpR05817eq26kYw0BTAkr21qbGP6xDIFMET6ccA+EwEoKjD++JUTFLwQERGRvNLW0UlTWweJCSXMmzmJksICVqgbyYhTAEPyWm1jK3tVlTF7SgV1TW3saO8c7SqJjEl1TW0AdHQ5W3fsHOXaiIiIiIysLS3h+icxoYSy4kLmzZzEUwpgjDgFMCRvNbXupKW9k70mljIrUQEokadIb5IBDIDNzW19zCkjobKyEoCNGzdy+umn9znvD37wA7ZvH9hn27Jly/jQhz406PpJ7tE5JyL5rr4lXP9MrSwBYEFNguc3bNMD0BGmAIbkrdrG8CG096Qy5iiAIdKn1ABG6t8564034D3vgTffHLFNdnYO/AJo33335fbbb+9znsHcTMoo0DknIjKm1TeHhJ2JCaUALKypZmen89z6raNZrbyjAIbkrU2NrQBMrwo5MEABDJHe1DW3UVlaFP7OhwDGFVfAI4+E31mwZs0aDjjgAM455xzmzZvH6aefzvbt26mpqeEb3/gGxx57LLfddhuvvvoqixcv5ogjjuDd7343L7/8MgCrV6/m6KOPZuHChVx66aW7rfcd73gHEG5Gv/SlL3HIIYcwb948fvSjH3H11VezceNGTjjhBE444QQAfv/733P00Udz+OGH85GPfITm5mYA7rnnHg444ACOPfZY7rjjjqzstwyAzrms7LeIyHBJjjiSmBBbYMwJiTyXr1Y3kpFUNNoVEBkttU0hgLHXxFImVxRTVVrEOgUwRNKqa2rjwH2qWL5my/gPYBx//J5lH/0oXHghbN8OixbBU09BVxdccw2sXAkXXADnngubN0PP5vPLlmW02VdeeYVrr72WY445hvPOO4+f/OQnAJSVlfHII48AsGjRIq655hr2228/nnzySS688EIefPBBLrroIj772c9y9tln8+Mf/zjt+pcuXcrq1atZuXIlRUVFNDQ0kEgkuPLKK/nDH/7A1KlT2bx5M9/85je5//77mTBhAt/97ne58sor+cpXvsL555/Pgw8+yNve9jbOOOOMDA+mZETnnM45ERn36mMAY0oMYEyqKGb/vapYrpFIRpRaYEjeSnYhmT6xDDNjVqKCtfUto1wrkbGprqmNuVMnUFpUQF2u58BYuxbcw9/u4XUWzJo1i2OOOQaAT3ziE903kMkbt+bmZh577DE+8pGPcOihh/LpT3+aN954A4BHH32UM888E4BPfvKTadd///3385nPfIaiovBsIpFI7DHPE088wYsvvsgxxxzDoYceyg033MDatWt5+eWXmTt3Lvvttx9mxic+8Yms7LNkSOeczjkRGfMaWtooLDAmlRd3ly2oqeaZtVvo7PJRrFl+UQsMyVu1ja1UlhZ1N4ufnajgr5uaRrlWImNPZ5dT39LO9KoyplaWsnm8t8Do6+n1tm2wZcvuN5NbtsDixeH11KkZP/3uyczSvp4wYQIAXV1dTJ48mWeffTaj5Xty94zmOfHEE7n55pt3K3/22Wf7XVaGQOeczjkRGffqm9upriihoGDXZ9eRcxPc+OTrvPxmIwfvO2kUa5c/1AJD8tamxjamTyztfj1nSgXrtuygSxFUkd1s2d5OZ5czraqUaVWlud0C44orQjP+VJ2dWclL8Prrr/P4448DcPPNN3PsscfuNn3ixInMnTuX2267DQg3fs899xwAxxxzDLfccgsAN954Y9r1v//97+eaa66ho6MDgIaG0Ce3qqqKpqYQnD3qqKN49NFHWbVqFQDbt2/nL3/5CwcccACrV6/m1Vdf7a6fjBCdc931ExEZy+pb2ru7jyQtqFEejJGmAIbkrdrGVvaqKut+PStRQXtHF5vG+9NlkSxL5rzoDmDk8nvk8cehvX33svZ2eOyxIa/6wAMP5IYbbmDevHk0NDTw2c9+do95brzxRq699lrmz5/PwQcfzF133QXAD3/4Q3784x+zcOFCtm3blnb9f//3f8/s2bOZN28e8+fP56abbgLgggsu4OSTT+aEE05g2rRpXH/99Zx55pnMmzePo446ipdffpmysjKWLl3KBz/4QY499ljmzJkz5P2VDOmc0zknIuNCQ0t7dwLPpBmTy9l3UpnyYIwgc8+vp80LFizwFStWjHY1ZAx49/ce5IjZ1fzgY4cB8PBf6jj7uqe49YKjeOdbpoxy7UTGjuR747bPHM2dKzdw7/Nv8vSlJ452tTL20ksvceCBB45qHdasWcOHPvQhnn/++VGtRzakO55m9rS7LxilKo2qdNcVOueyaywcTxGRE/5tGQfvO5H/+Pjhu5V/4eaVPLm6nicuWaSucVnU27WFWmBIXnJ3ahvb2GvirhYYGkpVJL3uFhiVpUyrLKVhezs7O7v6WUpEREQkd2xubtujCwnAwrkJahvbWNewYxRqlX8UwJC8tG3HTto7upieEsCYUV1OgaGhVEV6SOa8SHYhcd81FrpkpqamJieehMv4oXNORCR72ju6aGrtIDGhdI9pC2uqAVi+RnkwRoICGJKXkkOo7pWSxLO4sIB9J5erBYZID3VNbVSUFDKhtIiplaXdZeNJvnWXHC46jpnTscoOHUcRGQu2bA8PbqZU7tkC4+3Tq5hYVsSKtQpgjAQFMCQv1Ta2AuzWhQRCNxIFMER2V9fUxrSqELhI/h5PI5GUlZVRX1+vG6Ehcnfq6+spKyvrf+Y8p3MuO3TOichYUd8cAxhpupAUFBgLahI8pZFIRkTRaFdAZDR0BzCq9gxg3P9S7WhUSWTMqmtqY1pseTG9avy1wJg5cybr16+nrq5utKsy7pWVlTFz5szRrsaYp3Mue3TOichYUN8Srnt6jkKStKCmmgdf3kR9cxtTKvfsZiLZowCG5KXkUKnTJ+7+ATN7SgWbm9tpaetgQqneHiIQWlvsN70SYFx2ISkuLmbu3LmjXQ3JIzrnRERySzL3V7ouJAALaxIAPL12C+8/eO8Rq1c+UhcSyUu1ja1MKi+mrLhwt/LkSCTrtqgbiUjSpsbW7q4j5SWFVJUWjasAhoiIiMhQ7OpCkr51xbyZkygpKmDF2i0jWa28pACG5KXaxtbdEngmdQ+lWq8AhghA685OGls7uruQQMiDMZ5yYIiIiIgMRX1LG4UFxqTy4rTTS4sKmT9zkvJgjAAFMCQv1Ta27ZHAE1ICGErkKQKEMc9hV/JOCN1INqsFhoiIiOSJhpZ2qiuKKSiwXudZUJPg+Q3b2NHeOYI1yz8KYEhe2tTYyvSqPQMYkytKmFhWpACGSJTsKpIawFALDBEREckn9c3tvSbwTFpYU01Hl/Psuq0jVKv8pACG5J2uLmdTU1vaLiQQEnkqgCES9BrAUAsMERERyRMNLe295r9IOmJ2AjNYvkbdSIbTsAUwzGx/M3s25afRzP7RzBJmdp+Z/TX+ro7zm5ldbWarzOxPZnZ4yrrOifP/1czOSSk/wsz+HJe52sx6b9MjEjVsb6ejy9N2IYHQjUQBDJGgLk0XkmlVpTS1dtC6U00kRUREJPfVt7ST6GUEkqRJFcXsv1eVAhjDbNgCGO7+irsf6u6HAkcA24E7gYuBB9x9P+CB+BrgZGC/+HMB8FMAM0sAlwHvBI4ELksGPeI8F6Qst3i49kdyR21jK0CvLTBmJSpY37CDzi4fyWqJjEnJlhapTx2mjcOhVEVEREQGq765jSn9dCEBWFBTzTNrt9DR2TUCtcpPI9WFZBHwqruvBU4FbojlNwBL4t+nAj/34AlgspntA5wE3OfuDe6+BbgPWBynTXT3x93dgZ+nrEukV5saw03X9D5aYLR3dnUHOkTyWV1TG9UVxZQU7fq6mFoVvsA3Kw+GiIiI5LidnV00tnb024UEYGFNgpb2Tl5+s2kEapafRiqA8THg5vj3Xu7+BkD8PT2WzwDWpSyzPpb1Vb4+TblIn3a1wEgfwJiTmABoJBIRCAGM1O4jANMqy7qniYiIiOSyLS3tAP12IYEQwADlwRhOwx7AMLMS4MPAbf3NmqbMB1Gerg4XmNkKM1tRV1fXTzUk19XGFhjJZvA9aShVkV3qmtMEMOJrjUQiIiIiuW5zcwhgZNKFZN/J5cyYXM6KNVuGu1p5ayRaYJwMPOPutfF1bez+Qfy9KZavB2alLDcT2NhP+cw05Xtw96XuvsDdF0ybNm2IuyPjXW1TK1MmlOzWJD7VPpPLKCwwXq9XAEOkrqltj2DflPgEQi0wZDSYWaGZrTSz/42v55rZkzHR963xwQlmVhpfr4rTa1LWcUksf8XMTkopXxzLVpnZxT23LSIi+ach2QIjgwAGhOFUl69pIGQ5kGwbiQDGmezqPgJwN5AcSeQc4K6U8rPjaCRHAdtiF5N7gfebWXVM3vl+4N44rcnMjoqjj5ydsi6RXm1qbO01/wVAcWEB+04uUwsMyXvunrYLSXFhAYkJJQpgyGi5CHgp5fV3gaticvAtwKdi+aeALe7+NuCqOB9mdhCha+vBhOTfP4lBkULgx4QHLwcBZ8Z5RUQkj9W3hOudqRl0IQFYUJNgU1Ob7iWGybAGMMysAjgRuCOl+DvAiWb21zjtO7H8t8BrwCrgP4ELAdy9AbgCWB5/vhHLAD4L/Cwu8yrwu+HcH8kNtY1tvY5AkjQnMUEfOpL3mto6aOvo2iOAAaELlgIYMtLMbCbwQcJ3P/EBxnuB2+MsPZODJ5OG3w4sivOfCtzi7m3uvppwDXFk/Fnl7q+5eztwS5xXRETy2K4WGP0n8YTUPBjqRjIcioZz5e6+HZjSo6yeMCpJz3kd+Fwv67kOuC5N+QrgHVmprOSN2sZWDtpnYp/zzEpU8PsX3hyhGomMTckARboAxtSqEo1CIqPhB8BXgKr4egqw1d074uvUhN7dScDdvcPMtsX5ZwBPpKwzdZmeScPfme0dEBGR8aW+uZ0Cg8nlxRnNv9/0SiaVF7NiTQOnHzGz/wVkQEZqFBKRMaGjs4vNzf23wJidqKC+pZ3mto4+5xPJZd0BjMo9u1xNqyxVEk8ZUWb2IWCTuz+dWpxmVu9nmpKDi4hIxupb2qmuKKGgIN3XxJ4KCowFc6p5SiORDAsFMCSv1Le00+X0mQMDUkYiUSJPyWN9tcCYVhW6kChBlYygY4APm9kaQveO9xJaZEw2s2SL0tSE3t1JwOP0SUADA08avgclBxcRyR8NLW3dCcwztaAmwWt1LdTrYU/WKYAheaW2sRWAvfoJYMyZoqFURfoLYLTu7FIrJRkx7n6Ju8909xpCEs4H3f0s4A/A6XG2nsnBk0nDT4/zeyz/WBylZC6wH/AUIc/WfnFUk5K4jbtHYNdERGQMq29uz3gEkqSFNdUArFirPBjZpgCG5JXaxnBD1l8XklmxBcY6BTAkj9U1t1FUYGn7fCaDGkrkKWPAV4EvmtkqQo6La2P5tcCUWP5F4GIAd38B+CXwInAP8Dl374x5ND5PGP3sJeCXcV4REcljDS3tTMkwgWfSITMnUVJUwAp1I8m6YU3iKTLWZNoCY1J5MZPKi9UCQ/JaXVMbUytL0/b5TObFqGtq4y3TKke6apLn3H0ZsCz+/RphBJGe87QCH+ll+W8B30pT/lvCqGgiIiJA6II+0BYYpUWFHDpzMk9pJJKsUwsMySu1ja0UGEzJ4ENodqKCtQpgSB6ra2pL230EwigkAJub20eySiIiIiIjZmdnF9t27BxwDgyABTXVvLBhG9vb1d02mxTAkLxS29jK1MpSigr7P/VnT6lQFxLJa30FMKZVJruQtI5klURERERGzJaW8KAmk4efPS2sSdDR5Ty7bmu2q5XXFMCQvFLb2NZv95Gk2YkK1m/ZTmeXRlmQ/FTX3NYdqOipuqKEwgLTUKoiIiKSs+pjACMxwBwYAIfPqcYMlq9WN5JsUgBD8kptY+uAAhg7O503G/WEWfJPZ5dT39x7C4yCAmNqZYmSeIqIiEjOaki2wBhEF5JJ5cXsv1cVK9YqkWc2KYAheWVTU1u/I5AkzY4jkaytbxnOKomMSQ0t7XR5+iFUk6ZVlSqAISIiIjmrfghdSCB0I3lm7RY6OruyWa28pgCG5I22jk4aWtoH1AIDNJSq5KdkYKKvAMbUylIl8RQREZGcVR+7yg50FJKkhXMTtLR38vKbTdmsVl5TAEPyRvKGLNMWGPtMKqOowDSUquSlZG6LPltgVKoFhoiIiOSuhpZ2zGByxWBbYFQD8NRqdSPJFgUwJG/UNoYbrekZtsAoKixgRnU5rzfsGM5qiYxJ3S0wekniCSG4sbm5jS4luhUREZEcVN/STiImLh+MfSaVM2NyufJgZJECGJI3NsVknHtVZRbAgNCN5HXlwJA8lEkXkmlVpXR0OVt37BypaomIiIiMmIbm9kF3H0k6cm6C5Wu24K4HPtmgAIbkjdpkACPDLiQAsxIV6kIieamuqY2KkkImlBb1Ok8yuKFuJCIiIpKL6lvahhzAWFBTTV1TG2vrdU+RDQpgSN6obWqjuNCoHkAftjmJCrZs30ljq54wS36p62MI1aRk9xIFMERERCQX1be0D2oI1VQLaxIALF+jbiTZoACG5I3axlamV5VRMIA+bBqJRPJVXVNrn/kvAKbGAMfmZgUwREREJPc0tLQzZULmrbfTedu0SiaVF7NizZYs1Sq/KYAheWNTYxvTB9B9BEIXEoDX1eRL8kxdUwYtMNSFRERERHJUR2cXW7fvHHIXkoICY2FNNcuVyDMrFMCQvFHb2DqgBJ4As6fEAIZaYEieySSAUVVaRGlRQfeQqyIiIiK5omF7O8CQu5AALKhJ8Fpdi1qtZoECGJI3ahtbB5TAE2BiWTHVFcUKYEhead3ZSWNrR79dSMyMaVWlaoEhIiIiOaehJQQwhtoCA2BhTTWAupFkgQIYkhd2tIcbsukTB9YCA+JQqgpgSB5JPh3orwVGch4FMERERCTXNDTHFhhDzIEB8I4ZkygtKmCFEnkOmQIYkhc2NSWHUB14AENDqUq+SQYkMglgTK0sVXNIERERyTmbW7LXhaS0qJD5syZrJJIsUABD8kJtY7jBGmgXEggtMDZs2UFHZ1e2qyUyJg0kgKEWGCIiIpKLGuIDmmx0IYHQjeT5jY1sb+/IyvrylQIYkhdqGwffAmPOlAo6upw3trVmu1oiY1LdQLqQVJbSsL2dnQrwiYiISA5paGnHDKorshXASNDZ5Tz7+tasrC9fKYAheaE7gDHAUUhg11Cq69SNRPJEskVFJn0+p1WV4r4r0ZWIiIhILqhvaae6ooTCAsvK+g6fU40ZPKVuJEOiAIbkhU1NbZQWFTCxvGjAy85OaChVyS91TW1UVxRTUtT/V0SylYa6kYiIiEguqW9uz1r3EQijGx6w90SNRDJECmBIXghDqJZhNvAI6j6TyikuNNYqgCF5oq6pLaPuI6AAhoiIiOSmhpbsBjAg5MF45vUtyq03BMMawDCzyWZ2u5m9bGYvmdnRZpYws/vM7K/xd3Wc18zsajNbZWZ/MrPDU9ZzTpz/r2Z2Tkr5EWb257jM1TaYu1PJCyGAMbghkAoLjJnVGolE8kdd8wACGJWl3cuIiIiI5Ir6ljamZmEEklQLaxJsb+/kpTeasrrefDLcLTB+CNzj7gcA84GXgIuBB9x9P+CB+BrgZGC/+HMB8FMAM0sAlwHvBI4ELksGPeI8F6Qst3iY90fGqU2NbUwfRALPpFmJCuXAkLxR19TWHZjoz9RKtcAQERGR3DMcLTAW1ITbWOXBGLxhC2CY2UTgOOBaAHdvd/etwKnADXG2G4Al8e9TgZ978AQw2cz2AU4C7nP3BnffAtwHLI7TJrr74+7uwM9T1iWym9rG1kEl8EyanShXCwzJC+4+oC4k5SWFVJUWKYAhIiIiOaOjs4st23eSyCCh+UDsM6mcmdXlrFAAY9CGswXGW4A64L/MbKWZ/czMJgB7ufsbAPH39Dj/DGBdyvLrY1lf5evTlO/BzC4wsxVmtqKurm7oeybjSnNbBy3tnYPuQgIhkefW7TvZtmNnFmsmMvY0tXXQ1tGVcQADQh4MdSERERGRXLFle7jmn5LlFhgAR9YkWL5mC+EZvAzUcAYwioDDgZ+6+2FAC7u6i6STLn+FD6J8z0L3pe6+wN0XTJs2re9aS87pHkJ1CF1IZmsoVckTyZYUAwlgTK0qVQsMERERyRnJ4eGnZDkHBsCCmgSbm9tYU6/7isEYzgDGemC9uz8ZX99OCGjUxu4fxN+bUuaflbL8TGBjP+Uz05SL7CYZwJg+pBYYEwANpSq5rzuAUZl5wG9aVSmbFcAQERGRHFHfEq5rsp0DA8JIJADL1Y1kUIYtgOHubwLrzGz/WLQIeBG4G0iOJHIOcFf8+27g7DgayVHAttjF5F7g/WZWHZN3vh+4N05rMrOj4ugjZ6esS6TbpsbwATSUFhizEuWAAhiS+wbTAmNapbqQiIiISO6ob44tMLKcAwPgrdMqmVxRrDwYg1Q0zOv/B+BGMysBXgP+jhA0+aWZfQp4HfhInPe3wAeAVcD2OC/u3mBmVwDL43zfcPfkf/uzwPVAOfC7+COym2x0IakqKyYxoYS1auolOW5QAYyqUppaO2jd2UlZceFwVU1ERERkRAxnF5KCAmPBnAQr1mzJ+rrzwbAGMNz9WWBBmkmL0szrwOd6Wc91wHVpylcA7xhiNSXH1Ta2MaGkkMrSoZ3uGkpV8kFdcxtFBcbk8uKMl5mWMpTqrJgvRkRERGS8qm9pxwyqK7IfwIDQjeT+l2oHNPKbBMOZA0NkTKhtah1S64ukOYkKdSGRnFfX1MbUylIKCtLlSU4v+cWrbiQiIiKSCxpa2phcXkzhAK6HBmJBTQKAp9eqG8lAKYAhOW9TY+uQEngmzU5UsGHrDjo6u7JQK5GxaTBPAroDGErkKSIiIjmgvrl9WBJ4Jh0yYxKlRQUsVzeSAVMAQ3Lem43ZaYExO1FBZ5ezcWtrFmolMjYNJoAxNXYh2awWGCIiIpID6lvamVI5fF07SooKOHTWZI1EMggKYEhOc3dqG9uyEsBI9u1XNxLJZXXNbd05LTKVTHClFhgiIiKSCxpa2pkyjC0wABbWJHhhYyMtbR3Dup1cowCG5LRtO3bS3tHF9Cwkx5kzRQEMyW2dXU5988BbYBQXFpCYUKIAhoiIiOSE+ua2Ye1CArBwboLOLufZdVuHdTu5RgEMyWm1jeGGKhstMPaaWEZJYYECGJKzGlra6fKBDaGaNK2yVAEMERERGfc6u5ytO3YOewuMw2dPpsBQN5IBUgBDclptY8hXkY0ARmGBMbO6nNcbWoa8LpGxKBmAGFQAo6pUo5CIiIjIuLdlezvuDGsODICqsmIO2HuiAhgDpACG5LRdAYzsfADN0lCqksOSAYhBBzDUAkNERETGuYaWdoBh70ICsLCmmpWvb2WnRjnMmAIYktM2NWWvCwmEPBiv1yuAIbmpuwXGIJ44TK0sYXNzG+6e7WqJiIiIjJjkqGrD3YUEQh6M7e2dvPRG47BvK1cogCE5rbaxlUnlxZQVF2ZlfbMTFTS2drBt+86srE9kLBlqF5LWnV00K5O2iIiIjGPdLTAqhz+AsWBOAoCnVqsbSaYUwJCcVtvYmrXuI6ChVCW31TW1UVFSyITSogEvmwx6qBuJiIiIjGfJAMaUCcObAwNg70llzEqUs2LNlmHfVq5QAENyWm1jW9a6j0BogQGwVok8JQfVDWII1aRpleF9pgCGiIiIjGf1zSGAUV1RPCLbW1iTYMXaBnXDzZACGJLTNjW2Mr0qewEMtcCQXFbX1Dqo/BeQ0gJDI5GIiIjIOFbf0sbkimKKCkfmVnlhTYLNze2s3qwHpJlQAENyVleXs6mpLatdSCpLi5haWcI6BTAkB9U1DaEFhrqQiIiISA5oaGkfkQSeSQtrqgHUh4PodAAAIABJREFUjSRDCmBIzmrY3k5Hl2e1CwloKFXJXUMJYEwuL6awwLozd4uIiIiMR/XN7SOS/yLprdMqqa4oZvkaJfLMhAIYkrNqG1sBstoCA0IejLUaSlVyTOvOThpbOwbdhaSgwJhaWaIWGCIiIjKuNbS0kxjBFhhmxoKaBCvWqgVGJhTAkJy1qTHcSE3PcguM2YkKNm7dwc7OrqyuV2Q0JVtODLYFRnJZBTBERERkPKtvaR+RIVRTLaypZvXmFjY1tY7odscjBTAkZ+1qgZH9AEaXw8atO7K6XpHRlAw8DCmAUVmqJJ4iIiIybnV2OVu2tzN1BFtgAGxv7wTgyG89wDHfeZBfrdwwotsfTxTAkJxVG1tgDLZJfG9mayQSyUFZCWCoBYaIiIiMY1u3t+POiHYh+dXKDVzz0Kvdrzds3cEld/xZQYxeKIAhOau2qZUpE0ooKcruaT57SghgKA+G5JK6LHQhmVpZSn1zO11dGsdcRERExp/6lnYAEll+ANqX79/7Cq07d++avmNnJ9+/95URq8N4ogCG5KxNja1Zz38BsFdVGSVFBRpKVXJKsuXEULJuT6sqpaPL2bpjZ7aqJSIiIjJi6ptDAGMkh1HtrVu6uqunpwCG5Kzaxrasj0ACYbSFWdXl6kIiOaWuqY3qiuIhtVhKtt5QNxIREREZjxpiC4wpI5jEc9/J5QMqz3cKYEjOqm1sZa+q7LfAgJAHQwEMySV1TW1D6j4Cu/LNKIAhw8XMyszsKTN7zsxeMLOvx/K5Zvakmf3VzG41s5JYXhpfr4rTa1LWdUksf8XMTkopXxzLVpnZxSO9jyIiMnoaWsI1zEjmwPjySftTXly4W1l5cSFfPmn/EavDeKIAhuSkjs4uNjcPTwsMiAGM+u24q6+/5Ia65iwEMJItMJo1BJgMmzbgve4+HzgUWGxmRwHfBa5y9/2ALcCn4vyfAra4+9uAq+J8mNlBwMeAg4HFwE/MrNDMCoEfAycDBwFnxnlFRCQPbI5dSKorRi6AseSwGXz7tEOYMTk8eK0oKeTbpx3CksNmjFgdxhMFMCQn1be00+UMSw4MgFmJCpraOti6XX39JTfUNbUNecQedSGR4eZBc3xZHH8ceC9weyy/AVgS/z41viZOX2RmFstvcfc2d18NrAKOjD+r3P01d28HbonziohIHmhoaWdSeTHFhSN7m7zksBk8evEiTth/GjOryxW86IMCGJKTahvDE+C9himAMWfKBEBDqUpucPf/z96dx7dd34cff31ky/IhWb6dxEcIxE44cjihlHK0lCusMEjZaGn3G2zr1q2j+7VbxwrbHmMl7Q82+ujadb1b6LFulK4s0BYIKVfLfeVqEpyDkNiOLd+W5EOypM/vj+9XtuPItmxL1vcrvZ+Phx+2v/pK+thJlI/e3/eRkhIStysfV75j4uqFEOlgZkrsBrqBncBRYFBrHTFPaQfiO786oA3AvH0IqJx6fNp9Zjo+fQ0fV0q9rpR6vaenJ1U/mhBCiAzrHw4vaf+L6dbXl3GkO8hwKDL3yTkqrQEMpdQ7Sql9SqndSqnXzWMVSqmdZp3qTqVUuXlcKaX+3aw53auU2jTlcW41zz+slLp1yvHN5uMfMe+r0vnzCPvw+Y0rwOksIQEJYIjsEAhFCEViiw5gKKWo9rgkA0OkldY6qrXeCNRjZEycneg083OifYFewPHpa/i21vp8rfX51dXVyS1cCCGE5fUNh5Z0Asl0Gxq8xDTsP+nP2BqsbikyMN6vtd6otT7f/P4O4CmzTvUp83sw6k2bzI+PA98AI+AB3AW8G2Ojclc86GGe8/Ep97sm/T+OsIN0Z2A0VBhdgSWAIbJBPOCw2ABG/DEkgCGWgtZ6EHgWuBAoU0rlmzfVAyfNr9uBBgDzdi/QP/X4tPvMdFwIIUQO6AuGl7SB53Tr6soA2Ns+mLE1WF0mSkim1qNOr1P9oVnf+jLGZmQ5sAXYqbXu11oPYKSLXmPeVqq1fkkbnRR/OOWxRI7r9o/hUOmb4VxckE+V28WJPglgCPubCGC4Fx/wq3ZLAEOkj1KqWilVZn5dBFwJHASeAX7fPO1W4BHz60fN7zFvf9rcMzwK3GxOKVmFcRHkVeA1oMmcalKA0ejz0fT/ZEIIIazAKCFJTwZ3Mqo9LlZ4C9nTPpSxNVhd/tynLIoGnlRKaeBbWutvA7Va604ArXWnUqrGPHe+9ah15tfTjwuBzx+iyu0iP40NeBoriiQDQ2SFVGdgvH58YNGPI8QMlgM/MKeFOICHtNa/UEodAB5USn0e2AV8zzz/e8CPlFJHMDIvbgbQWu9XSj0EHAAiwG1a6yiAUuqTwA4gD7hfa71/6X48IYQQmRKLaQZGwhktIQGjD8Y+ycCYUVIBDKXUJUCT1voBpVQ14Da7ds/lYq31STNIsVMp9dZsT5Pg2KLrVMFotoVRakJjY+PsKxZZwRcYS1v5SNzKyhJePdaf1ucQYimkOoAxMBJmPBpb8g7ewl4WsrfQWu8FWhIcfxujzHT68THgphke6wvAFxIcfwx4LKkfQgghRNYYHB0npsloCQnAunovT+zvYmhkHG+xM6NrsaI5d5dKqbuAzwJ3moecwH8m8+Ba65Pm527gfzE2Fz6z/APzc7d5+nzrUdvNr6cfT7QOabaVY3z+UNoaeMY1VBTTOTRKOBJL6/MIkW49wRD5DkVZ0eL/k6xyu9DaSMEUYiaL2VsIIYQQ6dAXNC7oZDqAsaHe7IPRIVkYiSRzeeyDwPXAMEwEJTxz3UkpVaKU8sS/Bq4Gfsup9ajT61RvMaeRXAgMmaUmO4CrlVLlZvPOq4Ed5m0BpdSF5vSRW6Y8lshx3f4xatKcgdFYUUxMQ8fgaFqfR4h06wkYJVcOx+IHOcWzOKQPhpjDgvYWQgghRLr0mRdfqjLYAwNgXZ0XgL3SByOhZEpIwlprbfaxiAcjklEL/K852TQf+C+t9RNKqdeAh5RSHwNOMJna+RjwAeAIMAL8MYDWul8ptQ2jsRbA3VrreN7+J4DvA0XA4+aHyHHhSIy+4TC1nvQHMMCYRLKqKtl/FkJYT08glJLyEZAAhkjaQvcWQgghRFrEs0cznYHhLXZyRmWxTCKZQTIBjIeUUt/CmAryZ8CfAN+Z605mPeqGBMf7gCsSHNfAbTM81v3A/QmOvw6cN9daRG7pMdO/0l1CsrJyMoAhhJ31BEIs86Ym4FftlgCGSMqC9hZCCCFEusQzMDLdxBOMRp6vvSO99hKZM4Chtf6iUuoqwA+sAf5Ja70z7SsTYoF8/jGAtDfxrHa7cOU7aJMAhrC5nmBoIl1xsSYyMIISwBAzk72FEEIIq4n3wCi3RADDy6N7TtIdGKMmzVnldpPUFBJzUyEbC2ELviEjgFGT5gwMh0PRUFHM8b7htD6PEOkUjWn6gqkrISl05uFx5UsGhpiT7C2EEEJYSf9wGG+R0xJT1DY0GI0897UPccXZEsCYKpkpJAGllN/8GFNKRZVS/qVYnBALsVQZGGD0wTjRL008hX31D4eJ6dSMUI2r9rgkA0PMSvYWQgghrKZvOGyJ8hGAc1eU4lCwRxp5niaZEpJTuoIrpbaSYNa6EFbhCxgjISuK0/8C1FhRzKvH+tFaYzasFcJW4pkSqQxgVHlckoEhZiV7CyGEEFbTFwxlvIFnXHFBPk01HmnkmcC882O01tuBy9OwFiFSwucfo8aTmpGQc2msKCYYijAwMp725xIiHeKZEqnOwOiVAIaYB9lbCCGEyLT+4TCVbmsEMMDog7GvfQhj1oWImzMDQyl145RvHcD5gPwWhWV1+0PULEH5CEyOUj3eN2yZiK0Q8zGRgZHCmefVbhe/lgCGmIXsLYQQQlhN/3CYzSsrMr2MCevrvfz0jXY6BkepLy/O9HIsI5kmnr875esI8A5wQ1pWI0QK+PxjnFldsiTP1ThllGpLY/mSPKcQqZSOEpJqj4tAKMLYeJRCZ17KHldkFdlbiIzavquD+3a0cnJwlBVlRdy+ZQ1bW+oyvSwhRIbEYtrIwLDQBcn19UYjz73tQxLAmCKZHhh/vBQLESJVfP4x3nNW5ZI8V4P5YiKjVIVd9QRCFBfkUeJKaihVUuLZHD2BEA0V8h+uOJ3sLUQmbd/VwZ0P72N0PApAx+Aodz68D0CCGELkqMHRcWIaS2VUr13uwZmn2NM+yAfWLc/0cixjxh2rUuqrzJLOqbX+v2lZkRCLMBqO4h+LLMkEEoCigjxqPC5OSABD2FRPCkeoxsUfrycoAQxxKtlbCCu4b0frRPAibnQ8yn07WiWAIUSO6h82MlKt1APDlZ/H2mWl7JNJJKeY7ZLb60u2CiFSpDuwdCNU4xorijneJwEMYU89gbGU9r+AKQEM6YMhTid7C5FxJwcTjz+f6bgQIvv1BcMAVJakdk+0WOvrvTy6+ySxmF6SAQV2MGMAQ2v9g6VciBCp4PMbb5hqS5fuxaexopiX3+5bsucTIpV6AiGaaz1znzgPEsAQM5G9hbCCFWVFdCQIVqwoK8rAaoQQVtA/bAQwrFRCArChvowfv3KCY33DnFXtzvRyLGHOMapKqWql1BeVUo8ppZ6OfyzF4oSYL58/AxkYlcV0+scIRaJznyyExfQEUl9CUlFSgFISwBAzk72FyKTbt6yhIP/ULXCRM4/bt6zJ0IqEEJnWawYwrFRCArC+wQsgZSRTzBnAAH4MHARWAZ/D6BT+WhrXJMSCTQQwPEtbQqI1dAxI6qmwl7Fxo2dMqktInHkOyosL6A1KAEPMSPYWImO2ttRx3frJhnhV7gLuuXGd9L8QIof1myUk5cXWCmCsrnZT6HSwp30w00uxjGQCGJVa6+8B41rr57TWfwJcmOZ1CbEg3YEQrnwHpUWpm6gwl0azSeFxaeQpbCYeYEh1BgYYk0gkA0PMQvYWIqMKnXk484x68k9d0STBCyFyXP9wiNLC/NOyszItP8/BeSu87JUMjAnJ/AmNm587lVLXKqVagPo0rkmIBfP5x6gtLUSppWtyEw9gyChVYTfxAENaAhgeFz2SgSFmJnsLkVGtXQFaGsrxuPI55AtmejlCiAzrGw5TmeKM1FRZX1/G/pNDRKKxTC/FEpIJYHxeKeUFPgP8LfBd4K/TuiohFsgIYCzti0+1x0Wh08EJmUQibCbtAQzJwBAzk72FyBitNYe6AqxZ5mF1rZtDvkCmlySEyLC+YNhyDTzj1td7GRuPcbhbgq0w+xjVuFe01kPAEPD+NK9HiEXp9oc4e0Xpkj6nUorGimJOSAaGsJmedJaQmAEMrfWSZkQJ25C9hciYzqExAqEIzcs8hCMxdh70ZXpJQogM6x8Os7KyONPLSGh9vdHIc2/7IGcvX9r3OVaUTAbGi0qpJ5VSH1NKlad9RUIsgs8/tqQNPOMkgCHsKJ4hkY6Z59VuF6FIjEAokvLHFllB9hYiY1rNjIu1yzw01brpHw7TJyVvQuQ0o4TEmhkYZ1SW4CnMZ4/0wQCSCGBorZuAfwTOBd5QSv1CKfV/0r4yIeYpGIowHI4ueQkJQIMZwNBaL/lzC7FQPYEQ5cXOtDSsqvIYm4BeKSMRCcjeQmRSa5cRwGiu8dBc6wGQPhhC5LBYTDMwYt0SEodDsa7OK6NUTUntWrXWr2qt/wa4AOgHfpDWVQmxABMjVEszk4ExEo7SZ86QFsIOegKhtJSPAFS7CyeeQ4hEZG8hMuVQV4BlpYV4i5001boBONwtfTCEyFVDo+NEYzotGampsr6+jLe6/IQi0UwvJePmDGAopUqVUrcqpR4HXgQ6MTYbQlhKPIBRk4EMjHjNnJSRCDvpCaYxgGE+rkwiEYnI3kJkUqsvQPMyI/NiWWmhOYlEAhhC5Kr4BUirlpAAbKj3Mh7VHOyU16pkMjD2ABuBu7XWzVrrz2qt30jzuoSYt26/8UYpUxkYIKNUhb30BEJUp2lk2EQAQzIwRGKytxAZEY1pDncHWWsGMJRSNNW6pYREiBzWbwYwrFpCArC+oQwwGnnmumSmkJyppbBf2EAmS0jqy40AxnEZpSpsQmud1hKSsiIn+Q4lAQwxE9lbiIx4p2+YcCQ20fsCoLnWw479XTI1SYgcFW/ia+UAxgpvIZUlBeyVPhhJNfGUDYawBZ8/RElBHm5XMnG51Cp05lFb6pISEmEbgVCEUCSWtgCGw6GocrskgCESkr2FyJRDZgPPNVMCGE21HgZGxqWPlRA5Kv5vvypNWampoJRifb1XMjBIsomnEHbgC4xlJPsibmVFiQQwhG3EAwvpCmCAMYmkV3pgCCEspNUXQClYXeOeONZsNvKUPhhC5KZ4CUl5sXUzMMBo5HmkO8hwjo+oT6aJ58XJHBMi07r9Yxlp4BnXUFEsPTCEbUwEMNzpC/pVu13SxFMkJHsLkSmtXQHOqCyhqCBv4li8nOSw9MEQIif1D4fxFOanZax8Kq2v9xLTsP+kP9NLyahk/pS+muSxhJRSeUqpXUqpX5jfr1JKvaKUOqyU+olSqsA87jK/P2LefsaUx7jTPN6qlNoy5fg15rEjSqk7kl2TyE4+fyijGRiNFcV0+ccYG5fxRsL6liIDo9ojJSRiRovaWwixUK2+wETGRVyNx4WnUCaRCJGreoMhKi3c/yJufb008oRZmngqpd4DXARUK6X+ZspNpUBe4nsl9CngoHk/gH8B/k1r/aBS6pvAx4BvmJ8HtNarlVI3m+d9WCl1DnAzcC6wAviVUqrZfKyvAVcB7cBrSqlHtdYH5rE2kSW01vj8mS0haawsQmtoHxg9JTVVCCtaqgBGbzBMLKZxOKQxnkjp3kKIeRsbj/JO7zDXrVt+ynGlFM21HsnAECJH9Q+HqbRw/4u4ao+LFd5C9uR4I8/ZMjAKADdGkMMz5cMP/H4yD66UqgeuBb5rfq+Ay4H/MU/5AbDV/PoG83vM268wz78BeFBrHdJaHwOOYMyKvwA4orV+W2sdBh40zxU5yD9qNCSsSeObsbk0VpQAMkpV2ENPMES+Q1FW5Ezbc1S7XURjmoERaYwnJix6byHEQh3tCRLT0LzMc9ptzbVuDnUHkP6yQuSe/uGwpSeQTLW+vox9koGRmNb6OeA5pdT3tdbHlVIlWuvheT7+l4G/w9icAFQCg1rreOeRdqDO/LoOaDOfO6KUGjLPrwNenvKYU+/TNu34u+e5PpElfIHMjVCNa6wwRqlKI09hBz2BEFVuV1ozI6rMgGJv0B5XNkT6pWhvIcSCtJoTSNYmCGA01Xj475E2eoPhtGamCSGsp284zMaGskwvIynr6r08sb+LoZFxvMXpuwhlZcn0wFihlDqAUQaCUmqDUurrc91JKXUd0K21fmPq4QSn6jlum+/xRGv5uFLqdaXU6z09PbOsWtiVz5/5AEaVu4AiZx7H+ySAIayvJxBK+ya92gxaSB8MkcCC9hZCLEarL0BBnoOVlSWn3TbZyFP6YAiRS2IxbasMjA3xPhgduZuFkUwA48vAFqAPQGu9B3hvEve7GLheKfUORnnH5eZjlSml4pkf9cBJ8+t2oAHAvN0L9E89Pu0+Mx0/jdb621rr87XW51dXVyexdGE3Pr/xBqk2g1NIlFI0VhRLBoawhZ5AKO0lV/EASU9wLK3PI2xpoXsLIRbsUFeAM6tLcOadvv2VUapC5Cb/2DjRmLZNpui6Oi8Ae3O4D0ZSs2K01m3TDs05ZkFrfafWul5rfQZGE86ntdZ/ADzDZJ3rrcAj5tePmt9j3v60NgoRHwVuNqeUrAKagFeB14Amc6pJgfkcjybz84jsE8/AqPFkLgMDZJSqsI+e4BJkYHgkA0PMbCF7CyEW45AvmLB8BIzXq9LCfA51SyNPIXJJ37DRp8sOU0gAvMVOzqgszulJJDP2wJiiTSl1EaDNQMH/xUz5XKDPAg8qpT4P7AK+Zx7/HvAjpdQRjMyLmwG01vuVUg8BB4AIcJvWOgqglPoksAOjc/n9Wuv9i1iXsLFu/xilhfmnzHXPhJWVxbxwpBetNUYPWiGsJxrT9C1BAMPtyqfQ6ZAAhkgk1XsLIWblHxunY3CUP1jWmPD2yUkkkoEhxFTbd3Vw345WTg6OsqKsiNu3rGFrS93cd7SJfjOAYZcSEjAaeb72Tn+ml5ExyQQw/gL4CkbjzHbgSeC2+TyJ1vpZ4Fnz67cxJohMP2cMuGmG+38B+EKC448Bj81nLSI7dWV4hGpcY0Uxo+NReoKhjGeDCDGT/uEwMZ3eEapgvCGo9rgkgCESWfTeIltl+5uFTIkHJtbUJs7AAGiq9fDYvk65CCGEafuuDu58eB+j40aCXMfgKHc+vA8ga16X+oLGHqXSbacAhpdH95ykOzCWk+835iwh0Vr3aq3/QGtdq7Wu0Vr/H61131IsTohk+fwhywQwQEapCmuLBxSql6Des8rtojcoY1TFqWRvkVj8zULH4CiayTcL23d1ZHppttfaZZSGNM8SwGiudTM0Oi5BVyFM9+1onQhexI2OR7lvR2uGVpR6kyUk9uiBAUYGBsC+HO2DMWcGhlLq3xMcHgJe11o/kuA2IZZct3+MM8+qzPQyaJgySnXzyooMr0aIxHrMqw1LMSqw2u2SyTziNLK3SGy2NwvZcrUzUw75ApQU5FFfXjTjOROTSLqD1FjgoogQmXZycHRex+2o37zIUl5in5Gk59WV4lCwp32IK86uzfRyllwyTTwLgY3AYfNjPVABfEwp9eU0rk2IpMRimu6ANTIw6suLUApO9GXPC7vIPhMZGEsRwPC4JgImQkwhe4sEcuHNQqa81eWneZln1tKQJplEIsQpVpQlDvjNdNyO+obDeFz5uPIz20dvPooL8mmq8eRsI89kAhirgcu11l/VWn8VuBI4G/ggcHU6FydEMvpHwkRimtoleDM2l0JnHstKCzneP5zppQgxo3gAo2oJSkiqPS76h8OMR2Npfy5hK7K3SCAX3ixkgtaa1q7ArP0vwMgYKyt2csgnk0iEALh9yxqceacG/Yqcedy+ZU2GVpR6fcNhW/W/iFtf72Vv+xDG0M7ckkwAow4omfJ9CbDCnAQil9VExsVHqFohAwNklKqwvp5AiJKCPEpcyfRxXpx4lkef9MEQp5K9RQK3b1lDkfPUq4DZ9mYhE3qDYQZGxmftfwFG4+GmGrdMIhHCtLWljgvPnCzRLi92cs+N67KqpK1/OGSrCSRx6+u99A+H6cjBDL1kAhj/CuxWSj2glPo+xujTLyqlSoBfpXNxQiSj22/sda1Sr9pYUcwJCWAIC+tZghGqcfFGob1SRiJOJXuLBLa21HHPjesm/n1m45uFTGjtMgISa5fNHsAAYxLJIV8gJ69qCpGIfyzCpsYyXPkOfm9Tfda9HvUFw1TYqIFnXLyR594cbOQ5awBDGYWCTwIXAdvNj0u01t/VWg9rrW9fgjUKMavJDAxrvPisrCjG5w8xNq0RmxBW0RMYW7IARpX5PNLVX8TJ3mJ2W1vqePGOyyly5rG1pS7r3ixkQquZUdGcRACjucaNfyxCt7xmCUEoEuXgST/vOqOC8+q87GrLvp4LfcNhKm2YgbF2uQdnnmJPDvbBmDV/WGutlVLbtdabgZztCi6szedfuoaEyWisNCaRtA+MsLpm7s2SEEutJxBiTRIb+VSIZ2BIAEPEyd5ibs48B+vrvbx5fCDTS8kKh7oCVJYUJNX3Z2ISiS9omdJUITLlYGeAcDTGxoYyojHND18+TjgSoyA/mSR+69NaM2DTHhiu/DzWLivNyVGqyfzte1kp9a60r0SIBfIFxqgoKbBM9+D4KFUZHSmsqicQmggspFs8sCiTSMQ0sreYw+aV5ew/6ZdsvhRo9QXm7H8R12SeJ5NIhIA9ZsbFhoYyWhrLCUdivNXlz/CqUsc/GiES07bsgQFGH4x97UPEYrlV8pZMAOP9wEtKqaNKqb1KqX1Kqb3pXpgQyer2j1FjkewLMHpgANIHQ1jS2HgU/1hkyTKWCp15eArzJQNDTCd7izlsaiwnEtM5Wd+cSrGY5pAvkHTWWZW7gPJiJ4e7JYAhxO62QWo8LpZ7C9nYaPRc2HUie0oW+oaNvYkdMzAANtSXEQhFONaXW9MPk2lB/ztpX4UQi+Dzh1jmtU6aZ2VJASUFeRLAEJYUb6a5lCVX1R6XBDDEdLK3mMOmleUAvHligAtWVWR4NfbVMTjKSDiadADDmETikVGqQmBkYGxoKEMpxQpvITUeF7tODHDrRWdkemkp0TdsTEirtGETT4B19V4A9rYPcla1O8OrWTpzZmBorY9rrY8Do4Ce8iGEJfj8Y9R6rBPAUErJKFVhWfFAwlIGMKrcLikhEaeQvcXcKkoKWFVVIn0wFik+gSTZEhKAplq3TCIROW9oZJy3e4fZ2GBkXiilaGksy6pGnvER73YtIWmqcVPodORcpt6cAQyl1PVKqcPAMeA54B3g8TSvS4ikRKIxeoMhy0wgiWusKJYeGMKSJgIY7qUL+lV7XPRKBoaYQvYWydnUWM6bJwbkjfQiTEwgqU3+6mRzrYfAWGSiSbgQuSg+3SIewDC+Lud43wj9ZuaC3cV/DruWkOTnOThvhVcCGAlsAy4EDmmtVwFXAC+kdVVCJKlvOExMQ43FOoU3VhRzon9ENp3CcnoyUULilhIScZoF7S2UUg1KqWeUUgeVUvuVUp8yj1copXYqpQ6bn8vN40op9e9KqSNmr41NUx7rVvP8w0qpW6cc32z25Dhi3lel+odP1qaVZfQGw7T1j2ZqCbbX2hWgrqwIT6Ez6fs0mcEO6YMhctmetkGUmixTAGgx+2DsbsuOzLB+sweGXTMwANbXl7H/5BCRaCzTS1kyyQQwxrXWfYBDKeXQWj8DbEzzuoRIis8/BmC5UWeNlcWEIjF50yYsJ/53cimvNlR7XARCEUbDMk1BTFjo3iICfEZrfTZGAOQ2pdQ5wB3AU1qY46fPAAAgAElEQVTrJuAp83swem00mR8fB74BRsADuAt4N3ABcFc86GGe8/Ep97tmsT/sQm1qNJb0xon+TC3B9ubTwDOueWISifTBELlrd5vRV6F0SvBvfb0Xh8qeRp69wTAeV75lJhkuxPp6L2PjMQ53587rVTIBjEGllBv4NfBjpdRXMDYQQmRcPL3TiiUkIJNIhPX0BEJUlBTgzFu6Ge7xbI9e6YMhJi1ob6G17tRav2l+HQAOAnXADcAPzNN+AGw1v74B+KE2vAyUKaWWA1uAnVrrfq31ALATuMa8rVRr/ZI2Uuh+OOWxllxzrQe3K583j2fHm4WlNh6NcbQnOK/+F2D07akoKeCwjFIVOUprzZ72QTbUl51yvLggn7XLStmdJX0w+ofDVNi0fCRu/ZRGnrkimR3sDcAI8NfAE8BR4Lp0LkqIZFk2A8MMYEgfDGE1PYEQ1e6lDfjFAxjdkpEkJi16b6GUOgNoAV4BarXWnWAEOYAa87Q6oG3K3drNY7Mdb09wPCPyHIqNDWW8IY08F+RY7zDjUc2aZfPvzt9UYzTyFCIXtQ+M0hsMT4xOnWpjYxm7TwwSi9m/TLp/OGzr8hGAMypL8BTmsyeH+mAkE8D4J611TGsd0Vr/QGv978Bn070wIZLR7R/DoYzRpVZSV16EUpKBIaynJxha0v4XwETARDIwxBSL2luY2Rs/Az6ttfbPdmqCY3oBx6c//8eVUq8rpV7v6elJZskLtmllOW91+RkOSfLrfMUnkKypLZ33fZtq3Rz2BaWXlchJEw08608PYLQ0lBEIRTjaY/+Shb7hsOXeQ8yXw6FYV+eVDIxprkpwTOa3C0vw+UNUuV3kL2E6fDJc+XksLy2UUarCcnoCGQhgmM8nPWHEFAveWyilnBjBix9rrR82D/vM8g/Mz93m8XagYcrd64GTcxyvT3D8FFrrb2utz9dan19dXZ3MshdsU2MZMW001BPzc8gXIM+hOLO6ZN73ba71EAhF6DIzPYXIJbtPDFKQ72Dt8tPLr1rM3jzZ0AejLxiissRaZegLsb6+jNauAGPjudFrbMZ3fUqpTyil9gFrzM7d8Y9jwN6lW6IQM/MFxixXPhLXWFksGRjCUrTWGQlgVJQUoJQEMMTi9xbmRJDvAQe11l+actOjQHySyK3AI1OO32JOI7kQGDJLTHYAVyulys3mnVcDO8zbAkqpC83numXKY2VE/M3CmyekjGS+WrsCnFFZTKFz/g36mmqMN26HpZGnyEF72gc5b0Vpwn5ZZ1YZJQu7bB5U1VozMGL/HhgAG+q9jEc1b3XlRtlb/iy3/RfGTPZ7mOzmDRDQWks7bGEJPn+IujLrBTC27+pgb/sQI+EoF9/7NLdvWcPWloyVUQsBQCAUIRSJLXkPDGeeg4rigokRriKnLXZvcTHwh8A+pdRu89jfA/cCDymlPgacAG4yb3sM+ABwBKPnxh8DaK37lVLbgNfM8+6e8vyfAL4PFJlrfXyeP2NKeYucNNW4pQ/GArT6Apy3wjv3iQk0m6NUD/kCvLc5vVk2QljJeDTGvo4hPnrByoS3O8zePLtsHlT1j0UYj2rbl5DA5Kjbve2DbGw4vewn28wYwNBaDwFDwEeWbjlCzE+3f2xiJrVVbN/VwZ0P72PUTOPqGBzlzof3AUgQQ2RUPANiqTMw4s8pGRhisXsLrfXzJO5TAXBFgvM1cNsMj3U/cH+C468D5y1kfemyeWU5T+zvIhbTOBwz/fhiqpFwhBP9I9zYUj/3yQlUul1UlhRIBobIOYd8AcbGY2xomDn419JYzn88fZjhUIQS12zXw62rz7yoYvcmngB1ZUVUlhSwN0caeVqrcYAQ8xCOxOgbDlPrsVYGxn07WieCF3Gj41Hu29GaoRUJYch0AEOaeAqxMJsayxkcGeft3uFML8U2jnQH0ZoFTSCJa6p1c6g7N1KyhYiLj0htaSif8ZwWszePnd8w9w+HASNYaXdKKdbX504jTwlgCNuKp6PXllrrhefk4Oi8jguxVDIZwKhySwaGEAu1aaX0wZiv+ASS5trTmxAmq7nWwxGZRCJyzJ62QSpKCmioKJrxnPh0kl1t9n1N6osHMLIgAwOMRp5HuoM5MbFKAhjCtnxmZ3CrNfFcUZb4BX+m40IslYkARgauNsRLSOSNgBBJ6OyE970PuroAo2met8hp+5rzpdTaFcCV72Bl5SwTSKb9nqdrqnETCEXoHJJJJCJ37G4bZEO9F6OPcWLlJQWsqiqx9SSSeAZGNpSQAKyv9xLT8NsO+2bFJEsCGMK2us0ARo3FMjBu37KGomkdzwudDm7fsiZDKxLC0BMM4cxTeIucS/7c1W4XoUiMQA5cGRBi0bZtg+efNz5jNM1raSyTRp7z0OoL0FTrJm+2niHTfs/TNZnZG4d8UkYickMwFOFwd5ANSTSCbGkoY9eJQdtemMimHhhgZGAA7JMAxsIppQqVUq8qpfYopfYrpT5nHl+llHpFKXVYKfUTpVSBedxlfn/EvP2MKY91p3m8VSm1Zcrxa8xjR5RSd0xfg8huPn+8hMRaGRhbW+q458Z11E3JuPiTi1dJA0+RcT2BEFVuV0aaAMbLVqSMRIg5dHbC/fdDLAYPPDCRHbC5sZzD3UGGRsczvEB7OOQLzF4+0tkJ3/nOab/nqeL3P9ItjTxFbtjXPoTWJBXA2NhYRm8wRIdNS6T7hsO4XfkLGrNsRdUeFyu8heyxcV+SZKUzAyMEXK613gBsBK4xZ7D/C/BvWusmYAD4mHn+x4ABrfVq4N/M81BKnQPcDJwLXAN8XSmVp5TKA74G/A5wDvAR81yRI3z+MfIdiopi60VOt7bU8cIdl/Pbz20h36GwZ2xaZJueQCgj/S9AAhhCJG3bNgiZ/06i0YnsgE0ry9F6ssGemNngSBifP8Sa2QIY//RPEDEzwqb8nqeqKCmgyl0gGRgiZ8RfX+I9LmYTb/Jp1zKS/uFw1mRfxK3LkUaeaQtgaEM8ZO00PzRwOfA/5vEfAFvNr28wv8e8/QplFF/dADyotQ5prY9hzHK/wPw4orV+W2sdBh40zxU5wucPUePJzNXkZLld+bQ0lvH84d5ML0UII4CRoW7bVebzyiQSIWbR2WlkA8SFwxPZARsaynAoeFPKSOYUb+C5ZtkMAYzOTvjhDye/n/J7nq6pxsMhGaUqcsSetkFWVhZTnsQb+7XLPbjyHRLAsJD19WUc7xthaCS7M/XS2gPDzJTYDXQDO4GjwKDWOl4E3Q7E8+rrgDYA8/YhoHLq8Wn3mem4yBHdgTFqLFY+ksglq6v57ckhBsxmQUJkSk9QMjCEsLRt24yShqnM7AC3K581y0plEkkS4hkTMwYwtm2D6XX7M2RhNNe6zZGskkspst/utkE2JlE+AuDMc7C+3stum04i6Q2GqXJnVwBjg5k5s7fDnkGlZKU1gKG1jmqtNwL1GBkTZyc6zfyc6DK6XsDx0yilPq6Uel0p9XpPT8/cCxe24POPWW6EaiKXNFWhNbxwVLIwROZEY5q+DAYwyoqc5DuUBDCEmM1LLxnZAFOFw/DiiwBsXlnG7hODRGPyZno2rb4AnsJ8ls10keOll2B82hXKKb/nqVbXegiGIpyUSSQiy3UNjdHlH5t4E5yMjQ1l/Pakn1AkmsaVpUf/cCjrMjDW1XkB2JvlfTCWZAqJ1noQeBa4EChTSuWbN9UDJ82v24EGAPN2L9A/9fi0+8x0PNHzf1trfb7W+vzq6upU/EjCAnz+kOUaeCayod6LpzBfykhERvUPh4lpMhbAcDgUVW6XBDCEmM2uXUZmgNbwyU9CdbXxRnvXLgA2NZYTCEU43C09GWbT2hVgTa1n5jGQTz0Fhw9P/q47OyEYnPg9T9Vc4wZkEonIfhP9LxqTD2C0NJYTjsQ42Gmvfx9aa7OExPoXQufDW+zkjMpi9mR5r6R0TiGpVkqVmV8XAVcCB4FngN83T7sVeMT8+lHze8zbn9ZGvt6jwM3mlJJVQBPwKvAa0GRONSnAaPT5aLp+HmEtY+NRhkbHbRHAyM9z8J4zK/nN4V5JQbWbzk543/sS1kXbTTxwkKkeGGAET3qkB4YQybnrLjh+HPLzJw5tXmk0zXvzeHZvThdDa20EMGYqHwF46CFoajKCGPv2wfLl8MgjCU+dmEQifTBEltvTPogzT3HO8tKk79NiBjt22ay0LRCKMB7VVGZZBgYYfTCyfZRqOjMwlgPPKKX2YgQbdmqtfwF8FvgbpdQRjB4X3zPP/x5QaR7/G+AOAK31fuAh4ADwBHCbWZoSAT4J7MAIjDxknitygM9vpHLWZOhq8nxd2lxNx+Ao7/SNZHopYj62bYPnn09YF2038cBBpjIw4s8tGRhCJKmqCoqKTjnUWFFMZUkBb0gjzxn5/CH8Y5HZAxg7dkBjI6xeDeeeCzU18ItfJDy1vKSAKrdLMjBE1tt9YpCzl5fOa6zocm8RtaUu201H6gsapXqVWdYDA2B9vZfOoTG6A9lb9pbOKSR7tdYtWuv1WuvztNZ3m8ff1lpfoLVerbW+SWsdMo+Pmd+vNm9/e8pjfUFrfZbWeo3W+vEpxx/TWjebt30hXT+LsB6f33gTZIcMDIBLV1cB8Pxh6cFiG/FpALHYjN3p7WQiAyODAYwqd4FMIRFiPh5+GC67bGLcp1KKTSvLbXe1cym1moGG5plGqI6PGyUkW7aAUuBwwAc+AI8/PjlWdZrmWjeHuiUDQ2SvaEyzr2NoXv0v4loaym03iaR/2NiLZFsPDDAyMAD2tmVvFsaS9MAQItXiGRh2CWCsrCymvryI30gfDPvYtg1C5pvtGbrT20k8gFGV4RKS3mCYmDQgFCI5sRg89xy88MLEoU2N5bzdO0y/TLZKqLXLD8CamQIYL78MgYARwIi77joYHEzYxBOMYMgRX0DKQEXWOtoTJBiKJD2BZKqWxjJO9I/QZ6MLFBMZGFnWAwPgvLpSHAr2ZnEZiQQwhC1NBjDs8cKjlOLSpipeOtpHJBqb+w4is+LZF/HNajhs+yyMnkCIkoI8Slz5c5+cJtVuF9GYZmBE3ngJkZQtW8Dlgu3bJw7F+2BIFkZirV1Bajwuyme6srpjB+TlwRVXTB676ipwOuGXv0x4l6ZaN8PhKB2Do2lYsRCZFy8B2bCgAEb5KY9hB/EAcDaWkBQX5NNU42Fvu33+POZLAhjClroDIQryHXiLnJleStIuWV1NIBRhT5aPNsoK27adnkps8yyMngyOUI2r9hROrEUIkQSPB6680ghgmAHV9fVe8h1K+mDM4JBvjgaen/40PPYYlE15o1ZaCj/9qTH5JYGmGuPxDksjT5GldrcN4inM58yqknnfd12dlzyHslUZSZ8ZwMjGEhKAdfVe9rYPZW3WmAQwhC35/GPUlrpmHpFmQRedVYlSyDhVO3jppdMDGOHwjOnFdtATGLNAAMNlrkUCGEIkbetWeOcdY1oGUOjM45wVpbwpGRinicY0h7sDM/e/AKM56tVXn378hhugoSHhXZprjVGqMr5WZKs9bYNsqC/D4Zj/vrqoII+1yzzsarPPa1JfMExJQd68GpbayYZ6L/3DYdoHsjNrTAIYwpZ8/jFqPfbofxFXXlLAujovzx+RRp6Wt2sX/Oxn8O1vwyuvGMceftg4blM9gcxnYFSZqZrSyFOIefjd34XrrzeywEybGsvZ0zYkJYnTnOgfYWw8NnMGxrPPwpe+BGMJuvPHYnD//UZ2xjRlxQVUe1wckgyMnLB9VwcX3/s0q+74JRff+zTbd3VkeklpNRqO8lZXYEH9L+JaGsvY0zZE1CY9rvqHQ1RkYflIXLyRZ7aOU5UAhrClbn/INg08p7pkdRW7TgwSDCXudC4s5MYb4c/+DDZtMq7YPfRQple0KD2BENUZbOAJkoEhxILU1sIjj0BLy8ShTSvLGR033nSISa3m72PGBp4PPABf+ILR72I6hwPuuw++8pWEd22udXNYRqlmve27Orjz4X10DI6igY7BUe58eF9WBzH2nzQCDwvpfxG3saGcYCjC0R57BPn6hsNZ2cAzbu1yD848xZ4s7YMhAQxhSz7/GDU2aeA51SVNVURimpeP9mV6KWI2P/sZHD9ufJ2fbwQzfv5zGLVnKt7YeBT/WCTjGRhuVz6FTocEMIRYiLY26O8HJht5ShnJqQ6ZAYYms+TjFFrDk08aDTvzZkgbv+46I0sjcHqgoqnGw+HuoExRynL37WhldDx6yrHR8Sj37WjN0IrSb7KBp3fBj9HSaAQ/7NJcuC8YpjJL+18AuPLzWLusNGtHqUoAQ9hOMBRhOBy1ZQbG5pXlFDnzeP6I9MGwrMFB+OhH4ctfnjx2000wPAxPPJG5dS1CvGQj0wEMpRTVHpcEMISYrxMnoLER/vM/AVjhLaS21CWNPKdp9QVorCimuCDBtKW9e41JUlPHp0537bVGv6Nf/eq0m5prPYzIJJKsd3KGP9+ZjmeD3W2D1JUVUbOI0uxVlSV4i5y2aeTZPxzO2gaecevrvfy2Yygrg64SwBC2Y7cRqlO58vO4YFUFvz4sfTAs65FHjA3shz88eeyyy2xdRhIPGGQ6gAHGKFWZQiLEPDU2wrnnToxTVUqxeWW5ZGBM09o1ywSSHTuMz4kaeMZdfDF4vfCLX5x2U5M08swJK8qK5nU8G+xpH1xU9gWAw6HY2FBmi1GqWmsjgLGYHhidnfC+9xlBUYvaUF9GIBThWN9wppeSchLAELYzEcCwWRPPuEubqni7Zziro/m29uCDsHIlvPvdk8fy843gxZe+lLl1LcJEAMOd+X8zkoEhxAJt3Qq//jX0GSWImxrLaesfpTuQoCFlDgpFohzrHZ65/0VnJ2zcCHV1Mz+I0wnXXAMdp/c7aJZRqjnh9i1ryJ82iaPQ6eD2LWsytKL06guGaOsfXVQDz7iNDWW0+gKW7/MWCEUIR2NULaYHxrZt8PzzxmeLWldvBKX2ZmEfDAlgCNvp9htvfmpsWEICRh8MkHGqltTba6QOf/jDMH1E7/vfD8uXZ2Zdi9RjkRISgCq3i95gONPLWJRc61AvLGLrVmMSyS9/CRiNPAHePJ59m9OFeLtnmGhM0zxTBsa//Ru89trcD/SjHyUsF/QWO6mRSSRZb2tLHbWlLgryJt8i/eklq9jaMkvgy8biTR431C8+gNHSWIbWsNfiWRj95h5kwSUkzz8P3/jG5OQii2ZhNNW4KXQ62JOFfTAkgCFsJ56BscxrzwDGmloP1R4Xv5E+GNbz8stGo7ebb058+09+YnSpt5l4xkOlBUaGVXtc9A+HGbfp+Mdc7FAvLGLzZiN74H//F4BzV5RSkOeQMhLTrBNItFkDnp+gN8Z08Qkl+vS68eZaj5SQZLn2gRE6Bsf4zNXN/PZzWyjIczA6bs//r5Kx+8QgDjV5tX4x4lkcuywewOgbNgMYC90TffGLk1+PjcHv/75Remwx+XkOzlvhzcpRqhLAELbj84coKcjD7UpiI2JBSikuWV3FC0d6s7Kxjq1dd50RSd+4MfHtTz0Fd99tu2kkPYEQFSUFOPMy/5IfzwLps2kWRi52qBcWoZQRRP3GNwCjp9K6ei9vSiNPwGjg6cxTrKoqOf3Gv/1bo0FngqBEQv/wD0bvo2maat0c9skkkmy284APgKvPXYbblc9FqyvZecCHTvbvjs3sbh+iudaTuPHtPJUVF3BmVYnlG3n2mwGMBU0h6eyc7KcT98ILRvN3C1pX72X/ySEiNr1oNJPM72aFmCdfYMyWE0imumR1Ff3DYQ50+jO9FDFdVdXp5SNxH/oQBIO2m0bSEwhR7c58+QgwsQ679sHIxQ71wkIuvhiWLZv4dlNjGXs7hghHsmtzuhCHugKcWeWmID/B1vbnPzeCFzO9tk/n8Rj9Rk6ePOVwc62H0XGZRJLNdh7w0VTjngiEXXVOLSf6R7KydEhrzZ62wYkRqKmwsbGM3W0Dlg749AXjWakL2Bf94z8apSNT5edPjmbu6oI33ljkClNnQ30ZY+OxrPv7KwEMYTvd/jFqbDiBZKqJPhhSRmId3/ym0eciMEt6cHwayU9/umTLSoWeYMgS/S9gMgOjJ2jPxoO52KFeWMyPfjQx5nnzynLCkRj7T2ZfivB8tfoCiftfHDsGhw/PPj51uuuuMz4/9tgph5vNSSSHfFJGko0GR8K8cqyfq86pnZgysaXCeCO+84A1+xwsxjt9IwyNjqek/0VcS2M5vcEw7QPWDfL1LSYD4/HHTy8XiUTg0CHj63vugXe9C269FdrbF7nSxVtvlgbt67B2Vsx8SQBD2I7PH7J9BkZtaSHNtW5p5GklP/6x0cTTM0MDODCi7B/8oHE1z0ZlJD0B6wUwegP2LCG5fcsaXNOu8DoUWduhXljQE0/A5z8PkQibGo1Gnm/keBlJMBShfWCUNWaA4RTxdO/5BDDOPdeYRjVtnOpqcxJJtl3NFIZnWruJxjRXn7tsYspE1ZfvY2ND2URpSTbZ3Wa8bmxMYQZGiw36YPQPhykuyKPQmTf/O9fVwQUXGBldUz927TJuv/tu+Lu/MybaNTfDXXcZmbsZckZlCZ7CfPa0Z1eQWwIYwla01vj89i8hAbhkdTWvvtPP2LR6epEB7e1GV+kPf3jucz/0IeM/JQtE1pOhtbZUAKMqXkIStGcJydaWOuPqHKAAjyufmIbz6hbfAE2IpGzdaoxSffFFakoLqSsrsnzNebrFMyLWLCs9/cYdO6CxEdbMI8iolJGFsXOn0aTP5C1yUlvqkkaeWerJ/T5qPC7WO0bggQeMUoEHHuCGZQ72tA/RNWTPzMGZ7Gkborggj6aaWS7czNOaZR4KnQ52Wbi5cP9weGFNzY8fh9dfh9/7vZnP8Xrh3nvhrbfg+uuNgMYddyx8sYvkcCjW1XmzbpSqBDCErfhHI4QiMWos8mZsMS5tqiIcifHaO/2ZXoqIl4QkE8C48kqjvrGpKb1rSpFAyPg3Y5UeGIXOPDyF+bbtgQHGJKTz6ko5du+1PHv7ZRQ6HXzzuaOZXpbIFddcAwUF8MgjgFFGkuuTSA7NNoHkyivhr/86+f4XcR/9KHzmM6cEMMCcRCIZGFlnbDzKc4d6uOqcWhxf+PxkmUA0ygd/cT8AOw9mVxbGrrZB1tV5yXPM89/GLJx5DtbXlVk6qNobDFFRsoA9kTkBihtvnPvcVauMLIwXX5wMYOzfD888M//nXaT19WW0dgWy6oKpBDCErfgCxkYiGzIw3n1mBc48JWUkVvDgg7Bp0/yCEsGgJcdmTRcPFFglAwOMtdg1gDEwHOaN4wNcvtbIwqh0u7j5XY1s39Uhjf3E0vB4jDfl27eD1mxqLKNzaCynG8m2+gIUOfOoL0/Qi+a22+DTn57/g150kXH1tOzU9PqmGg9HumUSSbZ58WgvI+Eo11WryewLgHAY709+zKaCsawqIwlFohw86Z8YfZpKLY1lHDjpJxSx5hvm/uHwwvpfPPwwrF8Pq1cnf5/3vAfq642v770XLr8cbrhhsmfGEthQ72U8qnmrK3syxySAIWzF58+eAEZxQT6bGsv5jQQwMktr40rb3/5t8vfZuxdqak5r8GZFlgxguO0bwHjuUA8xDVesrZk49qeXrgLgu795O1PLErnmgx80GgoPDLB5ZQVATmdhtHYFaK5145h+JXn/fhhYxO9lbMwoI5kyUaG51s3oeNTSTQrF/D2534fblc+7/vM/YHz8lNtUNMrfv/k/vHS0l8DY+AyPYC8HOwOEo7G0BDA2NpQRjsY4cNKak/b6h8NULCSA8bWvwVe+svAn/s53jCafzzxj9Nn51KeMcsA0W2c28symMhIJYAhb8fmNNz21Np9CEndpUxUHOv302rQfQFZQyvhP5CMfSf4+55wDxcW2mEZiyQCGx2XbHhhPvdVNldvFuik9L+rLi7l+4woefLVtYr68EGn1sY/BK69ARQVrlxs157ncyPOQL8CaRBNIbr3VuNq5UD/6EVx9NRw4MHGoqTbeyDN7rmbmumhM86uDPi5bU03+yy9DdFrmQDjM2cd+y3hU82xrT2YWmWJ7zCabG9KSgWE0F7ZiGYnWmr7gAntgrFtnTKNbqMJCo5zk8GHjNfw//gO+/vVTzzGn39CVuqk3dWVFVJYUsKctexp5SgBD2Eo8A6PGY/8MDIBLmqoBeEHGqWbO9u0wNM8X9fx8owby0UctP41kIoBhkR4YYDTy7LVhBsZ4NMZzrd1cvrb6tCu9n3jfWYyOR/n+C8cytDqRU+L9HEZHceY52FBfxpsWfLOwFHqDIXqDYZqn97/o6YE334Srrlr4g3/gA8bnKdNIVteYo1SlkWfW2N02QG8wbEwf+X//zzj44ING5s3WrVBWRuGLL1BZUpA1ZSR72gap8bhY7k39fnqZt5Dl3kJLTiIJhiKEo7H5l5Dcd1/q+lfU1sI3vwl79hj9eQB+9Sujx8bddxtN5bdtS81zAUopajwuHtndwao7fsnF9z7N9l0dKXv8TJAAhrCVbv8YpYX5FBUsYPSRBa2r8+ItckofjEw5dMhIxX7ggfnf96abjD4Y8RF9FtUTDOHMU3iLnJleyoRqj4tAKMJo2Jr1sTN54/gA/rHIRP+LqZpqPVx9Ti3ff/EdgqFIBlYncs7//A9UVMCJE2xaWc7+jqGsatKWrIkGntMzMOKlH9dcs/AHr6uDlpZTAhjeIifLSgs5Io08s8aT+3048xSXramGzZuNXgUf/KBx49//PQwOkvetb3L52hqeae1mPBrL7IJTYHfbIBsaylDzbW6bpI0NZRNjWq0kniU5ryae/f3G34Mnn0ztYs47D9zm6Oevfc24MPbtb09Mv0lVFsb2XR0c7g4SiWk00DE4yp0P77N1EEMCGMJWfP5QVvS/iMtzKC46q5Lnj/SitTQEW3I/+YlxJfOmm+Z/3/e/HyorLV9G0iP2OqUAACAASURBVBMIUeV2nV4bnkHxcha7lU49/VY3BXkOLmmqSnj7X75/Nf6xCP/1yvElXpnISRs2GD0aHnmEzY3lRGKafR3ZkyKcrFbfDAGMHTuM1+hNmxb3BNddZ0wSmFKr3lTrlgyMLKG15skDPi48s5LSQqdxdfyznzUm/QC8611GFs+XvsSWM0sJjEV45W17T48bGhnn7d7htPS/iGtpLKOtf9Ry/a76zADGvDIwfv5ziESSmz6yUD/9Kbz3vZPNY6PRlGVh3Lejlci0psOj41H+5Ym3UvL4mSABDGErvsBYVgUwAC5pqqJzaIyjPcOZXkruefBBuPRS4yrbfOXnw3e/m9H53snoCYQs1f8CJgMY3Rbb2MzlqYM+3n1mBW5XfsLbNzaUcdFZlXz3N8cs231dZJGmJjj7bNi+nZZG441ILvbBOOQLUF7sPLVMTmvjaulVV0HeIjM2r7vOeFOxc+fEoeZamUSSLY72BDnWO2yUj3zrW0ZZ6XT/8A8wMsKlwx0UOh3sPJC6/gSZsMds5pjeAIbRB2O3xcpI+oJmAGM+PTAefhgaGuD889O0KoySt1dfnfw+HE5ZFsZME6o6h8bYePeTXPfV3/DnP3qdu39+gPufP8aO/V38tmOIoZHxOS+ubt/VwcX3Pr3kpSmJd2FCWFS3P8S7zyzJ9DJS6tLVRh+M5w/3TNTWiiXw298ajdm+9rWFP8bWralbT5r0BEJpqXFdjPgbDatdmZnNO73DHO0Z5g8vXDnreZ+47Cz+8Huv8vCbHXzkgsYlWp3IWVu3wr/+K5XhYVZVlfBmDgYwjAkkntNT4Z95ZvJq5mKcf77xxmLz5olDzbVuxsZjtA2MsLIyu/YkuWbHfqOnxdWNbvidO4ySo+n/t7/3vdDWhsvr5dJ3XmfnAR//fP25aSu/SLc9bYMoNTmdIh3OW+El36HYdWKAq845vewyU/qHjX1H0lNIAgEjm+sv/mKy91A6bNt2+utVPAtjMftUYEVZUcIx76WF+Vy7bjntA6Mc7Rnm14d6GZ1Whuh25VNXVkR9eRF15UXm18XUlRext32Qex47yOi4se54aQrA1pYFXBich7QFMJRSDcAPgWVADPi21vorSqkK4CfAGcA7wIe01gPKeBX4CvABYAT4I631m+Zj3Qr8o/nQn9da/8A8vhn4PlAEPAZ8SkseftaKxTTdWZiB0VhZTGNFMc8f6eWPLl6V6eXkjqeeAocDfu/3Fv84R47An/95ataVYj3BEOvTuElZiBozA8NOk0iefqsbIGH/i6kuWV3Fujov33ruKB86v4E8C5XuiCy0dasxlu+Xv6SlcR2/PtSD1tq2b6zmS2vNIV+QGzdN2ywrBWvXpuZJHA6jjGCKyUkkQQlg2NzOAz421Hup/eXDMDgIn/zk6ScpBV4vaM3v1sDOA2PsP+nnvDpr/d+arN1tg5xV7TZKZtKkqCCPtcs91svAmCghSTIz9ehRqKlZ/F5xLi+9ZGRdTBUOG+Vri3T7ljXc+fC+U4ITRc487r7hvFMCDVprBkbGaR8YoWNglI7BUdoHjI+OwVFee6cf/9jsPb5Gx6Pct6M17QGMdJaQRIDPaK3PBi4EblNKnQPcATyltW4CnjK/B/gdoMn8+DjwDQAz4HEX8G7gAuAupVS5eZ9vmOfG77eITk3C6gZGwoxHNbUWS4dPhUubqnj57f6saAxlG5/6FBw7ZtS7LsaDD8Lttxu16BYTjWn6gtYrIakoKUApbDWJ5Om3ummqcdNYWTzreUop/vKys3inb4TH9nUu0epEzjr/fPiXf4GLLmLzynJ6g2Ha+q09GSmVOgZHCYYip/e/uOceePzx1D2Rzwe33WaMrgWa4pNIZJSqrfn8Y+xuG+Sqs2vgq1+FjRvhootmvsMtt3DtX32UfB3lSZtOI9Fas6d9kA316SsfiWtpKGdP2yBRC5Va9QfDFDnzkh8GsHEjHD8OF1+c3oXt2mWUvsU/YjEjqPHmm4t+6K0tddxz4zrqyopQGGNV77lx3WlBBqUUFSUFrK8v43fWLedPLz2Tf77+XL576/k8/qlL2fvPW9j7z1fz+Kcu5bu3zFxOM1PJSiqlLYChte6MZ1BorQPAQaAOuAH4gXnaD4B4ntYNwA+14WWgTCm1HNgC7NRa92utB4CdwDXmbaVa65fMrIsfTnkskYV8fuPNTrZlYIARwAiGIpaLVGe9xhSk+N9002SKocX0D4eJaSwXwMjPc1BRXGCbDIzA2DivHOvj8rNrkjp/y7nLOLO6hK8/e1Sa84r0cjjg7/4OzjqLTWbN+Rsn7N1gcD7iAYQ1U0eoBoNw112pG3kIUFwM3/kO/OxnAHgKnSz3FnKkWyaR2Fl8JOoNgbdh3z4j+2K27KXrryfvyGE+0b/XtuNU2wdG6Q2G2di4BAGMxjKGw1EOW6jhbd9wOPn+F5GIUcahlPFau5T++7/hPe+BF15IycNtbanjhTsu59i91/LCHZcvOEOitNDJ2ctLufKcWurKihKes2KG46m0JH8aSqkzgBbgFaBWa90JRpADiO8I64C2KXdrN4/Ndrw9wXGRpXwB4wp3TRYGMN5zVhUOBb+RcapL43Ofg1tuMaLcixWfRvLQQ4t/rBSL95g4pbmdRVR7XLbpgfH84V7Go5or5igfiXM4FH/xvrM42OnnuUM9aV6dyHnj4/DIIzSfPILblc+bx3MnEN7aZQQQmqYGMJ591vidbNmSuifyeOCyy04Zp9pU65EMDJvbecDHGZXF1Duj8O53w0c+MvsdbrwR1qzhj579Lw6eHKKtf2RpFppCEw08lyADI94kdPcJ67wm9Q2Hk59A8thjRpP3gwfTu6hEtm419pb/+q9L/9xJun3LGoqcp2ayFDnzuH3LmrQ/d9oDGEopN/Az4NNaa/9spyY4phdwPNEaPq6Uel0p9XpPj2wm7arbbwQwakut92ZssbxFTtbXl/H8Yfn7mXZaw/33Q29vahoyOZ3GvPif/9xyZSTxDAerZWCAvQIYT73VjbfIyaZ5XLHaurGO5d5Cvv7s0TSuTAiM17RbbiHvG19nY0MZb57InUaerV1+lnsL8RZNqeXfscPImLjkktQ+2bXXGm9kjhr/pptr3BzpDloqPV4kLzA2zotHe7nqnFrUtdfCyy8bf29mk5cHd9xB5ZGDXPb267bMwth9YpCCfAdrl3vmPnmRVlWV4C1ysstCAYz+4VDyDTx/9jMIheCss9K7qESKi+Gv/srYWx44sPTPn4RkS1PSIa0BDKWUEyN48WOt9cPmYZ9Z/oH5uds83g40TLl7PXByjuP1CY6fRmv9ba31+Vrr86urqxf3Q4mM6Rqy7puxVLi0qYo97UP4x8YzvZTs9vLLcOIE3Hxz6h7zppugtNRo5mkhExkYFvw3U+22RwAjFtM881Y3l62pJj8v+f8yC/Id/OmlZ/LqsX7eOJ47Kf0iAwoKjDfXjz7K5joPBzv9DIdmb7SWLVp9wdP7X+zYYWRLuFL8unfddcbnX/4SMEaphiIxW16FF/DcoR7Go5qtdMPoPGr2/+APoLGRj7U+Y8sAxp72Qc5bUYpzHv+fLZRSipbGMna1WSeo2h8MU5lMVur4ODz6KFx/vfEamwm33QZFRfDFL2bm+ZOQqtKU+Urb315zqsj3gINa6y9NuelR4Fbz61uBR6Ycv0UZLgSGzBKTHcDVSqlys3nn1cAO87aAUupC87lumfJYIgv5AmNUlBTgyl/kTHeLumR1FdGY5qWjfZleSnb7yU+M/4xuuCF1j3nllUZQ5LzzUveYKRAPEFRZtISkNxiyfI+IPe2D9A2HuXxtcv0vpvrIBQ2UFzv5+jOShSHSbOtW6OnhsoGjxPRkmng2i0RjHO0Ontr/YmjI+JzK8pG4s84yAiPmqMOmWmnkaWdP7vdR61Kc87Gb4Y//OPk7Op3wxBO8+vmv8uo7/QyOhOe+j0WMR2Ps6xhiY0P53CdP19kJ73sfdHXN624tDeUc7g4SsMDFOa01vcmWkDzzjDGV5sYb07+wmVRVwZ/8iTHtLmT9Cz5LKZ3ht4uBPwQuV0rtNj8+ANwLXKWUOgxcZX4PxhjUt4EjwHeAvwTQWvcD24DXzI+7zWMAnwC+a97nKJDCltPCarr9YxPjF7NRS2M5xQV5PJ+tfTAW+J9fSkWjRq+KD3zAGImWKg6H8RGNGk2fLKInEKKkII8SV9omZi9YldtFKBIjYPErxU+/1U2eQ/G+5vln7xUX5PNHF63iqbe6eatrtgpKIRbpmmugoIBzXjEaV7553DpXPNPlnb4RwtEYzVMDGF4vHDpkXLlMh2eegU9/Gpjsu3FYGnnaTjgS45m3uvnU0F6Uzze/AAbA2Wdz+cYGiER4prV77vMt4pAvwNh4jA0NC9j/bNsG/5+98w5r6nzf+H0Swt5TZSmIKIqKA9wbd5UOR1tHtXXU0VatVlu7tL+vq61tXXW3tnXUOlqxTnBrVRQHICBLpuy9QpL398eTsGQEyALzuS4u4CQ55806533v53nu5/p1+t0AujuZgzHgUWJuw4+pYAqFYghFEvlKSI4fB4yMgJEjlT+wuli7FoiIUHxGWTNHmV1IrjPGOMZYV8ZYd+nPv4yxTMbYcMaYm/R3lvT+jDG2kDHmyhjzZIwFVdrXPsZYe+nP/krbgxhjXaSPWcQ0PZSnpUmk5pW2yA4kMnR1eOjjYoXrUS1UwGjkxU+hFBcD06cDc+Yoft8REYCDQxWTN3WTroEtVGXIxqXpZSQBT9LQ09kC5oaNSyGd2c8Zhrp8/Kz1wtCiTExNgeHDoffwPtxsjXFfg2rOlUXEc2kHksolJLJpIF+JmZqMAQUFMNbTQRszfW0GRjPkdmwm8ktFGHvlOODmBvj6Nngf3VKjcXPne4g8FaiEESoHWac7r4ZmYKSkUBceiQTYv79BgSiZWWiwBnjzZBVQtoxcAsZbbwGbN1MJhzqxsAD09Sk4pmE+a+pExT1htGhpPKl5JS3SwLMyA9pbIzajEInZLaymNiWFLnoSCRloqisLw9gY2LCBMjAUjYsLIBQCR48qft+NJD2/RCtgNIGU3GKEpeRheCPKR2SYG+riLW8nnHqUoq2V16Jc/vgDuHQJPZwscD8+W+PLs5pKRGo+eBzQ3pZKOVBWRufh3buVd1DGgO7dgQ8/BEBZGE9TtRkYzY3zoanomREL8wd3gQULGtUik9fRHabiEvQ8+DNKysRKGKXieZiQA0sjXThaNnBR/sEHFdmlYnGDAlFmhgK42hhphJFnZmEDymoHDVJOsKsxZGeT0LZli7pHojFoBQwtzQKRWIKMgpadgQGQkSeAlldG8sUX5XXDEAqBNWtUPwaRCLhwQXklHrJuJP/80zBDMCWSnq/NwGgKgeGUGjy8U+MFDAB4b6ALeByw86o2C0OLErGwADgOPZ0tkFNUhpiMQnWPSKlEPs9HWysj6Mva+N26BcTFUd24suA4wMODjDwlEnSwM0Z0urYTSXOCMYYLYal4J/MRdXp4553G7cjEBM9nzsWIiFt4dOa6QseoLB4m5KKbgxm4hnRgS0mhcgoZQmHDszAcLfAgIUftomqmvBkY/v5AUFDd91ElFhbkwfPDD1ovDClaAUNLsyCzUAgJA2xbuIDR3tYYdqZ6uNaSykju3AH27KGLHkBCxp49qs/CuHSJahmVWeIxeTJQUEAu+BpAen4pbDTQwBNA+bg0WsB4kgYnS0O42hg3aT+tzPTxeg8H/BmUiLR8bQqoFiWyaRPGffoeAOBeC/fBiEjNr+p/ce4clY4MG6bcA48fD6SmAvfuwU3aiSRem13VbHiclIvneSUQfvY5EBoKmMvfHrs6bb5YgSKBPgTfbVLgCJVDQakIkWn56ObYwOe7enVFAEpGA7MwvJzMkVkoREKWeoM7WYVyCBiMkYfO11+raFRysmIFkJwMHDyo7pFoBFoBQ4vGczI4CeO3kLq9+UIkTgYnqXlEyoPjOAxob4MbURktI6LDGGUlVKesDFi6VLVjOXIEMDEhsztlMXQoYGmpEWUkJWVi5JWINDYDw8xAAB0eh4wCzRQwioViXI/KwLCOtg2LVtXCvMGuEIkl2Hc9rumD06KlNhiD0cXz6CDM1oiac2VRUiZGXGYhOrSqJmD07atYg+aaGD2aSg78/csFFK0PRvPhfGgqBJBgWCc7oG3bJu1Lz84WN3wnoeu1M5DExCpmgEricWIuGEPDBYz791/cJhSSp5mceDlJfTDU3E41UypgWBnXIWDcu0dd5V5/XUWjkhNfX6BbN2qpWl1QegnRChhaNJqTwUlYdfxxeZQ2q1CIVccft2gRY6CbNXKKyhCarH7H5iazaxcpxjVx4oTqUuGEQkqBnDiRzJCUhUAAfP898N57yjuGnMiEAU0VMHg8DtbGehqbgXErJgOlIkmTy0dktLM2whjP1vjjv2fI04B2clpaKNL20NPTHrboDIyotAIwBnSUCRjp6bTQUkb71OpYWQH9+gH+/nCT+m881QoYzYaLIUkI/O1DWOzerpD9iT5agndf/xwP+UoWzpqIzMBTZqopF0VF9L1irOInPp7mOg0IBrnbmcBAwFe7D0ZmQSkMBHwY6tbRme3YMcrkeuUV1Q1MHjgOWL4cCAsDLl5U92jUjlbAaAIng5PQf30g2q08jf7rA1v0olpdbDoXgeJq5kjFZWJsOhehphEpn/7tqX73WnP3wXj2DPj4Y2DECFKLK18AT52iulNVqcgXLpAJ0tSpyj/WzJmUiaFmZMKApgoYAI0tXUMzMAKepMFIlw/vdpYK2+f7g12RXyrCb7eeKWyfLxscx+3jOC6N47iQStssOY67wHHcU+lvC+l2juO4nziOi+I47hHHcT0qPWam9P5POY6bWWl7T47jHksf8xOniPQbVeLuDnTsiCFhN/A0rQC5xS1TLJN1ICkvIRGJKKtPKuAonc8+A774AkZ6OrA3N0Ck1sizWRCXUYg2t67AMTmWuoYpgH79u+CamzfOP9HsdqoPE3LgbGUIC3k6cMhYvhzw8anqHeboCMyYQcGax4/l2o0OnwdPBzMEJ6hXwMgqFNZfPnLsGM3hrKxUNzB5mTyZ/HdGjFD3SNSOVsBoJLLMgKScYjAASTnFLT4zQB0k59RcL1fb9paAjYkeOrYyaf5GngEBlGa7ezcpx5UZPx7YsYPaU6nC1On0aTJBakSrtEbx8CFw+LBqjlUL5QKGseb6xtiYaGYGBmMMgeFpGOhmAz0dxbVj7GJvhkEdbLD/Rmyzca3XQH4BUD30txJAAGPMDUCA9H8AGAPATfozF8AOgAQPAF8C8AHgDeBLmeghvc/cSo9TYs2ZkvDzg8OjOzApLiiPurY0IlLzoavDQ1srQ9rQujWlVnt6qmYAo0eXiyVudsZ4mqYVMJoDF8JSMfO+P0St2yhM7DIzFMCnrQUcvvs/MizXUB4k5KB7Q8pHnj8H9u6lrjs61TIWNmwg75D58+UORHk5mSMsOVet177MQmHd5SPJyWRa+tprqhtUQxAIqIteI7rmtDS0r0AjeRkzA9RBG/OaWz3Vtr2lMNDNGveeZaNY2IwXObNnAzExddeYPnxIqbhJShb+tmwhh3rdBkQemnq8uXPV2rM7XcNLSAAy8tREAeNJSj5SckswTEHlI5VZMMQVGQVC/BmUoPB9vwwwxq4CyKq2eSKAX6V//wrAr9L2A4z4D4A5x3GtAYwCcIExlsUYywZwAcBo6W2mjLFbjOzyD1TaV/Nh8mSI3n0PhqJS3G+hZSQRz/PR3sYYOnweieDXr5O3kioJDQWOHEEHOxNtJ5JmQsiluxgcex86C96nxaCC8O3cCvrPkyH57jsgQ/OCT89zS/A8rwTdGlI+8v339J1aseLF26ysSDC8eRPYt0+u3Xk5WqBMzBCanCf/GBRMVqEQVnVlYNjbUznazJm130cT2LgRePdddY9CrWgFjEbyMmYGqIOPfTugev6ugYCP5aPc1TIeVTHAzQZCsQS3YzPVPZSGk5AAXL5Mf9eXgmdgQCmI06aRq7Wy4PMptVpVTJoE5OertRuJTBioM9qgZmxM9KjDkIZN/APDUwEAQ90VL2D4tLNEDydz7LwSgzKx1ohLQdgxxlIAQPpb9sbZA6isFCVKt9W1PbGG7S/AcdxcjuOCOI4LSk9PV8iTUBheXhDs/BkWbu1wv4UaeUam5sNd5n/x6BEwcCDwxx+qHcSOHcDs2XA304FQJMGzzJbdtra5k1FQiu7+ByHWEQBz5ih0374edtjuMwlccTHw448K3bciKPe/cJJTwMjKos/3lClA+/Y132fGDMpqzZRvnioz8lRnVlhmQSksjeoJ6ujrU3tdTSY/n1rZRry8QXOtgNFIassAMNbT0aYGKxBDfR0wABaGAnAA7M0NsO41T/h51TinbDF4t7WELp/X/MpIGKOJwSuvkOdEfXToAGzdSoLHunXKGdNHHzWo3ZdCGDZM7d1I0vNLYWmkCwFfgaf5lBRg8GCFtcC1NtaFWMKQXSRUyP4URUB4Gro5misle4XjOCwY0h5JOcXwf1SLwa0WRVGTfwVrxPYXNzK2izHWizHWy8bGpglDVBISCSaUxCMsJk3jBMKmkltchpTckgr/i7Nn6ffIkaodyPjxQFERvGIeAoDWB0PDCXyShj+6jUbKxh8AOzuF7tvBwhB6np3xX/fBlIGZq1km7A8TcyDgc/BobSrfA/bupZbwq1bVfh+Oo+/eJ5/ItUs7U320MdNXW3ckxljdJSTR0VSCduuWagfWGBYvpozi775T90jUhlbAaCTLR7nDQFC1NprPccgvFWHsj9dwM7qZLTw1EMYYtgZGwdnKEHc/G4HY9eNwY+WwFi9eAICBLh+92lrgelQz+xzt309ZB+vXk+eEPMycCbz1FvDVV8CNG4odT2EheXDU1glFWQgE1D72n3/UVkaSnl8KG2MFL8DXrqVUbQUJQjYm5M+hSUaeGQWleJCQg+EdFZ99IWNYR1t0sDPGjsvRLW5xqSZSpeUfkP6WueklAnCsdD8HAMn1bHeoYXvzIyAA76+chq6R91qcP4OsZal7K+oAgnPngK5dgTZtVDuQIUMAQ0M43gwEoO1EoumcD0tFcXt32H/0vlL27+thh//r5kfixXbFdDhRFA/ic9CptSn0BXJ6On34IX2v6vOUkXkxnDsn1/zNy8lCbZ1IioRilIoktZt4HjsGhISQn46mY2sLzJoF/PqrwgJKzQ2tgNFI/Lzsse41T9ibG5RnBnw3uRt+e9cbIgnDW7tvY/nRh8gu1KzIYnPiSmQ6Hifl4v3BrlTn+pIxwM0a4c/zkZavPh+FBpGYSC7wgwcD7zdggsBxlKro7EzZGIrE35/agKmi+0h1Jk0ic6uQkPrvqwTSC0oVm0EQHk5tcSUSEqoUcNGUjU+TfDAuR6SDMRIZlAWPx+H9Ia6ITC1AQLhmO9c3E/4BICtangng70rbZ0i7kfQBkCstMTkHYCTHcRZS886RAM5Jb8vnOK6PtPvIjEr7al4MHgyJiSlGRt5qce1UZR1I3FuZUpT4+nXVtE+tjr4+4OsLwZl/4WCuj8gWJhS1JIpKy9Bvx/8wQzcDymos5OthhxC79ni0YAUwZoxSjtEYxBKGx0m58vtfMEbRfXkzmoRCYMEC8mQorfta7uVkjqScYrXMa7Ok67FaPTCOHwd69qzbt02TWLaMPEq2bFH3SNTCy7cqVCB+Xva4MbMTYm9txI13PODnZY+BbjY499EgvD/EFSeCkzD8+ys4EZwIpopOCy0IWfZFazN9vNZDMa2umhsD21Na8o3mkIXBGDBvHp1M9+5tuEOyqSkQGAj89ptix3XkCKnpAwYodr/yMHw4kJYG9Oql+mNDmoGhSAFj06YKnxKhEFizpsm71EQBIzA8FXameujcRs5U20byStc2cLAwwPbLUdrrQwPgOO4QgFsA3DmOS+Q47l0A6wH4chz3FICv9H8A+BdADIAoALsBLAAAxlgWgLUA7kp/1ki3AcD7APZIHxMN4IwqnpfC0dUFN24sRkbfQXBcM7iGNIDI1HwY6+mgjZk+lR+WlalHwACAceOA58/Rh1+gzcDQYEIOnsLs2ycwrCxVacfo3MYU9uYG+Ml7EnXu0BCi0wtQUCqSrwNJSQng7Q2cOCH/AXR1gW3byI9h06Y67yobwwM1ZGFkFNThC5aYCNy+rbndR2qifXsyUvVrfj7TikArYDSVGlKqDXT5+GR0R/h/MADOVoZYcuQhZuy7ozV4agC3Y7MQ9Cwb8we7Qlfn5fyYdm5jCgtDAa41Bx8Mxqit3HffAa6ujduHszO16kpPB/79t+ljysuj/UyaRCaeqkZHp8IISsULVMaY4gSMx4+pm8zBgxXbxGLKxkhoWicNTRMwhCIJrkZmYFhHO6VF6WTo8HmYN8gFwfE5+C+melMNLbXBGHuTMdaaMSZgjDkwxvYyxjIZY8MZY27S31nS+zLG2ELGmCtjzJMxFlRpP/sYY+2lP/srbQ9ijHWRPmYRa8bqEufnB6vCHJRcVXBpnpqJeJ6PDnbG9B0dNQq4elU9IjVA5Y+ZmbDq3AEx6YUQaY15NRK9nTuQbWCKtgtnK+0YHMfB18MO16PSURIaDnzwAYn9akZmmtlNHgHjl1+AoCDAzKxhBxk9Gpg8GfjmGyAqqta7dbE3gw6PQ7AajDxlGRg1mnjKBJvXX1fhiBTA0qVA797qHoVaeDlXhooiJYVSqSUSaiNULaW6YytT/DW/H9ZO7Izg+ByM3HwV2y9HaZ3n5WBrYBSsjfUwpbdj/XduofB4HPq1t8b1pxmaH6Hl8chUaP78pu9r2TK6iDS19CI/n0pH3n676WNqLLGxQLduwKlTKj1sfqkIpSJJ0z0w/P2BPn2AiRNf7PUuFtP2JmCky4e+gFceGVE3d+OyUFAqUqr/RWUm9XKEtbEuL1e24AAAIABJREFUdlyJVsnxtLxkjBkDsY4Ane9dKZ+8N3cYY4io3IFEIKAOJHpqahdtZAQYGcHNzgRCsQTPsorUMw4ttSKKe4bOdwNx3/c1CIyNlHosXw87lJRJEHIjmFL7FZ1V2ggeJOTARF8HLtb1PHeRCNiwAfDxAYYObfiBNm+mbIyFC2sN2ugL+PBoY6oWI8/MukpIOnakcauyW52iiI4mIUPVbaTVjFbAaApr19abUs3ncZjety0uLh2Moe622Hg2Aq9sud5iW5spguD4bFyPysCcge3kNxxqoQxsb420/FLNNWFjjEw4jxxR3D43bSL1f+pU8q9oLPb2FE3w9lbY0BqMgwNlKfz5p0oPK8toaFIGxvbtJFB06kTvc02RJJGo8fsHRaxsTPQ0JgMj4Eka9HR46N/eWiXH0xfwMXtAO1yNTEdIkma51mtpAZia4skRf2we8LbanP8VTXp+KXKKyuBuZwI8e0aC97Nn6h3U5csYM+dVWBTlastINJDnm34CxwB+Q7y5Gol3O0uY6uvgsHkn8lNYv77J18mm8jAhB90czMHj1ZNVeOgQEBcHfPopeZM1lDZtgB9+AN54o867dXc0x6PEXIhVbGBd7oFRUwmJr6/iPdhURWQkiUeHD6t7JCpFK2A0Fln2hUzxkkiAPXtqNbZrZaaPn6f3xO4ZvZBbXIbXd9zE5ydDkFfycilm8rDtUhTMDQV4u4+zuoeidga40UJKY8tIfv8dOHCAvg+Kws6O9hkaSqpyY8jNBR4+VHnpxgvU0o3kZHAS+q8PRLuVp9F/fSBOBicp9LBNEjAkEmD5copGjBsHXLlC2TCMvfjz6BE9r9mzKdukEdgY62lEFxLGGALCU9HP1QoGuqoTTqf1cYaJng52XNZmYWhRPK7jh0Osq9digiYRUoGgQysTKhH8/nu1dXoqx9AQRsFBGBx7X9tKVQN5UszD8a4j0HtoD6UfS8DnYWhHWwRGpEO8chWVU/z1l9KPWxslZWKEP8+v3/9CIqFW9p6e1B64scyeDcyZU6cA4uVkjiKhuLybkKrILCiFvoAHQ12dqjeEhKhfBG0Ko0cDXboAGzeqf86rQrQCRmNZu/bFlOqyMpr014Gvhx0uLB2MmX3b4vfbz+D7/RWcDUnR/BIBFRGanIuLT9Iwu387GOvp1P+AFo6DhSHaWRvh+tN0dQ/lRVJSqNVW//5UPqJIRo4EVqwAdu4ETp5s+OOPHiUTrUePFDuuxjBpEpWznD8PgMSLVccfIymnGAxAUk4xVh1/rFARo0kCRlISlcQtXEh1oUb1pJ1GRdF71K8fiUYNRFMyMGIyCvEsswjDOtmp9Lim+gJM6+uMf0NSEJOuXfxoUSwGAh7WBh+F8UH1p7IrgvIOJHYm1LqxbVugQwf1DqpXL8DWFuMT7qt8Uaalbhhj+Np9DM589A2MVDSn9PWwQ1ahEPe8BlNpwv/+9+J6QUWEJFGmQ73+FxxHYuD33zfchL0mdu8GPvusxpu8HC0AQOXtVDMLhbCqyf9i+XIyXW+u6zCOo+cQEgKcPavu0agMrYDRWG7dqjml+vTpirKSWjDW08FXEzrj5IL+sDTSw/zf72POgXtIzilW0mCbD9svRcNYTwcz+7ZV91A0hgHtrXE7NgtCkQZ5pzBGfhfFxbTYVYZJ5tq1dFJujDnbkSNkJtq1q+LH1VCGDwcsLMrLSDadi0BxWdVzRHGZGJvORSjskOUCRkM8MPLy6H11dCQhYssW+d7XLl2Aa9fItHTQIOoK0AA0RcAIfELtTJXZPrU2ZvdvB10+DzuvxKj82FpaOByHgTH30f/iXy3CYDLieT6sjXVhpcejzlWjRjUu3V2R8HjAuHHo+zQIsSmqNyfUUjvxx/9FcmYBRnqoTpge3MEGunweLoSnAV9+SX4SasoSqjDwrMeUk+Mokj9ihGIO/PgxZXTcvfvCTc5WhrAwFKi8rC2rUAjL6v4XOTlAQAB1H1H3eaQpTJ1KJcsbN6rn+CkpwODBtVYhKAOtgNFYgoNfTKcODgb++0/uxVw3R3OcWtQfn47tiBtRGfD9/gr2XY+FWMKUnmKuiUSl5ePfkBTM6OsMM0OBuoejMQxws0aRUKxZKcDXr1NZxDffKC/6patLJ2Nra6ohlbeONC2NJrZTpmjGBUkgAL7+GpgwAQBqFSqTcooVtsBILyiFgM/BzEDO79HTp1Svu24d/e/g0LDXrnNn4OZNetyoUfTZkBMbY31kF5Wp3dw4IDwVHVuZwN7cQOXHtjHRw+RejjgenIjnuWpOh9fS4sgbPQ5dkyMRdT9c3UNpMpEyA89btyizTV3tU6szfjyMivJhHhzUIoSiFsHdu3B+Yzwmh1zEcBVm1pnoC9DX1Qrnw1LBpkwBfvyxoiOZinmQkAN7cwPYmujXfqdLlyjjNV+B2UNr1wKtWgHz5r0wd+M4Dt0dzcvFFVWRVSh80f/C35+y55tT+9Sa0NUFVq4EPDzUY+ZZQ0dOZaMVMBRJ9+4VvZ/lTKXW4fMwd5Arzi8ZhF5tLbHGPwxDNl3CJ8ceKTXFXBPZfjkaejo8vDugnbqHolH0dbUCn8fhuib5YAwcCFy4AHz0kfKPVVREkf2vvpLv/n/9RemaU6cqdVgNYvFiYPJkJOcU16kLDP/+Co7cjW9ytk16fimsjfXqN+0CgBs3gL59KRLRGOdxGY6OlIkxciT1J5cTaxOaUGQWqK9LQm5xGe7GZWN4J9VnX8iYO8gFEgbsuabNwtCiWCzfmgQAyD1yTM0jaRoSCUNkagE62JlQqZutLTBsmLqHRfj6ImXAcBSDh7hMbScSjWDbNhTpGSBxxCuKaSneAHw97PAss4gM2BkjkSAoqP4HKpiHiTn1Z1+sWUNt0nVrMLdsLGZmJNwEB5MheDW8nCzwNK0AucWqW2xnFtSQgXH8OJmPqtPsXVEsXAhs20ZBM1WSnEwekBIJeUOqKAtDK2Aog99+A7y8gDNn5H6Io6UhfpnVGz+96YWknGKUVlvAKDrFXNOIzyzC3w+S8baPM6ya2vqxhWGqL0B3R3Nci9IAAYMxID6e/h4xQjmlI9UxNKyoIw0MrP/+J09S54wuXZQ/tgaQExmDLSu2QMDjoKdT9dRrICDhzsxAgE+OPcbQby/j9/+eoVRUdzlabaTnl8o3YTt6lEpcLC0potm3b6OOV46lJbWM9fCgz4q/f711pbIyF3WWkVyNTIdYwjCso2r9LyrjaGmIV7q2xsE78chuIS0vtWgGdt7dEWftCPNzp9U9lCaRkF2E4jIx+V+8+SZNlM3qWZypChMTZBw6hvsOnbSdSDSB9HSww4fxl8cwDOzpovLD+0pLVi6EpVK5+dtvA598otIxZBaUIiGruG4Dz5s3qezz448V34r4jTeoLGX1aiC7agaxlxON6VGi6rIwMgtLq7ZQLS2lQNxrrynG90MTYIwyIeLiVHO89HSaN8qyPsRilWVhtJB3TMN4/XVy8p02rUHOthzHYUK3NrXO91uyR8aOK9HgcxzmDlL9haY5MKC9NR4n5iC3SM1da44cAdzcgNu3VXvcLVuoVGXaNCCjHiHn+HFamGtC+YiUIqEIQe98gE8PfI0D07phw+tdYW9uAA6AvbkB1r3WFZ+P98DfC/tj/6zesDXVw+qTIRi88TL234hFSVnDhIz0/NL6/S+ePaNJVa9eJF40IGtCLvz9gVdeqTGFtDIyoSW9QH2lE4HhabA00q3fqV3JvD+kPYqEYgzadOmlKh/Uolw4jsPjQWORyDNovkZ1qDDw7GBnTBs06BwPAO1tjWFTlI1nUdrvrNrZuxdcaSkO9BhXLiaoEjtTfXRzMMP5sFQSBpYtowDMf/+pbAwPpeJAN4c6rmv/+x+V6c6Zo/gBcBxlBBw7Rj5glegqHdMDFRl5FglFKCmTVA2Q6ukB0dFUetFSyMykoNSGDco/VkAABQplQU2AxDoVZWFoBQxlYGhIX1iRiBTI0oZFFtvUUoNtaqDT4IVMcyAltxjH7iViUi8H2JnWUaf3EjPQzRoSBtyMVmMWRloasGgRlUn16qXaYxsZUY/rzExg1qy6J+HGxuTJoCGUiSVY8Md9/OboDZPSIvg8vQc/L3vcWDkMsevH4cbKYfDzsgdAC42h7rY4/n4//P6uD5ysDPH1qTAM2HAJu6/GoEgonw9IekEdGRiy187ZmdoQXrwIWFkp4qlWZfx4ciHfvZtE3eKaBdhyAUNNGRhiCcOliDQMcbcBX56SGxlKMK16kpIHHgfkl4heqvJBLcon9aMVeHfMx0jTgJbFjUXW4cPjkj8J2omJah5RVQzSn+PulumwOnFE3UPRcuYMQjr2BDw84GJjrJYhjOzcCg8TcpCaV0JCvqUlCQYq4kF8Dngc4OlQS5bSgwfUeOCjj+rvNtZYXFwAX1/6u9JayMxAgPa2xghWkQ+GrET1hRISW1vA3l4lY1AJ1tbAjBnAL7/QnF1Z/P03va9C4YslKyrKwtAKGMqifXvg11+p5m3JkgY9dPkodxgIqqbm8zggt1iEwZsu4cCtuEanlmsiu67GQMwY5g92Vc8A1OCe21C6OZrDWE9HvWUkCxeSydP+/aopHalO9+7Apk1ARETtJ+b33gN+/12146oDiYThk78e4XJEOsZ8+DZNYI4erfdxHMdhgJs1/pzXF4fn9oF7K2P8379PMGDDJWy/HIWC0tqFDLGEIbM2AaOgAPDzo4sPQGVA+koSDTmOTF63bKGyEl9fICvrhbtZq7mEJDg+GzlFZRje0PIRJZhWbToXAUk1ba6llw9qUQ1eThQBffwoVs0jaTwRqQVwsDCAfuBFSklv00bdQ6qKvT2S27SDy+3L6h7JS0+u/zm86/uRSruPVKdKGYmxMbWdP3VKZe3dHyTmooOdCQx1a2kfa2REi92FC5U/mC1bqCtcUYU/jJejOYLjs8FUkBWWKS3LLC8hKS0lY/UGdk1rFnz8MT2/rVsVv2/Ze+XrC3z+OeDk9KJpqFBIpUlKRitgKBM/PzIeHDKkYQ/zsse61zyrpJh/P7k7Ds/tA2dLI3zxdyiGbrqMg7ebbvanbtLzS3HoTjz8utvD0VI9Ls3qcM9tKAI+D31crNRn5Hn0KJljfv01+Ruoi8WLKWpgV8Ok5NkzYO9ejYrKrTvzBMeDk7DMtwOm9nOlc8I//zSopVofFyv88V4fHHu/LzztzbDxbAQGbAjETwFPazTAyioUQsLwooAhE+r8/YHU1KY+NflZtIiyZ4KDgXv3XrhZX8CHqb4OMtRk4hkQngYdHoeBHazlf1BkJAl5EgmwYwcwdiydP/z9ydCqkROy2soEW3L5oBbV0MXeFB/dOowBvr3U1tKxqUQ8z0NHGyPg/HmaQGtg3XpC36HwjHqAspxcdQ/l5UUkQmBUBlINLdRSPiLDzdYYzlaGJGAANH9p375BpeWNhTGGhwk55V4TNQ/QjQKt5ioonezala6b33xTvqm7kzmyi8rwTAWmt1mFFCApz8C4eJHEpFoyQ5s17u7AxIkkYBQUKG6/hw8DPj60T0NDWg88fPhiR05ZV04lo3ln/5bGl18CkyfT3/K2gQRqTDHv42KFI/P64Pd3fWBnpo9PTzzGsO8u48+ghGbbtmvv9ViUiiRYMFRF2Re5ucDVq+SO/M47FM2XLUR27wZiNLcDwEA3a8RnFSFeHQ7nUVFAnz6k7KoTjqMTZ1ER8MUXQEFBecvhde98DQA433mQescoZeeVaOy+FouZfZ2xaJjUX2LyZMpiqaE3en30dLbEr7O98ffC/ujlbIHvL0RiwPpAfH8+AjlFFYt/WSZDFQ+M0FB6/yIiSECZO7dJz63BTJ4MxMZWpJJWu6ham+ipLQMj8EkavNtZwlS/HuduiYQmPAMH0o9Ees7lOIo2fPEFeX7Y21e0oy0oIPEvKqri/nVQW/lgbdu1aJEXPR0+8rt0h15xEdC7t0ZnHNaEUCRBTHoh+hcnkwCrKe1Tq1E6ajR0JSJknPBX91BeTp48ARwcEHv8DGxN9Or2f1AyHMfBt5MdbkVnUtakhQVdg195RenHjsssQm5xWe3Pf88emheoisGDac69aVP5cb0cKStMFe1UZSUksoxPHD8OmJpqThcjRbNiBWVKK+I9LiwEZs8m42QdHSAvr+n7VABKEzA4jtvHcVwax3EhlbZZchx3geO4p9LfFtLtHMdxP3EcF8Vx3COO43pUesxM6f2fchw3s9L2nhzHPZY+5ieO0zA3p+ocOECdSZr4xstSy4+/3w/7Z/WGpZEuVvz1CCO+v4ITwYkQV88/1mByioT47VYcxnm2hquiaxQZo0iorK/1uXOAqyspzYMHU83fmTO06JAtLMrKqHvFqlXUok3DGOBGEeJrUemqP/iqVST86NSSiqhqHjwAvvkGz956F6uOP0ZSTjHGP7mKB63d8OGdPLV7Bvx1LxHrzoRjfNfW+PKVzig/PQ0bRp/LgQMbve9ujubYM7M3Tn8wAAPcrPFTYBT6rw/EhrPh+P2/OEzfSwarn/8dQq9DfDzQvz+l9V29Cowbp4in2HBspS1K/f2pLvbWrfKbbIzVI2AkZBUhIjUfwzrW0T61tBTYt498VSZMICEmO5teT4DOH0Ih8PQptZH96aeKxdX9+yTeuLnR5FV27omouSREVj5oU5CFIwdXwqYgGzwO+Ni3g4KfuZaXEYHvcAh5fLCQEI3OOKyJ2IxCiCQMPhF3aMPIkeodUC1Y+g5Frp4RRP+cUvdQXk62bQPLzsaxIhP4etjJ10pcifh62EEoluBKhHTexuNRMNPfX6mlyw8SqOtH95oyMOLjgfffB37+WSnHrpWNG0k0mD8fkEjQwc4Yhrp8BMdn1//YJiIrIbE00qXX/++/SUhSdOcVTaFvXyAhgTImmkJwMNCzJ3lqrF5Nc0gNKd1TZgbGLwBGV9u2EkAAY8wNQID0fwAYA8BN+jMXwA6ABA8AXwLwAeAN4EuZ6CG9z9xKj6t+LM2ibVtShuszIJQTmdnf3wv7Y/eMXjDQ1cGSIw8xcvMVnHqYDEkzEDJ+uRmHQqEYC4fK0f2gPp+KvDzqkLFqFbVtatWKIqH//ku329mRgPTNN2RalJxMi+B//qlYiABkPrNhA71fn33W5OeoSFysjdDGTF+1ZSRnzlD/ckD1vaXrol8/YPVqOJ/6E74PA9A2KwmeqdHw7zhQ7Z4BgeGp+OTYIwxob43vJnerOoESCOizqQA6tzHDjmk9ce6jQRjWyQ47Lkdj9cnQ8gt1RoGQDCAzePS9uH0b6NGjnr2qAA8Pan04fDjg74+TwUl4lJiDO3FZKu+6cSmCvFSGd6ojzfj334F33yWvkIMHyZy0ul4uFgObNwMDBlCacM+etL1PHyqb2b2bOuiUlQG7dlV4gZw4QdHwefOAn3+GnzARG8a2x6qgo+idEIplt49AwoDYLDVkXWlpcXibAnzGwAFUbteMsjDCn1Pwx2hAXzqftW6t5hHVjGsbCyzyW4lzk95X91BePvLygF9/xfMxE5EkMFFr+YiMns4WsDTSxYWwSt+1r78mMfzaNaUJiQ8TcmGoy4ebrcmLN377Lf1evlwpx64VGxsSMW7fBoKDocPnoauDmUqMPLMKhdDT4cFQl0+L8MxMap/aktHXp7lJU8qqly6lQHBAAH1WNSWICSUKGIyxqwCqO7ZNBPCr9O9fAfhV2n6AEf8BMOc4rjWAUQAuMMayGGPZAC4AGC29zZQxdouR+8uBSvvSTAYNAtavp7SlzZsVtluO4+DrYYfTiwdgx9s9wOdxWHwoGGN+vIazISkaK2QUlIqw/0YcRnSyQ6fWpvU/QOZT8dVXFNXcu5cWCn/9RbdnZwNTp9KJ+flzqkn/4YeKbhndu9N9P/uMbmvdmvZZPa2bz6fWkosWUR0ZQOlTJ0/SiUCNyLJvbkZnqibTJiODUv6WL5cr/V2VlJSJcXDUTNxx8MD/ndsG74QQ5OgZ45ZTVwDq8wy49ywLC/64D4/Wpvh5ek/o6dRgdpqcTBF6mbjWRNxbmWDLm16wlXpe2BRk4cgfn2D5lV/hlByNTecjqf+8k5NCjtdkXFyAGzcADw9I/Pxw54vvYJydgSMHV0KYmKzSrhsBT9LgYm2EdtaVHNgTE6lUav9++v+tt6jm/v59SqG8fbuq6AnUblqlq0ui0XvvUTu5mzdpMuDtTbfr6VFE6uhRioj16YMJA9zx2oPz4IFhSmgAZrnq46eApzgb0nwWm1o0kzZbv4VYKr6JhULEfPCJmkckP5Gp+eDzOLR6bZxKOzk0FANdPuJ79kcwq2HhqEW5HDgAFBTgeD8/GOvpoK+rErprNRAdPg/DOtoiMDwNZbJS7wkTKrwC9u1TipAYnJADT3uzFztrpaWRoD59unrmBLNmAWFh5SJ/d0cLhCXnKb3DYmaBEFZGupQNKxbTmkxDy9AUip8fZZo0JHCenk7zfwD47TfyuRg6VDnjawKq9sCwY4ylAID0tyxv1x5AQqX7JUq31bU9sYbtms2yZcCrr1Jt0rVrCt01j8dhjGdrnPlwEH6c2h1lYgnm/34f47dcx8WwVJW4/DaE3/97htzisgpvgLpISaGTvEQC7NxJJ7733qOUpvBwuo+TE0U6Cwoos2L/fnJ8dq3DW+PWrZoXIiEhJDLNmEHbDh+m961DB0oPl5WlqIEBbjbILS7D4yQVGIR98AEJQ/v2aYxZWk6REFsDn2LAhkB8eiocH09cDgnHw5Lrf8C0tBBTHp0HAJgaCFQu3kWm5mP2L0FobWaA/bN6w1ivFqXaxoY8MPbuVWgKaUZeMUxLCvDppX3wTgzFwv+Owi/0smYaQNraApcuIahdd/zPfzPWnt+O3gmhWHzzkMoyaApLRbgVnVlRPhISQoJdu3YkfsrOLQYG5N0hy7oIDm6aaRWfX9HFZ+xYimxkZlJpyvHjJHhIz9ecSITP7v2Fbo7mWPbng/I2klq0NJQz5++j7amj0JXQQoHPGNqcOIwbPx+mTCANmyNUJ+J5AfojB3pPIzV+rG62Juj85z4qSW1GWS7NGsaArVvBvL2xX2iLIe42NQcQ1ICvhx3ySkS4EyuN6e7fXxHJLpG2WFUgpSIxniTnobtjDeUjmzdTWeTKlS/epgp4PDIyBYDQUHg5mUMkYQhNVu6cNquwFFYy/wtfX+DKFeW1jtUkXn2V1kQXL8p3/4AAoFs3KvMBAAcHas2qgWjGqgSoqUiNNWJ7zTvnuLkcxwVxHBeUnq4G/4CKgdCJy9UVuHNHKYfg8zhM7G6P80sG4btJ3VBQKsJ7B4Lgt+0GLkek4cT9RPRfH4h2K0+rPF1bRrFQjD3XYjDQzbrmE2x11q6tmLDw+XTyiYggQ87Vq2k7x9HEvyH1bPIuRGbOpAipnR2JIo6OlJVQvXWQCugvjShcf6rkz/HJk8ChQ9QmqWtX5R5LDhKzi/D1qVD0Wx+Ib89Hoou9GQ7N6YMls0fgq7GLYVmcDx4YJj2+CNvCbOQWl+GNn2+qbMGXlFOMGXvvQFeHhwOzvSuMompCIKCLyqlTNXe/KSujKEl4OEXsZR0Dbt0iU+DFiylLaMyYCkdoAN/c+g2PfpyKV8MugwNQxuNjX88JmmsAaWKCaX6r8eXwORgSe58yDh6dR/v0ZyoRXW5EZUAolmBYJ1tKSff0pO/5ggVkurlhg9LHUA7HUdlanz4kpMiE1bIy6Ozfh92+9jDU08GcA0HILVL9eUdL86f4i6/AsaqZdByTwP7z5ZRKPWECEBennsHJQWRqPt4N+puyKqsHHjSMDnbGeD3gIFh4eLPzGmnW7NyJyKWfI6OgVCPKR2QMdLOGng6PupGkpNA6oLKp/6lT5EuhIMJT8iEUS2qeXwsENKftoGZfpYMHgS5d4B1PNonB8cotI8ksFJL/RXq6WoOQKufttynjfOPGuu9XVgZ8+imtr8zMaO6v4ahawEiVln9A+jtNuj0RgGOl+zkASK5nu0MN22uEMbaLMdaLMdbLxsamyU+iSZiZ0QJ52TKlHkaHz8PrPR0QsGwwNrzuiYwCId7ZfxdLjz5EUk4xGGjRpcp0bRmH78Yjo0CIRfV5X+Tn00Jv376KCYtYTIs+U1PVZQXo6ABvvEGLyf/+I4+NO3cqPCFUOOmzMtZD5zamuKZMH4wnT8h4sHNn9an0UsKS8/DR4WAM3nQZv916htFdWuHsRwPxyyxv9HW1wqs9HLBYJwmcVL/kMwkOp17A5indEJtRiHE/XcPmC5EoFSkvPTG7UIgZe2+jUCjCgdne8rUDHj6cLhgSSUUK6a+/0udaV5fEsk6dyHxTNrG5eZMmw3/8QWUMmZlkDFlK5peOMybjvkMniDiKOkk4DktuH8HyUe7KeupNxsbKFO0zE8sXVnpiES7uW4j7W6dRyuLChRUdWxQZdRWLkfrLQTiJCtC7rSVlwqxZQ6/1jz+SmKAOaiprEwphu+Ij/DytB5JzirHo0P1mZdasRTNwjw2FnrhqJzQ9sQiFnADnZy+HKCAQzMODSl01SCA4GZyEvusCEJ9VhLb3ruN5j74ab7zXhVcIy+I8irTt2aPNwlAFHAcMHozjpq4Q8DkMrcuYWcUY6upgoJs1LoSlgq1Z8+I5XkeHBPOyMoV0eJB19ehWk4CxZk1FeaQ6mTgRcHYGf9FC6EtE+Ob0E6UGVWUlJNiwgfzxmmkr6Qajp0fG4RcvUhlsTcTHk7H8unXk9xUURFkYGo6qBYx/AMg6icwE8Hel7TOk3Uj6AMiVlpicAzCS4zgLqXnnSADnpLflcxzXR9p9ZEalfWk+htIFztWr9atiTUTA52FKbydc+ngIzAwEL6wBVG14WCoSY+eVGHi3tYSPSx31ibK2nSdPvth+VixWX1TDx4dKSgIC6P+0NKBjR3L8PXq0Qa1yG4udqR5ux2YpL4vmp5/oeXTurBbjTsYYbkRlYPre2xgQV1Z2AAAgAElEQVT70zVcCEvFrH5tcXXFUHw/uTs6tqrkmZKSApdTR6ErnZjrikVw8T+KV1vr4OLSwRjn2Ro/BjzFuJ+uIyiuuiVP0ykSijDrl7tIyC7Gnhm95PNzAei7LytJkH2e3d3p4rFmDfXvPngQOHu2wvF58WKa4GRl0ffjzh263Yq+RwPH9Ue39BjoMBJr9MQiTAkJgF9rzUijrYnVPcwxKSSgysKqjMdHhKc3WGkpGWjKBJyrV6n8ZsgQypLYupUMZuvrc17ZALi4GNi5E6xjR0z/dhmWJN+CgM8jUfLzz8tfS7VRU1kbAJw6hZ75yVgzsQuuPc3AxrPhqh+blmbN3CW70fYT/xd+Xp27DYtbD8XAd7bhnGN3YNUqnF7wJfwfJSMtX72T/JPBSVh1/BFSckvglJ0C56xk7DFyU3uXqfrw+X17RUqwUEjmvloRQ3ncuUOL0gcPcCE0FX1crOpvi61iRnq0QlJOMUqu3XjxHF9WRgGKFSvI1LmJrS8fJuTA1kQPrc30KzYWFgKBgZpTfmVkhFtL18A0JhKLr/6udA+srEIhLA0FVKY5cCAZXL4szJsHmJhQkKwm9PUpo/3IEfJHaSalNUqzE+U47hCAIQCsOY5LBHUTWQ/gT47j3gUQD2CS9O7/AhgLIApAEYBZAMAYy+I4bi0AaQgOaxhjslXI+6BOJwYAzkh/mheHDlEbo44dKX1Tiejq8JBXXHPqsSpr5I/fT8LzvBJsfKOOsoTz54EpUyjDwtUViI6uentthnmqRFa/aGREfa1//JGyFpydaaE5Zw5dMKZOpZOCgjpPnAxOwvWnmQBQJYsGAPy8mmgDU1QEXLhA3iKMUVrj8+cKG3t9iMQS/BvyHDuvRCM0OQ82JnpYMdodb/s4w8yglslITRFrqSBgtW0bfpjqhYle9lh9IgRv/HwL0/s4Y8Vod5goYHJTJpZgwR/38SgxBzum9axbkKtMSgpdSGQTibIyioh8/nndBr+6unXvd+1a8KtNTvhMQq/Rtm3yjU3FjDm5B+LqBYEcD5GlOrj0zV6sHO0OTvaczM3JkCosjMSdXGnN7H//kbAYEEBGvR4eJL55eFAmi8wA2M+PfCbS0lDcrQeWTVwJ3yXzVfp866UmH41nz0ggHTsWb4aFITTZCTuvxsCjjSkmdtd86yctmsHyUe5YdfwxiiuZ5RkI+Fj3mifGeLbC48Rc3J40ABv/OY0/DNoh92AwPFOeQqddW7h7usDHxRI+7ayUUpImkTA8zytBXGYhnmUWIS6zEPGZRbgQlgqRNNtoUCxFDwOcvHDmXETTr3fKIiUFlkcPgpNUyvqLjgZSU1V2LX3pmDcPSE5G3v82Isblbczq31bdI3qBYZ1swXHAz5v/wpLa2mJfvUrrAh8f8siaMqVBxzgZnIRN5yKQlFMMfR0e/n6QXPE92bOHIvH371NHPg3g4yIHrO7QD/PuHAePMSy+eQhfjFyATQr+fhcJRSguE8P9eTTNATSsw6DSMTOjNVOnTjT/nDqV5px//kmG5ba2VLrK19xgV00oTcBgjL1Zy03Da7gvA7Cwlv3sA7Cvhu1BALo0ZYxqZ/NmUo5nzKCTiouLUg/XxtwASTWIFeaGqlGqRWIJtl+OQjcHMwx0q8UUJiCAavu7dKHsi3btVDK2RmNkRILFggXU13vzZvLHmDCB/pZ5HChoAbnpXASE4qoLdlkWTZNO+EFBVCsXG/tiZoCSF79FQhGOBiVi97UYJGYXw8XGCBte94Sfl339Jly1GbFWEriGutuSJ8z5SOy/GYsLYalY69elSTWyEgnDir8e4XJEOta/5olRnRswMa1DdGnSay3Ha6Fx3LoFflnVMQvEZRiRE41+V2NQJmb4fHwnSsXu1o2iAwCJPykpJGZ4etK2qCgSC7Mr9ZQ3M6MSG4mESlGGDgVWr8austY4GxiF//PQzFaMVXB2pnbGDx4Axsb4YnxnRDzPxyfHHsHVxhhd7M3UPUItzQDZ9WHTuQgk5xSjjbkBlo9yL9/eq60lerW1BIZ+iKViCUISstFuwALwc3KwadgsLO00HIzjwcHCAD7trKSChiWcLA3BcVz54qmmfQN0/U/KKUZcZhHiMwsRl1mEZ9Lf8VlFEIoqzokCPgdHS8Ny8cKmIAtLr/2ORBNrxFq0AaeJxsQy1q4FV/38rqtL7ZO3biX/gTfeoM4A1dsxa2kYaWlk7P7gAQDA8J8TsHlvLEZokP+FDGtjPfR0ssCFsNTaBYxBg2gtMGkSLTJv36aSBzkyYSlbqUKgLBFJKoJbHtYUaBsyRGPEC4CCp1v7TMboyJvgAEx6fBFb+r1Zux9AI8ksoDlG5/8CKDCq5ICxRtJFulz++mtqItGjB5Ur9e5NJc3NTLwAAE7TulMom169erGgoCB1D6OC2FjqquHsTAsNA+UZ7lU/wQEAjwMkDFg0tD2W+nYAr3rLJQVy/H4ilv75ELum98TI2hZ8ZWVUh7V0KWBsrLSxKJXoaCoTcnGhOjsdHVpoubk1edftVp6u0a2WAxC7flzDdygS0QXyq68oPT8zs+oi2MAAiIlpcuSopsntQDdr/HrrGQ7cikNOURl6OVtg7iAXjOhkp7TPYXB8NlYdf4zw5/kY59kaX07wgK1Jw1IJGWP4v9NPsOd6LD4e2QGLhjXwffXyKp9wVaF7d/k7WbRwGGNY4x+G/TfiMKOvM756pbN8nwnGKNIZGkrfuV27gMhI+kzr6pa3M52w9ToEfB6Ovd9P+U9G0Tx4gHQHF0zYfRc8jsM/i/pXuKurEY7j7jHGeql7HOpA4+YViiI0lNr7XruGol4+OLfoS5zl2eBObBaypWayrUz10cZMH4+Tc1Emrrg6CfgcfNpZgsfjIT6zEInZxeWCBADoC3hoa2UEJ0tDtLU2grOVIdpa0e/WZgbg8zj0Xx+IpJxirD23DW8/OIt/3fthkd8q2Jsb4MbKYSp/OeSirvP72bMkoj55QmVrP/xQ0a5dS8N48oTEa7GYhCDGUMYX4HzfcRh37YS6R1cjO69EY92ZcFz/ZCgcLOrwyhIKKTK+Zw/NCeT4jMi+K9WxNzfADesYygo+f55MGjWE/usDMf/It5j8+AL0xCKU8nUQaueKlW99hfObpirsOA8TcjBx2w2EHF0CY2cHKqV5GfnlF2pjK+Ovv4DXX1fbcOSltrmFVsDQBE6fBsaPB7ZsARYtUuqhqi8kl4xww924bBwJSoCvhx02T+lee/vHJiCRMPhuvgIBn4d/PxhYdTGSkEDdPXbupEV0S2DBAkoBlIkBhoaUsjVpUpOiLrVdpCwMBQj+YmTDdlZSAowYAdy4Abz5JokVv/9eVcCotOhrLDUJZ3weTTjEjFqMzRvkQtE/FVAmlmDX1Rj8GPAU+jo8rB7ngUm9HKg/uBz8fCUa68+E451+bfHlKx5yP05Lw2CMYd2ZcOy6GoM3vZ3wf35dGiZspaRUiIgyDAyQ8TAMvfaGYvkodyysz0hY00hOphZ0Eyfi0YZtmLTrNro7muP393zIy0ONaAUMDZtXKArGqORt+XLKbrp9GxKvHohKL8Dt2CzcjsnEv49TUJOvLAegs70pnK2M0NbKEM5WRnCWCha2Jnr1njv/DXyMSz/9hv+d+h4CiRjFOroYuWg/ls0YrLElJDVd72SlOn5e9hSk2baNOkoVF1Na/5dfNpu6c7UgkVDby99+oznihg30uVy1ikQgqZE1AIh09aDzLE4jy3Vi0gsw7Lsr+OoVD7zTX47s4mfPKLgJUGDM1fWFu5SKxLgVnYl39t994TYA0JGIEXV8KRl+37mjUVk/Z87fx9BxfaEvqpqFWcbx8HzYaDh+uowEvyaO+VJ4Gmb9chdnRligk6kO4O3dpP01W2Ql7YBC5vaqora5haa0UX25GTeOTs4LFij9UH5e9rixchhi14/DjZXD8EYvR6x/3RNfveKBwPA0vLb9BuIzixR+3LOhzxGdXoiFQ9tXXYRcv05t0S5eJEW9JSBrk1VZCCgupnrGUaNIsGkky0e5w0BQNdWL44DsojIs+OMeMgtKa3lkDejrA/36UVeLgwcpdVEJJQibzkVUmcwBgFjCoCfg4+LSwdg9o5fKxAuAjG0XDm2PMx8ORMfWplhx7BHe2n0bcRmF9T72aFAC1p8Jxyvd2uCL8VrxQplwHIdVYzpi4VBXHLoTj0+OPWpY941aSnWyV30BABjeSXNc6uWmTRta7Bw+jK5b1mH96564HZuF/zvdQs6dWjQPjgPeeYfaOq9bB/ToAR6PQ4fiTEz3ccLWt3rU6Qvov3ggtr3VA8tHdcTkXo7wcbGCnal+7efOc+dIUHd1xdjhXbHp703QkfpJ8JkEvyad01jxAqj5elfFLF0gINEiMhKYNo3MvzXkOnIyOAn91wcqzyC8oTx5QiJF27bAsGEUMZYZpXMcpcBX+/DxwDS2da2LjTHa2xrjfFiqfA+QiReHDpFX3pYtAGPILynDqYfJWHwoGD3XXsQ7+++itk9Qb3E2GV1/+qnGfM5kjDm5B4JqQxLrCJDk4ArjG9eA4cPBOnVqsgFuhnRebOTV/eUVL1JSgL8r9boQCmmd0ozNhbUChqYwaBDVZj17RmYqKoTjOLzTvx1+neWN1LxSTNh2HTejFdemkzGGLYFRcLE2wljPSjXnu3bRRcnMjGr9Bg1S2DHVSk0LJ4GAnMijoppUJuTnZY91r3nC3twAHCg98Ls3umLFaHdcDEuD7+arOP0opfYdZGSQkHLvHv2/cSPw1lv0d3AwTQaq/zSxrKE2k9hioRjtbdVXJuRqY4zDc/rgf696IiQpF6N+uIodl6NRVs1jREbAk1SsPP4YA9pb47tJ3ZRabqWF4DgOH490x4fD3XD0XiKWH30ov4hRiyeI3t3bsDc3gLudieIHrApWrKBMvW+/xatXj+G9Ae3wy804/BnUeGFUi5Z6sbKiLAyOo0wgT09qhfjsWa3GnrUaforFwOPHlKU4bx6VXcTE0G3R0SSa9+gBrF4N6OqWL85kXaY0edJd2/UuKacY+SWVjNTt7KiF9qNHlKFZUkLX4tpaHSoZWeZIUk5xFYNwlYsYqakVosSPP5J3g6cnLeKfPwe++67ivjWc43ka7vvk62GH27FZyC2q2VS/RsaMQanvKOCDD3Cz31gM+Nwfiw8F42ZUBsZ3bY197/TCxje6vhDcMhDwMWXaCCpVnzhRwc9EAdTggcUXlcHJ0hDf/HwOS8ctQUhrN0hspMGGQ4cq5q4NIKtQiGVXf4N18G1FjLp5Upf3WjNFK2BoEoyRuczEiUBOjsoPP8DNGn8v7A9rYz1M33sHv92KgyJKjALD0/AkJQ/vD3Gl0gGAzKzmzSPzmDt3yB23pVCbmWJBAUVdrK3pxDFlCpnzNZDqWTSv9XTEgiHt4f/BANibG2DhwftYePA+sgqrjeHsWZoInDhBk0cl8zy3BKuOP67RswOoY3KrQng8Dm/5OOHissEY4m6DDWfDMXHrDTxOzK0Sjer1zQXM+y0InduY4ufpPaGroz11qgqO47DEtwOW+XbA8eAkfHTkAUS1iExVqEGQKxGKMHrmjxjW0bb5Zs9wHKVNv/oqsGQJVhqnY0B7a6w+EYLg+Oz6H69FS1OxsaFMoIAAwMMDu1IuwoTHYFOQhSMHV8KmIBsGAj6Wj3Kn7158PInnALU+NjMDunalFOYjR2h/hdIMuPnzKZBz9Ch5MlVHwyfddV3X+q8PxOYLkVUXryZSITUigl7PXr1obpShuCCSPKw786TuzBFlUlhImaCjR1OW2W3pQnP1aiApicqsp04loacy0nN8frEQHT79F//nH6qQoIsy8fWwg1jCcCkird77xmUUYtfVaLx+KAydus7DpoHT0ef2OVw4+gn+GWWLO5+NwPrXu2JYRztM6uX4QnBrc38r+HWxpaAZTwPnLLUEzXgPHmDT9D4wnfsuXvGZjyVHH0JYIgSWLaPvh48P+TkUy2fmK46JxeJbR2AQ3ELL/OShOZq814PWA0PTuHkTGDwYGDsW2L6dFHkFtuGUh/ySMnx0+AECwtPwprcTvp7QudELNsYYXt1+E+n5pbi8fEhFnXZGBnUUWLGiWbrfNpnERPKfiIgAXnuNFiSOjk3erUgswc6rMfjhYiTMDAT4xq8LRruYAZ98QqJR5840UejWTQFPomZyioTYcTkav9yMg4Qx9HGxwt3YLJRUcpmvUhOsQZwNScEXf4ciLb8UOjyuiukcB2CtX2dM69NWbeN72ZH5j4zp0go/venVYN+HK5HpmLnvDvbP6o2h7s2whKQyxcWUxbZoEbJLxJiw7TqEIglOLRoAW1PV97jXemBo8LxCWcTHk3/VyZPIc3XHJQsXvBJ0FjfdfWA5fCA8EsIpQJGaStH0Dz6gBemGDZTK7e1Nni61La6aoeFxbR4YC4a44lFSLi6EpcJYTwcz+znj3QEusDSq1B47JwdYswb46ScSNtauJRNVJc2RysQSXAhLxcHb8bgeVbtgErZmFAx1m+iNJmvfWHk+m5ZGWT3Hj1OAx8mJymrmz5d7PnQyOAlfnwpFdlEZrI11sXqch8bNKyojkTB0+/ocRBKGkjJJlY49jDGEJufhXOhznA9NRURqPgCgcxtTjPRohZGd7dDx0S1wb79NnnF1GTAyRu23jYxIGGuGMMaw/XI0Np2LwKAONtgx3hVGRw4CO3ZQeZGFBb0OkybVuZ9/Zn6MCQe+o+wuJXd71KJ4tCaeUprFROPHH6lG0seHWv/Nn69yoxWxhOG78xHYfjka3m0tsWNaj0Y53d+IysDbe27jG78umKabSel/+/eTgczLjlBIr8fatTSB+/JLet/laJlVH+HP8/Dx0YcIScrDt8mX8cZv39K+160j7wslUCQUYd/1WOy8GoOCUhFe9bLHkhEd4GhpWG+LPU0it7gMfdcFoEgofuE2jXa/f0nYcy0G35x+gpEedtj6Vo8Giatf/h2CP4MSEfyFL/QFLUg4TUhAdOxzjL+QiU6tTXBobp/6WxArGK2AoeHzCmVy6hT5WO3aVdU0t1MnatPn7Q2MHKmQTlzNgbqud09S8rA1MAr/hqTAQMDHtD7OmDPQBTYmleZXYWEk9hQUUFBLwdHzhKwiHLoTjz+DEpFRUIo2ZvrILxUhv0RU4/1N9HTg52WPt3yc0Km1aeMOumBBxWJzzhzKvi0poQ4bvr7A9OnAwIENeq71GqZqICeDk7CsWimkrg4PPu0sEZNeiKScYvA4oHdbS4zq3Aq+HnZwtKyWeZKbS1lMAPDff/Qdqy5yBQbSa/zzz5TR04w5cjceq44/hqe9Gfa90xtWRrrkG7hjBwXnevSgjkmRkdSeWKeq2PbUrRt4xcVwTYxU0zPQ0hS0AoaUZjHRYIzKSE6dov8NDCgK0a6dQha3DeHvB0lY8dcjWBvrYfeMXvBo07CL19RdtxCTXojrTqnQnTeHyicuX9aqoJWJi6PJSng4lXboKaAloliMsqho7EjksOPCE/TLjMHkj6ZiVG3ta5uAUCTBoTvx2BIYhYyCUvh62OHjke5wb9VMPQaghHa1WhTKrzfj8OU/oRjW0Rbb3+4hlxjBGMPAjZfQsZUp9sxsQetsxkjsTklBwP6/8e7FFEztTenEqiyT0QoYGj6vUDaVO28JBMCMGdQGUkuNPE3Nx7ZLUfjnYTIEfB7e9HbC/MGuaGUmDTAwRgtVc3PKVPjkE8rOcHSsOZuhHsrEEgQ8ScPBO/G49jQdHIBhHW3xlo8TBnewxamHyTWIATzMGeSChKxinH6cAqFIAi8nc7zl7YTxXdvAQFcOkTQmhtp3Ll5cYcDZoQNlnwJUl98IgUYsYejzvwCk12BcrsmBhto6yQHAiE52GNnZDiM62VXNzKmNqCjAwwMYMoSM2K2tK24bPpyyFGJilBa0UiUXwlKx6OB92Jsb4MC73i+2of3wQ8pcsrcngWzOHCpHevAA8PKC/+hpGH/mN/UMXkuT0AoYUprNROO99yhTQSKhbIWOHUld9PIitVX206GD0p2FHyXmYO6Be8gtLsP3k7thTGUjzjoIisvC5O3XcSLxNLod2kXq+l9/AbbNPHVbWWRmklFaYSHVfq5a1bjXKi6OohlRUUBEBJ4UAsv+fIiwlDz4dW+DryZ0hrlh0zNgxBKGfx4m4fsLkUjIKoZPO0usGN0RPZ0tmrxvdVNnT3UNnRi9bPxx+xk+OxGCQR1ssGt6z3pFjMjUfIzcfBXrXvPEm95OKhqlinjwgEyQ27bFj1/txeY7aVjr1wXT+zirbAhaAaMZzCuURS0tixETo5HtLDWJ2IxCbLsUhRPBSeBzHCb3dsD8wa5VF2inTgGTJ9Nc79NPqXRn7165snMTs4tw+E4C/gxKQFp+KVqb6WNKb0dM6e2I1mZV/TrqyhzJLhTieHASDt5+huj0Qpjo6+D1Hg5409uJghWFhRSAefCAgjGbN9N4Z8yg9qcy+Hzatm9fg14nxhii0wtwIyoTN6Iy8F9MJvJqyRjR5ECDwoMje/YACxfS9+zYMVrAjx1L78O335JvRAvhTmwW3vv1Lgx0+Tgw26dqkEwkIq+UHTuokxGfD8yaBWRmgp04geC+o9Dj5ln1DV5Lo9EKGFKaxUSjpsmAri61MgsLI5fqoiI6YSUn00Xi0CGKevTuTXWEChY10vJKMO/3ewiOz8GHw93w4XC3erswvLP/DsZvX4M3gk5THecPP2hLR+Th3DlKgzMyopKPOXPkq4FljCYKixbR+79tG/D22wDHoUwswbZLUdgaGAULI13871VP/D97dx4fVX39f/x1CPtWCCCERYOooCggghu4b7hirbut1H23rZWqbd1K3X76rdZqtVgV2ypudWtVUOuCCiggIKigrBLCvoqEQJLz++PeMTMhCVlmz/v5eOSRzOfemTlzCZkz57Mds1fnOoXn7vzvq5XcO34uc1d8R9+ubfnNsD4cunvHzF0YsYJMHJraED035VtufGkWQ3p15LHzB1XbI/jI+/O5Z9wcJt90VHkvZzZ5+2044QT80EO59JxRvLdgPU9ffAAH7NohKU+vAkaa5xWJFD36IqJp06AjJsnTXzPVkrWb+ev783lx2hLc4ScDu3PlEb3YpUOr4IRFi+D664MPqWbB+32kSLR5c7AeQLt2YEZJaRnvzglGW3zw9SoAjui9E+fuvzOH9+5E4+rWDtrB6A4vK2P65C/514LN/PerNRz/+f/4zafP03VVARb5PNGuXdDh1qlTMOJ22DAojhopUcPi1rINRXw8bw0T563m4/mrWbExeIzu7VswdLeOjP9iOesq2c0jnTsaEtI5MmUKnH56sEvLQQcF0yuaNg06xVqnbqe3RJizfCMjnviUoq2lPP7zwQzOz93+pPnzg+lK7sHab1u2sK1pM5osXqSCagZSASOUEYnGjpKBkpJgaNjy5cHcQQiGkX31VfBzp07BSr2nngqXXrr949dh+CHAlm2l/P6V2bw4rYBhfbvwf2f2p1WzCgs7hY/91f2Pcfzz33DX7nBOWWHwIVxq7quvgqr6e+8F84cfeSSY51eVoiIYMSJYuf3QQ+Ef/yjfQzzKF4Ub+PXzM5mz/DtO27cbt57clx+1rPm0pE8WrOH/jZ/LtMXr6NmxFdcdswcn7pOXlVuKZtK6HQ3Zv6cVMPLFmezfM5fHRwze/m9S6IxHJ1K0rZT/XnNIkiNMon/+E84/n+IbbuT4jsexoWgbr10T7E6UaCpgpHlekUgZuNhmuipcX8SjH8zn2SlLKC1zhg/oylVH7EavTuEH0VNOKZ9eHMkLn3kG1q/HmzZlU9tcCpq25aU9hvLaMedw1qAeXDjjddrt3DXYujXylZtbeUdXZK2KyOiOlSuDKSAzZgRfM2cGi7BPnszavffl04f+Sct/PcXUdjuzqPvu9DxmCCefuD+7dW5b/ng1LG6t37yVSfPX8PH81Uyct4YFq4OdaTq0aspBvTowZLeODOnVkZ07BKNTMrGjIWExr14dLOo5cWLwGaFZs6DolYUf2AvWbeb8Jz5l6boiHjp3YNWdcVdeiT/+OLZ1KyWNm9D40ktUUM1AKmCEMiLRqEsyUFwc7Cc+ZUrwNXUqDBkSLOBTVhZsWbbHHsEIjUmT4L//DYoKf/tbrUJzdx7/aCF3vvEVe3Ruw2PnD4pdYOjKK+HRR/m2x26ceMFf+PjGI2nbPLnrdmQN9yAx+fWvYe+9g0XSIioWodyDN68DDgh6aaoZsbG1pIyH3v2Gh9+fT4dWTbnrtH04as/qR2N8UbiBe8fP5f25q+jcthm/PHoPTt+ve613gRBJhFdnLOVXz81gv13a8+QF+9O6QhFj3fdb2e+Pb3P1kbtz3TF7pCjKJBk7Fk44gXnFOfz44Y/ZpWNLXrz84IQvWqoCRprnFZJRVmzcwugJC3j6k8UUl5RxUr+u/LJva/L334ecqNEMJc2aM+83tzLzm+WsX1hAh+/XswebaXrCcex258003lJUeS/8DTfA3XfDd98FW7p37hyM+vzb32I/AM+dG6yx0KxZkIcMGBB8nXZasMYAQV44acEanvnkW8Z/sZxtpc7++bmce8DOnHLBiTSaOXP75x8wgKJPpjJl0Vo+nr+aj+et5ovCjbhDq6Y5HLBrBw4Oixa9O7epspMkEzsaEhbz5ZcHU8+3bs36EVBrv9/KBU9+yqylG7jrtH04a3CFaaGa1pY1VMAINahEwz2osG/cGKxCPGVKMLQqonFjWLIkmLvYu3fwBhX9dccdwRSEb74J5pJFHVu5Fa7vPJTZPfvxxCG5DPjPM8Gb3sMPQ2kpZRhPPjmOi35+bOpef7ZYvz74N9x552ALug8+gA8/DFZ832cfeOUVyM8v//euodlLN3D9C8FojJ8M7M4tJ+/Fe3NWxryx/vzgfD5fuoH/zCzkRy2acOXhvRhxcH527eAgWWxHQAsAACAASURBVOH1z5dx7bPT6df9Rzx14f4xhdNXpi/ll8/N4NWrhtC/R7sURplERUXMeOrf/Hhxe4b378r9Zw1I6BQvFTAaSF4hSbV6UzGPfbiAf05azE3/eZAzZ71Ns9LytR+KcxrzXL9j+ctPfsVZg4K1LWI6ldxh7dpgxO6KFeVfgwbB0KHBNORTTgmOFxYG50PQCXLZZcE6CgsWBDli4x1vpbpmUzEvTitg7KffsmjNZlo2aURxqcfsutG4kbFLbkuWrCtia2kZTXKMfXduz5BeHRmyWwf692inzpHaaoAf2L8vLuHyf03jw29WM/K43lx5eK/y9zhNa8saKmCEGnyiceGFwTDjkpJgzYxLLoHbbw8WXCoujv0aMQKOPDKYy3jFFdsdX37zKM5dsRM7zfiUf/77dhpvKfphDmRxTmMWDT+b3v/Wqr9x9bvfwZ13Bqt2l5UFbXfeGSz4WQfFJaX85X/zeOSD+bRqmsOWbWVsLS2LOadJI+Oyw3pxyaG78qMWGk0j6Wvc7OVcM/Yz9sxryz8vPOCH6VHXjJ3OpPlr+PS3R2XldKdK3Xwz3HEHb9z8IFcW9+T3J+7JxYckbvcnFTAacF4hCbfu+60s77Une65YsN2xOV160avg6/p96I/zB+CysmBUxsVPTaFoW9l2x5vkGBcO6cnBu3VkcH57WjbdcXFEqtFAP7BvLSlj5IszeXVGIRcMyefmE/cK3uM1rS1rqIARatCJRgIqtBu3bOPasdP5YtpcPvzbxTQvKf/juaVxU957YzLHH7NvfSOXiNLSoKg0YUJwu3HjYJ2Ter5BfV6wntP+OpGSsu3/HnRp25zJvz2qXo8vkizvfLmCK5/+jN07t+ZfFx1A6+aN2W/U2wzbuwv/7/T+qQ4veYqK4Oij8WnT+NPIh3i4JI9LD92V/8xclpDh1ipgNNC8QpImodt7J+gDsLYkT5IG/IG9rMz54+tf8cTHCzmlf1fuO6M/TRsHxbwXpxVw/Qsz+WDk4eUL4kpGqSq30BithmTUqPJe+4jS0qC9jto2b8LjIwbz68nPYR772OZlbL75tjo/tlRi5Ur49NPy2yUlwZzH5cvr9bD9ureLGeIZbcXGLZW2i6Sjo/fqzN/O349vVm7ihD9P4IA73mHjlhLe+Wolr0xfmurwkqdFC3jtNSw/n+se/g37Fy3n0Q8WsHR9EQ4sXV/ETS/NaljXRCSDda1iMd6q2mtl0qTY4gUEtydOrNfDJjRmKTd9ejD9p+JXlhcvABo1Mm4+aU9uGNaH12YWctFTU9hUHEyzWvt9sF5MbivtgJhtVMBoSBL0BpXTyNhnyVcx8zIBmpWW0Gfh7Ho9tlSQgCJUhBINyRZH9N6JC4fks2xjMWvDbfbWfr+14X1g79ABxo3DmjXjthfuAXc6bVrLc8/cSKdN6yjaVsq94+emOkoRqYGRx/WmRYX1p1o0yWHkcb3r/+AJ+gCc0JhFQmbGFYf34v+d3o+J89dw7mOT+dfkRTz4v3kADHtgQsN6728ANOmsIUlgJfbSXz1W9d7WCXvWBihBRSgIEo3KtvdSoiGZ6D8zl23XFvnAnu6r1MdVfj68+SZX/vVTMOPaj8cyeMkXXDNxLLcceyWFlfzdFpH0E/m7lUm7bmRizJK5zhzUg9yWTbnsn1O5uWDDD9OXlq7fwk0vzQLQ716WUAFD4kIffpMkgUUoJRqSTar6YN4gP7APGEDxrmvptKSAsz9/i0Y4Z8x6h78cfA5Nu3dNdXQiUkOn7tst496TMzFmyVxH79WZ9q2asnpTbGdfg+zAyGIqYEhc6MNvdlCiIdmia7sWlY4Ka6hTokYe15tW5/z+h52iGnkZv5r8LC0f+1uKIxMREYmfNRWKFxENsgMjS6mAIXGjD78iki40KizWqV0aUbroM3LCxZablZZw1uz/kZOXs4N7ioiIZA51YGQ/LeIpIiJZ59R9u3HXafvQrV0LjGA9nrtO26fhFllHjSKnwrbpOV4WlwWARURE0oUWj81+GoEhIiJZSaPCoiRwAWAREZF0oWnt2U8FDBERkWyXwAWARURE0ok6MLKbppCIiIiIiIiISNpTAUNERERERERE0l7GFzDMbJiZzTWzeWZ2Y6rjEREREREREZH4y+gChpnlAA8DxwN7AeeY2V6pjUpERERERERE4i2jCxjA/sA8d1/g7luBZ4HhKY5JREREREREROIs0wsY3YAlUbcLwjYRERERERERySKZXsCwStp8u5PMLjWzqWY2ddWqVUkIS0RERERERETiKdMLGAVAj6jb3YHCiie5+2h3H+Tugzp16pS04EREREREREQkPjK9gDEF2N3MeppZU+Bs4LUUxyQiIiIiIiIicWbu2824yChmdgLwAJADPOHud+zg/FXA4mTEFicdgdWpDiJN6FrE0vWIpetRTtcilq5HrERcj13cvUEOcVRekfF0PWLpepTTtYil6xFL16Ncoq5FpblFxhcwsp2ZTXX3QamOIx3oWsTS9Yil61FO1yKWrkcsXY+GTf/+sXQ9Yul6lNO1iKXrEUvXo1yyr0WmTyERERERERERkQZABQwRERERERERSXsqYKS/0akOII3oWsTS9Yil61FO1yKWrkcsXY+GTf/+sXQ9Yul6lNO1iKXrEUvXo1xSr4XWwBARERERERGRtKcRGCIiIiIiIiKS9lTASCEze8LMVprZ7Ki2UWb2uZnNMLO3zKxr2P4jM/uPmc00sy/M7ILURZ4YlV2PqGPXm5mbWcfwdh8zm2RmxWZ2ffKjTbzaXI+o9sFmVmpmpycv0sSr5e/GyPD/zwwzmx1ej9zkR504VfztuM3Mlka99hOijt1kZvPMbK6ZHZeaqBOnNtfDzPaPaptpZj9OXeTxV4ffjX7h39IvzGyWmTVPTeQSL8otYim3KKe8IpZyi1jKLcopr4iVbrmFChipNQYYVqHtXnfv5+4DgP8Ct4TtVwFfunt/4HDg/8ysabICTZIxbH89MLMewDHAt1HNa4FrgfuSEllqjKHm1wMzywHuAcYnI7gkG0MNr4W73+vuA8L/QzcBH7j72mQFmiRjqOR6APdHXru7vwFgZnsBZwN9w/v8NfxdySZjqOH1AGYDg8Lfj2HA38yscZLiTIYx1Px3ozHwL+Byd+9L8N6yLVmBSsKMQblFtDEot4gYg/KKaGNQbhFtDMotIsagvCLaGNIot1ABI4XcfQLBm2V028aom62AyCIlDrQxMwNah/crSUacyVLZ9QjdD/yG8muBu6909ylkcbJdm+sRugb4N7AywaElXR2uRcQ5wNhExZUq1VyPygwHnnX3YndfCMwD9k9YcClQm+vh7pvdPfK3szlV/+5kpFr+bhwLfO7uM8P7rnH30oQFJ0mh3CKWcotyyitiKbeIpdyinPKKWOmWW6iAkYbM7A4zWwKcR3kvyUPAnkAhMAv4hbuXpSjEpDGzU4Clkf8EDV1V18PMugE/Bh5NSWApsKPfDTNrSVAt/ndSA0utq8Nh4k+YWfuwrRuwJOqcgrCtIajsemBmB5jZFwR/Sy+PSjyyWWXXYg/AzWy8mX1mZr9JZYCSWMotyim3KKe8IpZyi0optyinvCJWSnILFTDSkLv/zt17AE8DV4fNxwEzgK7AAOAhM2ubohCTInyT+B3liVaDtoPr8QBwQ0PpPa3h78bJwMdZOMSzKo8AvQj+PiwD/i9st0rOzbregUpUdT1w90/CYY2DgZviPTczDVV1LRoDQwk+0A4FfmxmR6UkQkk45RYB5RbllFfEUm5RKeUW5ZRXxEpZbqECRnp7BvhJ+PMFwEsemAcsBPqkLLLk6AX0BGaa2SKgO/CZmXVJaVSpU931GAQ8G7afTjAX8dRUBZoENfndOJssHOJZFXdf4e6lYe/pY5QP5SwAekSd2p2gtzWrVXM9os/5Cvge2DvZ8SXTDn43PnD31e6+GXgDGJiqOCVplFsot4hQXhFLuUUFyi3KKa+IlcrcQgWMNGNmu0fdPAWYE/78LXBUeE5noDewILnRJZe7z3L3ndw9393zCf5DDHT35SkOLSWqux7u3jOq/UXgSnd/JZXxJtKOfjfM7EfAYcCrKQwzqcwsL+rmjwkWlQJ4DTjbzJqZWU9gd+DTZMeXbFVdDzPrGVlcy8x2IfhbuijpASZRNb8b44F+ZtYyvCaHAV8mOz5JPOUW5ZRblFNeEUu5xfaUW5RTXhErlblFtq2QmlHMbCzByqwdzawAuBU4wcx6A2XAYuDy8PRRwBgzm0UwbOsGd1+d/KgTp7Lr4e6PV3FuF2Aq0BYoM7NfAntVWKgso9XmemS7OlyLHwNvufv3yYgv2ar423G4mQ0gGMK5CLgMwN2/MLPnCd48SoCrsm1IcG2uB8FwxhvNbBvB39krs+lvaS1/N9aZ2Z+AKeGxN9z99VTELfGj3CKWcotyyitiKbeIpdyinPKKWOmWW5h7tk9XEhEREREREZFMpykkIiIiIiIiIpL2VMAQERERERERkbSnAoaIiIiIiIiIpD0VMEREREREREQk7amAISIiIiIiIiJpTwUMEakzM2tnZldG3e5qZi8m6bnzzezcZDyXiIiIJJ7yChHZERUwRKQ+2gE/JBruXujupyfpufMBJRoiIiLZQ3mFiFRLBQwRqY+7gV5mNsPM7g17L2YDmNnPzewVM/uPmS00s6vN7Dozm25mk80sNzyvl5mNM7NpZvahmfWp+CRmdlj4HDPC+7cJn/uQsO1XZpYTxjDFzD43s8vC+x5uZhPM7GUz+9LMHjUz/e0TERFJP8orRKRajVMdgIhktBuBvd19AATDLysc3xvYF2gOzANucPd9zex+4HzgAWA0cLm7f2NmBwB/BY6s8DjXA1e5+8dm1hrYEj739e5+UvjclwIb3H2wmTUDPjazt8L77w/sBSwGxgGnAUkZkioiIiI1prxCRKqlAoaIJNJ77v4d8J2ZbQD+E7bPAvqFScPBwAtmFrlPs0oe52PgT2b2NPCSuxdEnR9xbPiYkaGmPwJ2B7YCn7r7AgAzGwsMRYmGiIhIplFeIdLAqYAhIolUHPVzWdTtMoK/P42A9ZGelqq4+91m9jpwAjDZzI6u5DQDrnH38TGNZocDXvEha/wKREREJF0orxBp4DRfS0Tq4zugTV3v7O4bgYVmdgaABfpXPM/Mern7LHe/B5gK9KnkuccDV5hZk/A+e5hZq/DY/mbWM5yjehbwUV1jFhERkYRRXiEi1VIBQ0TqzN3XEMwJnW1m99bxYc4DLjKzmcAXwPBKzvll+BwzgSLgTeBzoMTMZprZr4C/A18Cn4ULfv2N8lFmkwgW55oNLARermOsIiIikiDKK0RkR8xdI55EJHuFQz1/WJRLREREpK6UV4iklkZgiIiIiIiIiEja0wgMEREREREREUl7GoEhIiIiIiIiImlPBQwRERERERERSXsqYIiIiIiIiIhI2lMBQ0RERERERETSngoYIiIiIiIiIpL2VMAQERERERERkbSnAoaIiIiIiIiIpD0VMEREREREREQk7amAISIiIiIiIiJpTwUMEREREREREUl7KmCISEYys5+b2UcN9flFRESkfsws38zczBo3xOcXyUQqYIhkMTO7zcz+lcTna2pmL5rZovAN+fAKx0ea2Wwz+87MFprZyArHB5jZh2a2wcwKzOyWZMUeb2aWY2Z/NLPC8PVON7N2qY5LREQknlKQaxxoZm+b2VozW2VmL5hZXtTxI8zsvTCXWJSsuBLFzM42s6/M7Hszm29mh6Q6JpFUUgFDRKpUxx6Bj4CfAssre0jgfKA9MAy42szOjjr+DDAByAUOA64ws1PqEEPskwaS/ffuduBg4CCgLfAzYEuSYxAREUlrdcg12gOjgXxgF+A74Mmo498DTwAjt7tnPSV7pISZHQPcA1wAtAEOBRYkMwaRdKMChkgWMLMbzGxp2NM/18yOMrNhwG+Bs8xsk5nNDM/tamavhT0X88zskqjHuS0cQfEvM9sI/NzMGpnZjWHVf42ZPW9muZXF4e5b3f0Bd/8IKK3k+P9z98/cvcTd5wKvAkOiTskHnnb3UnefT1AM6Vv9S7e/hL0sc8zsqKgD75vZHWb2MbAZ2NXMLgh7Mb4zswVmdlnU+YeHoz5+bWYrzWyZmV0QdbxDeN02mtmnQK9qgmoP/BK4xN0Xe2C2u6uAISIiGSmNco033f0Fd9/o7puBh4jKJdz9U3f/J7X7oH9hOGJymZn9egex7m9mk8xsfXj+Q2bWNOo+bmaXm9k3ZrbOzB42MwuP5ZjZfWa22swWACfuIK7bgT+4+2R3L3P3pe6+tBavSyTrqIAhkuHMrDdwNTDY3dsAxwGL3H0ccCfwnLu3dvf+4V3GAgVAV+B04M7oD/7AcOBFoB3wNHAtcCrBiIiuwDrg4TjEbcAhwBdRzQ8A55tZk/B1HQS8U83DHECQoHQEbgVeqpDw/Ay4lKDXYjGwEjiJYETEBcD9ZjYw6vwuwI+AbsBFwMNhMQKC17wFyAMuDL+qsg9QApxuZsvN7Gszu6qa80VERNJWmucahxKbS9TFEcDuwLHAjWZ2dDWxlgK/Isg9DgKOAq6s8HgnAYOB/sCZBNcL4JLw2L7AIIJrUykzywnP6RQWgQrCYkmLerxOkYynAoZI5isFmgF7mVkTd18Ujl7Yjpn1AIYCN7j7FnefAfyd4IN+xCR3fyWs9BcBlwG/c/cCdy8GbiP4YF7fYZS3EfwNih72+V+CN/MiYA7wuLtPqeYxVgIPuPs2d38OmEtsb8YYd/8iHPGxzd1fd/f54YiID4C3CIooEdsIejq2ufsbwCagd5hE/AS4xd2/d/fZwFPVxNWdoBCyB9AzfE23hUNBRUREMk1a5hpm1g+4hfpPF7k9fH+fRZCXnFNVrO4+LRwRUeLui4C/ERReot3t7uvd/VvgPWBA2H4mQd6yxN3XAndVE1NnoAlBDnFI+Bj7Ar+v52sVyWgqYIhkOHefRzBd4TZgpZk9a2Zdqzi9K7DW3b+LaltMMOIgYkmF++wCvBwOlVwPfEWQyHSua8xmdjXBWhgnhokK4ciJccAfgOZAD+A4M6vYqxFtqbt7hdcS/dpjXouZHW9mk8MhreuBEwh6UCLWuHtJ1O3NQGugE9C4wuMtriauovD7H8Jk53Pg2fD5REREMko65hpmthvwJvALd/+wNq+nEhXf36vLJfYws/+GIyw3EoxAic4lIHYdsEguQfi4tc0l/uLuy9x9NfAnlEtIA6cChkgWcPdn3H0oQQLgBAs+Ef4crRDINbM2UW07A9HzKSveZwlwvLu3i/pqXtc5mGZ2IXAjcJS7F0Qd2hUodfd/hL0aBez4Q3+3yLzSqNdSWNlrMbNmwL+B+4DO7t4OeINgYdEdWUUwJaRHheeqyucVn19ERCSTpVOuYWa7EEwxHRWud1FfFd/fK80lQo8QjBLd3d3bEqwBUpNcAmBZJc9VKXdfRzANR7mESBQVMEQynJn1NrMjww/oWwgq9pEFNFcA+RbuwOHuS4CJwF1m1jwcenkRwZzOqjwK3BEmC5hZJzMbXk08zcyseXizafg8kcWrziPoqTjG3SsurvV1cIqdGy7m1QU4C5hZTWw7AdeGa2acAexJUJSoTFOC4a+rgBIzO55grusOuXsp8BLBNJCWZrYXMKKa8+cDHwK/C6/HnuFr+W9Nnk9ERCSdpFOuYWbdgHeBh9390UqONwrzkCbBTWsevchmFW4O39/7EqyR9Vw157YBNgKbzKwPcMUOHjva8wR5S/dwja0bd3D+k8A1ZraTlS8QrlxCGjQVMEQyXzPgbmA1wZDFnQh6AwBeCL+vMbPPwp/PIdjtoxB4GbjV3d+u5vH/DLwGvGVm3wGTCRbPrMpcgsSmGzA+/HmX8NgfgQ7AFAtWK99kZo8CuPtG4DSChbHWATOA2cAd1TzXJwSLbq0Ozzvd3ddUdmI4lPVaguRhHXBu+Lpq6mqCIaDLgTHErt1RmXMIXvca4HXgZnf/Xy2eT0REJF2kU65xMcGozVujcolNUccPJcg93iAY4VBEsOZVdT4A5gH/A+5z9+rOv54gh/gOeIzqix0VPUaQG80EPiPoHKnOKGAKQSfPV8B0qs+LRLKexU4fFxERERERERFJPxqBISIiIiIiIiJpTwUMEREREREREUl7KmCIiIiIiIiISNpTAUNERERERERE0p4KGCIiIiIiIiKS9hqnOoBk69ixo+fn56c6DBERkawxbdq01e7eKdVxpILyChERkfirKrdIWAHDzJ4ATgJWuvveYdu9wMnAVmA+cIG7rw+P3QRcBJQC17r7+LB9GMHe0DnA39397rC9J/AskEuwj/LP3H3rjuLKz89n6tSp8XypIiIiDZqZLU51DKmivEJERCT+qsotEjmFZAwwrELb28De7t4P+Bq4KQxuL+BsoG94n7+aWY6Z5QAPA8cDewHnhOcC3APc7+67A+sIih8iIiIiIiIikoUSVsBw9wnA2gptb7l7SXhzMtA9/Hk48Ky7F7v7QmAesH/4Nc/dF4SjK54FhpuZAUcCL4b3fwo4NVGvRURERERERERSK5WLeF4IvBn+3A1YEnWsIGyrqr0DsD6qGBJpFxEREREREZEslJJFPM3sd0AJ8HSkqZLTnMoLLF7N+VU936XApQA777xzrWIVEZHMtm3bNgoKCtiyZUuqQ8l4zZs3p3v37jRp0iTVoYiIiKSMcov4qW1ukfQChpmNIFjc8yh3jxQdCoAeUad1BwrDnytrXw20M7PG4SiM6PO34+6jgdEAgwYNqrLQISIi2aegoIA2bdqQn59PMANR6sLdWbNmDQUFBfTs2TPV4YiIiKSMcov4qEtukdQpJOGOIjcAp7j75qhDrwFnm1mzcHeR3YFPgSnA7mbW08yaEiz0+VpY+HgPOD28/wjg1WS9DhERyRxbtmyhQ4cOSjDqyczo0KGDeptERKTBU24RH3XJLRJWwDCzscAkoLeZFZjZRcBDQBvgbTObYWaPArj7F8DzwJfAOOAqdy8NR1dcDYwHvgKeD8+FoBBynZnNI1gT4/FEvRYREclsSjDiQ9dRREQkoPfE+KjtdUzYFBJ3P6eS5iqLDO5+B3BHJe1vAG9U0r6AYJcSERGRrPH+++/TtGlTDj744Do/RuvWrdm0aVMco0oPZvYEwTTUle6+d1T7NQQdHiXA6+7+m7D9JoJt1kuBa919fNg+DPgzkAP83d3vDtt7Eux4lgt8Bvws3AVNREQkY2VTbpHKXUiyw7JlcNhhsHx5qiMREZE4eGX6Uobc/S49b3ydIXe/yyvTlyb1+d9//30mTpyY1OfMIGOAYdENZnYEwXbs/dy9L3Bf2L4XwdTTvuF9/mpmOWaWAzwMHA/sBZwTngtwD3C/u+8OrCMofiSfcgsRkayi3CJ+VMCor1Gj4KOPgu8iIpLRXpm+lJtemsXS9UU4sHR9ETe9NCsuicapp57KfvvtR9++fRk9ejQA48aNY+DAgfTv35+jjjqKRYsW8eijj3L//fczYMAAPvzwQ37+85/z4osv/vA4rVu3BmDTpk0cddRRDBw4kH322YdXX83+paDcfQKwtkLzFcDd7l4cnrMybB8OPOvuxe6+EJhHMHJzf2Ceuy8IR1c8Cwy3YAzrkUDkYj8FnJrQF1QV5RYiIllDuUV8pWQb1ayxbBk8+SSUlQXfb74ZunRJdVTZadkyOPtseO45XWMRqbPb//MFXxZurPL49G/Xs7W0LKataFspv3nxc8Z++m2l99mra1tuPbnvDp/7iSeeIDc3l6KiIgYPHszw4cO55JJLmDBhAj179mTt2rXk5uZy+eWX07p1a66//noAHn+88tmXzZs35+WXX6Zt27asXr2aAw88kFNOOaUhzsndAzjEzO4AtgDXu/sUoBswOeq8grANYEmF9gMI1tNaH66/VfH85FFuISKSUZRbJJdGYNTHqFFQEuY5paXqKUmk22+HDz/UNRaRhKqYYOyovTYefPBB+vfvz4EHHsiSJUsYPXo0hx566A/bhuXm5tbq8dyd3/72t/Tr14+jjz6apUuXsmLFinrHmYEaA+2BA4GRwPPhaIrKsi2vQ/t2zOxSM5tqZlNXrVpVt6ir8oc/wNZw2Q3lFiIiGU+5RXxpBEZdRXpIIgWMrVvVU5Ioy5bB3/8O7vDEE7rGIlJnO+rNGHL3uyxdX7Rde7d2LXjusoPq/Lzvv/8+77zzDpMmTaJly5Ycfvjh9O/fn7lz5+7wvo0bN6asLEhy3J2t4Yfbp59+mlWrVjFt2jSaNGlCfn5+Q93itAB4Kdxi/VMzKwM6hu09os7rDhSGP1fWvhpoZ2aNw1EY0efHcPfRwGiAQYMGVVrkqJNly2DMmGD0BSi3EBHJAMotkksjMOpq1KjyBCNCPSWJEX2ty8p0jUUkYUYe15sWTXJi2lo0yWHkcb3r9bgbNmygffv2tGzZkjlz5jB58mSKi4v54IMPWLhwIQBr1wZLO7Rp04bvvvvuh/vm5+czbdo0AF599VW2bdv2w2PutNNONGnShPfee4/FixfXK8YM9grB2hWY2R5AU4JixGvA2WbWLNxdZHfgU2AKsLuZ9TSzpgQLfb4WFkDeA04PH3cEkNzJv8otRESyjnKL+FIBo64mTSof4hmxdStkyequaSMy0sXDDq5Ib5RWZheRBDh1327cddo+dGvXAiPoHbnrtH04dd/6LYUwbNgwSkpK6NevHzfffDMHHnggnTp1YvTo0Zx22mn079+fs846C4CTTz6Zl19++YeFti655BI++OAD9t9/fz755BNatWoFwHnnncfUqVMZNGgQTz/9NH369Knvy097ZjYWmAT0NrMCM7sIeALY1cxmEyzIOcIDXwDPA18C44Cr3L00HF1xNTAe+Ap4PjwX4AbgOjObR7AmRpXbvyeEcgsRkayj3CK+zD1+Ix8zwaBBg3zqNjqSWAAAIABJREFU1Knxe8APP4RDD4Xx4+HYY+P3uBK48kp4/PHYhK5pU7j4Ynj44dTFJSIZ46uvvmLPPfdMdRhZo7LraWbT3H1QikJKqbjnFQDnnQeTJ8P8+fF9XBERiQvlFvFVm9xCIzDqq2tX2GknKNp+XpPEgXqjRESkodllF2jePNVRiIiIpB0VMOqrVy9YsQKGD091JNlp+vRg+og7tGoFv/pV8PP06amOTEREJDHuvBO++GLH54mIiDQwKmBI5sjLC9bEEBERERERkQZHBYx4uOYauOWWVEeRvdauDdYZmTdPi3eKiEj2+/JLOP54+OyzVEciIiKSVlTAiIeZM2HChFRHkb2WLQsWS438LCIiks3KymDcOC3iKSIiUkHjVAeQFfLyYMaMVEeRvSKjLi66CLrVb7shERGRtNelS/Bdow5FRERiaARGPGhthsRasSL4fv31cPvtqY1FRCQNtG7dGoDCwkJOP/30as994IEH2Lx5c60e//333+ekk06qc3xST7m50LixcgsREUmaTMktVMCIhy5d4Lvv4PvvUx1Jdor0QHXpAps2wbZtqY1HRLLfsmVw2GFJ7QEvLS2t9X26du3Kiy++WO05dUkyJMUaNYLOnTUCI9FS8P9cRBow5RZxoQJGPOy2GwwcGBQxJP7atAmu7yefBD9/+mmqIxKRbDdqFHz0UfA9DhYtWkSfPn0YMWIE/fr14/TTT2fz5s3k5+fzhz/8gaFDh/LCCy8wf/58hg0bxn777cchhxzCnDlzAFi4cCEHHXQQgwcP5uabb4553L333hsIkpTrr7+effbZh379+vGXv/yFBx98kMLCQo444giOOOIIAN566y0OOuggBg4cyBlnnMGmTZsAGDduHH369GHo0KG89NJLcXndUg/77x+MxJDEifP/cxGRaim3iMvrxt0b1Nd+++3nkqGmT3cH9xdfTHUkIpJBvvzyy9iGww7b/uvhh4Nj33/vfuCB7o0aBX9vGjVyP+gg9yefDI6vWrX9fWtg4cKFDvhHH33k7u4XXHCB33vvvb7LLrv4Pffc88N5Rx55pH/99dfu7j558mQ/4ogj3N395JNP9qeeesrd3R966CFv1arVD4/bt29fd3f/61//6qeddppv27bN3d3XrFnj7u677LKLr1q1Kgx/lR9yyCG+adMmd3e/++67/fbbb/eioiLv3r27f/31115WVuZnnHGGn3jiiTW7nu4OTPU0eI9PxZfyigxVWOiekxP8P2/Rwn3ZslRHJCIZRLlF6nILjcCQzJGXF3zXUE8RSaTFi8E9+Nk9uB0HPXr0YMiQIQD89Kc/5aOPPgLgrLPOAmDTpk1MnDiRM844gwEDBnDZZZexLFwD4eOPP+acc84B4Gc/+1mlj//OO+9w+eWX07hxsD53biW995MnT+bLL79kyJAhDBgwgKeeeorFixczZ84cevbsye67746Z8dOf/jQur1kkbY0aBZGh1aWlGoUhIoml3CJuuYV2IYmH776Do46Cq66CESNSHU32Oflk2HNPuOsuyMnRomYiUj/vv1/1sQ0bYN262CRj3ToYNiy43bFj9fevhplVertVq1YAlJWV0a5dO2ZUsatVxftX5O41OueYY45h7NixMe0zZszY4X0lyZ58Eh54AD77LHjvk/hZtiy4vhFbtwa3b765fAcYEZHaUG6RtNxCIzDioVUrmD4d5s5NdSTZacoUWL8+SOB22kkjMEQkcUaNgrKy2LY49c5+++23TJo0CYCxY8cydOjQmONt27alZ8+evPDCC0CQEMycOROAIUOG8OyzzwLw9NNPV/r4xx57LI8++iglJSUArF27FoA2bdrwXbhG04EHHsjHH3/MvHnzANi8eTNff/01ffr0YeHChcyfP/+H+CTFvv8ePv8c1qxJdSTZJ4H/z0VEtqPc4of44kEFjHjQauGJU1oKq1aV94jceCOcckpqYxKR7DVpUtAbG23rVpg4sd4Pveeee/LUU0/Rr18/1q5dyxVXXLHdOU8//TSPP/44/fv3p2/fvrz66qsA/PnPf+bhhx9m8ODBbNiwodLHv/jii9l5553p168f/fv355lnngHg0ksv5fjjj+eII46gU6dOjBkzhnPOOYd+/fpx4IEHMmfOHJo3b87o0aM58cQTGTp0KLvssku9X6/UU+R9T6MO4y+B/89FRLaj3CKuuYV5ZChLAzFo0CCfOnVq/B948OBg+M+bb8b/sRuyFSuCJO6hh4IpOiIitfTVV1+x5557pjSGRYsWcdJJJzF79uyUxhEPlV1PM5vm7oNSFFJKJSyv+Phj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HhgiIiIiIiIikvFUwBARERERERGRjKcChoiIiIiIiIhkPBUwRERERERERCTjqYAhIiIiIiIiIhkvK90BpNpuu+3mo0ePTncYIiIincbChQvXu/ugdMeRDsorREREEq+p3KLLFTBGjx7NggUL0h2GiIhIp2Fmq9IdQ7oorxAREUm8pnILDSERERERERERkYynAoaIiIiIiIiIZDwVMEREREREREQk43W5OTBERKRr2b59O0VFRVRVVaU7lA4vJyeHESNGkJ2dne5QRERE0ka5ReK0NrdQAUNERDq1oqIi+vbty+jRozGzdIfTYbk7GzZsoKioiDFjxqQ7HBERkbRRbpEYbcktNIREREQ6taqqKvLz85VgtJOZkZ+fr0+bRESky1NukRhtyS1UwBARkU5PCUZi6DqKiIgEek9MjNZeRxUwREREMsgLL7zAq6++2q5j9OnTJ0HRiIiISEfXmXILFTBEREQySCKSDBEREZGYzpRbqICRyUpL4bDD4OOP0x2JiEiX8diiYg6+5p+MufR/Ofiaf/LYouKEHPfEE09k//33Z6+99mLWrFkAPP3000yaNIl99tmH6dOns3LlSm699VZuuOEG9t13X/71r3/x7W9/m4cffviz48Q+Adm6dSvTp09n0qRJ7L333jz++OMJiVMkUyTrd1FEJNWUWySOViHJZDNnwssvh9ubbkp3NCIind5ji4q57JG3qdxeA0BxeSWXPfI2ACfuN7xdx77zzjvJy8ujsrKSKVOmcMIJJ3DOOefw0ksvMWbMGMrKysjLy+O8886jT58+XHzxxQDccccdjR4vJyeHRx99lH79+rF+/XqmTp3K8ccfrzG50ikk83dRRCSVlFsklgoYmerDD+GWW8L9u+6Cyy+HoUPTG5OISAf3yyff5b2SzU0+v2h1OdU1tfXaKrfX8NOHl3D/66sb3WfPgn5c8bW9dvnaN954I48++igAa9asYdasWRx66KGfLRuWl5fX0tMAwtJjP/vZz3jppZfo1q0bxcXFfPLJJwzVe4V0AtfO+eCzZD+mcnsN1875QAUMEckoyi1SS0NIMtVll9Xdr6kJvTBERCSpGiYYu2pvqRdeeIG5c+cyb948Fi9ezH777cc+++zTok80srKyqK0Nr+/uVFdXA3Dfffexbt06Fi5cyFtvvcWQIUO0xKl0GiXlla1qFxHJVMotEks9MDJRaSnEjzeqrlYvDBGRBNjVpxkHX/NPihv5B2n4gF787dyD2vy6mzZtYuDAgeTm5vL+++8zf/58tm3bxosvvsiKFSvqdfPs27cvmzfXfZIzevRoFi5cyKmnnsrjjz/O9u3bPzvm4MGDyc7O5vnnn2fVqlVtjk8k0xQM6NXo72LBgF5piEZEpGnKLVJLPTAy0cyZUNugIqdeGCIiSfeTo/egV3b3em29srvzk6P3aNdxjznmGHbs2MHEiRO5/PLLmTp1KoMGDWLWrFmcdNJJ7LPPPpx22mkAfO1rX+PRRx/9bKKtc845hxdffJEDDjiA1157jd69ewNw5plnsmDBAiZPnsx9993HuHHj2hWjSCZJ1u+iiEiqKbdILHP3dMeQUpMnT/YFCxakO4zm7bcfvPXWzu377guLFqU+HhGRDmzp0qWMHz++xds/tqiYa+d8QEl5JQUDevGTo/fQmPs4jV1PM1vo7pPTFFJadYi8ooN6bFExFz+0mB21Tq/s7lx90t76XRSRjKDcIrFak1toCEkmihUprr8eXnyx/nASERFJqhP3G66kQiQDnLBvAb947B22btvBngX99HspIh2WcovEUQEjUz3xBNx2G6xZA+6QQUvXiIiIiCTb5qodbN22AzNYtaEi3eGIiEgG0BwYmeq66+Df/4bKStiyJd3RiIiIiKRU8cYw6d2ew/qxfus2Pt22I80RiYhIuqmAkalKS+vuf/xx+uIQERERSYPYkqkHfS4fgDUb1QtDRKSrUwEjE7lDSQlMnBgexxczRERERLqAkk1RAWP3UMDQMBIREdEcGJlo82aoqIADD4RevaCb6kwiIiLStRRvrKRHVjcmFQ4EYLUKGCIiXZ7+M85EJSXh9vDDYf58OOSQtIYjIiKZpU+fPgCUlJRw8sknN7vt73//eyoqWveP3wsvvMBxxx3X5viSxczuNLO1ZvZOXFuemT1rZsui24FRu5nZjWa23MyWmNmkuH3OirZfZmZnxbXvb2ZvR/vcaKYZtNOpuLySgv45DOzdg345WawuUwFDRCRZOkpukbQCRmNJRtxzF5uZm9lu0WMlGfHGjoVVqyADk0cREUmOmpqaVu9TUFDAww8/3Ow2bUkyMths4JgGbZcCz7n7WOC56DHAscDY6GsGcAuEggdwBXAgcABwRazoEW0zI26/hq8lKVRSXsnwgb0AKMzPZZUKGCIirdIZc4tk9sCYTSNv/GY2EvgysDquWUlGvKwsKCyEfv3gK1+BH/843RGJiHQtpaVw2GEJm0R55cqVjBs3jrPOOouJEydy8sknU1FRwejRo/nVr37FtGnTeOihh/jwww855phj2H///TnkkEN4//33AVixYgUHHXQQU6ZM4fLLL6933AkTJgAhSbn44ovZe++9mThxIn/84x+58cYbKSkp4YgjjuCII44A4JlnnuGggw5i0qRJnHLKKWzduhWAp59+mnHjxjFt2jQeeeSRhJx3orn7S0BZg+YTgLuj+3cDJ8a13+PBfGCAmQ0Djgaedfcyd98IPAscEz3Xz93nubsD98QdS9Ig9MAIBYxReb1ZveHTNEckItIOyi0Sct5JK2A0kWQA3AD8FPC4NiUZ8Z57Dq66CmpqYN06WLo03RGJiHQtM2fCyy+H2wT54IMPmDFjBkuWLKFfv37cfPPNAOTk5PDyyy9z+umnM2PGDP74xz+ycOFCrrvuOi644AIALrroIs4//3zeeOMNhg4d2ujxZ82axYoVK1i0aBFLlizhzDPP5Ac/+AEFBQU8//zzPP/886xfv55f//rXzJ07lzfffJPJkydz/fXXU1VVxTnnnMOTTz7Jv/71Lz7uWKtfDXH3UoDodnDUPhxYE7ddUdTWXHtRI+07MbMZZrbAzBasW7cuISch9VXvqGXtlm0UDKjrgVG0sZKaWt/FniIiGUq5RULOOaWTeJrZ8UCxuy9uMOIjaUlGh/SPf8Dtt8PPfgZDh0JxcbojEhHpPA4/fOe2U0+FCy4IEyhPnw6vvw61tXDrrbBoEcyYAd/+NqxfDw3Hhb7wQoteduTIkRx88MEA/Od//ic33ngjAKeddhoAW7du5dVXX+WUU075bJ9t27YB8Morr/D3v/8dgG9+85tccsklOx1/7ty5nHfeeWRlhbf2vLy8nbaZP38+77333mdxVFdXc9BBB/H+++8zZswYxo4d+1l8s2bNatF5ZbDGhpZ6G9p3bnSfBcwCmDx5sv6jToJPNlfhTt0QkrxcdtQ6JeWVjMzLTXN0IiINKLdIWW6RsgKGmeUCPweOauzpRtoSkmRErz2DMNyEwsLCXcaadiUlUFAQ7g8ZAgsXpjceEZGuZNWqsJw1hNtVqxJy2IZTNcUe9+7dG4Da2loGDBjAW2+91aL9G3L3Fm3z5S9/mfvvv79e+1tvvbXLfTPYJ2Y2zN1Lox6aa6P2ImBk3HYjgJKo/fAG7S9E7SMa2V7SoGhjWEJ1+IDYEJJQtFhdVqEChoh0PMotEiaVq5DsDowBFpvZSkJi8KaZDaX5JKOp9hYnGe4+y90nu/vkQYMGJeBUkqy0FIYNC/eHDoVPPgnDSUREpP1eeGHnr6g7JZs2wcaN9ZOMjRvhmGiapd1223nfFlq9ejXz5s0D4P7772fatGn1nu/Xrx9jxozhoYceil7aWbx4MQAHH3wwDzzwAAD33Xdfo8c/6qijuPXWW9mxYwcAZWVhFGffvn3ZsmULAFOnTuWVV15h+fLlAFRUVPDvf/+bcePGsWLFCj788MPP4utAngBik3yfBTwe1/6taKLwqcCmaIjJHOAoMxsYzat1FDAnem6LmU2NJgb/VtyxJMVKykMBI34ICaCVSEQkMym3SFlukbIChru/7e6D3X20u48mFCEmufvHKMmoL74HxqRJcOKJUFmZ3phERLqCmTND9854NTUJGa86fvx47r77biZOnEhZWRnnn3/+Ttvcd9993HHHHeyzzz7stddePP54eGv7wx/+wE033cSUKVPYtGlTo8f/7ne/S2FhIRMnTmSfffbhr3/9KwAzZszg2GOP5YgjjmDQoEHMnj2bM844g4kTJzJ16lTef/99cnJymDVrFl/96leZNm0ao0aNavf5JoOZ3Q/MA/YwsyIz+w5wDfBlM1tGmCT8mmjzp4CPgOXAn4ELANy9DJgJvBF9/SpqAzgfuD3a50Pg/1JxXrKzWAFjWP+c6LYX2d2NVRtUwBCRDka5RUJzC3NPztDNKMk4HNgN+AS4wt3viHt+JTDZ3ddHRYg/EVYSqQDOdvcF0Xb/Bfws2u037n5X1D6ZsNJJL0KC8X1vwclMnjzZFyxYkIhTTA536NsXzjsPrrsu3dGIiHR4S5cuZfz48S3beL/9oLFulvvuG8arttHKlSs57rjjeOednVYW73Aau55mttDdJ6cppLTK+Lyig7r070uYu3QtC35x5GdtR1z3AuOH9eXmM/dPY2QiIsotEq01uUXS5sBw9zN28fzouPsOXNjEdncCdzbSvgCY0L4oM5BZ6FJUXZ3uSEREup52JBIikjjF5ZUMH5BTr60wL1dDSESk41FukVCpnANDWio7G6KJV1izBgYNgr/8Jb0xiYhIm40ePbpTfEIikiol5ZWfrUASU5iXy6oNFSSr97CISEfSVXMLFTAyzZIlYcKX1avD44EDw9I6paXpjUtEREQkBdyd4vJKCvrXL2CMys9lS9UOyiu2pykyERFJNxUwMs2SJXDLLVBVFR736RO+Pv44vXGJiHRg+sQ2MXQdJRU2VmynanvtZyuQxBTmaSUSEckcek9MjNZeRxUwMk1JtBpsbBlVgCFD1ANDRKSNcnJy2LBhgxKNdnJ3NmzYQE5Ozq43FmmH2AokDYeQjMoPw2tXqYAhImmm3CIx2pJbJG0ST2mjkpKwCknfvnVtQ4eqB4aISBuNGDGCoqIi1q1bl+5QOrycnBxGjBiR7jCkkyvaGBUwGvTAGJkXHq/e8GnKYxIRiafcInFam1uogJFpSkvr974AOOkk2LYtPfGIiHRw2dnZjBkzJt1hiEgLxXpgNBxCktsji0F9e2oIiYiknXKL9FEBI9Ns2wYjR9Zv+9GP0hOLiIiISIqVlFfSK7s7A3Ozd3puVLQSiYiIdE0qYGSaxx6DxsZSbdsWllftpmlLREREpPMqLq+kYEAOZrbTc4V5ucz7aEMaohIRkUyg/4YzUcM37LvvhpwcKCpKTzwiIiIiKVJSXrnT8JGYwvxcPt5cRdX2mhRHJSIimUAFjEyyaRMcfzzMnVu/fbfdwq0m8hQREZFOrri8ihEDGy9gjMrPxb1uok8REelaVMDIJMXF8OSTsH59/fahQ8OtllIVERGRTqxqew3rt26joH8TPTDycgFYXaaVSEREuiIVMDJJrEDRcBWSWAFDPTBERESkEyvdVAXsvAJJTGFebwBWayJPEZEuSQWMTFJSEm4LCuq3Dx4cblXAEBERkU4stoTq8CaGkOzWpwe5PbqzSkupioh0SSpgZJJYAaNhD4zsbPj5z+Ggg1Ifk4iIiEiKFEdzWwxvogeGmVGYl6seGCIiXZSWUc0kWVkwbhz06bPzc7/+derjEREREUmh4vJKzGBIv5wmtynMy2XFes2BISLSFakHRib58Y9h6dLGn6uoqOuhISIiItIJlZRXMqRvDj2ymk5RR+XnsrqsgtpaT2FkIiKSCVTA6CjOPRemTUt3FCIiIiJJU1xeScGApntfQOiBsW1HLWu3bEtRVCIikilUwMgkxx8P117b+HNDh4ZVSlyfNoiIiEjnVFJe2eQKJDGF+dFKJJrIU0Sky1EBI1O4w7PPwtq1jT8/dChUVcHmzamNS0RERCQFamudkvKqJlcgiRmVlwvAqg2aB0NEpKtRASNTlJeHAkXDJVRjhg4Nt1pKVURERDqh9Z9uo7qmtskVSGIKBvSim6kHhohIV6QCRqYoLQ23DZdQjRkyJNyqgCEiIiKdUEl5FQAF/ZsvYPTI6kbBgF4qYIiIdEEqYGSK2AojTfXA2GsvuOEGGD06ZSGJiIiIpErxxkqAXQ4hgbASyaoNKmCIiHQ1KmBkiqwsOOggGDmy8eeHDYMf/hBGjUptXCIiIiIpUFIeChi7msQTwkok6oEhItL1ZKU7AIkcfji8+mrz2yxbBtnZ6oUhIiIinU5xeSV9embRL2fX6WlhXm/KPq1mS9V2+uZkpyA6ERHJBOqB0ZF86Uvwq1+lOwoRERGRhCsur2T4gF6Y2S63HZUfViJRLwwRka5FBYxMMWMGfP3rzW8zdGjdZJ8iIiIinUhJeSUFA3JatG1htJTqas2DISLSpaiAkSneew82bWp+m6FDtQqJiIiIdEqhgLHr+S8ACqMeGKvUA0NEpEtRASNTlJQ0vQJJjAoYIiIijTKzi8zsHTN718x+GLXlmdmzZrYsuh0YtZuZ3Whmy81siZlNijvOWdH2y8zsrHSdT1dTUb2DjRXbW7QCCUC/nGwG5mZrCImISBejAkYmcG9ZAWPIEFi7FmpqUhOXiIhIB2BmE4BzgAOAfYDjzGwscCnwnLuPBZ6LHgMcC4yNvmYAt0THyQOuAA6MjnVFrOghyRVbgWR4C3tgQLQSiYaQiIh0KSpgZILycti2LSyV2pxTT4UHHoDa2tTEJSIi0jGMB+a7e4W77wBeBL4OnADcHW1zN3BidP8E4B4P5gMDzGwYcDTwrLuXuftG4FngmFSeSFdVXF4FtLKAkd+bVWWfJiskERHJQCpgZILqajjlFJg4sfntJk4M22VruTAREZE47wCHmlm+meUCXwFGAkPcvRQguh0cbT8cWBO3f1HU1lS7JFnxxtADo6VzYACMysulpLyK7TX6YEdEpKvY9ULbknxDhsCDD+56u4oKmD8fxo3b9XATERGRLsLdl5rZbwk9JrYCi4EdzezS2Dqd3kx7/Z3NZhCGnlBYWNjqeGVnJeWVdO9mDO7bs8X7FObnUlPrlJRXMiq/dxKjExGRTKEeGJnAd8qNGldaCtOnw7PPJjceERGRDsbd73D3Se5+KFAGLAM+iYaGEN2ujTYvIvTQiBkBlDTT3vC1Zrn7ZHefPGjQoMSfTBdUUl7J0H45ZHVveWoaW0p1lebBEBHpMlTAyAS//S3k50NVVfPbDRkSbrUSiYiISD1mNji6LQROAu4HngBiK4mcBTwe3X8C+Fa0GslUYFM0xGQOcJSZDYwm7zwqapMkKyqvbNX8FwCjoqVUtRKJiEjXoSEkmaCkBHbsgJyc5rfr0yd8qYAhIiLS0N/NLB/YDlzo7hvN7BrgQTP7DrAaOCXa9inCPBnLgQrgbAB3LzOzmcAb0Xa/cveyVJ5EV1VSXsnkUa1b8GVI3xx6ZHVTAUNEpAtRASMTlJa2fE6LoUNVwBAREWnA3Q9ppG0DML2RdgcubOI4dwJ3JjxAaVJNrfPxpiqGD2xdD4xu3YyRA3uxaoNWIhER6SqSNoTEzO40s7Vm9k5c27Vm9r6ZLTGzR81sQNxzl5nZcjP7wMyOjms/JmpbbmaXxrWPMbPXzGyZmf3NzHok61ySrqREBQwRERHpktZuqWJHrbdqBZKYUfm9WV1WmYSoREQkEyVzDozZ7Lx2+rPABHefCPwbuAzAzPYETgf2iva52cy6m1l34CbgWGBP4IxoW4DfAje4+1hgI/CdJJ5LcrWmgHHddXDDDcmNR0RERCRFSspbv4RqTGFeLqs3fIq3dEJ0ERHp0JJWwHD3lwizgMe3PePusWXN5hNm9wY4AXjA3be5+wrCmNQDoq/l7v6Ru1cDDwAnmJkBXwIejva/GzgxWeeSdKefDsce27JtDzwQ9t03ufGIiIiIpEhxeZjEfEQbCxifVtew4dPqRIclIiIZKJ2rkPwX8H/R/eHAmrjniqK2ptrzgfK4YkisvWO6+mr4xjdatu1HH8E990C13qhFRESk4yveGHpgDGvTEBKtRCIi0pWkpYBhZj8HdgD3xZoa2czb0N7U680wswVmtmDdunWtDTe5qquhohVvus8/D2edFSb+FBEREengSsor6d8rmz49Wz+3/GcFjA0qYIiIdAUpL2CY2VnAccDeqRbUAAAgAElEQVSZXjdgsQgYGbfZCKCkmfb1wAAzy2rQ3ih3n+Xuk9198qBBgxJzIony4ovQuze88krLth86NNxqIk8RERHpBErKKxneht4XACMGhgLGKhUwRES6hJQWMMzsGOAS4Hh3j3+neQI43cx6mtkYYCzwOmEd9rHRiiM9CBN9PhEVPp4HTo72Pwt4PFXnkVAlUd0lVpjYFRUwREREpBMpLq9s0wSeADnZ3RnaL0dDSEREuohkLqN6PzAP2MPMiszsO8CfgL7As2b2lpndCuDu7wIPAu8BTwMXuntNNMfF94A5wFLgwWhbCIWQH5nZcsKcGHck61ySKlbAGDasZdurgCEiIiKdSHF5JcMH5LR5/8L8XFaXfZrAiEREJFO1frBhC7n7GY00N1lkcPffAL9ppP0p4KlG2j8irFLSsZWWQv/+kJvbsu0HDw63KmCIiIhIB7e5ajtbqnYwfGDbemBAWInkpX9n2BxnIiKSFEkrYEgLlZRAQUHLt8/OhgULYPTopIUkIiIikgol5WEFkrYOIQEYlZfL2i3bqKyuoVeP7okKTUREMlA6l1EVgFNOgYsuat0+++8P+fnJiUdEREQkRRJRwCiMViJZszFD5sEoLYXDDlNvWRGRJFABI91OOw3OPbd1+8yZA7NnJyUcERERkVQpLq8CYER7Chh5GbYSycyZ8PLL4VZERBJKBYx0codly6CysnX73Xsv/PKXyYlJREREJEWKN1aS3d3YrU/PNh9jVH5vgMxYiaS0FO68E2pr4a671AtDRCTBVMBIp7Iy+MIX4LbbWrff0KHhDdE9OXGJiIiIpEBJeSXD+veiWzdr8zEG5mbTt2cWqzdkwEokM2fC9u3h/vbt6oUhIpJgKmCkU2lpuG3NJJ4QChhVVbB5c+JjEhEREUmRsIRq24ePAJgZI/NyWZXOHhjFxWGI7113hd4XADt2qBeGiEiCqYCRTiUl4bYtBQzQG6KIiIh0aCXlle2awDNmVH5ueoaQuId5yfbaC844o654EVNTo14YIiIJpAJGOqmAISIiIl3U9ppaPtlcxfABOe0+VmF+LkVlldTUpnB4bVERfPWrcPbZMHFiyM+qq+tvU10Nr76auphERDq5rHQH0KXFhpAMG9a6/b74xdBVcfDgxMckIiIikgIfb6qi1mH4wPb3wCjMy6W6ppaPN1e1e0hKi7z/Phx4YBgmcuONcOGF0C3uc8Err4TVq8OEniIikjAqYKTT0UdD//7Qq5VvtL16tX4fERERkQxSUh5WYUvIEJK8aCWSDRXJLWBs3w7Z2WES9hkz4LzzYPfdd97uyiuTF4OISBemISTpNGkSXHBB2/a9+mp4/PHExiMiIiKSIiWbEljAyM8FYHVZklYicYfbb4exY8MQ4G7d4NprGy9eNNxPREQSRgWMdFqwAFatatu+N98Mjz2W2HhEREREUqR4YyhgJKLHxLD+OWR1M1ZtSMJEnqtXh16z55wDY8aEYSO7sm4djBgRih4iIpIwKmCk08knw+WXt23foUM1iaeIiIh0WMXlVeT37kFOdvd2HyurezeGD+yV2JVI3GHWLJgwIUzEefPN8NxzUFi4633z82HjRnjvvcTFIyIimgMjbdzDJJ6tncAzZujQMPu1iIiISAeUqCVUYwrzEryUqhm89BJMmRJ6UowZ0/J9u3WDceNg6dLExSMiIuqBkTZlZWFprdYuoRqjHhgiIiLSgRWXV+56+EhpKRx2WItynlH5ue0fQlJbC7feCu+8Ex7PmgVz57aueBEzfrwKGCIiCaYCRrqUlITb9hQwysqgpiZxMYmIiIikgLu3rAfGzJnw8svhdhcK83LZVLmdTRXb2xbUihXw5S/D+efXzV2Rmxt6YrTF+PFh/oytW9u2v4iI7EQFjHRpbwHj5z+Higro3v5xoyIiIiKptKlyOxXVNRQMyGl6o9JSuOuu0CvizjvhxRfhk0+anESzMLaUakuHkcR6d5SUhPkt9t4b3ngj9Lq44YbWntLODjsMvvc9qKpq/7FERATQHBjps99+8Pe/w157tW3/nGbe8EVEREQyWFG0AsmIgc30wJg5MxQvIAy7PfzwuucGDgzDOhYuDI9vu40pi99jxtIt1OT+G/b7fPiQaP/9mz/+yy/DN74RiiNHHQV//nPLJulsiWnTwpeIiCSMChjpMngwnHRS2/dfswZ+/Ws491yYNClxcYmIiIgkWUl5KGA0OYQk1vuiujo8rq2FHj3gyith+3ZYv77+0I7nnyfv0Uf5WXU1vBC1jR9ftwrIkUfCu+/CbruFrz594Omnw3Fffz30wDjvvLYPF2nK9u2weXNYlURERNpNBYx0ef310KXw0EPbtn91deji+MUvqoAhIiJdnpn9N/BdwIG3gbOBYcADQB7wJvBNd682s57APcD+wAbgNHdfGR3nMuA7QA3wA3efk+JT6RJiBYwmJ/GM730Rr6gIbrpp5/YHHsDcOeR/nuS4YVlcMmVQ/XnCvvY1+NznQuFj/frQ8yJ2/JqaMGlnoosXEHK0sWPhkUcSf2wRkS5IBYx0ueYa+OCD8GlAWwwZEm61EomIiHRxZjYc+AGwp7tXmtmDwOnAV4Ab3P0BM7uVUJi4Jbrd6O6fN7PTgd8Cp5nZntF+ewEFwFwz+4K7a8bsBCsur6RnVjfyevdofIN58+p6X8RUV8OrrzZ9UDMGDcvnrazuYenTeBddVHe/tDQUM+KHp9x1F1x+eZgkPZHGjtVKJCIiCaRJPNOlpKTtE3hC6PrYp48KGCIiIkEW0MvMsoBcoBT4EvBw9PzdwInR/ROix0TPTzczi9ofcPdt7r4CWA4ckKL4u5SS8iqGD+iFNdXrYdGiMGEnhAk13cPXokXNHrcwL3fXk3g21rujpqZFK5202vjxsGzZzsUYERFpExUw0qW0FIYNa98xhg5VAUNERLo8dy8GrgNWEwoXm4CFQLm7x5asKAKGR/eHA2uifXdE2+fHtzeyjyRQcXklw5ubwBPqeqm2YsLzwvzelG6qpHpHI8NPYtrSu6Otxo8PxZHlyxN/bBGRLkgFjHRwDwWM9vTAABg9uv74ThERkS7IzAYSek+MIQz96A0c28imHtulieeaam/4ejPMbIGZLVi3bl3bgu7iissrKejfwgLGhAktPu6ovFxqHYo2NtMLY9Giuh4d8V+76N3RJuPHh1sNIxERSQjNgZEOGzaEWanbW8B49tnExCMiItKxHQmscPd1AGb2CPBFYICZZUW9LEYAJdH2RcBIoCgactIfKItrj4nf5zPuPguYBTB58uSdChzSvG07ali3ZVvTK5DE/Md/hCVNWzEvRWF+LgCryyr43KA+7QkzMcaNC/OetaIIIyIiTVMPjHTo1w9eey28MYuIiEh7rQammlluNJfFdOA94Hng5Gibs4DHo/tPRI+Jnv+nu3vUfrqZ9TSzMcBY4PUUnUOX8fGmKoBdDyEZNgyOP75Vq4OMyqsrYGSE3r3hkktgjz3SHYmISKegAkY69OgBBxwAw9s5rPYf/4CvfjUsxyoiItJFuftrhMk43yQsodqN0EPiEuBHZracMMfFHdEudwD5UfuPgEuj47wLPEgofjwNXKgVSBKveGNYQrVgQE7TG7nDLbfA+++36tiD+vYkJ7sbqzZkSAEDYO1amD8/3VGIiHQKKmCkw+LFMHt2+wsPn3wCTz1VN0u3iIhIF+XuV7j7OHef4O7fjFYS+cjdD3D3z7v7Ke6+Ldq2Knr8+ej5j+KO8xt3393d93D3/0vfGXVexeWhgDG8uSEkpaVwwQXw3HOtOraZtWwlklS6+mqYPn3nlU9ERKTVVMBIh3/8A84+u/3HiY0J1UokIiIi0kGUlFdhBkP7N9MD4513wm0rViCJKczrzepM6oExfjxUVMDq1emORESkw1MBIx1KSmDgQMhp5o27JVTAEBERkQ6muLyCQX160jOre9MbtWEJ1ZhR+aEHRpjWJANoJRIRkYRRASMdErGEKoTJrUAFDBEREekwSsqrdr0CyTvvwODBMGhQq49fmJdL5fYa1m3d1sYIE0wFDJH/z96dx0ddnYsf/5zsC9kJ2cMiGJAAsgRwXxFRUdwqdhG7eXvbW6v2WvHXVtvS22Ltva1abzeXqrW4XYoLKlKxUlEh7IQlbNknYcueTLaZ8/vjzEASJskkmS3J83698hryne+c73Fh5szzfc7zCOExEsDwB4vlTPBhMJKTYcIECO7lDoYQQgghRACx1Fr77kCyd++AW4+ebqUaKNtIRo82PxLAEEKIQQvx9wRGpMpKz7TTCg2FI0cGP44QQgghhA9oramotXL1eSm9n/iPf0BNzYCu4WylWnKqmTnjEgc0hse9/DJkZ/t7FkIIMeRJAMMfPvvMtAcTQgghhBhBTjW10dphJ723Ap4Ao0aZnwHISIhEKSgJpE4k11zj7xkIIcSwIFtI/CE9HTIyPDPWww/DV77imbGEEEIIIbzI4myhmhDV80n5+bB8OZw8OaBrhIcEkx4XSVkgBTAsFnj+eait9fdMhBBiSJMAhq+VlcGKFVBU5Jnxysvhk088M5YQQgghhBdV1JgARnp8LxkYH30Ejz0GIQNPFM5OjKLkVNOAX+9xe/bA174Gu3b5eyZCCDGkSQDD1woK4JFHTB0MT0hNNV1IZEuKEEIIIQJchTMDo7cuJAUFJlM1Pn7A18lONK1UA4Z0IhFCCI/wWgBDKfWcUuq4Uqqg07FEpdR6pdQhx2OC47hSSj2plDqslNqtlJrV6TXLHOcfUkot63R8tlJqj+M1TyqllLf+WTzKGbjwRBcSMAGMlhaor/fMeEIIIYQQXlJRayU6LJi4yNCeTxpEBxKn7KQoTja20dTaMahxPCYrC6KjJYAhhBCD5M0MjL8A13Y7thz4UGs9CfjQ8TvAImCS4+ce4PdgAh7Ao8A8YC7wqDPo4Tjnnk6v636twGSxmEdPBTCc41RVeWY8IYQQQggvsdRaSY+PpMf7TjYb7NsHU6cO6jpjna1UAyULQymYPFkCGEIIMUheC2BorTcC1d0O3wS84PjzC8CSTsdf1MbnQLxSKg1YCKzXWldrrWuA9cC1juditdafaa018GKnsQJbZSUkJkJEH9W33TVhAlxyifnAF0IIIYQIYJbaFtJ72z5SVWXWSIPNwOjUSjVgTJkiAQwhhBgkX7dRTdFaVwJorSuVUmMcxzOAsk7nlTuO9Xa83MVxl5RS92CyNcj2dw/uykrPZV8AzJ8PGzd6bjwhhBBCCC+pqLUyLTOu5xMyMqC6etA3ZsYmRgMEVieSX/wCwsP9PQshhBjS3MrAUEpdrJT6quPPyUqp8R6eh6s8Qj2A4y5prf+ktZ6jtZ6TnJw8wCl6yOuvw7/+5d85CCGEEH7mg7WFCDDWNhvVTW29F/AEs91iEB1IAOKiQomLDKWkOoA6kWRlwZgxfZ8nhBCiR30GMJRSjwIPAQ87DoUCfx3g9Y45tn/geDzuOF4OZHU6LxOw9HE808XxwBccDAkJfZ/nLq3h/PPhv/7Lc2MKIYQQXuThtYUYIix1brRQ/eEP4cEHPXK9sUlRgbWFpKkJfv5zuZElhBCD4E4Gxs3AjUATgNbaAsQM8HpvAc5OIsuANzsdv8vRjWQ+UOfYarIOuEYpleAo3nkNsM7xXINSar6j+8hdncYKXHY7fOtb8OGHnhtTKTh1Cg4f9tyYQgghhHd5cm0hhoiKGmcL1aieT3r7bThwwCPXy0qMCqwtJGFh8NOfwrvv+nsmQggxZLkTwGhzFMrUAEqpaHcGVkqtAj4DcpRS5UqprwMrgQVKqUPAAsfvAO8CR4HDwJ+BbwNorauBFUC+4+dnjmMA/w4843jNEeA9d+blVydPwh//aKpre1JqqnQhEUIIMZQMaG0hhjZLbR8ZGO3tJngxyA4kTmMToyivsdJhs3tkvEELDYVJk6SQpxBCDII7GwxfU0r9EdMZ5JvA1zBBhl5pre/s4amrXJyrge/0MM5zwHMujm8FBlei2tcqK81jerpnx01Lg7Kyvs8TQgghAsOA1hZiaLPUWglSkBLbQwDj8GETxBhkBxKnsUlRdNg1lXUtZCX2kvXhS1OmQEGBv2chhBBDVp8BDK31r5VSC4B6IAd4RGu93uszG44sjjIdnuxCAiYDIz/fs2MKIYQQXiJri5GpvNZKamwEocE9JAA7v9h7KAPDGbQorW4OrADGm29CW5vZUhIg1uyo4PF1hVhqraTHR/LgwhyWzOyxwZ8QQviNWyWeHYsKWVgMljOA4ekMjAsvBKvVFPRUrhq0CCGEEIFF1hYjj/PLca+mTYPJkz1yvbFJZmdSyalmLprokSEHb8oU02GltBQmBsak1uyo4OHVe7C2m9a1FbVWHl69B0CCGEKIgONOF5IGpVS946dFKWVTStX7YnLDTmOj2f/o6QyMu++Gl16S4IUQQoghQdYWI5OltqX3AMbtt8Pu3RDZR5DDTamxEYQFBwVWK9XbbzfdSAIkeAHw+LrC08ELJ2u7jcfXFfppRkII0bM+Axha6xitdazjJwK4Ffid96c2DH3ve9DSAuHh3hlfa++MK4QQQniQrC1GHrtdU1lnJSPBM8EJdwQHKTITIgOvE0lwsL9n0YWzuKq7x4UQwp/c6ULShdZ6DXClF+YyMgT1+19537Ztg7g4WLfO82MLIYQQXiZri+HvRGMr7TbdcwZGa6vZYvvssx69bnZSFCWnAiiAAfDII/Dzn/t7Fqf19N+kz+0+QgjhB33WwFBK3dLp1yBgDo62Z6Kf7r8fxo6F++7z7Ljx8VBfL61UhRBCDAmythh5Khx38zN6aqFaWGi6tUV7tqPu2MQothXXoLVGBcpW2/x8s2b70Y/8PRMAHlyYw/2v7eySyBsZGsyDC3P8NykhhOiBO+kAizv9LAQagJu8Oalh6403YNcuz4+bmmoejx3z/NhCCCGE58naYoSpqHEGMHroBuLhDiROWYlRNLR2UNvc7tFxB2XKFBOwsdv9PRMArs1NRQHp1hpe/dtyzrU38stbpkkBTyFEQHKnjepXfTGRYc9uN9F2TxfwBHO3IiZGMjCEEEIMCbK2GHmc9RTSe8rA2LvXdOfI8exd/9OdSKqbSYgOkLalU6aY7nElJTB+vL9nw15LHXYNL1euZ2z5Xv5r7xryZt7h72kJIYRLPQYwlFJP0Us6p9b6Xq/MaLg6eRI6OjzfQtUpNVUCGEIIIQKarC1GLkutldiIEGIiQl2fUFAAkyaZIpceNDbJZHyUnGri/Kx4j449YOedZx737w+IAMa2khpS6k8w7u3XUFozff3fzZrSmeErhBABpLcMjK0+m8VIYLGYR29kYADcdRckJ3tnbCGEEMIzZG0xQlXUWnsvCnnRRTBvnsevm5VgAhgB1YlkyhQYN85kYQSAbSU1/OH936BaWswBuw3rj39C5J//4N+JCSGECz0GMLTWL/hyIsOe1Wo+rDIzvTN+gBSCEkIIIXrirbWFUioHeLXToQnAI8CLjuPjgGLgC1rrGmWqOT4BXAc0A3drrbc7xloGOD9Ufy7rIc+oqG0ho7cAxg9+4JXrRoYFMyYmPLA6kSQmQlGRv2cBgNaa4oIjzCgpOH0s3NaB7aUXYMVPJAtDCBFw3OlCkgw8BJwHnN64qLWWdmf9ccEF3v2w0hoaG00tDCGEECKAeXptobUuBM53jB0MVAB/B5YDH2qtVyqlljt+fwhYBExy/MwDfg/MU0olAo9ypivKNqXUW1rrmoHMS5xhqbWSNy7B9ZNWKygFET3UxxiksUlRlARSBkYAKau28uUPXkB1KyiqbTZYsQKeftpPMxNCCNfc6ULyMrAfGA/8FHMHI9+LcxID8dhjEBsbMOmIQgghRC+8uba4CjiitS7BdDZxZlC8ACxx/Pkm4EVtfA7EK6XSMB1R1mutqx1Bi/XAtR6a14jV2NpBnbW95y0kr71mCpIfOeKV62clRgXWFhIwgYHZs+nSu9QPtpfWML9sD90bzIZ0tMOnn/plTkII0Rt3AhhJWutngXat9cda668B8708r+HnF7+AO+/03vjO+hfSSlUIIUTg8+baYimwyvHnFK11JYDjcYzjeAZQ1uk15Y5jPR0Xg3CmA0kPAQxnB5KxY71y/bGJ0VTVt9DSbvPK+APS0QHbt8Px436dxraSGv56wa3mlwMHYNYsjk2fw7iH3qH0H5v8OjchhHDFnQCGs3F2pVLqeqXUTMBLhRyGsS1bzAe0tzj3KEonEiGEEIHPK2sLpVQYcCPwel+nujimezne/Tr3KKW2KqW2njhxov8THWEqHAGMHmtgFBTA5MkmiOEFY5Oi0BrKawIoC6NzJxI/2lZSQ3DuVLj/fjj3XLjhBsYUbCehuY5PDp/069yEEMIVdwIYP1dKxQHfB/4TeAa436uzGo4sFu+1UIUz3U0kA0MIIUTg89baYhGwXWvt/DA85tgaguPRebu7HMjq9LpMwNLL8S601n/SWs/RWs9Jlg5gfaqo6SOAsXcv5OZ67fpZiaYTSWkgbSOZMsU8+jGA0djawYGqekZdeRn8z/+YOiQ33AAhIVzcWMamIxLAEEIEHncCGJu11nVa6wKt9RVa69la67e8PrPhxmLxXgtVkAwMIYQQQ4m31hZ3cmb7CMBbwDLHn5cBb3Y6fpcy5gN1ji0m64BrlFIJSqkE4BrHMTEIllorIUGK5Jjws5+sr4fSUpg61WvXH5tkAhgB1YkkI8MUXvdjAGNXWS1xTXVcarWAs4jn7NmokycJXbiQTw+fxG73b40OIYTozp0AxqdKqQ+UUl93fJiL/rLbTWDBmxkYycmwfDmcf773riGEEEJ4hsfXFkqpKGABsLrT4ZXAAqXUIcdzKx3H3wWOAoeBPwPfBtBaVwMrMAVF84GfOY6JQbDUWkmLjyA4yMUOHa3hv/8bFi3y2vWTosOIDgsOrACGUrB0KUyY4LcpbC+p4dpDnzHnpivg4EFzMCgIYmK4aOJoaprb2V9V77f5CSGEK31uNtRaT1JKzcUUxfqhUmof8IrW+q9en91w0dgIF154Jl3QDWt2VPD4ukIstVbS4yN5cGEOS2b2UkcsNBR++UsPTFYIMVT1+31DCD/xxtpCa90MJHU7dgrTlaT7uRr4Tg/jPAc8N9B5iLNV1FpJj+th+0hcHDzwgFevr5QKzE4kf/qTXy+/rbSGu44fMFm8OTlnnjh4kMXfvotXJt7MpsOTmZoe579JCiFEN+5kYKC13qK1fgCYC1RzpiWZcEdsLGzcCF/+slunr9lRwcOr91BRa0VjPvgfXr2HNTsqen9hbS1U9HGOEGJYGvD7hhB+ImuLkcNS29Jz/Yt9+6CkxOtzGJsURUmgBTDAZOk6t2/49LKa7cXVzC7eDZdfbjJCnNLSCNuxndssO9h0+JTP5yaEEL3pM4ChlIpVSi1TSr0HfApUYhYbwkseX1eItVurL2u7jcfXFfb+wttvh1tv9eLMhBCBasDvG0L4gawtRo4Om52q+hYyEnoIYHzvez5Zu4xNiqa0ujmwajps2ADR0bB1q88vfeREIwlVZcRVHzcBjM5iYuCyy7jicD5biqpp6/B9gEUIIXriTgbGLuB8zD7Qc7XWD2mtt3l5XsPLyy+b6tputlpz9kt39/hpaWlSxFOIEWrA7xtC+IesLUaIYw2t2OyadD91IHHKSoyircPO8YZWr1/LbZmZ0NLil0Ke20pqmF+6x/zSPYABpp1q+VGSj5ezo7TGp3MTQojeuBPAmKC1vl9r/ZnXZzNcHTliPqDj3NtD2NOHfI8f/k6pqaaNqg6guwtCCJ8Y8PuGEP4ha4sRwhlEdfleVF0NlZVe7UDiNDbR2YmkyevXctuECRAW5pcAxvbSGjbNvAL97rtw7rlnn3D99QBcdTSfTUdkG4kQInD0GcBwFLoSg1FZCaNHmw8pNzy4MIfuhbojQ4N5cGGO6xc4paaaSH69VIwWYqR5cGEOkaFd39Ldet8Qwg9kbTFyVNSYAIbLGhh795pHH2RgnG6lGkh1MEJCYNIkv2VgTM7JRC1a1LX+hdPEifC1rxEyYTybDp/0+fyEEKInbhXxFINksfSrheriGemEBiucHycpseH88pZpfXcTSE01j7KNRIgRZ8nMDH5w7eTTv4cGK/feN4QQwosqTmdgRJz9ZEGBefRBBkZ6fCTBQSrwOpFMmeLzAEZNUxvWI0V88+OXzRq1J88+S+jNS9hZVktDS7vvJihEAFuzo4KLVm5g/PK1XLRygxRL9wN3inhe5M4x0YvKSlOfwk0HjzXQ2qG5+6JxADxyw1T3voTMmwdPPw1JSX2fK4QYdpx3GGdlx6NQXDfN/fcdIXxJ1hYjh6XWSkJUKFFhIWc/eeON8NprkJXl9XmEBgeRHh9ByakAC2DccQcsW+bTS+4oq+GSoh3Me/4JaGjo9dzLEzQptcfYUlTto9kJEbik41tgcCcD4yk3j4mezJsHV1zh9ulbi82HxJfmjSU0WFFgqXPvheecA9/+ttmuIoQYcQ5UmYXoF+Zk0WazU1jV+8JUCD+StcUIUVFr7bkDSUaG6aDmaguDF4xNjA6sLSQAt90GP/yhTy+5vaSWC8r2oFNTXde/cLLZyFt0Efd/+oq0UxUjntaan6/dJx3fAoCLcLihlLoAuBBIVko90OmpWCDY2xMbVp7q35psS3ENKbHhnJMczbkpMRRUuBnA0NrsJ42NhezsAUxUCDGUFVY1kBEfyUUTTRBzV3kt0zLdKx4shC/I2mLksdRaGZcUffYTWsPzz8PFF/f+JdqDspOieL8gALfZnjhhgjg+ugG1rbiar5YXoBZd3XvwKDgYdfXVXP3BBp47dBw4zyfzEyKQNLV2sHpHBS9+WszJxjaX50jHN9/qLQMjDBiFCXLEdPqpB27z/tRGJq01+UXV5I1LRClFbnocey31uFXvTGuYNQv+93+9P2yX9MIAACAASURBVFEhRMAprGogJzWGzIRIEqJC2V1e6+8pCdGdrC1GEK01FTVW1x1Ijh+Hr38d3nvPZ/PJToyiuqktsOo5WK2QkuKztVuHzU7N7n0k1Z2Eyy7r+wU33EBC3SmCd+/iRCC1oBXCy46eaOQnb+1l/i8+5MdrCggPDSI+KtTludLxzbd6zMDQWn8MfKyU+ovWukQpFa21DqDeU0PEjh1m+8jrr8OCBX2eXlFrpaq+hbxxiQDkZsTy6tYyKuta+v7LERRkPgSliKcQI067zc6RE41cMXkMSimmZ8azu9zN7C0hfETWFiNLvbWDpjYbma62kDg7kPiggKfTmVaqzeRmBEh2WmQkjBsH+/b55HIHqhpIP1aKLTyC4Msv7/sFixahleKqw1v49Mht3HS+FIYWw5fNrvln4XFe+KyEjQdPEBqsuH5aGnddOI6ZWfG8udPCw6v3dNlGIh3ffM+dGhjpSql9wH4ApdQMpZTc4neXxQJ1dWZbhxu2FtcAMGdcAgBTHR+wbm8jSUuTAIYQI9DRE0202zQ5KTEAzMiM4+CxBprbOvw8MyFckrXFCHCmA4mLAIYPO5A4ZTsKHY/kTiTbSmrYMHEuVSWVkOPGl67kZJg/nwVF+dJOVQxbtc1t/GnjES7/9Ud8/YWtFFbV8/0F5/Lp8qv47dKZzMpOQCnFkpkZ/PKWaafbQocEKX5xc650fPOxHjMwOvktsBB4C0BrvUspdalXZzWcONtTudmFZEtxNTHhIUxONQGPKamxBCkosNRzzdTUvgdITYWysoHOVggxRB2oqgcgJ9UEMKZnxmPXsNdSfzqjS4gAImuLEcDSWwBj715ITDzTAt4Hsp0ZGIEYwPjwQ7DZINi7pWC2l9aQGhtB+pg4t4unqief5G8bK9h0+BRaa5SPiq4K4W0FFXW8+Fkxb+600NphZ974RB5eNIUF56UQGuz6Pv+SmRksmZnBqi2lPLx6D9muavwIr3InAwOtdfdvxDaXJ4qzVVaaRzc/oLcWVzNrbALBQebDITIsmIljRrHX3QyM1FTJwBBiBDp4rIGQIMU5yaMAmJ5lsrd2lUkdDBGYZG0x/DkzMDJ6ysCYOtVnHUgAYiJCSYwOC7xWqlOmQGsrFBd7/VLHtu3h1WfuRX3+ufsvmjOHyRfMoKLWGnj/7oTop7YOO2/urODW33/KDU99wtu7Krl1dibv33cJr/7bBVw3La3H4EVni2ekEx0WzKotpT6YtejMnQyMMqXUhYBWSoUB9+JI+RRusFhMVemwsD5PrW1u4+CxRm6ckd7leG56HJuOuJm2d889pq+6EGJEKaxqYEJyNGEh5kN3TEwEaXERUgdDBCpZW4wAllorYSFBJEW7WAOtXQvV1T6fU3ZiVOBtIbnySnj2WUhI8OpljtW3MG5PPmOL9vX7Wtcc2ET55g/ZdCSXcaPljrMIbGt2VPD4ukIstaaI8IMLc7jgnCRe3lzK3zaXcrKxlbFJUfzo+incPjuLuB6Kc/ZmVHgIN56fzt93VPDI4vOIjej/GGJg3AlgfAt4AsgAyoEPgO94c1LDyvz5EB/v1qln6l90TfeemhHH6h0VHG9oYUxMRO+DzJkzoGkKIYa2A1UNzMzuuiCdnhknnUhEoJK1xQhQUWslPS6CoCAXWRbx8W6vjzwpOzGKHWU1Pr9ur8aPNz9etr2khnllBbQnjyHUnfoXnaR8vpH7Pl3Fw/vv4UvzxnpphkIM3podFV0KbVbUWvn+azuxa0DBFTljuOuCsVw6Kdn1e1M/LM3LZtWWMt7caeEr8+Xvha/0mR+jtT6ptf6S1jpFaz1Ga/1lrfUpX0xuWLj7bli50q1T80uqCQ1WnJ/V9QM9N93Uw9hrqe97kJoa05LspBRaEmKkaGztoLzGymRH/Qun6ZnxFJ9qpq45gFoGCoGsLUaKilorGa46kOzcCY8+6pe1ytikKCy1LbTb7D6/dq8KCmDzZq9eYltxNReU7SHoisv7vXVHLV5MVFsLrR99hN2uvTNBITzg8XWFXbqEANg0RIcH89H3L+e5u/O4PGfMoIMXYG4UTUmL5RXZRuJTfQYwlFJPuvhZoZS6aaAXVUrdr5Taq5QqUEqtUkpFKKXGK6U2K6UOKaVedaSUopQKd/x+2PH8uE7jPOw4XqiUWjjQ+XhVk/vd4bYW1zAtI46I0K4FnM5zBjDcqYOxbx9cdx1s3dqvaQohhq7CqgaA0x1InGZkmmDo7grJwhCBxRtrCxF4LLVW0uNcBDA2bICf/cz3E8JkYNjsmooaq1+u36Pvfhfuu8+rl7BsKyC14RTBV17Z/xdfeSW28HDm7f2MfZVu3FATwk+cxYOTG6t59W/LSW40GVdNrTaPb39SSnHn3Cz2WurZI1t2fcadIp4RwPnAIcfPdCAR+LpS6rf9vaBSKgOz13WO1joXCAaWAo8Bv9FaTwJqgK87XvJ1oEZrPRH4jeM8lFLnOV43FbgW+F+llHdLN/eXzWbap/7kJ32e2tJuY3d5rctuATERoYwfHU1BhRsfGM5uJ1LIU4gR43QAo1sGxrRMU8hT6mCIAOTRtYUIPG0ddo43tPbcQjUlxdQI8zFnJ5LSQKuD4Wylqr2T3dDSbqPYUkPhhVebmhv9FRVFx2VXcOWRfDYdOuH5CQrhIc73nHs3rSKvbC/f/XRVl+OedtP5GUSEBrEqX7IwfMWdAMZE4Eqt9VNa66eAq4EpwM3ANQO8bggQqZQKAaKASuBK4A3H8y8ASxx/vsnxO47nr1Kmf9NNwCta61atdRFwGJg7wPl4x4kTYLfDmDF9nrqrrJZ2mz6r/oXT1PRY9riTgZGSYh4lgCHEiFFYVc+o8BAyu6Vqx0Wa4OdO6UQiAo831hYigFTVtaA1rreQ7N0Lubm+nxQw1tHyMCBbqdbVeW39ttdSx77ELEr+9BJMmjSgMcKX3IgtMoqdu4s8PDshPOfBhTmkNFVze8GHBKG5fc8/yGqt48GF/av74q64yFCum5bGWzstNLV2eOUaoit3AhgZQOd8m2ggXWttA1r7e0GtdQXwa6AUE7ioA7YBtVpr53/1csd1ndcvc7y2w3F+UufjLl4TGCwW85ie3vt5wNYSRwHPsa6rQudmxFFRa6Wmqa33gaKjISYGjh3r11SFEEPXgaoGzk0ZhXKxp1kKeYoA5dG1hQg8PbZQtdvNdtepU/0wKxgTE054SBClp9zf4usTU6aYx/3eacazrbia5MZqZvWwznTLt77FC79/k49OdNDaIV2PRWCamR3Pf3yyimC7+X80WNt5oWIdS2Z672viF+dm09jawdrdlV67hjjDnQDGr4CdSqnnlVJ/AXYAv1ZKRQP/6O8FlVIJmOyJ8UA6ZtGyyMWpzhw6VxVWdC/HXV3zHqXUVqXU1hMnfJj2Vun4n9i5raMX+cXVTBozigRXrcYwrVTBzUKeqamSgSHECKG1pvBYAzmpsS6fn54Zz7H6Vo7Vt/h4ZkL0yqNrCxF4nPvQz0rbdt5g8VMGRlCQIisxKjC3kIDXAhil+XvIf/ouRq95feCDKMVFE0fT1trOjlIJjIvA9M66bXxhzz8IdQQwwmwdTHjnda9+N5o9NoGJY0bxNynm6RO9BjAcWzU+AC4E1jh+LtZaP6O1btJaPziAa14NFGmtT2it24HVjvHjHVtKADIBR/oC5UCWYz4hQBxQ3fm4i9d0obX+k9Z6jtZ6TnJy8gCmPEBuZmDY7JptJTU9bh8Bs4UEoMDixjaSv/zFrbobQoih73hDK7XN7Wd1IHGa4aiDsUu2kYgA4aW1hQgwzgyMtLhu7d/T0sxWiWXL/DArY2xiFCWnAiyAkZ4OH3wAd9zh8aG11kRs+pf5JS9vUGNdvPl9tj/1JbbtPOqBmQnhWe02O2Oe+DUhuluGkM0GK1Z47bpKKZbmZbGzrJYDVVLk1tt6DWBorTWwRmtdqbV+U2u9RmvtMkjQD6XAfKVUlGMRcxWwD/gIuM1xzjLgTcef33L8juP5DY55vQUsdXQpGQ9MArYMcm6eNX06PPTQmboUPSisaqChpYO543tO60uIDiMjPpICd+pgXHgh9LO/txBiaDrQQwFPp6npcQQHKSnkKQKGl9YWIsBYaq2MHhV+Vmc1AIKCIMx1xqkvZCeZDAztpYKZA6IULFjglcKm5TVWph7cgTVxNJx77qDGipp8LvEtjVjXvueh2QnhORsOHOe84r0E27u1SW5rg08/9eq1b5mVSVhwEK9sKev7ZDEo7mwh+VwpNbhwbSda682YYpzbgT2OOfwJeAh4QCl1GFPj4lnHS54FkhzHHwCWO8bZC7yGCX68D3zHsXc2cMybBytX9vkhvbWkGoA5Y3vOwADIzYh1bwvJnj3w/PNuT1MIMXQVOiL9PWVgRIYFM2nMKHZJHQwRWDy6thCBp6LWSkZ8xNlPrFgBy5f7fkKdZCdG0dxm41RfdcV8bedOeOopjw+7rbia+aV7aLv4UhMoGYx582iOjeecLR/T0NLumQkK4SGrtpTyw6/8xPzy61/DmjXmz++8Azt2ePXaidFhLMxNZfX2clraA+sr6XDjTgDjCuAzpdQRpdRupdQepdTuwVxUa/2o1nqy1jpXa/0VRyeRo1rruVrriVrr27XWrY5zWxy/T3Q8f7TTOP+ltT5Ha52jtQ68UHB5OdT3HXDIL64hNTbirA4C3eWmx1F0sqnvD4y334avfQ2sAdbjXAjhcQeqGkiJDSc+qudA6YzMePZU1AXW3UYx0nl8bSECS0Wt1XUHkr//HXbt8v2EOhmbZFqpBtw2knXr4N57zRYbDyravJu0xlPELLx68IMFB9N4xQIuO7KVzdJOVQSQilorHx88wb3WQnPglltg0SKT1fSXv/hkDnfmZVHf0sF7BVLM05vcCWAsAs7BtDldDNzgeBR9WbIEli7t9RStNflF1cwZl+Cyg0BnuRlmL/u+vrIwUlPNo3QiEWLYK6zquYCn0/SsOGqb2wOvaJ0YyWRtMYxprbHUWkmP6xbAsNlMkUo/dSBxyk40DXBKq0dGJ5LP6uCPX/0xQYtv8Mh48bffTKK1npL3P/LIeEJ4wmv5ZuvGpJ88BFu3wvjxJgv+S1+Ct96C6mqvz2H+hCTGJkWxSraReFWfAQytdYnWugSwYrp8OH9EXyyWPjuQlNdYqapvYe743rePAEzNcBbydDOAIZ1IhBjWOmx2Dh1v7HH7iNOMzHgAdkkdDBEgZG0xvNU0t9PSbj87A+PoUWhp8VsHEqfMhEiUgtJTAZap6oUARlNrB1vrNE13fhmysvp+gRvCrl/EW4uW8XGdi/omQviBza55fWsZF08cTVZyDMyefebJb3wD/t//88k8goIUS/Oy2VJUzZETjT655kjUZwBDKXWjUuoQUAR8DBQDgbddI9DYbCYDoo8OJO7WvwAYExPBmJhw9vZVyFMyMIQYEYpPNdPWYScnpfcARk5qDGEhQeyWTiQiQHhjbaGUildKvaGUOqCU2q+UukAplaiUWq+UOuR4THCcq5RSTyqlDju2sMzqNM4yx/mHlFL+a5UxhFXU9NBCtaDAPPo5AyMiNJjU2AhKAi0Dw3nH2IMBjF2lNdy6az0XhnrwnzU+noof/JiNHTEcb5AW3cL/Nh48gaWuhe+f2Gq2YbW2nnkyNxcefRQS+/6u5Qm3zc4kJEjxirRU9Rp3tpCsAOYDB7XW4zFdQzZ5dVbDwfHjYLf3mYGRX1xDTHhIjx0EusvNiOu7lapkYAgxIhT20YHEKTQ4iPPSYqUTiQgk3lhbPAG8r7WeDMwA9mMKf3+otZ4EfOj4HcwWlkmOn3uA3wMopRKBR4F5wFzgUWfQQ7jP2UI1o3sAo6PDdMFwZhr4UXZiFKWBVgMjJMT8+zlwwGNDHv5sF4+/9wQzdnu2A8PFWaO4pGg72/ILPTquEAOxakspSdFhTP9gNaxfD+HhXU9oazP1d4qKvD6X5Jhwrp6Swv9tr6C1Q4p5eoM7AYx2rfUpIEgpFaS1/gg438vzGvoqHcVb+sjAyC+qZva4BIKD3KsKnZsRx+HjjVjbevkLkZJiKlnfeae7sxVCDEGFVfUEKZg4ZlSf587INMFPm12y9EVA8OjaQikVC1yKo4OZ1rpNa10L3AS84DjtBWCJ4883AS9q43MgXimVBiwE1mutq7XWNcB64NqBzmuksvQUwLj9digshFF9v2d5W3ZiVGDWBXr/fXjjDY8N1/GRqVMRec1VHhsT4LzWal567RGaV73u0XGF6K/j9S18eOA4X5kYTdDGj03xzu6qq837z5/+5JM5LZ2bRXVTG+v3STa8N7gTwKhVSo0CNgIvK6WeADq8O61hIC3NtMKaNavHU2qa2jh0vJG8ce6nNOWmx2LXsL+qlzoYwcEwYwbE9l7YTwgxtB2oamDc6GgiQvvehzw9M57mNhuHj8ueTBEQPL22mACcAJ5XSu1QSj2jlIoGUrTWlQCOxzGO8zOAzlXWyh3Hejou+qGi1kpkaDDxUaH+nkqPxiZFcbyhtfcbQv6QkWG2kXiA3a5J2fY5DfFJkJPjkTGdgqdM5sSYDFL/9Q/pcCX86vVt5djsmi8d32m28N9669knpabCwoXw0kvmHC+7ZFIyGfGRvCLFPL3CnQDGTUAzcD/wPnAEUy1c9CYtDf7jPyA7u8dTtpXUADBnrPvZqc5OJH3WwXj9dVi1yu1xhRBDT+Gxhj4LeDrNyHIW8pQ6GCIgeHptEQLMAn6vtZ4JNHFmu4grrtIedS/Hu75YqXuUUluVUltPnJBWkt1Zaq2kx0d07a7W3g4TJsBzz/lvYp1kJzk7kQRYFsaRI/C975nHQTp6ooFZRbuoybsQ+uh0129KcfKyBcw+soOSspOeHVsIN9ntmlfyS5k/IZHk9e/CuHEwc6brk+++GyoqYMMGr88rOEjxhTlZfHL4ZOBtVRsG3AlgPKK1tmutO7TWL2itnwQe8vbEhryjR2Hv3l5PyS+pJjRYnf5i4Y60uAgSo8MoqOijE8mf/wxPPOH2uEKIoaW5rYPS6mZyUrplWlVWwmWXnVUDZ8LoaGLCQ9gtAQwRGDy9tigHyrXWmx2/v4EJaBxzbA3B8Xi80/mdWzJkApZejnehtf6T1nqO1npOcnLyIKY9PFlqrWQkRHU9eOiQ2X/efW+6nxSfNNloC3+7kYtWbmDNjgo/z8ihsRGefNK0gRyk/ZsLSGs8ReQCz24fcYq//WYiOtooev0dr4wvRF8+PXKKsmord+ZlmS47X/taz8G6xYshPh5eeMH18x72hbxMghS8unX4FvNcs6OCi1ZuYPzytT59H3UngLHAxbFFnp7IsPPYY3Dllb2ekl9UzfTMeLfSv52UUkxNj3WvkKcU8RRi2Dp4rBGtXRTwXLECPvnEPHYSFKTIzYiTQp4iUHh0baG1rgLKlFLOPPmrgH3AW4Czk8gy4E3Hn98C7nJ0I5kP1Dm2mKwDrlFKJTiKd17jOCb6oaLWSkZ8RNeDAdKBBMyi+3//eSbDoaLWysOr9wRGEOPcc80XMA90IvlXWzRX/OA1Rn/TO810UhdfQ3NYBPb1670yvhB9WZVfSnxUKAtz0+D3v4cf/7jnkyMiYOlS2L3bNFrwsrS4SK7IGcPrW8tpt3n/er62ZkcFD6/eQ0WtFY1v30d7DGAopf5dKbUHyHG0GHP+FAG7vT6zoc5i6bWAZ0u7jT0VdcwZ1//i5rkZcRw81tB7ZVtnAEP2JQoxLBU66uB02UJSWQnPPms+mJ9//qwg5vSsOPZX1ktVbOE3Xl5bfBdTT2M3piDoL4CVwAJHy9YFjt8B3gWOAoeBPwPfBtBaV2M6pOQ7fn7mOCbc1NJu42RjG+lx3Qp47t0LQUEwebJ/JtbJ4+sKaWnv+oXC2m7j8XUB0FEjMtK0U/VAAGNbSQ0TpoxDxbuf6dsfKiKCJ3/1Kg/O/wp2KRAtfOxUYysf7K3i5pkZRFRWuPed5/HHYdcu817kA0vnZnO8oZUNB473ffIQ8/i6QqztXdeTvnof7e2/3t+AxZi7FIs7/czWWn/Z6zMb6iore22huquslnabJm9s/3sS56bH0W7THDrWSzG+1FTTA7lO7rYKMRwdqGogMjSY7MROadorVphWYWD2m3fLwpiRGU+7TXOgssGHMxWiC6+tLbTWOx3bOqZrrZdorWu01qe01ldprSc5Hqsd52qt9Xe01udoradprbd2Guc5rfVEx8/zg5nTSHS6A0lCtwBGQQFMnGjugvqZc47uHve5KVMGHcCobWrlO8//jFsqtntoUq7lXDqL6hY7+yr72NoshIet3l5Bu03zxWnJ5u/Mj37U94tGjTIZTu3t3p8gcEVOMimx4byyZfhtI/Hn+2iPAQytdZ3WulhrfafWuqTTj9yJcEcfGRhbnQU8B5SBYfa8F/RWyDM11Twek/Y9QgxHB481cG7KKIKcLZgrK03WhVNHx1lZGNMzTRFgqYMh/EXWFsOfpbYFgPTuLVTnzAmY9u5nza2P4z43ZYqphTGILNoDn+zklr0fMUV7N2B94fhEHv3HHzn1m9959TpCdKa1ZlV+KbOy45m081NoboYrrnDvxR98YG4ye6BQbl9CgoO4fXYWHx88ETgBUg/x5/uob/JnRhqbzQQOesnA2FJUzbkpo4iP6n+rrOzEKGIiQnqvg3HTTXDypNlLKYQYdgqrGrrWv1ix4uw9nTZblyyMjPhIkqLD2CV1MIQQXnI6A6P7Ivbhh+EnP/H9hFx4cGEOkd3qj0WGBvPgQs+2Gh2wlStNMfhBdA6pe8/UpUi/0btl61Lio7jw+EHS1rzq1esI0Vl+cQ1HTzRx59xsWL0aEhNNAXN3nHceVFfDiy96d5IOd+RlYdfw2tbh1VL1wYU5hId0DSX46n1UAhjeoLX5y3THHS6fttk120tqmDOu/9tHoFMhz946kURHQ1KS59tmCSH87mRjKycb28hJ7dSB5LPPzmwfcWprg08/Pf2rUorpmXGSgSGE8JryWitKQWpcp60ira0+S9l2x5KZGfzylmlkxEeiMMGWX94yjSUzM/w9NSPY/eLuPYn+7BNqYhKJmHaeBybUO8vFVzHxSAGtVZL1K3xj1ZZSYsJDuH5yErz1Ftx4I4SGuvfizEy4+moTwPBBMc+sxCgumTSa1/LLsA2jWjFLZmZw6yzznunr91EJYHhDSIjJgMjNdfl0YVUDDa0d5A1g+4hTbropxtfRU1Xb9nazF0wqQwsx7BRWmZTgLgU8t283H8o332y2j2htfnbs6PLa6ZnxHD7eSFNrhy+nLIQYISy1VlJiIggN7rTEfOMNc2Pl8GH/TaybJTMz2LT8SopWXs+m5VcGTvACzBru1lu7bgvsh44OGxP3b6Vixlyf3MiKWnIjQWhK/7ra69cSoq65nXf3VHLTzHSiPtlo6v3dckv/Blm2DIqLYeNGr8yxu6V52VjqWth46IRPrucrdg1xkaEc+cV1Pn0flQCGN5SWwvvvm/1YLmwtMVt98waYgQGmE0lrh50jJ5pcnxASYirtfvjhgK8hhAhMBxwBjC5bSHbvhvJyuOGGM3fvXOyfnpEVh133UUNHCCEGyFJrJb17C9W9e837UXa2fyY11ISGmuy5AX65OniogtK4FDquutrDE3Ntyg2Xczw6Advbb/vkemJk+/uOclo77CzNy4ZLLoHXX4cFrjpz9+LmmyEmBl54wTuT7GbBeSkkRYcNu2Ke+cXVzBmbcKYem49IAMMb3nsPFi0y+6tc2FJUTVpcxNn7Q/uhz0KeSkFKylltFIUQQ19hVT2jR4UxelT4mYPvvGMer7vOPL70EmRkQFPXIOf0TNNOb7fUwRBCeEFFrZWMhKiuBwsKICcHwvpf92vEOu+8AXci2Vpr5wtf+hXJ933bw5NyLTYqnE8uXMRhFe2T64mRS2vNK/llTMuIIzcjzmR23XZb/7sbRUXB734H//Zv3ploN2EhQdw2O5N/7D/O8foWn1zT2041tnLkRNOASyIMhgQwvKGy8kwAoRuttYlWjUtEDSKtb/zoUUSGBvdeyDM1VQIYQgxDZxXwBFi71lT5d3YgSksz70UbNnQ5bfSocDLiI9kldTCEEB5mt2sqa1tcZ2BMneqfSQ1VzlaqA+hEsuPoCVJjI0iP813L2qPff4TvXfhV6lt8V+tkzY4KLlq5gfHL13LRyg2s2VHhs2sL/9hZVsuBqgaWzs2CbdvgF78wW0gG4q67YP58z06wF3fkZWGza17fVu6za3pTfrHpqDl3/MBLIgyUBDC8wWKB5GSXxWTKa6wcq29l7iDqXwAEBynOS4/tu5WqBDCEGFbsds3BY43kpHQq4GmzmfoXnQsHX3qp6Xe+du1ZY5hCnpKBIcSIU1lpKvV7aW1wsqmVNpu9a4ZpU5PpqCEBjP6ZMgXq681/s/7QmgfvvYlH8l8Z1I2y/rpwYhI2m53tWw/65HprdlTw8Oo9VNRa0ZjMn4dX75EgxjD3ypYyIkODuXFGuinCuWLF4Ire7twJTzzhuQn2YkLyKOaNT+TV/DLsw6CY59biasJDgkwmjI9JAMMbKishPd3lU/nFZluJJ9JtctNj2Wup7/kvQWoq1NQM+jpCiMBRWt2Mtd3WtYBncDC89hr853+eORYWZvaErl171h286ZnxlFY3U9PUrWuJEGJ4W7ECPvmkS3tlT6qocdFC1WYzbUEXebed57AzYwbMnQu1/cuWO7VzH+nVlcSeM9ZLE3NtVnYCT7z7P0y9c7FPrvf4ukKs7bYux6ztNh5fV+iT6wvfa2zt4O3dFm6ckU5MWLDp+LhwoblZM1Bvvgn332/qF/rAnXOzKa1u5rOjp3xyPW/KL65mRlY84SGD75rUXxLA8AaLpZcARg0xESGcmxLj8vn+mJoRR3ObjaJTPRTy/N3vTIVdIcSw4bKAZ0+ByuuvN4U9Cwq6HJ6RaaLlu6WQpxAjR2UlPA+sxwAAIABJREFUPPusaRv4/PNeycKw1Jq93emdAxixsfDQQ5CX5/HrDWsXXwybN5taGP1Q+dZ7ACRe18+ihoMUERpMfe75JJcX+aTbjKXW2q/jYuh7a6eF5jab2T6ydatZ3/S3+0h3d91lbvK89JJnJtmHa3NTiYsMZdUQL+bZ1NpBgaWeuX6ofwESwPCOv/zF7MlyYWtxNbPHJhDsgWqtuenmS0iP20jCwnzSPksI4TuFVQ0oxZkgaHs7jB8PP/zh2Sdfdx18//tn3Z3IdQYwyqQOhhAjxr33Qpsj66qtzStZGM4vj10CGIcOmRs7wif0Pz/mRHQCEy+Z4/NrBy++AYCG/1vj1euUVTf3uLwNCwmivMZ1F0AxtK3aUsrk1BjOz4qH//s/03Fx8SAzfsaPN9vqXnhhQPVm+isiNJibZ2bwwd5jVA/hLNidZbXY7Jq88RLAGD6mTTOpf93UNLVx6HjjoNqndjYpZRRhwUHstdS7PmHvXrj77oDquy6EGJzCY/WMTYwiMsyRsvfpp6aA1ezZZ5+clga//rX5gO4kNiKUCcnR7JI6GEKMDEVF8MYbZ3632eC55zyehVFRayUmPIS4yE41wO6990x3JNE/3/gGLFni/vlak75zMwcnzyIs1Pdp3dMunc2hpCya17zltWscq2/hS89sJixYER7S9WtMaLDCrjXX/GYjz35ShG0Y1BkQRkFFHXsq6lial2Vqu9TVwbXXQoIHCkguW2YCrZ9/Pvix3HDn3GzabHZWbx+6xTy3FFUTpGBWdrxfri8BDE+rq4NnnoGSkrOe2lpi0rw9FcAIDQ5iclpMzxkYdXUmoigBDCGGjQNVDV23oK1dawoG99QDvb0dPv74rCrdMzLj2VVei/bBHQchhJ89/ri5W9mZ3e7xLIyKWmvX7AswN1Nycz16nRHDbjfbSNzU2tLKM7MWU7H4Ni9OqmfnpceyafJ8kvI/g4YGj49f3dTGl5/ZzKnGVlbdcwGP3TqdjPhIFKbuyuO3zeCj/7yceeMTWfHOPpY8van3YvdiyHglv5TwkCBunplpDvzhD6Z+hSfcdpvZ+n/0qGfG60NOagyzsuP525bSIbsGyy+uZkpaLDERZzes8AUJYHjaoUPwzW/Crl1nPbW1uJqw4CCmZ3quWuvU9DgKKupc/wVwtlOUTiRCDAst7TaKTzZ1LeD5zjsm/TGmh7o627bB5ZfDu+92OTw9M44TDa1UDZN+5EIIFzo6YNMm+Owz8+fO2tpMBpcHWWqtXVuo1tVBWZl0IBmoKVPMGs7NQp4Fx638Pu8W4m7rR9aGBwUHKUoWf4Ef3/FDdPeA2SDVt7Rz13ObKa1u5plleczMTmDJzAw2Lb+SopXXs2n5lSyZmUFmQhTP3Z3H7744k8q6Fm56ehO/fHc/zW0dfV9EBKTmtg7e3GHhumlpxEWFQmureSLIQ19jY2JMEc8vfckz47lh6dxsjp5oOt2KdChpt9nZUVrrsRvyAyEBDE9z7vNMSzvrqfziaqZlxhHhwbS+3IxY6ls6KK9xUbQoJcU8SgBDiGHh8PFG7BpyUh0tVIuKYP9+U6yzJ3l5MHr0We1Up2eatL9dZXJ3SohhSWu47z645BJToE7rrj/PP2/Sr222vsdyU0WtlYyEThkY+/aZR8nAGJgpU8zj/v1unV667mPirfXMyvZAWv0ATbgsj1VZeRQ1eu7/q+a2Dr72fD4HKhv4w5dnc8E5Sb2er5TihunpfPjAZXxhTiZ/3HiUa36zkY8PnvDYnITvrN1dSUNrB0vzssyBefPgP/7DsxcJDjbvi/3s+jNQN0xPIyY8hFeGYDHPvZZ6rO02CWAMK85+3d26kLS029hTUefx/9i9FvKMjjZRRQlgCDEsnNWBJCnJfAm59daeXxQcbNoXvv9+ly8qU9NjCQlS7C6XQp5CDEtPPglPP20K+boKIISHw0cfmW2vHtDU2kFtc3vXLSTODkiSgTEw/QlgaM3ly/+N//nnn0iOCffuvHpx8cTRZNVWUb1ipdkCM0itHTb+7aVtbC+t4YmlM7li8hi3XxsXFcovb5nOq/fMJywkiGXPbeF7r+zgZGProOclfOeV/DImJEczd3yiyXTftQsmTvT8ha65Br74Rc+P60JUWAg3np/O2j2V1DW3++SanpJfVA1A3nj/BUolgOFpFovp/OHMfnDYWVZLu02TN86z/7FzUmMICVIUWHq4izpxokc+QIQQ/ldYVU9YSBDjkqLMgdhYU6g3K6v3F15/PZw6BVu2nD4UERrMuSkx7JZCnkIMP2+9BfffDzffDI895vqcpUvh0ktNB6Pq6kFfsrLOZIJmdA5gLFxosj/GjRv0+CPSuHFmf76LrN7u9OHDJNQc51Tehd6fVy/GJUVxdfVh5jz1X2YL4yC02+x89287+Nehkzx263Sun973vwdX5k1I4t17L+Heqybx7p5Krv6fj3lta9mQrT8wkhw81sC2khruzMs2xTtXrzZPDLZ9qitz58K6dT7rmnTn3GxaO+ys2Vnhk+t5Sn5xNeOSohgTE9H3yV4iAQxPs1hgzJizimVtLTaLg9ljPRvAiAgNZlJKDAUVPXQi2b7d3IURQgx5B6oamDRmFCHBQdDYCL/7nXsZVtdcYzIx3n+/y+EZWXHslkKeQgwvJSVw552mM9Ff/9rzPnGl4KmnoKYGfvzjQV/WuZW1SwAjOxu+/GXP7VUfaYKD4fXXTRZdH2reXQ9A2NVXentWvVJKYV+4EJsKwv7OOwMex27XPPj6Lj7Yd4yf3jiV2+f0EajvQ0RoMA8sOJd3772ESWNG8YM3dvPFP2+m6GTToMYV3vXKljJCgxW3zMowB1avhjlzzHuLp911l7np+/LLnh/bhdyMOHIzYlk1hIp5aq3ZWlLDHD9uHwEJYHjeY4/BP/951uH84hpyUmKIjwrz+CVz02N7LuQphBg2Cqsazmwf+fBD+O53z+wx701CAuTnw49+1OXw9Mx46ls6KD7V7IXZCiH8Ijsb/vu/TRZGVFTv506fDt/+Nvzxj6aI3SBYak1B4C5bSF5+GY4cGdS4AhOw7kPTB//gRHQ8ky6Z44MJ9W7mrElsT59My98H1k5Va82P3ixgzU4LDy7MYdmF4zw2t0kpMbx6zwX84uZpFFjqWPjbjfxuwyHaOiRbOdC0tNtYvaOca6amkjQq3BQE3rKl922zg5GTA/Pnmw6OPvpOtTQvmwNVDUOmrf2RE41UN7UxVwIYw0xiIkye3OWQza7ZXlLDHA9vH3HKzYjjVFMbx+pd7Ol76SW46SavXFcI4Ts1TW0cb2g904Fk7VpT4+bii90bYOZM0261E2dHJKmDIcQw0NBgaiUoBd/6llvbDgD42c9gw4ZB39G01FoJDlKMcdZfOHXKZF/8/e+DGnfE+/WvIS4OrC6KtTtpTezmTeSPnU5OWqzv5taDCycm8dE5c4jas7Pf6fhaa37x7n7+trmUf7/8HL5zhedrHQQFKb44L5sPH7iMBVNS+PUHB7nhqX+xrWTodYQYztbtraK2uZ078xzvTTExJmvsjju8d9Fly0zr5+3bvXeNTm46P53I0GBWbR4axTydXVPyxksAY3j51a/g44+7HDpQVU9Da4fXqrXmZpgPK5eFPMvKzF2Y3j74hBAB70wBz1hzZ2DtWrO/PMzNrK6WFlPMr9OXiXNTYggPCZJOJEIMdR0dZtvIxRf3v4p+QoKphQHQPLBsrDU7Knj2kyJsds1lj/+TNTsqzJcAkA4kg5WdbdLaDx7s9bQH/+1/+Ocd/05wkPLRxHo2JiaCw3Mvpz0kFHbs6Ndrn/zwMH/+VxHLLhjLDxbmeGmGxpjYCJ7+0iyeuWsODS0d3PaHT/nxmgJWbSnhopUbGL98LRet3GD+f/aQNTsqvDK2t8b1p1VbSslKjORCZ9eZ+HjTfWT8eO9d9I474LXXfFZ4OCYilMUz0nh7t4XG1sBv9ZtfVM3oUeFnarH5iQQwPKmjA5YvN3cyOtnqiFZ5KwNjSlosSuG6kGdqqnk8dswr1xZC+EZhlalzMzk1BnY67mr11j61u/BweOMNePHF04dCg4OYmh4rGRhCDHUPPGCCmj//uVnkD8STT5oM0oaGfr1szY4KHl69B2u76XJUUWvl4dV72PXeJ+YE6UAyOG50Imlqs/EPezypF8zy0aT6ln5xHvPuW0XLNde6/Zpn/nWU3/zjILfOyuTRxVNN0UYfuPq8FNY/cBl3XziOlz4v4eHVBVTUWtGc+f/ZEwEB598VT4/trXH9qehkE58frWZpXjZBQQpOnjRd1+q8fMMlIQFuvx0ifFegcuncbJrbbLy10zfFQwdjS3E1eeMSfPZ3sychfZ8i3HbsmLkz2q2Fan5xNelxEWQmeCdaFRUWwjnJo1wX8nQGMKqqpAq4EENY4bEG4qNCTXr29u1n2qO6Sym47jqzray11QQ0gBlZ8azaUkqHzW6KgwohhpannjI/DzwA//7vAx9n3jyTtfnzn/fcucSFx9cVng5eOFnbbRz+eDMzYmMhM3PgcxJw7rmmCGov9Y6qfvUEC/efZNbdeT6cWO8unpTMXz4rYXtpDReeM7rP81dtKeXna/ezKDeVx26dZr60+tCo8BAeXTyVd3ZVcqJbm1Vru42H/m83qwcZENh89BSt3WpteGLsnsZ9fF0hS2ZmDHhcf3olv5TgIMXtsx3vH3//O9xzjylOPH26dy/e3Ay/+Y15T7z6au9eC5iZFU9OSgyv5JfyxXleKE7qIZV1VsprrHztIi9mwLhJVque5Nzn12nfqdaa/OJqr1drzU2PZW9vGRjudCoQQgSsA1UN5KTEmKj3179u7kZ0a9fcp+uvh6Ym2Ljx9KEZmfG0tNs5dLzvInFCiADzr3/BffeZWle/+tXgxpo3z7Rl/s1voLDQ7ZdZal1vUc2sOGqyL/x8p27ICw+HCRN6zsDQmpQnH+e6wk3MzPZOpu9AzJuQyLi6KsYuXgDr1/d67ps7K/h/f9/D5TnJPLF0pl+D6ScbXdSTA1o77NRb2wf10z3I4Kmxexq3p7+bga6tw87/bSvnqsljGBPryIRYvRrOOQemTfP+BMLCTJe3p57y/rUwnXuWzs1id3md6+9yAcJZ/2Kun+tfgGRgeFZlpXnslIFRXmPlWH0reV7aPuKUmxHHmp0WTja2MnpU+Jkn0tJMSqgsIIQYsrTWHKxq4LbZne5kDiRN/MorzWJ47VpYsADoWshzSgAUfxNC9MPcufDoo6a+TXDw4MdbudJ8Ufje9+C999xaO6TFR5zuQNLZz+76KWu/IttHPOLBB01quytHjjDq5DGOXv5FFkeGuj7HD2IiQknNGc/oZ/fD22+f/szpbv2+Yzzw2i7mjkvkD1+eTViIf++tpsdHUuHii39GfCRrvnPRoMa+aOUGr4zd07hdOgINIR/uP8bJxjbunOvIRqitNZ3X7rvPN99nQkJMAeLf/hZOnIDkZK9f8uaZGfzyvQO8sqWMFUvivH69gcgvqiY6LPhMMXk/8su7hFIqXin1hlLqgFJqv1LqAqVUolJqvVLqkOMxwXGuUko9qZQ6rJTarZSa1WmcZY7zDymllvnjn6ULFxkY+cXVgPertU5NN/+z77V020aSlmai9tKJRIghq7zGSlObzRTwfOUVU7zz1Kn+DxQVZdqPdSr8OS4pmpiIkCHTwksIgblhUl1tApKPPALR0Z4ZNyUFfvpT+Ogjt7Mwrjnv7EywyNBgvnnrPNOWUAzePfeYffku2Dd8BIDtkst8OSO35J2XwSfZ07G//Y7LtpSfHDrJd17eTm5GHM/enUdEqAeCcIP04MIcIrvNIzI0mAc9UFDUW2O7GjciNMgjc/aHv20pJT0ugkvPdQQO3n4b2tvhllt8N4lly0xtw7/9zSeXi48KY1p6LH/9vCRgC7HmF1cza2xCQGw39tcMngDe11pPBmYA+4HlwIda60nAh47fARYBkxw/9wC/B1BKJQKPAvOAucCjzqCH39xzj4nUdQlg1BATEcK5Y7wbrTovvZdOJEKIIa3wdAeSGLMPdPfunu/G9eXll7ukmgcFKaZnxkkhTyGGisZGsx3smmtMdwpP+853zI2Pbi3hXemw2dl46CRjYsJJj49AYe4mPz0thCVrnzdrIjF47e2mBkb92bXOGtd/yInoeLIumOmHifXuoomj2XBOHkHFRSZbqNN25m0l1Xzzxa1MSI7mha/mMSo8MJLCl8zM4Je3TCMjPvL0/8+/vGWaR2pJeGvs7uOCac85FOtflFU388nhk9w+J+tMR53t2yEjw/w/5Cu5uabexgsv+ORya3ZUsMdSj4aALMRa19xO4bEG5nq5JIK7fP5uoZSKBS4F7gbQWrcBbUqpm4DLHae9APwTeAi4CXhRa62Bzx3ZG2mOc9drrasd464HrgVW+eqf5SxBQTC6a6Gi/OJq5oxN8HoxorjIUMYmRbneO/WNb5hqur/7nVfnIITwjsJjjgBGUgS8/765Exc0yPhzU9Ppu7bTM+P588ajtLTbAuIOmBCiBzYbfPGLsGuXuSs52PcBV0JDTc0FgKKiXlsWrt5ewdETTfzhy7O4NvfMzRueeAJ+/GOz/hCDt307zJ8Pa9aclVFrLSplS9Y0ZgXIF4vOZmbHszxnHnzwv7BtG6xYAU8/TUFFHXc/n09qXAQvfX0e8VH/n73zDo+q2vrweyYdSIFAOiX0EkJvRoogHRVBsVfUa8WKgNd6sXDFgqBXsID62bDQDFV6FRIICTUQQiCVBNJJnZn9/bEnpJBAgGkh+32eeSZz6srkZObstdf6/WppB24lxvcItNjg31LHLjuuEIJhH2/h5Nmrs0S2Nb9FJgIwqU/z8oWffipb5SzxeXcpHntMttwWFMgKVgsye20sJXYsxLr3dCZCYHFNx9piiwqM1kAGsEjTtChN077RNK0h4CuESAUwPfuYtg8EEivsn2RaVtNy2/HZZzB//oWXmedLiEvPt9ofOyTAs3onktOnITLSKjEoFArzczQtj6DGbjSK3C1n4K7EPrU6brkFxo+/8LJbkCd6o+BIajWfHwpFHUHTtARN0w5omrZf07RI07K6355akVdekYmLefOkq5AlmT1binCeOlXt6qJSA3PWH6NbkCcju/hVXnnoEHh7X7nQsKJ6yqphqhHy/GT6fN65cxqtm5qpjciMuDg6ENLSG4Omky0kixYRfyCOBxfuwcPViR8f60czd5fLH0hRazRNY0LPQPaczCQxs24lMfQGI79FJjK4fTMCq+p3XK099LXw5JPy89bCyQuoWXDVXoRY95zMwslBo0cLG/wdqsEWCQxHoCfwpRCiB3Ce8naR6qiudEFcYvnFB9C0JzRNi9Q0LTLDkuWM330H4eEXXu49ZV211i6BHpzOLCCnoLTyCj8/5UKiUNRhYtNypWhSeLicHb1WW6+OHWHLFsiTlR2hQfILKUbpYCjqPjcJIboLIXqbXtf99tQyFi2SonIvvABPP2358911l3x++eVqV/+0+zQpOUVMHdlRuiNV5OBB5UBiTjw9pUB8NQmMvaez6Nba5+K/gZ3w1Naf0ZtmzoXBQNGosXgV5vHjY/0uHqQqzMJt3eV87vL99tF+UFs2x2ZwJre4XLwT4PHHZSLBlpw6JfUwLEhNgqv2IsQamZBJ10BPu6nStUUCIwlIEkLsNr3+A5nQOGNqDcH0nF5h+wp1RAQBKZdYfhFCiK+EEL2FEL2bWVJJNjW1kgNJZEImzg46ugZaR002pEzIM7XKIKQsgVGNgJJCobBvSvRG4jPOS/2LTp3g2WfB/Ro1dcaOlT3V69cD4O/pStNGLkQrHQzF9cdtyLZUTM/jKyz/QUj+AcraU0diak8VQmQBZe2ptmfMGJgxAz76yDrna9EC/v1v+PNP6QBQgfxiPV9siuOGNt7c2K5y6yxCyAqMkBDrxFlf6NTpogRG8dPP8OgPs+jZ0j5ybBeRmkqHNX/iYpCDP62khE4px/j780cIXvgFFNrH7PL1RvMmDegb3IQl+5IRdeje/9eI0zRzd2FoR1MRfnExLF4sW+dsxdat0KoVrF1r0dNYUjz2WikqNRCTlEMfO2kfARskMIQQaUCipmllf5FhwGFgBVBWqvkQsNz08wrgQVO5Z38gx9RishYYoWlaY9PsyAjTMttQWgrp6ZUEPPckZBIaZL1sVReTkOehqm0kfn7yQyBHza4qFHWNExn56I2C9r7uMHkyfPLJtR80LAw8PGDVKkCWnHYL8lQVGIq6jgDWaZq2V9O0J0zL6n57akKCvMfw9YX33zePXWptefllqYfx3HMyBhMLt58k83xJ9TfX6enynqOLslA1K506wdGj5ZNRQiCWLsO9+Dy97DSBEf/8NAxVBp+lOgeKGrrDtGnQvr2sXraEGG09Z2LPQOLPnq8zDmNpOUVsPJrOnb2CcCpzuVi/XlaKTpxou8D695f6hhYW86woxFrGKyPb24X+RXRiNiUGY/1OYJh4DvhJ07QYoDvwPjALGK5p2nFguOk1wCogHogDvgaeBjCJd84EIkyP/5QJetqEM2fkl4qpAqOwxMDB5ByL26dWxLuRCwGerhysKuTZsSMMG6Yy3QpFHaTMgaRr8bkLLR/XjJOTdDBYterCzXBokBcnMvLJL7ZsmaRCYUHChBA9ke0hz2iaNugS215Te6rVWlNTUmDgQOlyZgtcXWXbytmzcvAMZJ0v4eut8Yzo7EuPFtUMnH19pVPKo49aOdjrnEcflS5SZYP9EydwTUthd8tQQoOsU+l7pei377xQfVGGs9FAsuYqrXr9/WVrlJ22v9RlRnf1x8VRx9J9SbYOpVb8HpmIUcBdFcU7//xTTrYMHWq7wJydpXDy8uWQlWXRU43vEciO6UPZ9upNAJTo7aN6JtIkidC7lf0kSm3iWSSE2A/0rmbVsGq2FcAzNRxnIbDQvNFdJWfPSj92UwVGdFI2pQZBHyv/sbsEenKgqpXqmDGWF/tSKBQW4WhaHk4OGq3eeEW2gsXEmOfAzz0Ht98uSzMdHQlt7okQcCAphwFtvM1zDoXCigghUkzP6ZqmLUVqWJzRNM1fCJF6Be2pQ6os31zNub4CvgLo3bu3+e8yU1Ol21Burrxpfv55s5+i1owbBydOXGhd+3LLCfJL9Lw84hKlzY6O8qEwHz16yEcZmzcDcK73ABo42+d7PfLBz6oVp9OAk0OGwO7dkJkpExgpKVLv4J13oHd1QwTFleDh6sTwzr6siE7h32M74+xoqznry2M0Cn6NSCSsrTctvU1itHq9TBrccotMItiShx6CuXPh11/hqacsfrrmTRrQrbkXKw+k8NSQNhY/3+XYczKT9r6N7MotyH6v5rpG9+6ywmHcOEDqXwD0amHdcpuQAE9Onj2vZlEViuuE2LRcunjo0G3ZIqsmzMWgQXJWwTTI6HZByFPpYCjqHpqmNdQ0zb3sZ2Rb6UHqanvqO+/Ajh1w4IDsAe/e3eohXEDTZPJCrydz+Sq+35nA7d0DpS5PdcyaBa+/bt0Y6wNGI6xbB/v3y5ebNnG2YWN8+3SzcWA1c1lhQk2TbjUAsbEQEQF9+sA990B8vJWivH6Z0DOQrIJSthyzYJXYNbAsKpmwWRtp/doqkrMLadOsUfnKwkKZLHjkEdsFWEaPHtC1K/z4o9VOeUuoPweTc0k4e95q56wOg1Gw71SWXbWPgEpgmBdNu+BRvCchiw6+7ng2cLJqCCGBHghBZTvE/Hxo2xa+/NKqsSgUimsnNi2PcemHoaTk2u1TqxIfL0uSgSYNnQlq7KZ0MBR1FV9gu6Zp0cAeYKUQYg11sT01NRW+/Vb+7OQEvXpZ9fQ1MncuTcaPpVviIV4c3r7m7f78E/75x3px1Rc0TTrDLFgAQHrL9vwcOoKedjawqMgVCRPedBPExcnk14oVsv35xReVAP01MLBdM7wbOrPEDttIlkUlM2PJAZIr2IT+FpnIsiiTc4q7O7z7rmyBtzWaJrVali612inHdJUV/eEx1fpTWI2jabnkFeut5qhZW1QCw1z88AM89hgIUZ6tCrZ+r1CIyfHkYMU2koYNITGxRi93hUJhn+QUlpKSU8QNsbtlH+iNN5r3BD/8AA88IFvgkFUYyolEURcRQsQLIbqZHl2EEO+Zlp8TQgwTQrQzPWealgshxDNCiDZCiK5CiMgKx1oohGhreiyy+i8zc2a5JoCmydd2QMKE+0h192bO9oU093SpfiOjEQ4fVg4klkDTKjmRrLvlIT4Z9AA9W3jZOLCaqShMqAGBXm58MKFrzcKEHh7yeo+LkzPvOTnl/wsVRGQVtcPJQcet3QPYcCSdnAL7ev9mr42lsLSywGtRqZHZa2Pl58jatVIM2F7o2RN8fC6/nZkI8HKjV8vGhMekWu2c1RFxUubve9tZolQlMMzF1q1SEE/TOJqWS36x3iblNj7uLjRt5MLBik4kmiZFtdLSrB6PQqG4eo6dyUMTRtrs2QIjR8rZWHMydqyc3VqzBoDQIE+Ssgo5l29HNw0KRX0iNVWKGpYN1kpK5Gs7+P7+ZFcKH938GAHxR8orRKqSkAAFBcqBxFKUJTDS04mOO4Ovh0sl1wJ7pEyY8OSsseyYPrR2rgr+/rLSpOw6i4qC4GD45hupjaCoNRN6BFFiMLLygG0HwlVJya7eWCAlu1BWcI0aJau57IkNG2DSJKvZuo4L9edoWh5x6flWOV91RCRkEejlZnefMyqBYS5SUi4IeNoyW6VpGiGBHhyq6kTi52cXN0AKhaL2HE3LQ6CRvSwc3njD/Cfo1UsmN012qqFlOhhVhYAVCoV1mDnzYktJg8HmVRiHU3JZEZ2C7+MPweDB8NprUnyxKocOyWdVgWEZOnWSNrUPP8zLL9xOr5aN0a5nB4+KlUgtWkiRz9BQ2WJS1lqSmiqvSXWPWy0hgR609Wlkd20kl9QDgHoaAAAgAElEQVRHWbJETtiYu232Wjl3Dn7/HTZutMrpxnT1R9Ns10YihGBPQqbVDSlqg0pgmIvU1AsWqhGnbJutCgnw5Hh6PkUVS7NUAkOhqHPEpuXi7uaEz4BeUkDK3Oh0MHq0rMDQ6+ka5ImmQUyiSmAoFDZh1y5ZdVGRkhLYudM28Zj4aF0sHq6O/GtwW6nGHxgo73uqUlgIrVpB585Wj7Fe0KmTfF69mr0+belZnY3t9Uj37lLUdskSmdC77TbprieETO5t327zJJ+9omkaE3oGEnkqi9PnCmwdzgWmjuyAo65y8s3NyYGpI9rLv/PNN4OnndkD33oreHnB999b5XS+Hq70adWElTZqIzmdWUBGXrHdtY+ASmCYD1MFhhCCyIRMm3rlhgR6YjAKjqbllS8cNgyGDLFZTNdCmUpx8PSVhM3aWC7wo1Bc58Sm5fHvvb+jmezyLMLYsdKq8dAhGrk40qZZI+VEolDYiqgoOSir+oiKsllIkQmZbDyazr8Gt5HC5KGh0gmjujaRSZPg5En7G3hcLwwcCF99BcBB3zb0allPEhggqzBuvx0OHpSi9CNHyom5RYtk1ZKdtFrZI+O7B6JpsNSO7p9Hd/XDzUmHi6Ousj6K7qz8DJk40dYhXoyrK9x9t0yw5OZefnszcEuoP8fT84mtOKazEntMHQX2JuAJKoFhHgwGmZELDiYpq5AzubbNVoUEegBVhDyffx7mzLFRRFdPRZViASRnFzJjyQGVxFBc9wghyIg7zaSVC+XMk6UYNw4yMqCbtOILDfIkOikHoZTfFYp6jxCCD9fE0rSRC4+EtSpfoWnyBn7uXOUSYU08PODnnwEIyThJl4B6mChycoInn4QXXpBVF2WaGEVFcN99sgpIUYkALzf6B3uzJCrJbr7b/9ybTF6xgW8f6lNZH2XVKlkdeuuttg6xeh5+WF5j33xjldalUSH+6GzURhKRkIlXAyfaVrS3tRNUAsMcODhI/+oZMy5kq2zZLxTo5YZXA6eLdTDKZnLqENWpFBeWGqRKsUJxHZOaU0TvI7vRCWHZPlBXV2hc/nnVLciLs/nFpOQUWe6cCoWiTrD5WAZ7EjKZMqwtDZwdK69cskROjpgG1BgMsnVkkfWNW+oNqamwZQsAI47/g/PZdBsHZEPKBG/LEhhCSG2CgAB45RXIs/6MtT0zoWcgp84VsO+07Sss9QYjC7aeoFuQJ2FtvSuvnD4doqOhWTPbBHc5+vaFO+6Adeus0rrUzN2F/q29CY9JtXryKTIhi94tG6PT2Z/OjkpgmJnIU5l4uDrS3sfdZjFomkZIgGdlJ5LVq8HNTX4o1CEuqVKsUFzHxKblcdOJCEp8/WT/ryWJiICbboLTpwkNkjN6MYm2v8lRKBS2w2gUfLQ2luZN3Li7T4uLN3jwQejdG6ZOlYPFEyekQ4ZO3VpajJkzEQ4OADgIY/3WfahO8NbREby9YelSec8LcPSoci4BRnf1x9VJx9Io24t5rjqYxqlzBTw1pO3FIrQ6nX2LAGuarDzbssVqrUvjQgM4efY8h1Ot07YCkJFXTPzZ8zZx1KwN6lvGHGzaBMOHQ0ICEQlZ9G7VxObZqi6BHsSm5VGiN324e3lJP+U61B+YmlOIs2P1l2hN6sUKxfXCscRzDDq5D0aPKVditxSNGsHmzbBqFZ38PXDUaUQnKSFPhaI+s+pgKodScnnx5vbVfxfrdPD553Im/N13yx1IlIWqZUhNxbBwIZppMO6oL8Xw7cI6dV9nVqoTvNXrwd0dDh+WyYySEqn/FhwsEx7VCc/WExq5ODKisx9/RadSrLeODWh1CCH436Y42vo0YkRn38or58+H5567ODFlb1RMnlnBJWpUiB8OOo1wK4p5RiaYOgrsUP8CVALDPBw9CuvXk2XQiEvPt6mAZxkhAZ6UGIwcTzeV0PmaPiTqwBedEILfIxMZ8elWjEaBk0PlwZuzo46pIzvYKDqFwjpkHDxGfgMPnMdboQ+0Y0fpHLBqFa5ODnT0d1dCngpFPUZvMPLJumO0923Ebd0Da96wXz945BH49FP48Ue5rIl93vDWdeKfn4a+ysBTr9cTP2WajSKyMZcSvHVxkds4OMhBcadO8Oab0op10iSIibFt7DZiQs9AcgpL2XQ0w2YxbIpN52haHk8NbnPxZO/XX0NkpH1XcZW1LpUlz0pKLF6F0aShMze08SY8JsVqbSQRCVm4OukIsVOdHTu+QuoQKSmg0xFxXvaH2kO5TUigvOAOlbWR1JEERnpuEY//EMnUP2Lo6OfO3y8NZvYd3Qj0ckMDdBo0b+wmhX4UiuuY7VpjZny8HG65xfIn0zSps7FhAxQVERrkxYGkHIzGuqWZo1AozMMfe5OIP3ueV0Z0wOFyFaUffCAF97Ztk68//tjyAdZD9Nt34mKo3ArhYtCj325Bkee6joMDjB8v9QqOHYMpU2D9ejh3Tq7PyIDs+pOsv7FtU5o2crFZG4kQgi82nSDQy41buwdUXpmQAPv2wYQJNomt1lTXumSFKoxbQgNIzCzkQLJ1qmMjEjLp3tyrxkp4W2OfUdU1UlLAz4/IpFycHXUXeshtScsmDWjk4sjBMiHPhg1lWZ2dJjCEECzfn8yIOVvZdvwsr4/txK9PDKBV04aM7xHIjulDOTlrLK+P7cyJjPPsjj9n65AVCotRajASn55LB38P681EjB0LBQWweTPdgjzJK9Zz8tx565xboVDYDUWlBj7bcJzuzb0YXrXEuzp8fWHePMjKkq+VnaVFGPngZ7SaFn7RY+SDn9k6tLpBu3YyuZacLNtKAN57DwID4fHH5eD5OsfRQcf47gFsPJpO1vmSy+9gZvaczGTvqSyeGNQaJ4cq9zZLlshne09gVNe6VFICO3da9LQju/jh5GCdNpL8Yj2HUnLoawcT8jWhEhjmIDUV/P2JSMikW5AnLo4Oto4InU6jc4BHZSvVZ5+FAQNsF1QNnMsv5pmf9/H8r/tp5d2QlVMG8tjA1tXO+tzbrwVNG7kwd+NxG0SqUFiH5IgYdn52PwMToqx30iFDYMQIcHKiW3MvANVGolDUQ3785xSpOUW8OrLDxQJ7NTFzZnmy1QqzkfWRmrS/lCbYFeLmVq4r9dBDcM898NNP0KsX9O8Pv/4q16WmWsUm09rc3jOQUoMg/ID19UD+t/kETRs5c1ef5hevXLJE2rm3aWP1uK6Iiq1LCQnS1vfpp+VyC+LZwIkb2zZlpRXcSKJOZ2EU9qt/ASqBYR4CA9H36sPB5Bx621G2KiTAk8OpuRjKysDffx/uusu2QVVhzcE0Rny6lfWH03l1VAf+eHIAbX1q9ht2dXLgycGt2RF37oLAjML+WRaVTNisjQRPX0nYrI0si0q2dUh2Tf6SFTQtyMG3uxXF8NzcYO1aGDaMts0a4ebkQHSiEvJUKOoTeUWlfLEpjhvbNuWGtk1rt5MNesLrI1NHdsDNqfIEmZuTg9IEuxZ69IBvvpGV1HPmyHaSdevkupkzZVvUdZaM6+zvQQdfd5bus24bycHkHLYcy+CRsGBcq1zHGI3SgvmRR6wa0zXTsiU8/LB0YLKC8Oi40ACSswuJsrBLXMTJTHQa9Ghhe03HmlAJDHPw9ddEvPoupQZhV+U2IYEeFJUaic/IlwuEsJtev+yCEl74NYonf9yLn6crfz13I08PaYtj1ZKyari3Xwu8Gzozd2OcFSJVXCvLopKZseQAydmFCCA5u5AZSw6oJMYlaLR+Lce9m9Oijw2sxLKzcczLJSTQQ1VgKBT1jG+3nySroPTKBsU26gmvb4zvEcgHE7pe0AQL9HLjgwldlSaYOfDygueflzbAc+fKpNzChfK++csv5cD6r78gP9/WkV6aWlSNaJrGhJ6B7Dudzcmz1msT/XLzCdxdHHlgQMvKK1JTpY37f/4j/wZ1jXnzYM0aq7T7Du/ii7ODjvBoy1bP7EnIpEuAJ41cHC16nmtBJTDMRGRCJpoGPe0oW1Um5HlBB+PFF6XTgI3ZePQMIz7dSnhMKi/c3I5lz4TRwc+91vs3cHbk8UGt2Xosg6jTWRaMVGEOZq+NpbC0snJ6YamB2WtjbRSRnZOXR1DMHqK63mD9drT0dGjaFL79ltAgLw6l5FJqsHM7M4VCYRYyz5fwzbaTjOrid6GNrFbYqCe8PlJRE2zH9KEqeWFuNE3ais+cKZMXZfzf/0mh2iZNyq/roqLK29gDM2fC9u2XTR7e1j0QTYOlVppIis/IZ9XBVB4Y0BIPV6fKK8sqXf7zH6vEYnbKHG9SUqQorAXxcHVicIdmrDqQajGR9RK9kf2J2XZhSHEpVALjWklOho4dKV3xFx183fFs4HT5faxE66YNcXXScbCiE0lODhQW2iSe3KJSpv4ezaPfRdK4gTPLngnjhZvbXyzkUwse6N+Sxg2cmLtBaWHYOynZ1V9vNS2v9/z9N44GPSlhQ61/bh8faTe3ciWhQZ4U640cO5Nn/TgUCoXV+d+mOApK9Lwysv2V7XgpO0uFoq5RtSVKCHB2ht9/lxOB3brJ5f/9L/j7Sx2Nn3+2+OD1kpw/D1u2yLiNxsu2cPl5uhLWpilLo5KsYss5f8sJnB10PHpjcOUVZe+1ENJCta62neXkQIcOUhTWwowL9Sctt4jIU5aZwD2YkkNRqZE+rexnQr46VALjWklKgthYTqTn09vO/tiODjo6+VcQ8iyzUj1zxuqxbD9+llGfbuXPfUk8PaQNK54Lu1AhcjU0dHHksYGt2RSbocrc7ZyaBMYa21Gyz54oaNGKb3rfhtPAG20TwNixsG0b3T3l10NMktLBUCiud1KyC/nhn1NM6BlEW5/aV0QqFNcdNbVEbdokkxYNG8plffvK1oeVK+G+++Q99qBBlqvKKEsMgozlhRdg1Cipw9CokYylLO7SUnj77UsebkLPQBIzCy02EC4jNaeQpVHJ3N2nOU0buVRe+eabUFwsf9a0utt25ukJd94JCxbIpIwFGdbJFxdHHStjUixy/IiTUl/QnjQdq0MlMK4V04Wa4OJpl+U2IQGeHE7JlaVGfn5yoRUznOeL9by+7AD3f7sbV2cH/nzqBl4d1dEspfEPDmiJp5uqwrB3Hujf4qJlmgaZBaW8t/KwalGowlGfYN4d9jjtgmz0eTJmDOj1tNi7A083J5UgVCjqAXM3HEcIwfPD2tk6FIXCttS2JWr0aPjlFzkpuGcPvPOOdDEpczgZNkxagi5YIN0qKnI5rYqMDAgPh48+gsmTISwMvL3LJyB37ZIVC+npcOONMHUqODqWx63Xy/XHa74/HtnFDzcnB5bss2wbyddbTyIEPD6odeUVBw/Ct9+WJ2VKS+u2+O+//y1/h9mzLXqaRi6ODO3ow6qDaeUmDWYkIiGT1k0b0szd5fIb2xCVwLhWjhwBwKA52GcCI9CDvGI9pzMLrJ7A2B1/jtGfbeOn3ad57MZgVk0ZaFZFW3dXJx67MZj1R9Ir28Uq7IrIU1m4OGr4e7peEB6bPTGUBwe05OttJ7nv692k5xbZOkz74PRpzv69GZ3RQEc/D9vEcMMN4OWFtmoVoUGeyolEobjOic/I5/e9SdzXryXNmzSwdTgKhW250pYoBwfo0wfeeAM+/FAuMxqhXTvYuxeefBKCg6FjRykMCuVaFc8/L5Mgb70FkybJQT3A6tVwyy0yMREeLpMTkybJShCAl16CvDzYt09awObnlydOyjAaYcCAGu/5G7o4MirEj/CYFIqq6JSZi8zzJfyy5zS3dg8gqHGFzxYhYPjwi6tV6rL4b5s2cP/9MH++xSvdx4b6k5FXzO6T58x6XKNREHkqy+46CqrDfuVF6wp//IEAnjiyjgCvZ20dzUV0CSgX8mzVqpX8kGxnmRmWZVHJzF4bS0p2IQ1cHDhfbKCldwMWPzGAvhbyEn4orBVfbYtn3sbjLHigt0XOYW9UfJ8DvNyYOrKD3Qp57Y4/x/oj0iL36SFtK627o3dzerVszPQ/DzBm7nY+v7cH/Vt72yhSO2HRIoa/8w7+L/5MUOPqW28sjqMj/PgjtG9PaLyB+VviKSo1XGx7plAorgs++fsYLo46nrmp7eU3VigUl0enkwNZIeDoUWlRvnatXJ6aKisPjEb47Tf50OlkkiM9Xe4/ahTs2CGTHk2quX92da38urqqEYDMTDkpsXZttff+E3oGsjQqmY1H0xnT1d8Mv3hlvttxkiK9gaeHtKm8QtPAw+Pi5EpdF//9979lQmrDBrj3XoudZmhHH9ycHFgZk8oNbWppd10L4jLyyS4otcsJ+aqoCoxrITUVceAAGjAuap1dlj2193XHyUGTQp5NmsieuC5dzH6eqlaZ54sNOOg0nhnSxmLJC5CKvI+GBbP20BmOpOZa7Dz2Ql2yJBVC8P7qo/h7uvJoWHC129zWPZDlz4bh4erIfd/sZsGWE1YRlLJbwsM5HtyFZq2bo9Npl9/eUowdC+3aERrkhcEoOJRy/f9vKRT1kYPJOYTHpPJoWLDdlwwrFHUOTZPC2C+8IKsqHn64coWBoyPcdZcU4YyLg6Em8W4fH5l4qC55UR01VY3s3i0rNbZtq3a3G9o0xdfDxSJtJHlFpXy3M4ERnX3LdXXWry8XuoyNvf7Ef9u1g8REiyYvQLoxDuvkw5qDaejN2Ia9x6R/Yclxm7lQCYxrIP75aZSa+o+EwUD8lGk2juhinB11dPBz51CZlWp6unROMTPVWWUajILPNsSZ/VxVeTQsGHcXR+ZtvP61MOqSJemqA2lEJ2bz0vD2l5y9b+/rzvJnwxjZxZcPVh/lX/+3l9yiUitGaiekpUFkJOta9aLjFdgKW4zFi+kbtQVA6WAoFFZkWVQyYbM2Ejx9JWGzNlo0Qf3Rulg83Zwu7k9XKBTmp6rDiV4PK1ZAtoW+Y/v0kYmCRx+Vr6ucx0GncVv3QDbHpnMuv9isp/5592lyi/Tl1bc//yw1thYvhoICs57LrvDxkc9l1TQWYlyoP+fOl7Ar3nxtJJEJmTRzd6FFHWglVAmMq2T1un0ELF2Ms0EPgItBT8DSX1n9t/1lDkMCPDmQnCNntocPh2eeMfs5km1olenZwImHw1qx6kAasWnXr+Wj3mC06ft8JZTojXy49igd/dyZ0DPostu7uzrxxb09eWNcZzYeTefWedvrRUVNJVatkk8tetHBHhIYc+bQeN4n+Li7KCcShcJKWLPKbs/JTDbHZvDUkDZ4uilXKIXC4tTkcGJJ3YeyKo69e2Wbyk8/VVo9oWcgeqMgPMZ87hlFpQa+2X6SG9s2pVtzL/j4Y+nUEhYGW7dCA/sfIF8Tc+ZITQwLWusO6eBDQ2fZRmIuIhKy6NuqCVpVPRU7RCUwrpLCN99GE5U/hDRhpOCNt20T0CXoEuhJdkGpHPz6+Zm91eX3yMQa19VkoWluHg0LpqGzA59vsnzFhy3IyCvmgW/31LjeWu9zbfllz2lOnStg2uiOONSyFULTNCbfGMwvT/SnoMTA7f/bwR97kywcqR2xbh3Fvv4c9gm2jwTG2LEQEUGYh5FoVYGhUFgFa1XZCSH4cM1RfNxdeGhAK7MeW6FQ1EBtHU4sQdu20L27FJr85JMLizv6edDJ34MlZkyS/rE3iYy8Yql9MW0avPKKFCFdswa8vMx2Hrtl5EjZFvTxxxY7hauTA8M7+7LmUJpZ3PySswtJzi6kTx0Q8ASVwLhqOpw8hIup+qIMF4OejicP2iiimgkJkG4GB5NzzZ7A+L9/TjH1jxg6+DbC1any5eTm5MDUkR3Mdq5L0bihMw/e0IrwmBTi0q+vKozIhEzGzdvGvtNZ3NO3OW5V2jE0DV4e3t5G0V1MXlEpn204zoDW3gxp3+yK9+/Tqgkrpwyke3MvXvk9mhlLDlhMIduu+P57Vnz4HWia7RxIKjJmDAjBmKQo4jPO18+2HoXCytRUTZecXciT/7eXLzefYOeJs+Rd4//jpth0Ik9l8dywdrg5K4FehcIqXKnDiTnx9JQJhDvugJdflg4npmqQiT0DiU7M5kRG/jWfRm8wsmDrCbo192JAG28ICSl3W3GpJzo7nTpJbZPPP4ezZy12mnGhAWQXlLI97trPEZkg9S961wEBT1AuJFfNEy9+XW05f6CXGztsEM+l6OTvgYNO41BKDqPKEhhCXGy5dIV8sy2ed1ce4eZOPnx+b0/WHEyzqTvG4wNb8/3OBD7fGMecu3tY7byWQgjBwh0JfLDqCIGN3VjydB+6BHjSL9j7wvvs1cCJrIJSMguqUZ+2EV9tjSfzfAkzxnS86jK0Zu4u/Di5Hx+tO8b8LSc4mJzD/+7reX1b/Lm48I+rL83cM2jS0NnW0UCPHuDvT7eYndAthINJOdzQ1nxq1wqF4mICvNyqvbdwc3LgaFouaw7JCQhNg7bNGhEa5EX35p50a+5FRz8PnB0vPy9lNApmrz1GiyYNuKt3c7P/DgqFwk5xcYFff5UJhY8+kqL+Dz/Mrd0CeH/VEZbuS+aVa5x4DI9JJTv1LJ921cl7wAcekI/6xhtvSL2PTz6B99+3yCkGtm+Ku6sjK2NSuamDzzUda8/JTNxdHOnkbwcTaLVAJTCukqkjOzBjyYFKpZ7WrDi4ElydHGjbrBEHk3NkBUZxsRTyaXz1ZUJfbIpj9tpYxnT1Y85dPXB21DG+R6BN7TybNHTmgf4t+XpbPFOGtaN1s0Y2i+VayS/WM+2PGFYeSOXmTr58PKnbhR7liu+zEILHf4jko3WxDO/sS0vvhrYMmzO5RXy9LZ5buwUQGnRtZYKODjqmj+5IzxZevPx7NOPmbWfOXd25qeO1fUjbJZ9+Cnl5xDa+yT4EPEGOkMaMocn+aBCCaJXAUCgsTk33Fh9M6Mr4HoFknS8hJjmH6MRsohOz2Rybzp/7ZKuds6OOzv4edG/uRbfmnnQL8qKVd8MLjkZlFtxlCZL7+7eoVcJDoVBcRzg4wLx5MGgQTJwIgI+HKze2a8bSqGReGt7+ql3QjEbB4uW7Wbb4NVp/cwZuuwm8vc0Zfd2hc2e480747jt45x1wMr/OkIujAyM6+7H2UBrv3R6Ci+PVV9NFJGTSs2XjWrd92xqVwLhKygaQtqw4uBJCAj3ZejwDbhsOX3991f9IQgg+/fsYczfGcXuPQGbfEYqjg/3cAD02sDXf70rg801xfDKpu63DuSqOncnjyR/3knD2PNNGdeRfg1rX+GWiaRozx4cw4pOtTP/zAD8/3s+m4juf/n0Mg1GYNZE3oosf4X7uPPnjPh75LoIpQ9vy/M3t68yHbK348ktEm7Yc79WHB/q3tHU05XzxBY4uLrT4cJNyIlEorMDl7i0aN3RmcPtmDDa15wkhSM4uJDoxh+ikbPYnZrM4IpHvdiYA4OHqSLfmXrg66thy7CwlFXql/9ybRO+WTez2vkWhUFgITZOaFAApKfD889zz1Bs8dSyDPQmZ9G99dUmHf1ZuZ/anT+KrL0BbuqT+Ji/K+PhjcHW1SPKijHHd/PlzXxLbjp3l5s6+V3WM7IISjp3J59ZuAWaOznKoBMY1YOuKgyshJNCDP/clkd6iLT4hIVd1DCEEH6w+yldb47m7T3Peu72r3Q0im7m7cH+/lizamcCUoe1o1dS2FQlXyvL9yUz/8wANXRz46bH+sn/wMvh7ujFjTCdeW3qAxRGJ3N23hRUivZjjZ/L4LTKRh28INnurR0vvhix9+gZeX3aQuRvjiErM5rO7e9hHq8W1cuwYHD/O2UefpDjbaB8CnmWY+lVDgzyJOq0SGAqFNbiSewtN0whq3ICgxg0YG+oPyB70uIx8ohOz2Z8oqzUOV+PqVFhqZPba2DpzH6NQKCzA4cMQHs7I/dG0H/UaS/clX1UCQ+zYQdd7xlGq6dA2b4Y+vc0fa10jyOTCJwSUloKz+e9Zw9o0xdPNifCYlKtOYEQmZAFSg66uYD9T5wqLEhLoCcChU2ellVJKyhXtbzQK3lpxiK+2xvPggJa8b4fJizKeGNQaR53G/zbXHUeSEr2Rt5Yf5Plf99MlwIOVUwbWKnlRxt19mtO/dRPeW3WEM7lFFoy0Zv675igNnR15dmhbixzf1cmB2XeEMmtCV3afzGTc3G1Enc5iWVQyYbM2Ejx9JWGzNlrEbtCirFwJwMHuNwLYh4BnRWbN4vVZ/yI5u5CzZvaJVyjMjaZpDpqmRWmaFm56Haxp2m5N045rmrZY0zRn03IX0+s40/pWFY4xw7Q8VtO0kbb5Ta4eRwcdHf08uKtPCz6Y0JVVzw+kpm9re7PgVigUVubmm2H9enTnzvLHj1OJ+3vHVQmnp/zwGxnOjdiyaDmOKnlRTlER9O8P771nkcM7O+oY1cWPvw+fuWrB+4iETJwddNLyto6gEhj1hE7+HmgaHDuRBr17w2+/1Xpfg1EwY8kBfth1iicGteadW7tcdX+cNfDxcOWevi1Ysi+ZxMwCW4dzWVKyC5m0YBff7zrFYyYbUV8P1ys6hk6nMWtCKCV6I68vO4gQwkLRVs/u+HOsP5LOUze1sWhVhKZp3N23BUueugGdTmPilzuZ+kc0ydmFCKRS/4wlB+pWEiM8HLp0IcrBC50G7XztTLvFxQW/A5EE5ZyxXBtJaioMHmx2i2dFveR54EiF1/8FPhVCtAOygMmm5ZOBLCFEW+BT03ZomtYZuBvoAowC/qdpWp236ajJatveLLgVCoUNCAuDbdtwcXVm0XevELF4Te33zZKz9zN6383kpz5n9G1hFgqyjuLqKisxPvtM6g9agHHd/DlfYmBzbMZV7R+RkEnXIE9cnerOV51KYNQTGrk4Ety0IXtzhCxhquVAQW8w8vJv+1kcmciUoW2ZMfrqnSWsyVND2qCrA1UY245nMHbuNuLS8/nffT15fVxnnK5SU6RV04a8NLw9fx8+w6oD1hsICiF4f/VR/DxceTQs2CrnDAn0JHe52FsAACAASURBVPy5G3Fy0FFqqJysKSw1MHttrFXiuGaEAB8fuOsuYtNyaeXd0P6+QMaMAWBofCTRiTmWOcfMmbB9u3xWKK4STdOCgLHAN6bXGjAU+MO0yffAeNPPt5leY1o/zLT9bcCvQohiIcRJIA7oa53fwHJMHdnhIgtuexUeVygUNqBLF5z+2UVE+94szqnFJJoQ8NZb0KULRyKOsPVEJpOGh9rfPYw98OabkJMjkxgWYEBrb5o0dCY85sqq6wGKSg0cSM6pU+0joBIY9YqQAE8OpeZJJ5JaJDBK9Eam/BrFsv0pTB3ZgZdGdKgTyQsAXw9X7u7TnD/2JpGUZX9VGEajYO6G4zy4cA/N3F1Y/mwYY7r6X/NxJ98YTNdAT95acZCs89axVl11II3oxGxeGtHeql9cXg2cKdEbq11XZ8qiNU16o7/xBrFpefalf1FG+/bQpg1jE6MsU4GxY4cUFjYaYcEC+UX/xx8XZnUUiitgDvAqUPbB4A1kCyH0ptdJQJngQyCQCGBan2Pa/sLyava5gKZpT2iaFqlpWmRGxtXNelmT8T0C+WBCVwK93NCQlu9lziYKhUIBoGvZgogPF7A6uZizZ3Pgzz+r31CvhyeegP/8B0aP5vPDubi7OnJ/f9tosNk93brB+PEwZ45MZJgZRwcdo0L82HAkncKSK2sjiTqdTalB0Df46p0pbYFKYNQjQgI9SM4uRO/VGFasuGQSo6jUwNM/7WXVgTTeGNeZZ26yjK6BJXlycBsA5m85YeNIKpNdUMKj30fwyd/HuK1bAMueCaONmSxfHR10/HdiKNkFpby78sjld7hGSvRGZq89Sgdfdyb2DLL4+apS58uiTeWEBSV6TmUW0N7XDhMYmgZjx9IzLopj8WeurT3JaISoKOk/HxMjl33wgbwZAjAYZBXGnXdComkM+f33EBoKt94KU6ZIy9mlS6GglolJ1Z5SL9A0bRyQLoTYW3FxNZuKy6y71D7lC4T4SgjRWwjRu1mzZlccry0Y3yOQHdOHcnLWWHZMH6qSFwqF4iIm9AzEYBTEvzkL7rgDXn9dVluUUVAAt98O33wDr79O3PtzWHX0LA8NaIW7q+XcNuo8b74p7/m++soihx8X6k9hqYGNR9OvaL/IhEw0DXq1UBUYtUIJbVmfkAAp5Kk/lylnN2so1y4sMfD4D5GsP5LOzPEhTL7ROm0B5ibAy407ezfnt4gkUnPsY0Y+JimbsXO3syPuLDPHh/DpXd1p4GxeM6DOAR48ObgNf+5LYssxy84M/rLnNAnnCpg+uqNNRF2rK4t2ddLVjbJooxE6doRXXuH4mXyEgI72WIEBcNdd7Bg5ifO5+bSeserKxFILC+UX9l13ga8v9OwJU6fCpk0yubBhQ+XtXV3h77+hg+lv2KQJBAdDQgIsWgQvvQQTJkCxSVB01izo0UMue+klmDsX/vpLvr+g2lPqD2HArZqmJQC/IltH5gBemqaVfcgGAWU1tklAcwDTek8gs+LyavZRKBSK65r2vu6EBHrwXvuRMHmyFJ98/HE5qTB4MLzyCqxaBV9+CTNnMn9rPC6OOh4Ja2Xr0O2bHj2k5tmUKRY5fL9gb5o2crniNpI9CZl08HXHs0HdSj7ZsgJDCW1ZmS4BnjTLz8Qp3TQTuWgRnD5daZv8Yj0PL9rD9rizfHhHKA/0b2mDSKvhKmdRnx7SBqMQzN9s2yoMIQQ/7z7NHV/uQgjB70/ewAP9W1qsJefZoW1p06whry05wPli/eV3uAryikqZu+E4A1p7M6SDbWYgy8qiQ3UFLP55Os3ys2jn04jbutcBL+s1a+DMGQgOJvZMHoB9tpAAy9xa8q9u95Dt5nF5sdSMDFi8WLaBADg4yMTCjh0wdiz88AMkJ8Pzz8ukgrFKG5DRKCssTBau3HILLF8uKzZyc+HcOemk1NhU7ujvDwEBEBsL8+fL495zj6wcSU2VyROjUc4WJSRY6i1S2BghxAwhRJAQohXy3mCjEOI+YBNwh2mzh4Dlpp9XmF5jWr9RyPKiFcDdpsmTYKAdsMdKv4ZCoVDYnAk9gohOO8/xdz+RFRjffguDBsnJgNJSef/y5JMkZxeyLCqZu/u0wLuRi63Dtn/GjpX3NhYQ2nfQaYzp6sfGo+m1vu/XG4zsO5VV5/QvwEYJDCW0ZRs8Gzjx2t7fMZb935SWQuvWMGoUfPgh+Tt38/DXO4k8lcWcu7ozqXfzSx7PqlzlLGpQ4wbc0SuIXyISrWovWtHa84YPNjBp/i5eW3qAfq2bED5lIN0tbFXk6uTAfyeGkpJTaDFBy6+2xnPufAkzxthW2HV8j0BWZG+iX/JhFiWt4UByLkv21QEXkjfflM/79hGbloerk46W3g1tG1MNzF4bi6G4hJuP72LxT9Nolp9VWSx10yY5K9O9uxQlvfvucrEqZ2c4elTO3nz3HTzwgEw4AOzaBSVVtFpKSmDnzuoD0TRZkdGzZ/myhx6SVrSHDsH58zIptHOn3Lbi50VJiazq+Ne/4J9/zPK+KOoE04CXNE2LQ2pcfGta/i3gbVr+EjAdQAhxCPgNOAysAZ4RQlydN51CoVDUQW7tHoCDTmPJ/hT5Pfr++3DqlJwM+Okn6NoVgK+3xgPw+KDWtgy3brF6tbyHycsz+6HHhQZQrDey/siZWm1/JDWP8yUG+gSrBEZtsZrQFtQ9sS2LkZrK2L3rcNKXytdlfecnT8K0aTQK6883U8fy7VBfbuseKAcDVrbjrMTZs7BxI7zzTvks6qJFsgpj2TJZvvbHH7BlCxw+LLevhqeHtMVgFCzYEl/9eczcI78sKpkZSw5QkpTMrz9PpzQ5lYhTWYzs7Mt3j/S1qM1oRXq3asJDA1rx/a4E9p7KNOuxz+QW8fW2eG7pFkBokA18o3NzpY7LM8/IRMCiRWA00mXNHwz3MvL2ikMk27OQZ2Ii7Nsnf/7lF9JiE2jn426TNpzakJJdyMSDG/hmyXv0STrMf/7+Hw9HrigXS/3f/2DePJlceO89mSDYtKn8AEFBMqFQlago+RlT9REVdXWBappMoISGyv/rRYukrkYZBgP83//J2SSQ5zp58urOpbBbhBCbhRDjTD/HCyH6CiHaCiHuFEIUm5YXmV63Na2Pr7D/e0KINkKIDkKI1bb6PRQKhcIWNG3kwqB2TVkWlYzRKOQ9i6OpE8+kVXUuv5hfI04zvkcggXVFd8weaNoU9u+Hzz83+6F7t2yMr4cL4TGptdo+IkGODfq0qlsCnmCDBIa1hbagboptWYSZM9GJKuXaDg4UDrqJe99ewku3TSV/4iSGDDPNbr7wgpwpve8+WLjQcuXXJSVw4IB0YyhLmEyZAs2awbBh8Pbb5YOQMpG/BQvg6ael2N+QIdClCwwYUH7MyZPl8jvvpMUbrzD/+HKyF35Pep6pCiM+XiYs9Hqz98jPXhtLYamBKTt+oU/iIZ7b+QsAB1NyrT5AnTqyAwGebrz6RwxFpeabRJyz/hgGo2DqCCtrTcydK8sYvb3httukwOOyZRfaELTiYr78eDI3HN/DK4v3yy9ee+Txx8uvdYOBwb/Nt9v2EZB6Mgd9pCiuDsHoY7t4c8NXhDiYEhhz5khdnY0b4bXXoF+/8psdW1Fde4qDg/w8K/tf37tXVqGFhcn2k0zzJvoUCoVCoaiLTOgZRGpOEXv/OSQnA0pNk58lJbBoEYv/iqBYb7wgmK+oJX36wOjR8PHHkJ9v1kPrdBpjuvqzJTaD3KLSy24fkZBJUGM3/D3rXgLKFhUYSmjLVuzahaO+ygVdUkLyqg3s07syYfarBP34bflM6ciRcNNNUmRv8mQppDd0aPm+1f3jXaqaoWx2FWDbNllK3q0bNGokZ0zvvbdck2PMGOlU8MsvUtSvQrwsWiQrMlJTIToa1q+X273/fvl2Xl5y8HLwIPz2Gzf/+TWT9q66UO7GmDGyd97JSVZylFk4lsU9diwMHCgTKKNHy8HynDnlx3/uOXj2WdnbP326rAJYuRKA5KwCntz1G3fHrEOHYFLM3zTLO2cTa8+GLo68d3sIJzLO88WmOLMc8/iZPBZHJHJ//5a08G5glmNWS2KinCl/7rnyZTt3SgXsMhHIQ4fg+PFKbQiO586y4Jc3mfbOw6z7eJFtq4jKyM6WbhtffCGv2y1byteVlHDLvrX0cLJei9OVMnVkB+4/9Dd6TX5llGoO/N71Ztp0Nd24BAZCAwteC1dDTe0pkZHSShqgRQv473+lrdlTT8nPhIkTpUaHQqFQKBT1lOGdfXF3caTknf9cNBkgDAaafPJfRnXxo62PeVz06hVvvSX1vL74wuyHHhcaQInByPrDl24jEUIQkZBJ3zqofwFg9SkyIcQMYAaApmlDgFeEEPdpmvY7UkjrV6oX2tpFBaEtTdNWAD9rmvYJEIAS2ro8UVH8sCuBN5cfAsDXwwW9wUhRqZEfHulL36o9UHfcIR9CyBaNjRtBZ8p5CQFt28pSqKFD5UB/8ODyaoa335Ye0TEx5Y/oaFn2P2CAHCBs3iwTF2PGyOeuXeVACKQux6hRssqi6iyqwSCdB774onwgUpWPP670UjMYWP7DLpb9c5p/DW5D0w8/LO/J37evsmPBF1/IpEpRkRzw5OfL5/QK1kR//VW+vKQEiovJe/QJpmX74Wg0MH3rDxc2dTWUsn3+o/xvzJPAWBl/RkbNsZuZIR18mNAzkC83n2BMV386+Xtc0/H+uyaWhs6OPDe0nZkirMD+/fJvsnat1E0AWQX0n/9I0caffpKz6GVUd304OSEGDCDo4DEC33mF43eOo10rH/PHWhtSUmTia/582e/4wAMy6VIlZp0wctPvC2B8P9vEeRnG++kwHFyPg6mCy0kYGH90Gx9tP8TiNt7c1ccOvd9r04bi4wOvvioTYvv3S4HRlStlKwxINxRPTzljYkOdF4VCoVAorImrkwOju/rRZMHeiyYDtJISup4+TJchbW0UXR2nXz85SfzRR3IytKH59M96tvAi0MuN8JhUJvQMqnG7hHMFnM0voXcdTWAghLDZAxgChJt+bo1MQMQBvwMupuWuptdxpvWtK+z/b+AEEAuMrs05e/XqJeorS/cliY6vrxYtp4VXenz6d+yVH6yoSIhZs4QYMUIINzdZW6FpQjg6yp9dXMo72t3chOjTR4jJk4WIiZH7G421O0/37tV1yMvlV0hcep4Inh4u3l91WC5ISRHC1bXycd3chEhNvaLjni8uFR+tOSLavxYuOry+Srw6d7UocnCqdNxSTSci3v1M7rB/v1zeooUQd9whxOzZQmzZIsT581f8O9WWzPxi0WvmOnHLvG2iVG+49MYpKUIMGlTt+/DPibOi5bRw8fnG41ceRNXjGgxC7Nsnr6MTJ+SyH3+Uf5ORI4X4+GMhDhy49LVyiesj/WyumPTMAjHms62iuLBYiEmThFi9uvbX3rUyb54Qzs5C6HRC3HOPEFFRl4y5pGuodeK6Gp56Sv4uFeI1OjuL9TdNFK2mh4u/opNtHaH5qHh99Owpf98OHYR47z0hTp0qX3eJ/5P6CBApbHg/YctHfb6vUCgU1y+7TPd8y6KSLiwrLNGLXjPXifu/+ceGkV0H7NsnxIoVFrknfTf8kGj72kqRfb6kxm0W7zktWk4LF8fP5Jr9/OakpnsLW9qoIpTQllUp02aoyu+RSVd+MBcXmDZNzpRnZcmS+J49y2cphZDZxdhYOfO8Z4+0MTQpF9d6NtOMIn9tmjXilm4B/N+uU2SeL6m+R75MY6MWCCFYvj+ZoR9tYd6mE4zqGsDGl4fw3yMrcKyidaE5OtI7xeTY4OMDn3wiK1EiI+Xs7+DBsHWrXH/okHyvDhyoLEBYkSsUHm3c0Jm3b+1CTFIOC3dcRrSwBk0QIQQfrD6Kn4crj4YF1+q81R73vvvg/vtluX7PnrIFZ/t2uc3EiVKHYM0a2Z4TEnLpa+US10czb3ceefJWDqXk8uPPG6Ww5OjRcMMN8roVFmgtiYiAJNP/U7du8NhjssXl55+lQ0c1MU/7PZqe/1mHY/R+88djLqppx9BKSrgpM44+LZvwwq/72XQ0vYad6xgVr7cNG+Drr8HXF/79b2jZEmbMkOvMrJ2jUCgUCoU90bdVEwK93Co5u/0emcjZ/BKeVtUX10aPHtIm3gLVneNCAyg1CNYernmMsCchk8YNnGjTrG62ANlYZU1hTWrSYLhmbQYXF2jXTg68K4r8bN0KHh6VS/5tzHND27IiOoVvt8cz9UotHCsQk5TNO38dZu+pLEICPfj83h7lZVi7duFQWvm4DqUVjuvvDy++WL4yPV0meG64Qb4OD5eDepBlZb17Q9++cgDl6SmXVxw8XaqHrqREJpD0esZ29Wd55xQ2LFzO+JP++Oj0sg0mL0+2szz4oEyMlDm+zJ8PcXFSjLFPH1ZP/Bf7E7PZ/s883Fa+KQVQDQb5GDVKajyAbAfKzZXLy7a5/XZZnm80ylYkb2+5z8iRcPPN8j2BynonZmBUiB8TewbxblQSPTbsocfG5dIlY9Qo6N9fCoD6+l7bSYSQrQazZkldjhdflAmqgQPl4zIcPZNHB193m1rRXpYaEoY64NuiUu79ejdP/riX7x/tS//W3taNzZJ4eckk1GOPSbeSH3+U/4+pqVLY2GiUOi1vvGG1ljCFQqFQKKyBTqcxvkcAX24+QXpeEY0bOLNgazw9WnjRv3UdbT2wJwwGqaEXFCR1uMxEaJAnLZo0IDwmlUm9m1e7TWRCJr1bNbHve89LYNMKDIV1CajB5qim5VfENVYzWIu2Pu6M7erP9ztPkb1j9xVXd6TnFTH192hu+2IHp86d58OJoax45sbKPWRXWjXi4wPjxslkD8iKjNhYOeB/5BEoLJQCo2Uiia++Kl+XCY+OGgUPPVR+vLvukj38zs4yudS0KYwahaZpvDs+hNf/XoDPw/fKhMXTT8tKmq++kvtW/DsajdKl4cwZDNk5fLjmKO19GxHY1F3G0rixHPw3by7PUUa/frI6ZMQImV2eOBFOnCg/rpMTTJokB4MPPFCevLAQb93aGX9PN15cepiChx+VFRELFsj3qMyVKCHh6ioy/vgDevWSiZhjx2Q/4zvv1Hp3o1Fw/EyeXTuQXA53Vye+f7QvLZo04LHvI4lOzLZ1SJYhOFgmKkaPlv8nZdVRxcWyuua338qtqRUKhUKhuA64vUcQRgEr9qfwV3QKSVmFPDOkbZ0d+NoVDg6we7e8bywoMNthNU1jbKg/O+LOyorzKqTnFZFwrqDOCniCqsCoV0wd2YEZSw5UaiNxc3Jg6kgzWGFeQzWDtXluaDvCY1JZuP0kL9XSBrRYb+C7HQnM2xhHsd7A4wNb89zQtri7Opk/QJ0O2reXjwcekMv0+nJbyk2bypMBBoNsQwkLK99/wACZFGnUCNzd5XNAAAC+Hq7smz2PaX/H8tS4btwS1l5u4+YmZ5UXVXHtKCiA8HB+OllEwvJDLHq4D9qLv186/q+/rvw6NVVaVZZdH6WlUqjzzTetMmvt4erER3d2495v/uH9VUd4d3xXKTD7xBNyg5wcWcrXqZMUnx0+/NIlfSUlMjkEsGqVfI8WLpStMWXLa0liVgEFJQY61uEEBkCThs78+Fg/7pi/k4cW7WHxEwPqdFLmkpT9n1RMVqSny8Rh69bS+cjt6pPCy6KSmb02lpTsQgK83Jg6sgPjewSaIXCFQqFQKK6Mtj6NaN7YjVmrj6I3Chx1GnmFl7foVNSSt96CQYPkROILL5jtsGO7+vPl5hOsPZTGPX0rC61HnMwCoE9V84Y6hKrAqEeM7xHIBxO6EujlhgYEernxwYSu5rk5NqNWhaXp4OfO6BA/Fu1IIOcyH8JCCNYfPsPIT7fyweqj9AtuwtoXBvHamE6WSV7URFnyIjVVDpAqUlAgKwrKeOEFmDdPtnS89hpMmSLdZEyMumc4ngP68FpMIWluXrJNRaersYqm5K23+Wz9cfq3bsKQDs2uPHY7qM4Z0MabyWHB/PjPaTbHVtFqcHOT7R9JSbKSIiwM1q2T129FrZHsbGnV27y5TBqBdBg5fFhWylxh8gLgaFoewHUx2Pf1cOWnyf1xcdRx/7e7OXXuvK1DsgzVXc9OTuWVUGXJi6++km0nV8CyqGRmLDlAcnYhAkjOLmTGkgMsi1K2rgqFQqGwPsuikknLLUJvlJNbeqPgtWUH1feSuRg4EG66SVq6F15jS38FugR4ENy0IeExKReti0jIxM3JgS4B1+ZKaEtUAqOeMb5HIDumD+XkrLHsmD603s7sPTe0HXnFer7bkVDjNnHpeTy0KILHfojEQafx3SN9+PbhPrS2peCNGZIBmqbxwYSulBqNvL7sIKKs4qKGKprsDVs4d76EGaM7XV3JoJ1U57wysgPtfBrx6h8xZBdUiMfZGf71L9laMn9+eSIjOlq+r9u2ycFpixZSh6RnTzlgBdn2o7v6j9FYUwKjvW/dT2AAtPBuwI+T+6E3GLnvm92k5pjvy9huqOl6TkuTVUUgf372WWk1feedcp9a8N81Ry8SWi4sNTB7baw5IlcoFAqF4oqYvTaWUkPlFlv1vWRm3nxT3jdUrWC+BjRNY1yoP7tOnCMjr7jSuoiETHq08MLJoe6mAepu5ArFNdA5wIMRnX35dns8uUWVqzByCkp5569DjJyzjajTWbwxrjNrXhjEkA4+Noq2AmZKBrRq2pCXh3dg/ZEzrDyQKhdWU0VzJqeQwfd8yrhQf7o197q6mO2kOsfVyYFP7+pO5vkSXl928OINXFzKExnLl0t9j7KWmuhoGDZMxrx6tXQYMQOxaXm0aNKAhi7XTzdfO193fni0H9kFpdz/zW7O5Rdffqe6RG2uZz8/iI+Xejbr10uB3gEDpNBxNWQXlPDp38dIzSmqdv01Cy0rFAqFQnEVWMwAQFHOkCHw+uuylcSMjA31xyhgzaFyN5K8olKOpObSpw7rX4BKYCjqMVOGtSO3SM+NszYSPH0lN8zawNQ/ornp4818tzOBSb2bs/mVIUy+Mdh+spRmTAY8EtaKbkGevLX8EFnViPwAzFl/DL3RaB6dFDsgJNCTF26WGijL99dQ/ujiArfeWrnaxclJ6oiUWaGaiaNpuddF+0hVugZ5svDhPiRnF/Lgwj0XJQnrBUFBsjUpMVG2dJ0/X+54ExsLublk5BXzweojhM3ayGcbjuPqWP3njFcDK7arKRQKhUJhwqIGAIpyZs40+z1mB1932vo0Ijy6vI1k3+lsjAKVwFAo6ipx6fnoNMgt0iOAlOwifo9MwsvNib+evZEPJnTFu5GLrcO0GI4OOmZNDCWnsJSZ4YcvWh+XnsfiiETu69eSlt4NbRChZXhycBt6tPDijWUHa25xKBNqrCg8umiRLPEzE0WlBhLOFdR5Ac+a6BvchPn39+LYmTwmfxdBYYnh8jtdjzRqJNtJoqMvuPWU3Hc/xX4BhN98N6tW7GJoJ1/WvDCQWRNDcXOqbDut0yCroJQvNsWVt3spFAqFQmEFpo7scNH3ktkMABSViY+HyZOlLoYZ7jfL2kj2JGRyJldWeEaczMRBp9GjxVVWVdsJKoGhqLfMXhuLsZrxQLHeQEigp/UDsgGd/D14ekgblkQlXyRuOev/27vz8KjKs4/j3zsJJBFCcAFZBImACEIERbTWBdGKVYsLiGhfa91xaa0tIpS2al2KoqKvFRW1pq9tFUVEcQGxLiBugGFHJLIIYReiICSQ5Hn/OCfOTJhAtlky8/tclxeZZ845c+d2MrnznGd5exlNGqfxm36dYhRdZKSlpjB2cE/2lDmGT1xAebg3QRQWHi3YtIOycpeQIzAq9O3SkkeH9GLu6m1c9/wcSkqTtBMDwIzV3/7AiFcWMDj3f5h6xPH8au4bzBh/LY9Nuo+jCpf/uNBybspOJvxnBD1Sd/HAwFwGHNOGMdOWMXLSQvaUle//tUREROpBRDcAkFArVni72s2aVW/15nm5rXEO3vKni3++aivd2zRr8FOX1YEhSavqeX3h56Enqpv6daJTy6aMenURO0q8rSE/X7mVd5duZGjfjgk5CqXDIU0YdW5XZi7fwr8+W733AVFYeLRiAc8uCbKAZ1XO6dGa0QNzmbl8C7e8MI/SJPwDfPnG7dw6YR6nP/gBk/IL6THgDI6b+Sapq1Ziw4d762T4O9tccHQLXt/6X04oXMKUovcZ1Lsdj1zSk5tP78SLs9dw9T/nsL0uU3KCd9YRERHZD20AECXdunkLwzvnLei5dm2dL9mpZRZHtcrizQXrKSktY96aInrX9/SRGNQVDbv7RaQO2jTPpDBMJ0ayzetLT0vl/oG5DHryY254fg4rtvxAYVExKQYtErDzosIvT2jP9CUbue+tpfy00yF0DN5dJsILjE7OL+SO170FHa947nOG9z8qoQuCwb3bsaO4lL++sYTbX1nImEG5pKTUYkebBmZR4Xc8/n4BUxdvICMtlatPzuHaU46gZbMM74ADD/C2Ox41KrBV8oMPeluwOuf9W15OSnY2w0aP5rADM3l3zD+YOOkZBp7QgWZNM73zMjPhmmu882fM8IqetDRITfX+bdIEzjzTe37UKPjoI+/uzuOPRz8pIiIisrd77vF+Z+/e7U1dPvZYb/pp69Z1uux5ua158J2veGfxRnaXltf/+hd33x31usKSbU5t79693Rz/Tpckt8n5hYyctDBk28LMRqlJOzTu8mc/Y+byLSFtiZ6Pjd8X0/+RGRx+cBNeGfoT0qKwWGsyv+8efXc5Y9/9il+f1IE7ftGtdtvyNgBzV2/l7+8V8P6yzWSlp3HFSR246uQcDmrSeP8nDxgAb7zhdWCAV8ykp8OOHQCsH3gZrSe9EHpO8+awbZv39cUXw8SJoc+3awfffOPdJenQwSuOMjO94aqtWtXtm/WZ2VznXO96uVgDo7pCHF0CMgAAFDxJREFURETqZP16OOIIKA4aBZ6SAqtXe4uC18HKLT9w+oMfkGpGmXO0ys5gxNn1dONs3Tro2NGLu57rCqi6ttAUEklamtcXqmDTjr3aEn2v70ObZXDPBd2Zv6aIx9//OiqvOWbaspDOC0j8PFf47RmduObkHPI+XsXD07+KdTj1yjnHrIItXDr+UwY+8Qnz1hQx7Kwj+WhEP4b171K9zov162H69EDnBXg74BQU/Piw9UvPs3TFJvreMYUTbpvIrE+/9HY1qfDYY97jxYu9OzdffAFTpnjPBc+prec1XURERKSWwq29lpbmjdLcuhV+9jOYPbtWl56/pggzKPNriw3fFTNy0kIm51exG191FBXB8OFw4omBuKNYV2gKiSS1C3q1TdoOi8o2fBd+7Y9E3+v7vNw2TF+ykf99bzmnH9WC3MMiszKzc478NUVhpy1B4ucZvBWxR53blR0lpTz2XgFZGWlcd2rHWIdVY5PzCxkzbRnrinbRpnkGP+/Rmrmrt5H/TREts9L507ldueyE9hzQuIa/Yve1eGzFsMzUVLrmtODFW8/kyrzZ/Oq1r7nngu5c2tI/vlWr8Hc/Ku+ss3u39/jPf67XuyUiIiJSQ/tae23lSli61Oss+MMf4K67vNEO1TRm2jIqT7iouHFW47+BSkpg3DhvusvWrd5U1bKyQLxRqis0AkNEgOTe6/uvA7rTomk6t06YR/Ge+t0pY8uOEp6ZuYKzxs7gonEfU9WkiWTIM3idGPde2IPzcltz31tf8p/Pvol1SDUyOb+QEZMWUFi0CwcUFhXzzMyVrNz8A3df0J0Zw0/nmlOOqHnnBdRo8dhW2Rm8PPQnnNzpEEZOWsgDU78Mv6NOhSjsrCMiIiK1kJ/vjb6s/F9+Phx3nDeq8pprYMwYyM311ruqpqo3LajhjbOFC6FrV/j9772YLr7Y68AIFqW6QiMwRATw9voOtzZDMuz1nX1AI8ZcnMvlz37O/VO/5I5fHF2n65WVO2Z8tZkJs9fw7tKNlJY7erVvzuiLegBw15QlSZnnCqkpxsODe/JDSSl/fHUhY6Z9SdHOPbRpnslt/bvU26io0JES+752eblj287dbNpewubtJWzaXsKm7cVs+r6EzTtK2Py993j1tzsJ101wQHoql594eN0CruHisU3T03jmit785bVFjPvga9Zu28WYi3NJT0vd++Ao7KwjIiIiEZCdDU89BZdc4nVkPPQQnHpqtU6t86YFRUXeWls5OdC5Mzz5JJx1FvTqFbO6Qh0YIgLw4x921f2DL9Gc0rkFV/zkcJ6btYozux7KTzsdUuNrrP72B16es5aJc9ey4ftiDmrSmF+f1IHBx7fjyKDtUjMapSZtnis0TkvhnB6t+fCrzWzb6W0LWli0ixGTFlC8p5Rzc9vU6fpvLljHnVOWULyn/MdrD584n48KttCmeSabt5eweXux11HxfQlbdpRQGmYEQ9P0NFpkpdMiK53ubbNZ9e3OsK+3PkbbLzdKTeG+C3vQ/qAm3D/1SzZ8V8xTlx/HgZXX3IjwzjoiIiISYf36eSMhdvq1yNdfw/LlcPbZVZ5S6xuUS5fC7bd762otWgRNm8K0aYHnY1hXaBcSERHfrt1lnPvYTHbtLmPq704lO7PRfs8p3lPG24vWM2H2Gj5dsZUUg9OObMHg3u04o+uhNE7TTL2q/HT0e1WuCRJpBzdpTIusdFo2y6Cl30HRMiudllkZtGyWToum6bRslr7XVJCqYm7bPJNZI/pFK/ywXp+/jmEvzeewAzPJu7IP7Q8+IGqvrV1IVFeIiEiUXXstPPMMXHEFPPwwHBR+i9SajEhl/Xq4807vuk2bwsiRcOut3o5oUVZVbaERGCIivszGqYwd3JOLnviYO19fzNhLeoY9zjnHwsLveGnOGl6bt47txaW0P+gAhp11JAOPO4zW2cmxnkVd7Wv+5Z/O7Vqna9/z5tKw7QZ8de/PaVTLLXPjearVgGPa0KpZBtc9P4cLx83i6St6c2z7A2MdloiIiETCY4/BoYfC6NEwdaq34PfAgXsdVu1NCxYsgJNO8hbrvPlmb0HOQ2o+IjnS1IEhIhLkmHbNufn0Tjz63+V8uGwT24LWZjjtyBZMnlfIhNlr+HLDdtLTUvh591YMPr4dJ+YcTEpKVUt0SjhVzcts2zyTa045ok7Xfm7WqirnfNa28wLif6pVn5yDeOWGk7jyudlcOv5THh3Sk7O7t451WCIiIlLfMjK8HUEGDYKrrvL+ffppb52M6iot9aaL9OgBRx8NN94I110HnTpFLu460hQSEZFKXpm7hmETF4RsO5Xq902UOejRNpvBx7djwDFtqjXNRMKbnF8YdjTD3y7qUecOgUheuyH4dkcJ1/zfHOatKWLUOV25+uQczCLXwaYpJKorREQkhvbs8bY4veoqyMqCzZu90RNV/e53DqZM8da52LjR2641Ozu6Me+HppCIiFTTw9OX77VndpmDJumpvHz9SXRr0yw2gSWYSI5miPeREpF2cNN0Xrj2RG6dMI973lzKmq07Oeaw5jw0/aukzIeIiEhCa9QIbrnF+7qkBE47DTp08HYvadfOW9tiyBCYMAG++QZuu83bjrVLF3juOWjWcGpbdWCIiFRS1doMO0vK1HlRz6o9LzPOrt0QZDRK5fHLjuVvby/l6ZkrSbHVVGy0Uli0i5GTFgIkdY5EREQSTloaXH89/PGP3rSQBx6A+fPho4+8BTlffBFatoQnnoCrr/Y6PxoQLY8vIlJJVXtjV3vPbJE4kZJijDq3G9mZjai8S+yuPWWMmbYsNoHVMzPLMLPPzWy+mS02s7v89hwz+8zMlpvZBDNr7Len+48L/Oc7BF1rpN++zMz6x+Y7EhERqaXUVG80xqJF0KcP3HADjB8P5eXw2mve4p8FBTB0aIPrvAB1YIiI7OW2/l3IbJQa0hYvO02I1Mb3u/aEbd/XTjANTAnQzzl3DNATONvMTgTuB8Y65zoD24Cr/eOvBrY55zoBY/3jMLNuwBDgaOBsYJyZhX4YiIiINAQ5OTB9OvTt63VeAJSVeYt2ZmXFNLS6UAeGiEglF/Rqy98u6kHb5pkY3q4YybL4oySmRB9V5Dw7/IeN/P8c0A+Y6Lf/E7jA//p8/zH+82eYt8rp+cCLzrkS59xKoADoE4VvQUREpP5t2ACffhp4vHu3t+bFhg2xi6mOtAaGiEgYyb5+giSW2/p3CbsrSyKNKvJHSswFOgGPA18DRc65Uv+QtUDFD3VbYA2Ac67UzL4DDvbbgyq9kHNEREQalrvvDoy+qFBW5rU//nhsYqojdWCIiIgkuGTYlcU5Vwb0NLPmwKtA13CH+f+G21fO7aM9hJldB1wH0L59+1rFKyIiEnGffOKNugi2ezd8/HFs4qkH6sAQERFJAskyqsg5V2RmHwAnAs3NLM0fhXEYsM4/bC3QDlhrZmlANrA1qL1C8DnBrzEeGA/Qu3fvvTo4RERE4kJ+fqwjqHdaA0NEREQaNDNr4Y+8wMwygTOBpcD7wCD/sCuA1/yvX/cf4z//nnPO+e1D/F1KcoDOwOfR+S5ERERkfzQCQ0RERBq61sA//XUwUoCXnHNvmNkS4EUzuwfIB571j38WeN7MCvBGXgwBcM4tNrOXgCVAKXCTPzVFRERE4oA6MERERKRBc84tAHqFaV9BmF1EnHPFwMVVXOte4N76jlFERETqTlNIRERERERERCTuqQNDREREREREROKeOjBEREREREREJO6pA0NERERERERE4p46MEREREREREQk7qkDQ0RERERERETinjnnYh1DVJnZZmB1rOOogUOALbEOIk4oF6GUj1DKR4ByEUr5CBWJfBzunGtRz9dsEFRXNHjKRyjlI0C5CKV8hFI+AiKVi7C1RdJ1YDQ0ZjbHOdc71nHEA+UilPIRSvkIUC5CKR+hlI/kpv//oZSPUMpHgHIRSvkIpXwERDsXmkIiIiIiIiIiInFPHRgiIiIiIiIiEvfUgRH/xsc6gDiiXIRSPkIpHwHKRSjlI5Tykdz0/z+U8hFK+QhQLkIpH6GUj4Co5kJrYIiIiIiIiIhI3NMIDBERERERERGJe+rAiCEz+4eZbTKzRUFtd5vZAjObZ2bvmFkbvz3bzKaY2XwzW2xmV8Yu8sgIl4+g54aZmTOzQ/zHR5nZJ2ZWYmbDoh9t5NUkH0Htx5tZmZkNil6kkVfD98Zt/s/PPDNb5OfjoOhHHTlVfHbcaWaFQd/7OUHPjTSzAjNbZmb9YxN15NQkH2bWJ6htvpldGLvI618t3hu5/mfpYjNbaGYZsYlc6otqi1CqLQJUV4RSbRFKtUWA6opQ8VZbqAMjtvKAsyu1jXHO5TrnegJvAH/x228CljjnjgH6Ag+ZWeNoBRoleeydD8ysHfAz4Jug5q3Ab4EHoxJZbORR/XxgZqnA/cC0aAQXZXlUMxfOuTHOuZ7+z9BI4EPn3NZoBRoleYTJBzC24nt3zr0FYGbdgCHA0f454/z3SiLJo5r5ABYBvf33x9nAU2aWFqU4oyGP6r830oB/AUOdc0fj/W7ZE61AJWLyUG0RLA/VFhXyUF0RLA/VFsHyUG1RIQ/VFcHyiKPaQh0YMeScm4H3yzK47fugh02AikVKHJBlZgY09c8rjUac0RIuH76xwHACucA5t8k5N5sELrZrkg/fb4BXgE0RDi3qapGLCpcCL0QqrljZRz7COR940TlX4pxbCRQAfSIWXAzUJB/OuZ3OuYrPzgyqfu80SDV8b5wFLHDOzffP/dY5Vxax4CQqVFuEUm0RoLoilGqLUKotAlRXhIq32kIdGHHIzO41szXALwncJfk70BVYBywEbnHOlccoxKgxswFAYcUPQbKrKh9m1ha4EHgyJoHFwP7eG2Z2AF5v8StRDSy2bvaHif/DzA7029oCa4KOWeu3JYNw+cDMTjCzxXifpUODCo9EFi4XRwLOzKaZ2RdmNjyWAUpkqbYIUG0RoLoilGqLsFRbBKiuCBWT2kIdGHHIOTfKOdcO+Ddws9/cH5gHtAF6An83s2YxCjEq/F8SowgUWkltP/l4BLg9We6eVvO98QtgVgIO8azKE0BHvM+H9cBDfruFOTbh7g6EUVU+cM595g9rPB4YWd9zM+NQVblIA07G+4P2ZOBCMzsjJhFKxKm28Ki2CFBdEUq1RViqLQJUV4SKWW2hDoz49h9goP/1lcAk5ykAVgJHxSyy6OgI5ADzzWwVcBjwhZm1imlUsbOvfPQGXvTbB+HNRbwgVoFGQXXeG0NIwCGeVXHObXTOlfl3T58mMJRzLdAu6NDD8O62JrR95CP4mKXAD0D3aMcXTft5b3zonNvinNsJvAUcG6s4JWpUW6i2qKC6IpRqi0pUWwSorggVy9pCHRhxxsw6Bz0cAHzpf/0NcIZ/zKFAF2BFdKOLLufcQudcS+dcB+dcB7wfiGOdcxtiHFpM7CsfzrmcoPaJwI3OucmxjDeS9vfeMLNs4DTgtRiGGVVm1jro4YV4i0oBvA4MMbN0M8sBOgOfRzu+aKsqH2aWU7G4lpkdjvdZuirqAUbRPt4b04BcMzvAz8lpwJJoxyeRp9oiQLVFgOqKUKot9qbaIkB1RahY1haJtkJqg2JmL+CtzHqIma0F7gDOMbMuQDmwGhjqH343kGdmC/GGbd3unNsS/agjJ1w+nHPPVnFsK2AO0AwoN7PfAd0qLVTWoNUkH4muFrm4EHjHOfdDNOKLtio+O/qaWU+8IZyrgOsBnHOLzewlvF8epcBNiTYkuCb5wBvOOMLM9uB9zt6YSJ+lNXxvbDOzh4HZ/nNvOefejEXcUn9UW4RSbRGguiKUaotQqi0CVFeEirfawpxL9OlKIiIiIiIiItLQaQqJiIiIiIiIiMQ9dWCIiIiIiIiISNxTB4aIiIiIiIiIxD11YIiIiIiIiIhI3FMHhoiIiIiIiIjEPXVgiEitmVlzM7sx6HEbM5sYpdfuYGaXReO1REREJPJUV4jI/qgDQ0TqojnwY6HhnFvnnBsUpdfuAKjQEBERSRyqK0Rkn9SBISJ1MRroaGbzzGyMf/diEYCZ/drMJpvZFDNbaWY3m9nvzSzfzD41s4P84zqa2VQzm2tmM83sqMovYman+a8xzz8/y3/tU/y2W80s1Y9htpktMLPr/XP7mtkMM3vVzJaY2ZNmps8+ERGR+KO6QkT2KS3WAYhIgzYC6O6c6wne8MtKz3cHegEZQAFwu3Oul5mNBX4FPAKMB4Y655ab2QnAOKBfpesMA25yzs0ys6ZAsf/aw5xz5/mvfR3wnXPueDNLB2aZ2Tv++X2AbsBqYCpwERCVIakiIiJSbaorRGSf1IEhIpH0vnNuO7DdzL4DpvjtC4Fcv2g4CXjZzCrOSQ9znVnAw2b2b2CSc25t0PEVzvKvWTHUNBvoDOwGPnfOrQAwsxeAk1GhISIi0tCorhBJcurAEJFIKgn6ujzocTne508KUFRxp6UqzrnRZvYmcA7wqZmdGeYwA37jnJsW0mjWF3CVL1nt70BERETiheoKkSSn+VoiUhfbgazanuyc+x5YaWYXA5jnmMrHmVlH59xC59z9wBzgqDCvPQ24wcwa+eccaWZN/Of6mFmOP0f1EuCj2sYsIiIiEaO6QkT2SR0YIlJrzrlv8eaELjKzMbW8zC+Bq81sPrAYOD/MMb/zX2M+sAt4G1gAlJrZfDO7FXgGWAJ84S/49RSBUWaf4C3OtQhYCbxay1hFREQkQlRXiMj+mHMa8SQiicsf6vnjolwiIiIitaW6QiS2NAJDREREREREROKeRmCIiIiIiIiISNzTCAwRERERERERiXvqwBARERERERGRuKcODBERERERERGJe+rAEBEREREREZG4pw4MEREREREREYl76sAQERERERERkbj3/07F4dZc5M9/AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results = combined[[\"week\", \"store\", \"brand\", \"prediction\"]]\n", + "results.rename(columns={\"prediction\": \"move\"}, inplace=True)\n", + "actual = combined[[\"week\", \"store\", \"brand\", \"actual\"]]\n", + "actual.rename(columns={\"actual\": \"move\"}, inplace=True)\n", + "store_list = combined[\"store\"].unique()\n", + "brand_list = combined[\"brand\"].unique()\n", + "\n", + "plot_predictions_with_history(\n", + " results,\n", + " actual,\n", + " store_list,\n", + " brand_list,\n", + " \"week\",\n", + " \"move\",\n", + " grain1_name=\"store\",\n", + " grain2_name=\"brand\",\n", + " min_timestep=137,\n", + " num_samples=6,\n", + " predict_at_timestep=135,\n", + " line_at_predict_time=False,\n", + " title=\"Prediction results for a few sample time series\",\n", + " x_label=\"time step\",\n", + " y_label=\"target value\",\n", + " random_seed=6,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Reading\n", + "\n", + "\\[1\\] Aaron van den Oord, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, and Koray Kavukcuoglu. 2016. WaveNet: A Generative Model for Raw Audio. arXiv preprint\n", + "arXiv:1609.03499 (2016)
\n", + "\n", + "\\[2\\] Shaojie Bai, J. Zico Kolter, and Vladlen Koltun. 2018. An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling. arXiv preprint arXiv:1803.01271 (2018)
" + ] + } + ], + "metadata": { + "author_info": { + "affiliation": "Microsoft", + "created_by": "Chenhui Hu" + }, + "kernelspec": { + "display_name": "forecasting_env", + "language": "python", + "name": "forecasting_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/grocery_sales/python/02_model/lightgbm_multi_round.ipynb b/examples/grocery_sales/python/02_model/lightgbm_multi_round.ipynb new file mode 100644 index 00000000..f566a571 --- /dev/null +++ b/examples/grocery_sales/python/02_model/lightgbm_multi_round.ipynb @@ -0,0 +1,4160 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# LightGBM: A Highly Efficient Gradient Boosting Decision Tree\n", + "\n", + "This notebook gives an example of how to perform multiple rounds of training and testing of LightGBM models to generate point forecasts of product sales in retail. We will train the LightGBM models based on the Orange Juice dataset.\n", + "\n", + "[LightGBM](https://github.com/Microsoft/LightGBM) is a gradient boosting framework that uses tree-based learning algorithms. [Gradient boosting](https://en.wikipedia.org/wiki/Gradient_boosting) is an ensemble technique in which models are added to the ensemble sequentially and at each iteration a new model is trained with respect to the error of the whole ensemble learned so far. More detailed information about gradient boosting can be found in this [tutorial paper](https://www.frontiersin.org/articles/10.3389/fnbot.2013.00021/full). Using this technique, LightGBM achieves great accuracy in many applications. Apart from this, it is designed to be distributed and efficient with the following advantages:\n", + "* Fast training speed and high efficiency.\n", + "* Low memory usage.\n", + "* Support of parallel and GPU learning.\n", + "* Capable of handling large-scale data.\n", + "\n", + "Due to these advantages, LightGBM has been widely-used in a lot of [winning solutions](https://github.com/microsoft/LightGBM/blob/master/examples/README.md#machine-learning-challenge-winning-solutions) of machine learning competitions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Settings and Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "System version: 3.6.10 |Anaconda, Inc.| (default, Jan 7 2020, 21:14:29) \n", + "[GCC 7.3.0]\n", + "LightGBM version: 2.3.0\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "import math\n", + "import datetime\n", + "import warnings\n", + "import numpy as np\n", + "import pandas as pd\n", + "import lightgbm as lgb\n", + "import scrapbook as sb\n", + "\n", + "from fclib.common.utils import git_repo_path\n", + "from fclib.models.lightgbm import predict\n", + "from fclib.evaluation.evaluation_utils import MAPE\n", + "from fclib.common.plot import plot_predictions_with_history\n", + "from fclib.dataset.ojdata import download_ojdata, split_train_test, FIRST_WEEK_START\n", + "from fclib.feature_engineering.feature_utils import (\n", + " week_of_month,\n", + " df_from_cartesian_product,\n", + " combine_features,\n", + ")\n", + "\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "print(\"System version: {}\".format(sys.version))\n", + "print(\"LightGBM version: {}\".format(lgb.__version__))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parameter Settings\n", + "\n", + "In what follows, we define global settings related to the model and feature engineering. LightGBM supports both classification models and regression models. In our case, we set the objective function to `mape` which stands for mean-absolute-percentage-error (MAPE) since we will build a regression model to predict product sales and evaluate the accuracy of the model using MAPE.\n", + "\n", + "Generally, we can adjust the number of leaves (`num_leaves`), the minimum number of data in each leaf (`min_data_in_leaf`), maximum number of boosting rounds (`num_rounds`), the learning rate of trees (`learning_rate`) and `early_stopping_rounds` (to avoid overfitting) in the model to get better performance. Besides, we can also adjust other supported parameters to optimize the results. [In this link](https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.rst), a list of all the parameters is given. In addition, advice on how to tune these parameters can be found [in this url](https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters-Tuning.rst).\n", + "\n", + "We will use historical weekly sales, date time information, and product information as input features to train the model. Prior sales are used as lag features and `lags` contains the lags where each number indicates the number of time steps (i.e., weeks) that we shift the data backwards to get the historical sales. We also use the average sales within a certain time window in the past as a moving average feature. `window_size` controls the size of the moving window. Apart from these parameters, we use `use_columns` and `categ_fea` to denote all other features that we leverage in the model and the categorical features, respectively.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Use False if you've already downloaded and split the data\n", + "DOWNLOAD_SPLIT_DATA = True\n", + "\n", + "# Data directory\n", + "DATA_DIR = os.path.join(git_repo_path(), \"ojdata\")\n", + "\n", + "# Parameters of LightGBM model\n", + "params = {\n", + " \"objective\": \"mape\",\n", + " \"num_leaves\": 124,\n", + " \"min_data_in_leaf\": 340,\n", + " \"learning_rate\": 0.1,\n", + " \"feature_fraction\": 0.65,\n", + " \"bagging_fraction\": 0.87,\n", + " \"bagging_freq\": 19,\n", + " \"num_rounds\": 940,\n", + " \"early_stopping_rounds\": 125,\n", + " \"num_threads\": 16,\n", + " \"seed\": 1,\n", + "}\n", + "\n", + "# Lags, window size, and feature column names\n", + "lags = np.arange(2, 20)\n", + "window_size = 40\n", + "used_columns = [\n", + " \"store\",\n", + " \"brand\",\n", + " \"week\",\n", + " \"week_of_month\",\n", + " \"month\",\n", + " \"deal\",\n", + " \"feat\",\n", + " \"move\",\n", + " \"price\",\n", + " \"price_ratio\",\n", + "]\n", + "categ_fea = [\"store\", \"brand\", \"deal\"]\n", + "\n", + "# Forecasting settings\n", + "N_SPLITS = 10\n", + "HORIZON = 2\n", + "GAP = 2\n", + "FIRST_WEEK = 40\n", + "LAST_WEEK = 156" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preparation\n", + "\n", + "We need to download the Orange Juice data and split it into training and test sets for multiple forecast rounds. By default, the following cell will download and spit the data. If you've already done so, you may skip this part by switching `DOWNLOAD_SPLIT_DATA` to `False`.\n", + "\n", + "We store the training data and test data using dataframes. In each forecast round, the training data includes a training dataframe and an auxiliary dataframe with the training dataframe containing historical sales up to the time we make forecasts and auxiliary dataframe containing price/promotion information up to the maximum week that we want to forecast. Here we assume that future price and promotion information up to a certain number of weeks ahead is predetermined and known. There is a one-week gap between the current week and the first target week of forecasting as we want to leave time for planning inventory in practice." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data already exists at the specified location.\n", + "Finished data downloading and splitting.\n" + ] + } + ], + "source": [ + "if DOWNLOAD_SPLIT_DATA:\n", + " download_ojdata(DATA_DIR)\n", + " split_train_test(\n", + " DATA_DIR,\n", + " n_splits=N_SPLITS,\n", + " horizon=HORIZON,\n", + " gap=GAP,\n", + " first_week=FIRST_WEEK,\n", + " last_week=LAST_WEEK,\n", + " write_csv=True,\n", + " )\n", + " print(\"Finished data downloading and splitting.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Feature Engineering\n", + "\n", + "Next we create a function to extract a number of features from the data for training the forecasting model. These features include\n", + "* datetime features including week, week of the month, and month\n", + "* historical weekly sales of each orange juice in recent weeks\n", + "* average sales of each orange juice during recent weeks\n", + "* other features including `store`, `brand`, `deal`, `feat` columns and price features\n", + "\n", + "Note that the logarithm of the unit sales is stored in a column named `logmove` both for `train_df` and `test_df`. We compute the unit sales `move` based on this quantity." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def create_features(pred_round, train_dir, lags, window_size, used_columns):\n", + " \"\"\"Create input features for model training and testing.\n", + "\n", + " \n", + " Args: \n", + " pred_round (int): Prediction round (1, 2, ...)\n", + " train_dir (str): Path of the training data directory \n", + " lags (np.array): Numpy array including all the lags\n", + " window_size (int): Maximum step for computing the moving average\n", + " used_columns (list[str]): A list of names of columns used in model training (including target variable)\n", + "\n", + " Returns:\n", + " pd.Dataframe: Dataframe including all the input features and target variable\n", + " int: Last week of the training data \n", + " \"\"\"\n", + "\n", + " # Load training data\n", + " train_df = pd.read_csv(os.path.join(train_dir, \"train_\" + str(pred_round) + \".csv\"))\n", + " train_df[\"move\"] = train_df[\"logmove\"].apply(lambda x: round(math.exp(x)))\n", + " train_df = train_df[[\"store\", \"brand\", \"week\", \"move\"]]\n", + "\n", + " # Create a dataframe to hold all necessary data\n", + " store_list = train_df[\"store\"].unique()\n", + " brand_list = train_df[\"brand\"].unique()\n", + " train_end_week = train_df[\"week\"].max()\n", + " week_list = range(FIRST_WEEK, train_end_week + GAP + HORIZON)\n", + " d = {\"store\": store_list, \"brand\": brand_list, \"week\": week_list}\n", + " data_grid = df_from_cartesian_product(d)\n", + " data_filled = pd.merge(data_grid, train_df, how=\"left\", on=[\"store\", \"brand\", \"week\"])\n", + "\n", + " # Get future price, deal, and advertisement info\n", + " aux_df = pd.read_csv(os.path.join(train_dir, \"auxi_\" + str(pred_round) + \".csv\"))\n", + " data_filled = pd.merge(data_filled, aux_df, how=\"left\", on=[\"store\", \"brand\", \"week\"])\n", + "\n", + " # Create relative price feature\n", + " price_cols = [\n", + " \"price1\",\n", + " \"price2\",\n", + " \"price3\",\n", + " \"price4\",\n", + " \"price5\",\n", + " \"price6\",\n", + " \"price7\",\n", + " \"price8\",\n", + " \"price9\",\n", + " \"price10\",\n", + " \"price11\",\n", + " ]\n", + " data_filled[\"price\"] = data_filled.apply(lambda x: x.loc[\"price\" + str(int(x.loc[\"brand\"]))], axis=1)\n", + " data_filled[\"avg_price\"] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols))\n", + " data_filled[\"price_ratio\"] = data_filled[\"price\"] / data_filled[\"avg_price\"]\n", + " data_filled.drop(price_cols, axis=1, inplace=True)\n", + "\n", + " # Fill missing values\n", + " data_filled = data_filled.groupby([\"store\", \"brand\"]).apply(\n", + " lambda x: x.fillna(method=\"ffill\").fillna(method=\"bfill\")\n", + " )\n", + "\n", + " # Create datetime features\n", + " data_filled[\"week_start\"] = data_filled[\"week\"].apply(\n", + " lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7)\n", + " )\n", + " data_filled[\"year\"] = data_filled[\"week_start\"].apply(lambda x: x.year)\n", + " data_filled[\"month\"] = data_filled[\"week_start\"].apply(lambda x: x.month)\n", + " data_filled[\"week_of_month\"] = data_filled[\"week_start\"].apply(lambda x: week_of_month(x))\n", + " data_filled[\"day\"] = data_filled[\"week_start\"].apply(lambda x: x.day)\n", + " data_filled.drop(\"week_start\", axis=1, inplace=True)\n", + "\n", + " # Create other features (lagged features, moving averages, etc.)\n", + " features = data_filled.groupby([\"store\", \"brand\"]).apply(\n", + " lambda x: combine_features(x, [\"move\"], lags, window_size, used_columns)\n", + " )\n", + "\n", + " # Drop rows with NaN values\n", + " features.dropna(inplace=True)\n", + "\n", + " return features, train_end_week" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Training\n", + "\n", + "We then perform a multi-round training by fitting a LightGBM model using the training data in each forecast round. After the models are trained, we apply them to generate forecasts for the target weeks. The paradigm of model training and testing is illustrated in the following diagram\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------- Round 1 ----------\n", + "Maximum training week number is 135\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 137 9151\n", + "1 2 1 138 24055\n", + "2 2 2 137 4879\n", + "3 2 2 138 12035\n", + "4 2 3 137 2156\n", + "\n", + "---------- Round 2 ----------\n", + "Maximum training week number is 137\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 139 9424\n", + "1 2 1 140 7544\n", + "2 2 2 139 7377\n", + "3 2 2 140 6843\n", + "4 2 3 139 3288\n", + "\n", + "---------- Round 3 ----------\n", + "Maximum training week number is 139\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 141 6717\n", + "1 2 1 142 8090\n", + "2 2 2 141 7881\n", + "3 2 2 142 7206\n", + "4 2 3 141 2003\n", + "\n", + "---------- Round 4 ----------\n", + "Maximum training week number is 141\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 143 15790\n", + "1 2 1 144 13234\n", + "2 2 2 143 8281\n", + "3 2 2 144 7340\n", + "4 2 3 143 2747\n", + "\n", + "---------- Round 5 ----------\n", + "Maximum training week number is 143\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 145 28856\n", + "1 2 1 146 14498\n", + "2 2 2 145 7185\n", + "3 2 2 146 8139\n", + "4 2 3 145 2034\n", + "\n", + "---------- Round 6 ----------\n", + "Maximum training week number is 145\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 147 9404\n", + "1 2 1 148 8103\n", + "2 2 2 147 6705\n", + "3 2 2 148 6120\n", + "4 2 3 147 2214\n", + "\n", + "---------- Round 7 ----------\n", + "Maximum training week number is 147\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 149 7641\n", + "1 2 1 150 5629\n", + "2 2 2 149 6967\n", + "3 2 2 150 11881\n", + "4 2 3 149 2874\n", + "\n", + "---------- Round 8 ----------\n", + "Maximum training week number is 149\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 151 7452\n", + "1 2 1 152 7124\n", + "2 2 2 151 7331\n", + "3 2 2 152 8968\n", + "4 2 3 151 3210\n", + "\n", + "---------- Round 9 ----------\n", + "Maximum training week number is 151\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 153 5451\n", + "1 2 1 154 9084\n", + "2 2 2 153 6404\n", + "3 2 2 154 6989\n", + "4 2 3 153 2876\n", + "\n", + "---------- Round 10 ----------\n", + "Maximum training week number is 153\n", + "Training LightGBM model started.\n", + "Training LightGBM model finished.\n", + "Prediction results:\n", + " store brand week move\n", + "0 2 1 155 6761\n", + "1 2 1 156 12385\n", + "2 2 2 155 6264\n", + "3 2 2 156 5950\n", + "4 2 3 155 3332\n", + "\n" + ] + } + ], + "source": [ + "# Train and predict for all forecast rounds\n", + "pred_all = []\n", + "metric_all = []\n", + "train_dir = os.path.join(DATA_DIR, \"train\")\n", + "for r in range(1, N_SPLITS + 1):\n", + " print(\"---------- Round \" + str(r) + \" ----------\")\n", + " features, train_end_week = create_features(r, train_dir, lags, window_size, used_columns)\n", + " train_fea = features[features.week <= train_end_week].reset_index(drop=True)\n", + " print(\"Maximum training week number is {}\".format(max(train_fea[\"week\"])))\n", + "\n", + " # Create training set\n", + " dtrain = lgb.Dataset(train_fea.drop(\"move\", axis=1, inplace=False), label=train_fea[\"move\"])\n", + "\n", + " # Train GBM model\n", + " print(\"Training LightGBM model started.\")\n", + " bst = lgb.train(params, dtrain, valid_sets=[dtrain], categorical_feature=categ_fea, verbose_eval=False,)\n", + " print(\"Training LightGBM model finished.\")\n", + "\n", + " # Generate forecasts\n", + " test_fea = features[features.week >= train_end_week + GAP].reset_index(drop=True)\n", + " idx_cols = [\"store\", \"brand\", \"week\"]\n", + " pred = predict(test_fea, bst, target_col=\"move\", idx_cols=idx_cols).sort_values(by=idx_cols).reset_index(drop=True)\n", + " print(\"Prediction results:\")\n", + " print(pred.head())\n", + " print(\"\")\n", + "\n", + " # Keep the predictions\n", + " pred[\"round\"] = r\n", + " pred_all.append(pred)\n", + "\n", + "pred_all = pd.concat(pred_all, axis=0)\n", + "pred_all.rename(columns={\"move\": \"prediction\"}, inplace=True)\n", + "pred_all = pred_all[[\"round\", \"week\", \"store\", \"brand\", \"prediction\"]]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Evaluation\n", + "\n", + "To evaluate the model performance, we compute MAPE of the forecasts from all the forecast rounds below." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/scrapbook.scrap.json+json": { + "data": 35.96942853751946, + "encoder": "json", + "name": "MAPE", + "version": 1 + } + }, + "metadata": { + "scrapbook": { + "data": true, + "display": false, + "name": "MAPE" + } + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAPE of the predictions is 35.96942853751946\n" + ] + } + ], + "source": [ + "# Evaluate prediction accuracy\n", + "test_all = []\n", + "test_dir = os.path.join(DATA_DIR, \"test\")\n", + "for r in range(1, N_SPLITS + 1):\n", + " test_df = pd.read_csv(os.path.join(test_dir, \"test_\" + str(r) + \".csv\"))\n", + " test_all.append(test_df)\n", + "test_all = pd.concat(test_all, axis=0).reset_index(drop=True)\n", + "test_all[\"actual\"] = test_all[\"logmove\"].apply(lambda x: round(math.exp(x)))\n", + "test_all.drop(\"logmove\", axis=1, inplace=True)\n", + "combined = pd.merge(pred_all, test_all, on=[\"store\", \"brand\", \"week\"], how=\"left\")\n", + "metric_value = MAPE(combined[\"prediction\"], combined[\"actual\"]) * 100\n", + "sb.glue(\"MAPE\", metric_value)\n", + "print(\"MAPE of the predictions is {}\".format(metric_value))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Result Visualization\n", + "\n", + "Finally, we plot out the forecast results of a few sample store-brand combinations to visually check the forecasts. Note that there could be gaps in the curve of actual sales due to missing sales data." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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XiXk2njGzG4j5IM4i3CT+6N4Tg7ns4SWKl8DPhLP3UbCsKOHEM7dc4D1g65hj7vj/Leb2X2EBKxPufuvRrRXo+TuPWZ2JnAH8Ov42fAk4UZ9Yazb6wnHZ7ib95G8l0f6nTFalxKS3n4SeK+Z3UPImTSX8D88HvgnQpLjke6DiMi0oQCGiEgad98cb6j+lhCU+BChWfRrhAvDHwBPp82fNLO3A5cQghafI1wsfp1wM55VACOu6z/N7BngC4Snu2cQRmj4I/CTAbN/BPgusJJwg2HA5jjvYOt/xMyWE57Qvh14b1z/9YThW9dmW9fx4O53xyf+XyDcPL+VkOPgFcINQnqT/TsIN9knEoIWMwk3dHcCl7n7wNEZzifcmJ1DyJPxMmHYze8QAgLZ+hx7ui+8i9D65l8IgZCLYr2PitO6CDfCXwJ+nKOkoucQRhP4GPCJWPY8IZD24xysHwB3v93M3ks4V84mBMgeJQTRXk+OAhhxW58xs98SbszeTkgk20r4H32HPUNmprubPf+L32eYtgJo9AxDEg8iNRTtyYRuGamg3ouEIY5TrV9w904zO4XQ6uUkwnn6EuEG8zLC8ZoI3YTj9W+EXB11sR7fJHxODSsmw30bcAHhRvx/EQI3jYQA6j8Q3lPZ+Drhf/dews10MXANIeAzIdz9jxaGNv08IaCUGub6VUKg6WLCZ95wsn4vj/Q7Ywz71mNmZxCGvj0v7l81IYHsekLOn/QA5kR8HomITDjzjMOYi4iIiMhUZGYbANy9YXJrIiIiMrGUA0NEREREREREpjwFMERERERERERkylMAQ0RERERERESmPOXAEBEREREREZEpTy0wRERERERERGTKUwBDRERERERERKY8BTBEREREREREZMpTAENEREREREREpjwFMERERERERERkylMAQ0RERERERESmPAUwRERERERERGTKUwBDRERERERERKY8BTBEREREREREZMpTAENEREREREREpjwFMERERERERERkylMAQ0RERERERESmPAUwRERERERERGTKUwBDRKYFM7vEzP6nULcvIiIi48vMrjazrxfq9kWmAwUwRPLIRN9km1mZmd1sZhvMzM3spAHTLzSzZ8ys3czWm9mFA6b/3syazazNzJ4ys9Mnqu65lMVxMDP7lpm1xJ9vm5lNUnVFRERGbQpeawz5HWtmV5rZ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\n", + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results = combined[[\"week\", \"store\", \"brand\", \"prediction\"]]\n", + "results.rename(columns={\"prediction\": \"move\"}, inplace=True)\n", + "actual = combined[[\"week\", \"store\", \"brand\", \"actual\"]]\n", + "actual.rename(columns={\"actual\": \"move\"}, inplace=True)\n", + "store_list = combined[\"store\"].unique()\n", + "brand_list = combined[\"brand\"].unique()\n", + "\n", + "plot_predictions_with_history(\n", + " results,\n", + " actual,\n", + " store_list,\n", + " brand_list,\n", + " \"week\",\n", + " \"move\",\n", + " grain1_name=\"store\",\n", + " grain2_name=\"brand\",\n", + " min_timestep=137,\n", + " num_samples=6,\n", + " predict_at_timestep=135,\n", + " line_at_predict_time=False,\n", + " title=\"Prediction results for a few sample time series\",\n", + " x_label=\"time step\",\n", + " y_label=\"target value\",\n", + " random_seed=6,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Reading\n", + "\n", + "\\[1\\] Guolin Ke, Qi Meng, Thomas Finley, Taifeng Wang, Wei Chen, Weidong Ma, Qiwei Ye, and Tie-Yan Liu. 2017. LightGBM: A highly efficient gradient boosting decision tree. In Advances in Neural Information Processing Systems. 3146–3154.
\n", + "\\[2\\] Alexey Natekin and Alois Knoll. 2013. Gradient boosting machines, a tutorial. Frontiers in neurorobotics, 7 (21).
\n", + "\\[3\\] The parameters of LightGBM: https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.rst
\n", + "\\[4\\] Anna Veronika Dorogush, Vasily Ershov, and Andrey Gulin. 2018. CatBoost: gradient boosting with categorical features support. arXiv preprint arXiv:1810.11363 (2018).
\n", + "\n" + ] + } + ], + "metadata": { + "author_info": { + "affiliation": "Microsoft", + "created_by": "Chenhui Hu" + }, + "kernelspec": { + "display_name": "forecasting_env", + "language": "python", + "name": "forecasting_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/grocery_sales/python/03_model_tune_deploy/aml_scripts/train_validate.py b/examples/grocery_sales/python/03_model_tune_deploy/aml_scripts/train_validate.py new file mode 100644 index 00000000..1f21a0bb --- /dev/null +++ b/examples/grocery_sales/python/03_model_tune_deploy/aml_scripts/train_validate.py @@ -0,0 +1,281 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +Perform cross-validation of a LightGBM forecast model on the data that includes historical sales from week 40 +to week 135 as well as price, deal, and advertisement information from week 40 to week 138. The script accepts +hyperparameters of the model and trains a model on 95% of the data by using these hyperparameters. Then, it +evaluates the accuracy of the trained model on a validation set which is the remaining 5% of the data. The +validation MAPE will be logged and collected by HyperDrive for searching the best set of hyperparameters. In +addition, the trained model will be saved in the "./outputs/" folder which is automatically uploaded into run +history of each trial. +""" + +import os +import math +import argparse +import datetime +import numpy as np +import pandas as pd +import lightgbm as lgb +from azureml.core import Run +from sklearn.model_selection import train_test_split +from fclib.feature_engineering.feature_utils import week_of_month, df_from_cartesian_product, combine_features + + +FIRST_WEEK = 40 +GAP = 2 +HORIZON = 2 +FIRST_WEEK_START = pd.to_datetime("1989-09-14 00:00:00") + + +def create_features(pred_round, train_dir, lags, window_size, used_columns): + """Create input features for model training and testing. + + Args: + pred_round (int): Prediction round (1, 2, ...) + train_dir (str): Path of the training data directory + lags (np.array): Numpy array including all the lags + window_size (int): Maximum step for computing the moving average + used_columns (list[str]): A list of names of columns used in model training (including target variable) + + Returns: + pd.Dataframe: Dataframe including all the input features and target variable + int: Last week of the training data + """ + + # Load training data + default_train_file = os.path.join(train_dir, "train.csv") + if os.path.isfile(default_train_file): + train_df = pd.read_csv(default_train_file) + else: + train_df = pd.read_csv(os.path.join(train_dir, "train_" + str(pred_round) + ".csv")) + train_df["move"] = train_df["logmove"].apply(lambda x: round(math.exp(x))) + train_df = train_df[["store", "brand", "week", "move"]] + + # Create a dataframe to hold all necessary data + store_list = train_df["store"].unique() + brand_list = train_df["brand"].unique() + train_end_week = train_df["week"].max() + week_list = range(FIRST_WEEK, train_end_week + GAP + HORIZON) + d = {"store": store_list, "brand": brand_list, "week": week_list} + data_grid = df_from_cartesian_product(d) + data_filled = pd.merge(data_grid, train_df, how="left", on=["store", "brand", "week"]) + + # Get future price, deal, and advertisement info + default_aux_file = os.path.join(train_dir, "auxi.csv") + if os.path.isfile(default_aux_file): + aux_df = pd.read_csv(default_aux_file) + else: + aux_df = pd.read_csv(os.path.join(train_dir, "auxi_" + str(pred_round) + ".csv")) + data_filled = pd.merge(data_filled, aux_df, how="left", on=["store", "brand", "week"]) + + # Create relative price feature + price_cols = [ + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + ] + data_filled["price"] = data_filled.apply(lambda x: x.loc["price" + str(int(x.loc["brand"]))], axis=1) + data_filled["avg_price"] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) + data_filled["price_ratio"] = data_filled["price"] / data_filled["avg_price"] + data_filled.drop(price_cols, axis=1, inplace=True) + + # Fill missing values + data_filled = data_filled.groupby(["store", "brand"]).apply( + lambda x: x.fillna(method="ffill").fillna(method="bfill") + ) + + # Create datetime features + data_filled["week_start"] = data_filled["week"].apply( + lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7) + ) + data_filled["year"] = data_filled["week_start"].apply(lambda x: x.year) + data_filled["month"] = data_filled["week_start"].apply(lambda x: x.month) + data_filled["week_of_month"] = data_filled["week_start"].apply(lambda x: week_of_month(x)) + data_filled["day"] = data_filled["week_start"].apply(lambda x: x.day) + data_filled.drop("week_start", axis=1, inplace=True) + + # Create other features (lagged features, moving averages, etc.) + features = data_filled.groupby(["store", "brand"]).apply( + lambda x: combine_features(x, ["move"], lags, window_size, used_columns) + ) + + # Drop rows with NaN values + features.dropna(inplace=True) + + return features, train_end_week + + +if __name__ == "__main__": + # Parse input arguments + parser = argparse.ArgumentParser() + parser.add_argument("--data-folder", type=str, dest="data_folder", default=".", help="data folder mounting point") + parser.add_argument("--num-leaves", type=int, dest="num_leaves", default=64, help="# of leaves of the tree") + parser.add_argument( + "--min-data-in-leaf", type=int, dest="min_data_in_leaf", default=50, help="minimum # of samples in each leaf" + ) + parser.add_argument("--learning-rate", type=float, dest="learning_rate", default=0.001, help="learning rate") + parser.add_argument( + "--feature-fraction", + type=float, + dest="feature_fraction", + default=1.0, + help="ratio of features used in each iteration", + ) + parser.add_argument( + "--bagging-fraction", + type=float, + dest="bagging_fraction", + default=1.0, + help="ratio of samples used in each iteration", + ) + parser.add_argument("--bagging-freq", type=int, dest="bagging_freq", default=1, help="bagging frequency") + parser.add_argument("--max-rounds", type=int, dest="max_rounds", default=400, help="# of boosting iterations") + parser.add_argument("--max-lag", type=int, dest="max_lag", default=10, help="max lag of unit sales") + parser.add_argument( + "--window-size", type=int, dest="window_size", default=10, help="window size of moving average of unit sales" + ) + args = parser.parse_args() + args.feature_fraction = round(args.feature_fraction, 2) + args.bagging_fraction = round(args.bagging_fraction, 2) + print(args) + + # Start an Azure ML run + run = Run.get_context() + + # Data paths + DATA_DIR = args.data_folder + TRAIN_DIR = os.path.join(DATA_DIR, "train") + + # Data and forecast problem parameters + TRAIN_START_WEEK = 40 + TRAIN_END_WEEK_LIST = list(range(135, 159, 2)) + TEST_START_WEEK_LIST = list(range(137, 161, 2)) + TEST_END_WEEK_LIST = list(range(138, 162, 2)) + # The start datetime of the first week in the dataset + FIRST_WEEK_START = pd.to_datetime("1989-09-14 00:00:00") + + # Parameters of GBM model + params = { + "objective": "mape", + "num_leaves": args.num_leaves, + "min_data_in_leaf": args.min_data_in_leaf, + "learning_rate": args.learning_rate, + "feature_fraction": args.feature_fraction, + "bagging_fraction": args.bagging_fraction, + "bagging_freq": args.bagging_freq, + "num_rounds": args.max_rounds, + "early_stopping_rounds": 125, + "num_threads": 16, + } + + # Lags and used column names + lags = np.arange(2, args.max_lag + 1) + used_columns = ["store", "brand", "week", "week_of_month", "month", "deal", "feat", "move", "price", "price_ratio"] + categ_fea = ["store", "brand", "deal"] + + # Train and validate the model using only the first round data + r = 0 + print("---- Round " + str(r + 1) + " ----") + # Load training data + default_train_file = os.path.join(TRAIN_DIR, "train.csv") + if os.path.isfile(default_train_file): + train_df = pd.read_csv(default_train_file) + else: + train_df = pd.read_csv(os.path.join(TRAIN_DIR, "train_" + str(r + 1) + ".csv")) + train_df["move"] = train_df["logmove"].apply(lambda x: round(math.exp(x))) + train_df = train_df[["store", "brand", "week", "move"]] + + # Create a dataframe to hold all necessary data + store_list = train_df["store"].unique() + brand_list = train_df["brand"].unique() + week_list = range(TRAIN_START_WEEK, TEST_END_WEEK_LIST[r] + 1) + d = {"store": store_list, "brand": brand_list, "week": week_list} + data_grid = df_from_cartesian_product(d) + data_filled = pd.merge(data_grid, train_df, how="left", on=["store", "brand", "week"]) + + # Get future price, deal, and advertisement info + default_aux_file = os.path.join(TRAIN_DIR, "auxi.csv") + if os.path.isfile(default_aux_file): + aux_df = pd.read_csv(default_aux_file) + else: + aux_df = pd.read_csv(os.path.join(TRAIN_DIR, "auxi_" + str(r + 1) + ".csv")) + data_filled = pd.merge(data_filled, aux_df, how="left", on=["store", "brand", "week"]) + + # Create relative price feature + price_cols = [ + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + ] + data_filled["price"] = data_filled.apply(lambda x: x.loc["price" + str(int(x.loc["brand"]))], axis=1) + data_filled["avg_price"] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) + data_filled["price_ratio"] = data_filled["price"] / data_filled["avg_price"] + data_filled.drop(price_cols, axis=1, inplace=True) + + # Fill missing values + data_filled = data_filled.groupby(["store", "brand"]).apply( + lambda x: x.fillna(method="ffill").fillna(method="bfill") + ) + + # Create datetime features + data_filled["week_start"] = data_filled["week"].apply( + lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7) + ) + data_filled["year"] = data_filled["week_start"].apply(lambda x: x.year) + data_filled["month"] = data_filled["week_start"].apply(lambda x: x.month) + data_filled["week_of_month"] = data_filled["week_start"].apply(lambda x: week_of_month(x)) + data_filled["day"] = data_filled["week_start"].apply(lambda x: x.day) + data_filled.drop("week_start", axis=1, inplace=True) + + # Create other features (lagged features, moving averages, etc.) + features = data_filled.groupby(["store", "brand"]).apply( + lambda x: combine_features(x, ["move"], lags, args.window_size, used_columns) + ) + train_fea = features[features.week <= TRAIN_END_WEEK_LIST[r]].reset_index(drop=True) + + # Drop rows with NaN values + train_fea.dropna(inplace=True) + + # Model training and validation + # Create a training/validation split + train_fea, valid_fea, train_label, valid_label = train_test_split( + train_fea.drop("move", axis=1, inplace=False), train_fea["move"], test_size=0.05, random_state=1 + ) + dtrain = lgb.Dataset(train_fea, train_label) + dvalid = lgb.Dataset(valid_fea, valid_label) + # A dictionary to record training results + evals_result = {} + # Train LightGBM model + bst = lgb.train( + params, dtrain, valid_sets=[dtrain, dvalid], categorical_feature=categ_fea, evals_result=evals_result + ) + # Get final training loss & validation loss + train_loss = evals_result["training"]["mape"][-1] + valid_loss = evals_result["valid_1"]["mape"][-1] + print("Final training loss is {}".format(train_loss)) + print("Final validation loss is {}".format(valid_loss)) + + # Log the validation loss (MAPE) + run.log("MAPE", np.float(valid_loss) * 100) + + # Files saved in the "./outputs" folder are automatically uploaded into run history + os.makedirs("./outputs/model", exist_ok=True) + bst.save_model("./outputs/model/bst-model.txt") diff --git a/examples/grocery_sales/python/03_model_tune_deploy/azure_hyperdrive_lightgbm.ipynb b/examples/grocery_sales/python/03_model_tune_deploy/azure_hyperdrive_lightgbm.ipynb new file mode 100644 index 00000000..096f3f42 --- /dev/null +++ b/examples/grocery_sales/python/03_model_tune_deploy/azure_hyperdrive_lightgbm.ipynb @@ -0,0 +1,1175 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation.\n", + "\n", + "Licensed under the MIT License. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Model Tuning and Deployment using Azure Machine Learning Service\n", + "\n", + "In this notebook, we perform hyperparameter tuning of a LightGBM retail sales forecast model using HyperDrive in Azure Machine Learning (AzureML). After the optimal hyperparameters are found, we further deploy the best model as a web service on Azure.\n", + "\n", + "To tune the hyperparameters, we carry out cross-validation with the Orange Juice data from week 40 to week 135. Specifically, we split the data into a training set and a validation set. Then, we train LightGBM models with different sets of hyperparameters on the training set and evaluate the accuracy of each model on the validation set. The set of hyperparameters that yield the best validation accuracy will be used to train forecast models when the data beyond week 135 is available, e.g., in the multi-round training examples provided in [examples/02_model](../02_model).\n", + "\n", + "## Prerequisites\n", + "\n", + "To run this notebook, you need to start from a conda environment where AzureML SDK is installed. In our case, we can first activate `forecasting_env` environment by\n", + "```\n", + "conda activate forecasting_env\n", + "```\n", + "as we have installed AzureML SDK in this environment. Then, we can start the notebook via\n", + "```\n", + "jupyter notebook\n", + "```\n", + "In addition, you need to install and enable AzureML widget extension in your environment by running the following commands. For your convenience, we will do this in the beginning of this notebook.\n", + "```\n", + "jupyter nbextension install --py --user azureml.widgets\n", + "jupyter nbextension enable --py --user azureml.widgets\n", + "```\n", + "\n", + "Besides, you need to create an AzureML workspace and download its configuration file (`config.json`) by following the instructions in [configuration.ipynb](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Global Settings" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + ">Note: If you run into any issue with installing and enabling the AzureML widgets below, please *uncomment* the first line in the following cell to manually install `azureml-widgets`." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Installing /data/anaconda/envs/forecasting_env/lib/python3.6/site-packages/azureml/widgets/static -> azureml_widgets\n", + "Up to date: /data/home/chenhui/.local/share/jupyter/nbextensions/azureml_widgets/index.js\n", + "Up to date: /data/home/chenhui/.local/share/jupyter/nbextensions/azureml_widgets/extension.js\n", + "Up to date: /data/home/chenhui/.local/share/jupyter/nbextensions/azureml_widgets/packages/labextension/azureml_widgets-1.1.0.tgz\n", + "- Validating: \u001b[32mOK\u001b[0m\n", + "\n", + " To initialize this nbextension in the browser every time the notebook (or other app) loads:\n", + " \n", + " jupyter nbextension enable azureml.widgets --user --py\n", + " \n", + "Enabling notebook extension azureml_widgets/extension...\n", + " - Validating: \u001b[32mOK\u001b[0m\n" + ] + } + ], + "source": [ + "# Install and enable AzureML widgets\n", + "#!pip -q install azureml-widgets==1.0.85\n", + "!jupyter nbextension install --py --user azureml.widgets\n", + "!jupyter nbextension enable --py --user azureml.widgets" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Turning diagnostics collection on. \n", + "Azure ML SDK Version: 1.0.85\n" + ] + } + ], + "source": [ + "import os\n", + "import sys\n", + "import json\n", + "import shutil\n", + "import azureml\n", + "import requests\n", + "import numpy as np\n", + "from azureml.core import (\n", + " Experiment,\n", + " ScriptRunConfig,\n", + ")\n", + "from azureml.telemetry import set_diagnostics_collection\n", + "from azureml.core.runconfig import (\n", + " RunConfiguration,\n", + " EnvironmentDefinition,\n", + " CondaDependencies,\n", + ")\n", + "from azureml.train.estimator import Estimator\n", + "from azureml.widgets import RunDetails\n", + "from azureml.train.hyperdrive import (\n", + " BayesianParameterSampling,\n", + " HyperDriveConfig,\n", + " quniform,\n", + " uniform,\n", + " choice,\n", + " PrimaryMetricGoal,\n", + ")\n", + "from azureml.core.webservice import AciWebservice\n", + "from azureml.core.model import Model, InferenceConfig\n", + "from fclib.common.utils import git_repo_path, module_path\n", + "from fclib.azureml.azureml_utils import (\n", + " get_or_create_workspace,\n", + " get_or_create_amlcompute,\n", + ")\n", + "from fclib.dataset.ojdata import download_ojdata, split_train_test\n", + "\n", + "cur_dir = os.getcwd()\n", + "if cur_dir not in sys.path:\n", + " sys.path.append(cur_dir)\n", + "from aml_scripts.train_validate import create_features\n", + "\n", + "# Opt-in diagnostics for better experience of future releases\n", + "set_diagnostics_collection(send_diagnostics=True)\n", + "\n", + "# Check core SDK version number\n", + "print(\"Azure ML SDK Version: \", azureml.core.VERSION)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Use False if you've already downloaded and split the data\n", + "DOWNLOAD_SPLIT_DATA = True\n", + "\n", + "# Get data directory\n", + "DATA_DIR = os.path.join(git_repo_path(), \"ojdata\")\n", + "\n", + "# Forecasting settings\n", + "N_SPLITS = 1\n", + "HORIZON = 2\n", + "GAP = 2\n", + "FIRST_WEEK = 40\n", + "LAST_WEEK = 138" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize Workspace & Create an AzureML Experiment\n", + "\n", + "Initialize a [Machine Learning Workspace](https://docs.microsoft.com/azure/machine-learning/service/concept-azure-machine-learning-architecture#workspace) object from the workspace you created in the Prerequisites step. `get_or_create_workspace()` below creates a workspace object from the details stored in `config.json` that you have downloaded. We assume that you store this config file to a directory `./.azureml`. In case the existing workspace cannot be loaded, the following cell will try to create a new workspace with the subscription ID, resource group, and workspace name as specified at the beginning of the cell." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Workspace name: chhamlws\n", + "Azure region: westcentralus\n", + "Resource group: chhamlwsrg\n" + ] + } + ], + "source": [ + "# Please specify the AzureML workspace attributes below if you want to create a new one.\n", + "subscription_id = \"\"\n", + "resource_group = \"\"\n", + "workspace_name = \"\"\n", + "workspace_region = \"\"\n", + "\n", + "# Connect to a workspace\n", + "ws = get_or_create_workspace(\n", + " config_path=\"./.azureml\",\n", + " subscription_id=subscription_id,\n", + " resource_group=resource_group,\n", + " workspace_name=workspace_name,\n", + " workspace_region=workspace_region,\n", + ")\n", + "print(\n", + " \"Workspace name: \" + ws.name,\n", + " \"Azure region: \" + ws.location,\n", + " \"Resource group: \" + ws.resource_group,\n", + " sep=\"\\n\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Create an experiment\n", + "exp = Experiment(workspace=ws, name=\"tune-lgbm-forecast\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preparation\n", + "\n", + "We need to download the Orange Juice data and split it into training and test sets. By default, the following cell will download and spit the data. If you've already done so, you may skip this part by switching `DOWNLOAD_SPLIT_DATA` to False. \n", + "\n", + "By passing `write_csv=True` to `split_train_test()` below, this function will write the training data and test data to three csv files: `train.csv`, `auxi.csv` and `test.csv`. The first two csv files contain the historical sales up to week 135 as well as auxiliary information such as future price and promotion. Here we assume that future price and promotion information up to a certain number of weeks ahead is predetermined and known. We will use these two files to implement cross-validation and search for the best model with HyperDrive." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data already exists at the specified location.\n" + ] + } + ], + "source": [ + "if DOWNLOAD_SPLIT_DATA:\n", + " download_ojdata(DATA_DIR)\n", + " split_train_test(\n", + " DATA_DIR,\n", + " n_splits=N_SPLITS,\n", + " horizon=HORIZON,\n", + " gap=GAP,\n", + " first_week=FIRST_WEEK,\n", + " last_week=LAST_WEEK,\n", + " write_csv=True,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Validate Script Locally\n", + "\n", + "A good practice is to test the model training and validation script on your local machine before you run the hyperparameter tuning job on a remote compute. To run the script locally, we need to correctly specify the path of the Python interpreter that has been installed in `forecasting_env` conda environment. We will try to find the Python interpreter path in the cell below. In case it cannot be retrieved automatically, you can also look for the path by executing `which python` (for Linux) or `where python` (for Windows) from a terminal where `forecasting_env` is activated and set `python_path` as the path that you find.\n", + "\n", + "In what follows, the script `train_validate.py` trains a model on the training set with the input arguments as specified in `ScriptRunConfig()` and computes the accuracy of the model on the validation set. Here we evaluate the model accuracy using mean-absolute-percentage-error (MAPE)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Get Python interpreter path\n", + "python_path = module_path(\"forecasting_env\", \"python\")\n", + "\n", + "# Configure local, user managed environment\n", + "run_config_user_managed = RunConfiguration()\n", + "run_config_user_managed.environment.python.user_managed_dependencies = True\n", + "run_config_user_managed.environment.python.interpreter_path = python_path" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Directory of the local scripts\n", + "script_folder = \"./aml_scripts\"\n", + "\n", + "# Copy feature engineering utils\n", + "src_dir = os.path.join(git_repo_path(), \"fclib\", \"fclib\", \"feature_engineering\")\n", + "lib_dir = os.path.join(script_folder, \"fclib\")\n", + "des_dir = os.path.join(lib_dir, \"feature_engineering\")\n", + "if os.path.isdir(lib_dir):\n", + " shutil.rmtree(lib_dir)\n", + "shutil.copytree(src_dir, des_dir)\n", + "\n", + "# Training script name and path\n", + "train_script_name = \"train_validate.py\"\n", + "train_script_path = os.path.join(script_folder, train_script_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will submit a local run if the Python interpreter path is valid and wait until the local run finishes. Then, we print out the validation metric. Moreover, you can also use `run_local.get_details()` to get detailed information about this run." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'MAPE': 66.59144474679267}\n" + ] + } + ], + "source": [ + "if python_path:\n", + " # Specify script run config\n", + " src = ScriptRunConfig(\n", + " source_directory=\"./\",\n", + " script=train_script_path,\n", + " arguments=[\"--data-folder\", DATA_DIR, \"--bagging-fraction\", \"0.8\"],\n", + " run_config=run_config_user_managed,\n", + " )\n", + " # Submit local run\n", + " run_local = exp.submit(src)\n", + "\n", + " # Check results\n", + " run_local.wait_for_completion()\n", + " metric = run_local.get_metrics()\n", + " print(metric)\n", + "else:\n", + " print(\"Can't find Python interpreter path. Local validation will be skipped.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Run Script on Remote Compute\n", + "\n", + "After validating model training script locally, we can create a remote compute and further test the script on the remote compute." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a CPU cluster as compute target\n", + "\n", + "In the next cell, we create an AmlCompute target with a specific cluster name, VM size, and maximum number of nodes if the cluster does not exist. Otherwise, we will reuse an existing one. For more options of VM sizes, you can check information in this [link](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-general)." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found compute target: cpu-cluster\n" + ] + } + ], + "source": [ + "# Choose a name for your cluster\n", + "cluster_name = \"cpu-cluster\"\n", + "# VM Size\n", + "vm_size = \"STANDARD_D2_V2\"\n", + "# Maximum number of nodes of the cluster\n", + "max_nodes = 4\n", + "\n", + "# Create a new AmlCompute if it does not exist or reuse an existing one\n", + "compute_target = get_or_create_amlcompute(\n", + " workspace=ws,\n", + " compute_name=cluster_name,\n", + " vm_size=vm_size,\n", + " min_nodes=0,\n", + " max_nodes=max_nodes,\n", + " verbose=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Configure Docker environment\n", + "\n", + "The remote compute will need to create a [Docker image](https://docs.docker.com/get-started/) for running the script. The Docker image is an encapsulated environment with necessary dependencies installed. In the following cell, we specify the conda packages and Python version that are needed for running the script." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "env = EnvironmentDefinition()\n", + "env.python.user_managed_dependencies = False\n", + "env.python.conda_dependencies = CondaDependencies.create(\n", + " conda_packages=[\"pandas\", \"numpy\", \"scipy\", \"scikit-learn\", \"lightgbm\", \"joblib\"],\n", + " python_version=\"3.6.2\",\n", + ")\n", + "env.python.conda_dependencies.add_channel(\"conda-forge\")\n", + "env.docker.enabled = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Upload data to default datastore\n", + "\n", + "Each workspace comes with a default datastore. In the following, we upload the Orange Juice dataset to the workspace's default datastore, which will later be mounted on the cluster for model training and validation." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Datastore type: AzureBlob\n", + "Account name: chhamlws4931040064\n", + "Container name: azureml-blobstore-f799a640-1ca3-4877-ad24-08eef7bd307e\n" + ] + } + ], + "source": [ + "ds = ws.get_default_datastore()\n", + "print(\n", + " \"Datastore type: \" + ds.datastore_type,\n", + " \"Account name: \" + ds.account_name,\n", + " \"Container name: \" + ds.container_name,\n", + " sep=\"\\n\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "$AZUREML_DATAREFERENCE_0fd85d0787ad41e7b99139d1933ea9b9" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Remote data path\n", + "path_on_datastore = \"data\"\n", + "ds.upload(\n", + " src_dir=DATA_DIR,\n", + " target_path=path_on_datastore,\n", + " overwrite=True,\n", + " show_progress=False,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$AZUREML_DATAREFERENCE_00b162eda80e4ee9a050e69c71311ecc\n" + ] + } + ], + "source": [ + "# Get data reference object for the data path\n", + "ds_data = ds.path(path_on_datastore)\n", + "print(ds_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create estimator\n", + "\n", + "Next, we will check if the remote compute target is successfully created by submitting a job to the target. This compute target will be used by HyperDrive for hyperparameter tuning later. Note that you may skip this part and directly go to [Tune Hyperparameters using HyperDrive](#tune-hyperparameters-using-hyperdrive) if you want.\n", + "\n", + "In the following cells, we first create an estimator to specify details of the job. Then we sumbit the job to the remote compute and check the status of the job." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "script_params = {\"--data-folder\": ds_data.as_mount(), \"--bagging-fraction\": 0.8}\n", + "est = Estimator(\n", + " source_directory=script_folder,\n", + " script_params=script_params,\n", + " compute_target=compute_target,\n", + " use_docker=True,\n", + " entry_script=train_script_name,\n", + " environment_definition=env,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Submit job" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Submit job to remote compute\n", + "run_remote = exp.submit(config=est)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check job status\n", + "\n", + "You can monitor the status of the remote run using the AzureML widgets. After the job is done, the following cell will display a dashboard similar to the snapshot below. You will see the dashboard when you run the notebook. However, the Jupyter widget state cannot be saved in the notebook. That's why we see the current output message of the following cell. \n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f86dd06da77e43e8975bd8a695afcb8e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "_UserRunWidget(widget_settings={'childWidgetDisplay': 'popup', 'send_telemetry': True, 'log_level': 'INFO', 's…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/aml.mini.widget.v1": "{\"status\": \"Completed\", \"workbench_run_details_uri\": \"https://ml.azure.com/experiments/tune-lgbm-forecast/runs/tune-lgbm-forecast_1585967817_b60bbc6e?wsid=/subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourcegroups/chhamlwsrg/workspaces/chhamlws\", \"run_id\": \"tune-lgbm-forecast_1585967817_b60bbc6e\", \"run_properties\": {\"run_id\": \"tune-lgbm-forecast_1585967817_b60bbc6e\", \"created_utc\": \"2020-04-04T02:37:04.210372Z\", \"properties\": {\"_azureml.ComputeTargetType\": \"amlcompute\", \"ContentSnapshotId\": \"f53e530a-0dc6-4573-af3b-fa3e6b6f9991\", \"azureml.git.repository_uri\": \"git@github.com:microsoft/forecasting.git\", \"mlflow.source.git.repoURL\": \"git@github.com:microsoft/forecasting.git\", \"azureml.git.branch\": \"chenhui/enhancement\", \"mlflow.source.git.branch\": \"chenhui/enhancement\", \"azureml.git.commit\": \"93da5e12f190bb96bcb7de6bad0280073e43b984\", \"mlflow.source.git.commit\": \"93da5e12f190bb96bcb7de6bad0280073e43b984\", \"azureml.git.dirty\": \"True\", \"AzureML.DerivedImageName\": \"azureml/azureml_7842fd2c5e99a43f1cca1341b66a0ecb\", \"ProcessInfoFile\": \"azureml-logs/process_info.json\", \"ProcessStatusFile\": \"azureml-logs/process_status.json\"}, \"tags\": {\"_aml_system_ComputeTargetStatus\": \"{\\\"AllocationState\\\":\\\"steady\\\",\\\"PreparingNodeCount\\\":0,\\\"RunningNodeCount\\\":0,\\\"CurrentNodeCount\\\":4}\"}, \"script_name\": null, \"arguments\": null, \"end_time_utc\": \"2020-04-04T02:39:25.162168Z\", \"status\": \"Completed\", \"log_files\": {\"azureml-logs/55_azureml-execution-tvmps_64205f30874f615b57c2717938d4039e14020b51244803148cd50a8d15cabd4c_d.txt\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.tune-lgbm-forecast_1585967817_b60bbc6e/azureml-logs/55_azureml-execution-tvmps_64205f30874f615b57c2717938d4039e14020b51244803148cd50a8d15cabd4c_d.txt?sv=2019-02-02&sr=b&sig=DduXomTRGTxuMQ4V6n2qdTWAzqWobPAa%2BgfUb3XTtpU%3D&st=2020-04-04T02%3A29%3A27Z&se=2020-04-04T10%3A39%3A27Z&sp=r\", \"azureml-logs/65_job_prep-tvmps_64205f30874f615b57c2717938d4039e14020b51244803148cd50a8d15cabd4c_d.txt\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.tune-lgbm-forecast_1585967817_b60bbc6e/azureml-logs/65_job_prep-tvmps_64205f30874f615b57c2717938d4039e14020b51244803148cd50a8d15cabd4c_d.txt?sv=2019-02-02&sr=b&sig=9SL92v6oBKvs3U6v7wpc2i6bnhSriBFKDYFOOncm79U%3D&st=2020-04-04T02%3A29%3A27Z&se=2020-04-04T10%3A39%3A27Z&sp=r\", \"azureml-logs/70_driver_log.txt\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.tune-lgbm-forecast_1585967817_b60bbc6e/azureml-logs/70_driver_log.txt?sv=2019-02-02&sr=b&sig=Wgd4KfIzVCciOILVowjVT57w9Mo7uEBvNZVag8d3%2BWw%3D&st=2020-04-04T02%3A29%3A27Z&se=2020-04-04T10%3A39%3A27Z&sp=r\", \"azureml-logs/75_job_post-tvmps_64205f30874f615b57c2717938d4039e14020b51244803148cd50a8d15cabd4c_d.txt\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.tune-lgbm-forecast_1585967817_b60bbc6e/azureml-logs/75_job_post-tvmps_64205f30874f615b57c2717938d4039e14020b51244803148cd50a8d15cabd4c_d.txt?sv=2019-02-02&sr=b&sig=Tf%2ByHLidR7mUEan%2BHAkh7kMmre5cD1bh8EqayfX%2BQTE%3D&st=2020-04-04T02%3A29%3A27Z&se=2020-04-04T10%3A39%3A27Z&sp=r\", \"azureml-logs/process_info.json\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.tune-lgbm-forecast_1585967817_b60bbc6e/azureml-logs/process_info.json?sv=2019-02-02&sr=b&sig=WtGEJUAQq925I8htjL8b%2FIM9y2Mp3Kh%2FDR4URRf4JZ0%3D&st=2020-04-04T02%3A29%3A27Z&se=2020-04-04T10%3A39%3A27Z&sp=r\", \"azureml-logs/process_status.json\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.tune-lgbm-forecast_1585967817_b60bbc6e/azureml-logs/process_status.json?sv=2019-02-02&sr=b&sig=q0y4E0REUTBa5t1TPhKKD3oyJS8xpl2GcAHajFNLgYA%3D&st=2020-04-04T02%3A29%3A27Z&se=2020-04-04T10%3A39%3A27Z&sp=r\", \"logs/azureml/138_azureml.log\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.tune-lgbm-forecast_1585967817_b60bbc6e/logs/azureml/138_azureml.log?sv=2019-02-02&sr=b&sig=C7SgQUqoJNVXDnEB7F6eUKNXyO8dRZlP5V24waycRtY%3D&st=2020-04-04T02%3A29%3A27Z&se=2020-04-04T10%3A39%3A27Z&sp=r\", \"logs/azureml/job_prep_azureml.log\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.tune-lgbm-forecast_1585967817_b60bbc6e/logs/azureml/job_prep_azureml.log?sv=2019-02-02&sr=b&sig=ybVIQN040pWWLpFQeGitV%2BrzuO9ojxErW%2B1ijX%2F8VV0%3D&st=2020-04-04T02%3A29%3A27Z&se=2020-04-04T10%3A39%3A27Z&sp=r\", \"logs/azureml/job_release_azureml.log\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.tune-lgbm-forecast_1585967817_b60bbc6e/logs/azureml/job_release_azureml.log?sv=2019-02-02&sr=b&sig=aV3H31e%2FdOnXtR%2BJmmRwSR7HLGJdeMeZ7vtla%2BNLgY0%3D&st=2020-04-04T02%3A29%3A27Z&se=2020-04-04T10%3A39%3A27Z&sp=r\"}, \"log_groups\": [[\"azureml-logs/process_info.json\", \"azureml-logs/process_status.json\", \"logs/azureml/job_prep_azureml.log\", \"logs/azureml/job_release_azureml.log\"], [\"azureml-logs/55_azureml-execution-tvmps_64205f30874f615b57c2717938d4039e14020b51244803148cd50a8d15cabd4c_d.txt\"], [\"azureml-logs/65_job_prep-tvmps_64205f30874f615b57c2717938d4039e14020b51244803148cd50a8d15cabd4c_d.txt\"], [\"azureml-logs/70_driver_log.txt\"], [\"azureml-logs/75_job_post-tvmps_64205f30874f615b57c2717938d4039e14020b51244803148cd50a8d15cabd4c_d.txt\"], [\"logs/azureml/138_azureml.log\"]], \"run_duration\": \"0:02:20\"}, \"child_runs\": [], \"children_metrics\": {}, \"run_metrics\": [{\"name\": \"MAPE\", \"run_id\": \"tune-lgbm-forecast_1585967817_b60bbc6e\", \"categories\": [0], \"series\": [{\"data\": [66.59144474679267]}]}], \"run_logs\": \"2020-04-04 02:38:15,684|azureml|DEBUG|Inputs:: kwargs: {'OutputCollection': True, 'snapshotProject': True, 'only_in_process_features': True, 'skip_track_logs_dir': True}, track_folders: None, deny_list: None, directories_to_watch: []\\n2020-04-04 02:38:15,684|azureml.history._tracking.PythonWorkingDirectory|DEBUG|Execution target type: batchai\\n2020-04-04 02:38:15,691|azureml.history._tracking.PythonWorkingDirectory|DEBUG|Failed to import pyspark with error: No module named 'pyspark'\\n2020-04-04 02:38:15,691|azureml.history._tracking.PythonWorkingDirectory.workingdir|DEBUG|Pinning working directory for filesystems: ['pyfs']\\n2020-04-04 02:38:15,914|azureml._base_sdk_common.user_agent|DEBUG|Fetching client info from /root/.azureml/clientinfo.json\\n2020-04-04 02:38:15,914|azureml._base_sdk_common.user_agent|DEBUG|Error loading client info: [Errno 2] No such file or directory: '/root/.azureml/clientinfo.json'\\n2020-04-04 02:38:16,226|azureml.core.run|DEBUG|Adding new factory for run source azureml.scriptrun\\n2020-04-04 02:38:16,226|azureml.core.authentication.TokenRefresherDaemon|DEBUG|Starting daemon and triggering first instance\\n2020-04-04 02:38:16,233|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:16,233|azureml._restclient.clientbase|INFO|Created a worker pool for first use\\n2020-04-04 02:38:16,233|azureml.core.authentication|DEBUG|Time to expire 1814327.766101 seconds\\n2020-04-04 02:38:16,234|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:16,234|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:16,234|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:16,234|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:16,234|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:16,265|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:16,265|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:16,266|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:16,271|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:16,280|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:16,286|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:16,293|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:16,299|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:16,299|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.RunClient.get-async:False|DEBUG|[START]\\n2020-04-04 02:38:16,299|msrest.service_client|DEBUG|Accept header absent and forced to application/json\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG|Request URL: 'https://westcentralus.experiments.azureml.net/history/v1.0/subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourceGroups/chhamlwsrg/providers/Microsoft.MachineLearningServices/workspaces/chhamlws/experiments/tune-lgbm-forecast/runs/tune-lgbm-forecast_1585967817_b60bbc6e'\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG|Request method: 'GET'\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG|Request headers:\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG| 'Accept': 'application/json'\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG| 'Content-Type': 'application/json; charset=utf-8'\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG| 'x-ms-client-request-id': '881085ef-cb0d-4095-a8a2-6dfd8db90588'\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG| 'request-id': '881085ef-cb0d-4095-a8a2-6dfd8db90588'\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG| 'User-Agent': 'python/3.6.2 (Linux-4.15.0-1067-azure-x86_64-with-debian-stretch-sid) msrest/0.6.11 azureml._restclient/core.1.0.85'\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG|Request body:\\n2020-04-04 02:38:16,300|msrest.http_logger|DEBUG|None\\n2020-04-04 02:38:16,300|msrest.universal_http|DEBUG|Configuring redirects: allow=True, max=30\\n2020-04-04 02:38:16,301|msrest.universal_http|DEBUG|Configuring request: timeout=100, verify=True, cert=None\\n2020-04-04 02:38:16,301|msrest.universal_http|DEBUG|Configuring proxies: ''\\n2020-04-04 02:38:16,301|msrest.universal_http|DEBUG|Evaluate proxies against ENV settings: True\\n2020-04-04 02:38:16,340|msrest.http_logger|DEBUG|Response status: 200\\n2020-04-04 02:38:16,340|msrest.http_logger|DEBUG|Response headers:\\n2020-04-04 02:38:16,340|msrest.http_logger|DEBUG| 'Date': 'Sat, 04 Apr 2020 02:38:16 GMT'\\n2020-04-04 02:38:16,340|msrest.http_logger|DEBUG| 'Content-Type': 'application/json; charset=utf-8'\\n2020-04-04 02:38:16,340|msrest.http_logger|DEBUG| 'Transfer-Encoding': 'chunked'\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG| 'Connection': 'keep-alive'\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG| 'Vary': 'Accept-Encoding'\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG| 'Request-Context': 'appId=cid-v1:2d2e8e63-272e-4b3c-8598-4ee570a0e70d'\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG| 'x-ms-client-request-id': '881085ef-cb0d-4095-a8a2-6dfd8db90588'\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG| 'x-ms-client-session-id': ''\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG| 'Strict-Transport-Security': 'max-age=15724800; includeSubDomains; preload'\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG| 'x-request-time': '0.020'\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG| 'X-Content-Type-Options': 'nosniff'\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG| 'Content-Encoding': 'gzip'\\n2020-04-04 02:38:16,341|msrest.http_logger|DEBUG|Response content:\\n2020-04-04 02:38:16,342|msrest.http_logger|DEBUG|{\\n \\\"runNumber\\\": 302,\\n \\\"rootRunId\\\": \\\"tune-lgbm-forecast_1585967817_b60bbc6e\\\",\\n \\\"experimentId\\\": \\\"3199ea18-1505-42f9-9092-777f27df73e5\\\",\\n \\\"createdUtc\\\": \\\"2020-04-04T02:37:04.210372+00:00\\\",\\n \\\"createdBy\\\": {\\n \\\"userObjectId\\\": \\\"8157bc92-2d12-4bc9-9270-bab51c673493\\\",\\n \\\"userPuId\\\": \\\"10033FFF97A21586\\\",\\n \\\"userIdp\\\": null,\\n \\\"userAltSecId\\\": null,\\n \\\"userIss\\\": \\\"https://sts.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47/\\\",\\n \\\"userTenantId\\\": \\\"72f988bf-86f1-41af-91ab-2d7cd011db47\\\",\\n \\\"userName\\\": \\\"Chenhui Hu\\\"\\n },\\n \\\"userId\\\": \\\"8157bc92-2d12-4bc9-9270-bab51c673493\\\",\\n \\\"token\\\": null,\\n \\\"tokenExpiryTimeUtc\\\": null,\\n \\\"error\\\": null,\\n \\\"warnings\\\": null,\\n \\\"revision\\\": 9,\\n \\\"runUuid\\\": \\\"f667e716-d546-4c3e-83e8-c0db0a607d76\\\",\\n \\\"parentRunUuid\\\": null,\\n \\\"rootRunUuid\\\": \\\"f667e716-d546-4c3e-83e8-c0db0a607d76\\\",\\n \\\"runId\\\": \\\"tune-lgbm-forecast_1585967817_b60bbc6e\\\",\\n \\\"parentRunId\\\": null,\\n \\\"status\\\": \\\"Running\\\",\\n \\\"startTimeUtc\\\": \\\"2020-04-04T02:37:59.4792144+00:00\\\",\\n \\\"endTimeUtc\\\": null,\\n \\\"heartbeatEnabled\\\": false,\\n \\\"options\\\": {\\n \\\"generateDataContainerIdIfNotSpecified\\\": true\\n },\\n \\\"name\\\": null,\\n \\\"dataContainerId\\\": \\\"dcid.tune-lgbm-forecast_1585967817_b60bbc6e\\\",\\n \\\"description\\\": null,\\n \\\"hidden\\\": false,\\n \\\"runType\\\": \\\"azureml.scriptrun\\\",\\n \\\"properties\\\": {\\n \\\"_azureml.ComputeTargetType\\\": \\\"amlcompute\\\",\\n \\\"ContentSnapshotId\\\": \\\"f53e530a-0dc6-4573-af3b-fa3e6b6f9991\\\",\\n \\\"azureml.git.repository_uri\\\": \\\"git@github.com:microsoft/forecasting.git\\\",\\n \\\"mlflow.source.git.repoURL\\\": \\\"git@github.com:microsoft/forecasting.git\\\",\\n \\\"azureml.git.branch\\\": \\\"chenhui/enhancement\\\",\\n \\\"mlflow.source.git.branch\\\": \\\"chenhui/enhancement\\\",\\n \\\"azureml.git.commit\\\": \\\"93da5e12f190bb96bcb7de6bad0280073e43b984\\\",\\n \\\"mlflow.source.git.commit\\\": \\\"93da5e12f190bb96bcb7de6bad0280073e43b984\\\",\\n \\\"azureml.git.dirty\\\": \\\"True\\\",\\n \\\"AzureML.DerivedImageName\\\": \\\"azureml/azureml_7842fd2c5e99a43f1cca1341b66a0ecb\\\",\\n \\\"ProcessInfoFile\\\": \\\"azureml-logs/process_info.json\\\",\\n \\\"ProcessStatusFile\\\": \\\"azureml-logs/process_status.json\\\"\\n },\\n \\\"scriptName\\\": \\\"train_validate.py\\\",\\n \\\"target\\\": \\\"cpu-cluster\\\",\\n \\\"uniqueChildRunComputeTargets\\\": [],\\n \\\"tags\\\": {\\n \\\"_aml_system_ComputeTargetStatus\\\": \\\"{\\\\\\\"AllocationState\\\\\\\":\\\\\\\"steady\\\\\\\",\\\\\\\"PreparingNodeCount\\\\\\\":0,\\\\\\\"RunningNodeCount\\\\\\\":0,\\\\\\\"CurrentNodeCount\\\\\\\":4}\\\"\\n },\\n \\\"inputDatasets\\\": [],\\n \\\"runDefinition\\\": null,\\n \\\"createdFrom\\\": {\\n \\\"type\\\": \\\"Notebook\\\",\\n \\\"locationType\\\": \\\"ArtifactId\\\",\\n \\\"location\\\": \\\"LocalUpload/tune-lgbm-forecast_1585967817_b60bbc6e/azure_hyperdrive_lightgbm.ipynb\\\"\\n },\\n \\\"cancelUri\\\": \\\"https://westcentralus.experiments.azureml.net/execution/v1.0/subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourceGroups/chhamlwsrg/providers/Microsoft.MachineLearningServices/workspaces/chhamlws/experiments/tune-lgbm-forecast/runId/tune-lgbm-forecast_1585967817_b60bbc6e/cancel\\\",\\n \\\"completeUri\\\": null,\\n \\\"diagnosticsUri\\\": \\\"https://westcentralus.experiments.azureml.net/execution/v1.0/subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourceGroups/chhamlwsrg/providers/Microsoft.MachineLearningServices/workspaces/chhamlws/experiments/tune-lgbm-forecast/runId/tune-lgbm-forecast_1585967817_b60bbc6e/diagnostics\\\",\\n \\\"computeRequest\\\": {\\n \\\"nodeCount\\\": 1\\n },\\n \\\"retainForLifetimeOfWorkspace\\\": false,\\n \\\"queueingInfo\\\": null\\n}\\n2020-04-04 02:38:16,349|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.RunClient.get-async:False|DEBUG|[STOP]\\n2020-04-04 02:38:16,351|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e|DEBUG|Constructing run from dto. type: azureml.scriptrun, source: None, props: {'_azureml.ComputeTargetType': 'amlcompute', 'ContentSnapshotId': 'f53e530a-0dc6-4573-af3b-fa3e6b6f9991', 'azureml.git.repository_uri': 'git@github.com:microsoft/forecasting.git', 'mlflow.source.git.repoURL': 'git@github.com:microsoft/forecasting.git', 'azureml.git.branch': 'chenhui/enhancement', 'mlflow.source.git.branch': 'chenhui/enhancement', 'azureml.git.commit': '93da5e12f190bb96bcb7de6bad0280073e43b984', 'mlflow.source.git.commit': '93da5e12f190bb96bcb7de6bad0280073e43b984', 'azureml.git.dirty': 'True', 'AzureML.DerivedImageName': 'azureml/azureml_7842fd2c5e99a43f1cca1341b66a0ecb', 'ProcessInfoFile': 'azureml-logs/process_info.json', 'ProcessStatusFile': 'azureml-logs/process_status.json'}\\n2020-04-04 02:38:16,351|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunContextManager|DEBUG|Valid logs dir, setting up content loader\\n2020-04-04 02:38:16,351|azureml|WARNING|Could not import azureml.mlflow or azureml.contrib.mlflow mlflow APIs will not run against AzureML services. Add azureml-mlflow as a conda dependency for the run if this behavior is desired\\n2020-04-04 02:38:16,351|azureml.WorkerPool|DEBUG|[START]\\n2020-04-04 02:38:16,352|azureml.SendRunKillSignal|DEBUG|[START]\\n2020-04-04 02:38:16,352|azureml.RunStatusContext|DEBUG|[START]\\n2020-04-04 02:38:16,352|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunContextManager.RunStatusContext|DEBUG|[START]\\n2020-04-04 02:38:16,352|azureml.WorkingDirectoryCM|DEBUG|[START]\\n2020-04-04 02:38:16,352|azureml.history._tracking.PythonWorkingDirectory.workingdir|DEBUG|[START]\\n2020-04-04 02:38:16,352|azureml.history._tracking.PythonWorkingDirectory|INFO|Current working dir: /mnt/batch/tasks/shared/LS_root/jobs/chhamlws/2de7e9cc412442c590a3a3c62880b1e9/tune-lgbm-forecast_1585967817_b60bbc6e/mounts/workspaceblobstore/azureml/tune-lgbm-forecast_1585967817_b60bbc6e\\n2020-04-04 02:38:16,353|azureml.history._tracking.PythonWorkingDirectory.workingdir|DEBUG|Calling pyfs\\n2020-04-04 02:38:16,353|azureml.history._tracking.PythonWorkingDirectory.workingdir|DEBUG|Storing working dir for pyfs as /mnt/batch/tasks/shared/LS_root/jobs/chhamlws/2de7e9cc412442c590a3a3c62880b1e9/tune-lgbm-forecast_1585967817_b60bbc6e/mounts/workspaceblobstore/azureml/tune-lgbm-forecast_1585967817_b60bbc6e\\n2020-04-04 02:38:17,195|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:17,195|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:17,195|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:17,195|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:17,195|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:17,196|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:17,196|azureml._base_sdk_common.service_discovery|DEBUG|Found history service url in environment variable AZUREML_SERVICE_ENDPOINT, history service url: https://westcentralus.experiments.azureml.net.\\n2020-04-04 02:38:17,201|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:17,202|azureml._run_impl.run_history_facade|DEBUG|Created a static thread pool for RunHistoryFacade class\\n2020-04-04 02:38:17,207|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:17,211|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:17,216|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:17,221|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:38:17,221|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.RunClient.get-async:False|DEBUG|[START]\\n2020-04-04 02:38:17,221|msrest.service_client|DEBUG|Accept header absent and forced to application/json\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG|Request URL: 'https://westcentralus.experiments.azureml.net/history/v1.0/subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourceGroups/chhamlwsrg/providers/Microsoft.MachineLearningServices/workspaces/chhamlws/experiments/tune-lgbm-forecast/runs/tune-lgbm-forecast_1585967817_b60bbc6e'\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG|Request method: 'GET'\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG|Request headers:\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG| 'Accept': 'application/json'\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG| 'Content-Type': 'application/json; charset=utf-8'\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG| 'x-ms-client-request-id': 'a7569271-846f-4750-998f-1dad026f9b7d'\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG| 'request-id': 'a7569271-846f-4750-998f-1dad026f9b7d'\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG| 'User-Agent': 'python/3.6.2 (Linux-4.15.0-1067-azure-x86_64-with-debian-stretch-sid) msrest/0.6.11 azureml._restclient/core.1.0.85'\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG|Request body:\\n2020-04-04 02:38:17,222|msrest.http_logger|DEBUG|None\\n2020-04-04 02:38:17,222|msrest.universal_http|DEBUG|Configuring redirects: allow=True, max=30\\n2020-04-04 02:38:17,222|msrest.universal_http|DEBUG|Configuring request: timeout=100, verify=True, cert=None\\n2020-04-04 02:38:17,222|msrest.universal_http|DEBUG|Configuring proxies: ''\\n2020-04-04 02:38:17,222|msrest.universal_http|DEBUG|Evaluate proxies against ENV settings: True\\n2020-04-04 02:38:17,265|msrest.http_logger|DEBUG|Response status: 200\\n2020-04-04 02:38:17,265|msrest.http_logger|DEBUG|Response headers:\\n2020-04-04 02:38:17,265|msrest.http_logger|DEBUG| 'Date': 'Sat, 04 Apr 2020 02:38:17 GMT'\\n2020-04-04 02:38:17,265|msrest.http_logger|DEBUG| 'Content-Type': 'application/json; charset=utf-8'\\n2020-04-04 02:38:17,265|msrest.http_logger|DEBUG| 'Transfer-Encoding': 'chunked'\\n2020-04-04 02:38:17,266|msrest.http_logger|DEBUG| 'Connection': 'keep-alive'\\n2020-04-04 02:38:17,266|msrest.http_logger|DEBUG| 'Vary': 'Accept-Encoding'\\n2020-04-04 02:38:17,266|msrest.http_logger|DEBUG| 'Request-Context': 'appId=cid-v1:2d2e8e63-272e-4b3c-8598-4ee570a0e70d'\\n2020-04-04 02:38:17,266|msrest.http_logger|DEBUG| 'x-ms-client-request-id': 'a7569271-846f-4750-998f-1dad026f9b7d'\\n2020-04-04 02:38:17,266|msrest.http_logger|DEBUG| 'x-ms-client-session-id': ''\\n2020-04-04 02:38:17,266|msrest.http_logger|DEBUG| 'Strict-Transport-Security': 'max-age=15724800; includeSubDomains; preload'\\n2020-04-04 02:38:17,266|msrest.http_logger|DEBUG| 'x-request-time': '0.022'\\n2020-04-04 02:38:17,266|msrest.http_logger|DEBUG| 'X-Content-Type-Options': 'nosniff'\\n2020-04-04 02:38:17,267|msrest.http_logger|DEBUG| 'Content-Encoding': 'gzip'\\n2020-04-04 02:38:17,267|msrest.http_logger|DEBUG|Response content:\\n2020-04-04 02:38:17,267|msrest.http_logger|DEBUG|{\\n \\\"runNumber\\\": 302,\\n \\\"rootRunId\\\": \\\"tune-lgbm-forecast_1585967817_b60bbc6e\\\",\\n \\\"experimentId\\\": \\\"3199ea18-1505-42f9-9092-777f27df73e5\\\",\\n \\\"createdUtc\\\": \\\"2020-04-04T02:37:04.210372+00:00\\\",\\n \\\"createdBy\\\": {\\n \\\"userObjectId\\\": \\\"8157bc92-2d12-4bc9-9270-bab51c673493\\\",\\n \\\"userPuId\\\": \\\"10033FFF97A21586\\\",\\n \\\"userIdp\\\": null,\\n \\\"userAltSecId\\\": null,\\n \\\"userIss\\\": \\\"https://sts.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47/\\\",\\n \\\"userTenantId\\\": \\\"72f988bf-86f1-41af-91ab-2d7cd011db47\\\",\\n \\\"userName\\\": \\\"Chenhui Hu\\\"\\n },\\n \\\"userId\\\": \\\"8157bc92-2d12-4bc9-9270-bab51c673493\\\",\\n \\\"token\\\": null,\\n \\\"tokenExpiryTimeUtc\\\": null,\\n \\\"error\\\": null,\\n \\\"warnings\\\": null,\\n \\\"revision\\\": 9,\\n \\\"runUuid\\\": \\\"f667e716-d546-4c3e-83e8-c0db0a607d76\\\",\\n \\\"parentRunUuid\\\": null,\\n \\\"rootRunUuid\\\": \\\"f667e716-d546-4c3e-83e8-c0db0a607d76\\\",\\n \\\"runId\\\": \\\"tune-lgbm-forecast_1585967817_b60bbc6e\\\",\\n \\\"parentRunId\\\": null,\\n \\\"status\\\": \\\"Running\\\",\\n \\\"startTimeUtc\\\": \\\"2020-04-04T02:37:59.4792144+00:00\\\",\\n \\\"endTimeUtc\\\": null,\\n \\\"heartbeatEnabled\\\": false,\\n \\\"options\\\": {\\n \\\"generateDataContainerIdIfNotSpecified\\\": true\\n },\\n \\\"name\\\": null,\\n \\\"dataContainerId\\\": \\\"dcid.tune-lgbm-forecast_1585967817_b60bbc6e\\\",\\n \\\"description\\\": null,\\n \\\"hidden\\\": false,\\n \\\"runType\\\": \\\"azureml.scriptrun\\\",\\n \\\"properties\\\": {\\n \\\"_azureml.ComputeTargetType\\\": \\\"amlcompute\\\",\\n \\\"ContentSnapshotId\\\": \\\"f53e530a-0dc6-4573-af3b-fa3e6b6f9991\\\",\\n \\\"azureml.git.repository_uri\\\": \\\"git@github.com:microsoft/forecasting.git\\\",\\n \\\"mlflow.source.git.repoURL\\\": \\\"git@github.com:microsoft/forecasting.git\\\",\\n \\\"azureml.git.branch\\\": \\\"chenhui/enhancement\\\",\\n \\\"mlflow.source.git.branch\\\": \\\"chenhui/enhancement\\\",\\n \\\"azureml.git.commit\\\": \\\"93da5e12f190bb96bcb7de6bad0280073e43b984\\\",\\n \\\"mlflow.source.git.commit\\\": \\\"93da5e12f190bb96bcb7de6bad0280073e43b984\\\",\\n \\\"azureml.git.dirty\\\": \\\"True\\\",\\n \\\"AzureML.DerivedImageName\\\": \\\"azureml/azureml_7842fd2c5e99a43f1cca1341b66a0ecb\\\",\\n \\\"ProcessInfoFile\\\": \\\"azureml-logs/process_info.json\\\",\\n \\\"ProcessStatusFile\\\": \\\"azureml-logs/process_status.json\\\"\\n },\\n \\\"scriptName\\\": \\\"train_validate.py\\\",\\n \\\"target\\\": \\\"cpu-cluster\\\",\\n \\\"uniqueChildRunComputeTargets\\\": [],\\n \\\"tags\\\": {\\n \\\"_aml_system_ComputeTargetStatus\\\": \\\"{\\\\\\\"AllocationState\\\\\\\":\\\\\\\"steady\\\\\\\",\\\\\\\"PreparingNodeCount\\\\\\\":0,\\\\\\\"RunningNodeCount\\\\\\\":0,\\\\\\\"CurrentNodeCount\\\\\\\":4}\\\"\\n },\\n \\\"inputDatasets\\\": [],\\n \\\"runDefinition\\\": null,\\n \\\"createdFrom\\\": {\\n \\\"type\\\": \\\"Notebook\\\",\\n \\\"locationType\\\": \\\"ArtifactId\\\",\\n \\\"location\\\": \\\"LocalUpload/tune-lgbm-forecast_1585967817_b60bbc6e/azure_hyperdrive_lightgbm.ipynb\\\"\\n },\\n \\\"cancelUri\\\": \\\"https://westcentralus.experiments.azureml.net/execution/v1.0/subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourceGroups/chhamlwsrg/providers/Microsoft.MachineLearningServices/workspaces/chhamlws/experiments/tune-lgbm-forecast/runId/tune-lgbm-forecast_1585967817_b60bbc6e/cancel\\\",\\n \\\"completeUri\\\": null,\\n \\\"diagnosticsUri\\\": \\\"https://westcentralus.experiments.azureml.net/execution/v1.0/subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourceGroups/chhamlwsrg/providers/Microsoft.MachineLearningServices/workspaces/chhamlws/experiments/tune-lgbm-forecast/runId/tune-lgbm-forecast_1585967817_b60bbc6e/diagnostics\\\",\\n \\\"computeRequest\\\": {\\n \\\"nodeCount\\\": 1\\n },\\n \\\"retainForLifetimeOfWorkspace\\\": false,\\n \\\"queueingInfo\\\": null\\n}\\n2020-04-04 02:38:17,269|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.RunClient.get-async:False|DEBUG|[STOP]\\n2020-04-04 02:38:17,270|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e|DEBUG|Constructing run from dto. type: azureml.scriptrun, source: None, props: {'_azureml.ComputeTargetType': 'amlcompute', 'ContentSnapshotId': 'f53e530a-0dc6-4573-af3b-fa3e6b6f9991', 'azureml.git.repository_uri': 'git@github.com:microsoft/forecasting.git', 'mlflow.source.git.repoURL': 'git@github.com:microsoft/forecasting.git', 'azureml.git.branch': 'chenhui/enhancement', 'mlflow.source.git.branch': 'chenhui/enhancement', 'azureml.git.commit': '93da5e12f190bb96bcb7de6bad0280073e43b984', 'mlflow.source.git.commit': '93da5e12f190bb96bcb7de6bad0280073e43b984', 'azureml.git.dirty': 'True', 'AzureML.DerivedImageName': 'azureml/azureml_7842fd2c5e99a43f1cca1341b66a0ecb', 'ProcessInfoFile': 'azureml-logs/process_info.json', 'ProcessStatusFile': 'azureml-logs/process_status.json'}\\n2020-04-04 02:38:17,270|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunContextManager|DEBUG|Valid logs dir, setting up content loader\\n2020-04-04 02:38:46,240|azureml.core.authentication|DEBUG|Time to expire 1814297.75921 seconds\\n2020-04-04 02:39:02,511|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient|DEBUG|Overrides: Max batch size: 50, batch cushion: 5, Interval: 1.\\n2020-04-04 02:39:02,514|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.PostMetricsBatchDaemon|DEBUG|Starting daemon and triggering first instance\\n2020-04-04 02:39:02,526|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient|DEBUG|Used for use_batch=True.\\n2020-04-04 02:39:02,826|azureml.history._tracking.PythonWorkingDirectory.workingdir|DEBUG|Calling pyfs\\n2020-04-04 02:39:02,826|azureml.history._tracking.PythonWorkingDirectory|INFO|Current working dir: /mnt/batch/tasks/shared/LS_root/jobs/chhamlws/2de7e9cc412442c590a3a3c62880b1e9/tune-lgbm-forecast_1585967817_b60bbc6e/mounts/workspaceblobstore/azureml/tune-lgbm-forecast_1585967817_b60bbc6e\\n2020-04-04 02:39:02,826|azureml.history._tracking.PythonWorkingDirectory.workingdir|DEBUG|Reverting working dir from /mnt/batch/tasks/shared/LS_root/jobs/chhamlws/2de7e9cc412442c590a3a3c62880b1e9/tune-lgbm-forecast_1585967817_b60bbc6e/mounts/workspaceblobstore/azureml/tune-lgbm-forecast_1585967817_b60bbc6e to /mnt/batch/tasks/shared/LS_root/jobs/chhamlws/2de7e9cc412442c590a3a3c62880b1e9/tune-lgbm-forecast_1585967817_b60bbc6e/mounts/workspaceblobstore/azureml/tune-lgbm-forecast_1585967817_b60bbc6e\\n2020-04-04 02:39:02,826|azureml.history._tracking.PythonWorkingDirectory|INFO|Working dir is already updated /mnt/batch/tasks/shared/LS_root/jobs/chhamlws/2de7e9cc412442c590a3a3c62880b1e9/tune-lgbm-forecast_1585967817_b60bbc6e/mounts/workspaceblobstore/azureml/tune-lgbm-forecast_1585967817_b60bbc6e\\n2020-04-04 02:39:02,826|azureml.history._tracking.PythonWorkingDirectory.workingdir|DEBUG|[STOP]\\n2020-04-04 02:39:02,826|azureml.WorkingDirectoryCM|DEBUG|[STOP]\\n2020-04-04 02:39:02,826|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e|INFO|complete is not setting status for submitted runs.\\n2020-04-04 02:39:02,826|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.FlushingMetricsClient|DEBUG|[START]\\n2020-04-04 02:39:02,826|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient|DEBUG|Overrides: Max batch size: 50, batch cushion: 5, Interval: 1.\\n2020-04-04 02:39:02,827|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.PostMetricsBatchDaemon|DEBUG|Starting daemon and triggering first instance\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient|DEBUG|Used for use_batch=True.\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|[START]\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|flush timeout 300 is different from task queue timeout 120, using flush timeout\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|Waiting 300 seconds on tasks: [].\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch|DEBUG|\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|[STOP]\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.FlushingMetricsClient|DEBUG|[STOP]\\n2020-04-04 02:39:02,829|azureml.RunStatusContext|DEBUG|[STOP]\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.FlushingMetricsClient|DEBUG|[START]\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|[START]\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|flush timeout 300.0 is different from task queue timeout 120, using flush timeout\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|Waiting 300.0 seconds on tasks: [].\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch|DEBUG|\\n2020-04-04 02:39:02,829|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|[STOP]\\n2020-04-04 02:39:02,830|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.FlushingMetricsClient|DEBUG|[STOP]\\n2020-04-04 02:39:02,830|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.FlushingMetricsClient|DEBUG|[START]\\n2020-04-04 02:39:02,830|azureml.BatchTaskQueueAdd_1_Batches|DEBUG|[Start]\\n2020-04-04 02:39:02,830|azureml.BatchTaskQueueAdd_1_Batches.WorkerPool|DEBUG|submitting future: _handle_batch\\n2020-04-04 02:39:02,831|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch|DEBUG|Batch size 1.\\n2020-04-04 02:39:02,831|azureml.BatchTaskQueueAdd_1_Batches.0__handle_batch|DEBUG|Using basic handler - no exception handling\\n2020-04-04 02:39:02,831|azureml.BatchTaskQueueAdd_1_Batches|DEBUG|Adding task 0__handle_batch to queue of approximate size: 0\\n2020-04-04 02:39:02,831|azureml.BatchTaskQueueAdd_1_Batches|DEBUG|[Stop] - waiting default timeout\\n2020-04-04 02:39:02,831|azureml.BatchTaskQueueAdd_1_Batches.WaitFlushSource:BatchTaskQueueAdd_1_Batches|DEBUG|[START]\\n2020-04-04 02:39:02,831|azureml.BatchTaskQueueAdd_1_Batches.WaitFlushSource:BatchTaskQueueAdd_1_Batches|DEBUG|Overriding default flush timeout from None to 120\\n2020-04-04 02:39:02,831|azureml.BatchTaskQueueAdd_1_Batches.WaitFlushSource:BatchTaskQueueAdd_1_Batches|DEBUG|Waiting 120 seconds on tasks: [AsyncTask(0__handle_batch)].\\n2020-04-04 02:39:02,831|azureml._restclient.clientbase.WorkerPool|DEBUG|submitting future: _log_batch\\n2020-04-04 02:39:02,832|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.post_batch-async:False|DEBUG|[START]\\n2020-04-04 02:39:02,832|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.0__log_batch|DEBUG|Using basic handler - no exception handling\\n2020-04-04 02:39:02,833|msrest.service_client|DEBUG|Accept header absent and forced to application/json\\n2020-04-04 02:39:02,833|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch|DEBUG|Adding task 0__log_batch to queue of approximate size: 0\\n2020-04-04 02:39:02,833|msrest.universal_http.requests|DEBUG|Configuring retry: max_retries=3, backoff_factor=0.8, max_backoff=90\\n2020-04-04 02:39:02,833|msrest.http_logger|DEBUG|Request URL: 'https://westcentralus.experiments.azureml.net/history/v1.0/subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourceGroups/chhamlwsrg/providers/Microsoft.MachineLearningServices/workspaces/chhamlws/experiments/tune-lgbm-forecast/runs/tune-lgbm-forecast_1585967817_b60bbc6e/batch/metrics'\\n2020-04-04 02:39:02,833|msrest.http_logger|DEBUG|Request method: 'POST'\\n2020-04-04 02:39:02,833|msrest.http_logger|DEBUG|Request headers:\\n2020-04-04 02:39:02,833|msrest.http_logger|DEBUG| 'Accept': 'application/json'\\n2020-04-04 02:39:02,833|msrest.http_logger|DEBUG| 'Content-Type': 'application/json-patch+json; charset=utf-8'\\n2020-04-04 02:39:02,834|msrest.http_logger|DEBUG| 'x-ms-client-request-id': '856debe6-841e-4e77-ba4a-86273ea493ef'\\n2020-04-04 02:39:02,834|msrest.http_logger|DEBUG| 'request-id': '856debe6-841e-4e77-ba4a-86273ea493ef'\\n2020-04-04 02:39:02,834|msrest.http_logger|DEBUG| 'Content-Length': '341'\\n2020-04-04 02:39:02,834|msrest.http_logger|DEBUG| 'User-Agent': 'python/3.6.2 (Linux-4.15.0-1067-azure-x86_64-with-debian-stretch-sid) msrest/0.6.11 azureml._restclient/core.1.0.85 sdk_run'\\n2020-04-04 02:39:02,834|msrest.http_logger|DEBUG|Request body:\\n2020-04-04 02:39:02,834|msrest.http_logger|DEBUG|{\\\"values\\\": [{\\\"metricId\\\": \\\"380b71e2-fa96-4cc1-a6c4-e78f4cd5d84e\\\", \\\"metricType\\\": \\\"azureml.v1.scalar\\\", \\\"createdUtc\\\": \\\"2020-04-04T02:39:02.511623Z\\\", \\\"name\\\": \\\"MAPE\\\", \\\"description\\\": \\\"\\\", \\\"numCells\\\": 1, \\\"cells\\\": [{\\\"MAPE\\\": 66.59144474679267}], \\\"schema\\\": {\\\"numProperties\\\": 1, \\\"properties\\\": [{\\\"propertyId\\\": \\\"MAPE\\\", \\\"name\\\": \\\"MAPE\\\", \\\"type\\\": \\\"float\\\"}]}}]}\\n2020-04-04 02:39:02,834|msrest.universal_http|DEBUG|Configuring redirects: allow=True, max=30\\n2020-04-04 02:39:02,834|msrest.universal_http|DEBUG|Configuring request: timeout=100, verify=True, cert=None\\n2020-04-04 02:39:02,834|msrest.universal_http|DEBUG|Configuring proxies: ''\\n2020-04-04 02:39:02,834|msrest.universal_http|DEBUG|Evaluate proxies against ENV settings: True\\n2020-04-04 02:39:03,000|msrest.http_logger|DEBUG|Response status: 200\\n2020-04-04 02:39:03,000|msrest.http_logger|DEBUG|Response headers:\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG| 'Date': 'Sat, 04 Apr 2020 02:39:02 GMT'\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG| 'Content-Length': '0'\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG| 'Connection': 'keep-alive'\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG| 'Request-Context': 'appId=cid-v1:2d2e8e63-272e-4b3c-8598-4ee570a0e70d'\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG| 'x-ms-client-request-id': '856debe6-841e-4e77-ba4a-86273ea493ef'\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG| 'x-ms-client-session-id': ''\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG| 'Strict-Transport-Security': 'max-age=15724800; includeSubDomains; preload'\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG| 'x-request-time': '0.147'\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG| 'X-Content-Type-Options': 'nosniff'\\n2020-04-04 02:39:03,001|msrest.http_logger|DEBUG|Response content:\\n2020-04-04 02:39:03,002|msrest.http_logger|DEBUG|\\n2020-04-04 02:39:03,003|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.post_batch-async:False|DEBUG|[STOP]\\n2020-04-04 02:39:03,082|azureml.BatchTaskQueueAdd_1_Batches.0__handle_batch.WaitingTask|DEBUG|[START]\\n2020-04-04 02:39:03,082|azureml.BatchTaskQueueAdd_1_Batches.0__handle_batch.WaitingTask|DEBUG|Awaiter is BatchTaskQueueAdd_1_Batches\\n2020-04-04 02:39:03,082|azureml.BatchTaskQueueAdd_1_Batches.0__handle_batch.WaitingTask|DEBUG|[STOP]\\n2020-04-04 02:39:03,083|azureml.BatchTaskQueueAdd_1_Batches|DEBUG|Waiting on task: 0__handle_batch.\\n1 tasks left. Current duration of flush 6.341934204101562e-05 seconds.\\n\\n2020-04-04 02:39:03,083|azureml.BatchTaskQueueAdd_1_Batches.WaitFlushSource:BatchTaskQueueAdd_1_Batches|DEBUG|[STOP]\\n2020-04-04 02:39:03,083|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|[START]\\n2020-04-04 02:39:03,083|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|flush timeout 300.0 is different from task queue timeout 120, using flush timeout\\n2020-04-04 02:39:03,083|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|Waiting 300.0 seconds on tasks: [AsyncTask(0__log_batch)].\\n2020-04-04 02:39:03,084|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.0__log_batch.WaitingTask|DEBUG|[START]\\n2020-04-04 02:39:03,084|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.0__log_batch.WaitingTask|DEBUG|Awaiter is PostMetricsBatch\\n2020-04-04 02:39:03,084|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.0__log_batch.WaitingTask|DEBUG|[STOP]\\n2020-04-04 02:39:03,084|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch|DEBUG|\\n2020-04-04 02:39:03,084|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.PostMetricsBatch.WaitFlushSource:MetricsClient|DEBUG|[STOP]\\n2020-04-04 02:39:03,084|azureml._SubmittedRun#tune-lgbm-forecast_1585967817_b60bbc6e.RunHistoryFacade.MetricsClient.FlushingMetricsClient|DEBUG|[STOP]\\n2020-04-04 02:39:03,084|azureml.SendRunKillSignal|DEBUG|[STOP]\\n2020-04-04 02:39:03,085|azureml.HistoryTrackingWorkerPool.WorkerPoolShutdown|DEBUG|[START]\\n2020-04-04 02:39:03,085|azureml.HistoryTrackingWorkerPool.WorkerPoolShutdown|DEBUG|[STOP]\\n2020-04-04 02:39:03,085|azureml.WorkerPool|DEBUG|[STOP]\\n\\nRun is completed.\", \"graph\": {}, \"widget_settings\": {\"childWidgetDisplay\": \"popup\", \"send_telemetry\": true, \"log_level\": \"INFO\", \"sdk_version\": \"1.0.85\"}, \"loading\": false}" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "RunDetails(run_remote).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can check the validation metric after the job finishes. The validation metric should be the same as the one we obtained when the script was ran locally. For more details of the job, you can execute `run_remote.get_details()`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'MAPE': 66.59144474679267}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get metric value after the job finishes\n", + "run_remote.wait_for_completion()\n", + "run_remote.get_metrics()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Tune Hyperparameters using HyperDrive\n", + "\n", + "Now we are ready to tune hyperparameters of the LightGBM forecast model by launching multiple runs on the cluster. In the following cell, we define the configuration of a HyperDrive job that does a parallel search of the hyperparameter space using a Bayesian sampling method. HyperDrive also supports random sampling of the parameter space.\n", + "\n", + "It is recommended that the maximum number of runs should be greater than or equal to 20 times the number of hyperparameters being tuned, for best results with Bayesian sampling. Specifically, it should be no less than 180 in the following case as we have 9 hyperparameters to tune. Nevertheless, we find that even with a very small amount of runs Bayesian search can achieve decent performance. Thus, the maximum number of child runs of HyperDrive `max_total_runs` is set as `20` to reduce the running time." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "For best results with Bayesian Sampling we recommend using a maximum number of runs greater than or equal to 20 times the number of hyperparameters being tuned. Current value for max_total_runs:20. Recommendend value:180.\n", + "WARNING - Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', OSError(\"(104, 'ECONNRESET')\",))': /azureml/LocalUpload/HD_dcf456bc-203d-42aa-892e-23fe23133bb5/azure_hyperdrive_lightgbm.ipynb?sv=2019-02-02&sr=b&sig=6vSboBoAni5Utk6oKUInYOz1eN258%2BmZiHVvvQQupT4%3D&st=2020-04-04T02%3A29%3A15Z&se=2020-04-05T02%3A39%3A15Z&sp=rcw&comp=block&blockid=TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQSUzRA%3D%3D&timeout=30\n" + ] + } + ], + "source": [ + "# Increase this value if you want to achieve better performance\n", + "max_total_runs = 20\n", + "script_params = {\"--data-folder\": ds_data.as_mount()}\n", + "est = Estimator(\n", + " source_directory=script_folder,\n", + " script_params=script_params,\n", + " compute_target=compute_target,\n", + " use_docker=True,\n", + " entry_script=train_script_name,\n", + " environment_definition=env,\n", + ")\n", + "\n", + "# Specify hyperparameter space\n", + "ps = BayesianParameterSampling(\n", + " {\n", + " \"--num-leaves\": quniform(8, 128, 1),\n", + " \"--min-data-in-leaf\": quniform(20, 500, 10),\n", + " \"--learning-rate\": choice(\n", + " 1e-4, 1e-3, 5e-3, 1e-2, 1.5e-2, 2e-2, 3e-2, 5e-2, 1e-1\n", + " ),\n", + " \"--feature-fraction\": uniform(0.2, 1),\n", + " \"--bagging-fraction\": uniform(0.1, 1),\n", + " \"--bagging-freq\": quniform(1, 20, 1),\n", + " \"--max-rounds\": quniform(50, 2000, 10),\n", + " \"--max-lag\": quniform(3, 40, 1),\n", + " \"--window-size\": quniform(3, 40, 1),\n", + " }\n", + ")\n", + "\n", + "# HyperDrive job configuration\n", + "htc = HyperDriveConfig(\n", + " estimator=est,\n", + " hyperparameter_sampling=ps,\n", + " primary_metric_name=\"MAPE\",\n", + " primary_metric_goal=PrimaryMetricGoal.MINIMIZE,\n", + " max_total_runs=max_total_runs,\n", + " max_concurrent_runs=4,\n", + ")\n", + "\n", + "htr = exp.submit(config=htc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After the job finishes, you should see outputs from the AzureML widgets similar to the following. Note that you can rerun `RunDetails(htr).show()` after the job finishes to get the updated results on the dashboard in case it is not automatically refreshed.\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "212902d6c8da419c94ac9df6086678c1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "_HyperDriveWidget(widget_settings={'childWidgetDisplay': 'popup', 'send_telemetry': True, 'log_level': 'INFO',…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/aml.mini.widget.v1": "{\"status\": \"Running\", \"workbench_run_details_uri\": \"https://ml.azure.com/experiments/tune-lgbm-forecast/runs/HD_dcf456bc-203d-42aa-892e-23fe23133bb5?wsid=/subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourcegroups/chhamlwsrg/workspaces/chhamlws\", \"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5\", \"run_properties\": {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5\", \"created_utc\": \"2020-04-04T02:39:10.910797Z\", \"properties\": {\"primary_metric_config\": \"{\\\"name\\\": \\\"MAPE\\\", \\\"goal\\\": \\\"minimize\\\"}\", \"resume_from\": \"null\", \"runTemplate\": \"HyperDrive\", \"azureml.runsource\": \"hyperdrive\", \"platform\": \"AML\", \"ContentSnapshotId\": \"f53e530a-0dc6-4573-af3b-fa3e6b6f9991\"}, \"tags\": {\"max_concurrent_jobs\": \"4\", \"max_total_jobs\": \"20\", \"max_duration_minutes\": \"10080\", \"policy_config\": \"{\\\"name\\\": \\\"DEFAULT\\\"}\", \"generator_config\": \"{\\\"name\\\": \\\"BAYESIANOPTIMIZATION\\\", \\\"parameter_space\\\": {\\\"--num-leaves\\\": [\\\"quniform\\\", [8, 128, 1]], \\\"--min-data-in-leaf\\\": [\\\"quniform\\\", [20, 500, 10]], \\\"--learning-rate\\\": [\\\"choice\\\", [[0.0001, 0.001, 0.005, 0.01, 0.015, 0.02, 0.03, 0.05, 0.1]]], \\\"--feature-fraction\\\": [\\\"uniform\\\", [0.2, 1]], \\\"--bagging-fraction\\\": [\\\"uniform\\\", [0.1, 1]], \\\"--bagging-freq\\\": [\\\"quniform\\\", [1, 20, 1]], \\\"--max-rounds\\\": [\\\"quniform\\\", [50, 2000, 10]], \\\"--max-lag\\\": [\\\"quniform\\\", [3, 40, 1]], \\\"--window-size\\\": [\\\"quniform\\\", [3, 40, 1]]}}\", \"primary_metric_config\": \"{\\\"name\\\": \\\"MAPE\\\", \\\"goal\\\": \\\"minimize\\\"}\", \"platform_config\": \"{\\\"ServiceAddress\\\": \\\"https://westcentralus.experiments.azureml.net\\\", \\\"ServiceArmScope\\\": \\\"subscriptions/9086b59a-02d7-4687-b3fd-e39fa5e0fd9b/resourceGroups/chhamlwsrg/providers/Microsoft.MachineLearningServices/workspaces/chhamlws/experiments/tune-lgbm-forecast\\\", \\\"SubscriptionId\\\": \\\"9086b59a-02d7-4687-b3fd-e39fa5e0fd9b\\\", \\\"ResourceGroupName\\\": \\\"chhamlwsrg\\\", \\\"WorkspaceName\\\": \\\"chhamlws\\\", \\\"ExperimentName\\\": \\\"tune-lgbm-forecast\\\", \\\"Definition\\\": {\\\"Overrides\\\": {\\\"script\\\": \\\"train_validate.py\\\", \\\"arguments\\\": [\\\"--data-folder\\\", \\\"$AZUREML_DATAREFERENCE_00b162eda80e4ee9a050e69c71311ecc\\\"], \\\"target\\\": \\\"cpu-cluster\\\", \\\"framework\\\": \\\"Python\\\", \\\"communicator\\\": \\\"None\\\", \\\"maxRunDurationSeconds\\\": null, \\\"nodeCount\\\": 1, \\\"environment\\\": {\\\"name\\\": null, \\\"version\\\": null, \\\"environmentVariables\\\": {\\\"EXAMPLE_ENV_VAR\\\": \\\"EXAMPLE_VALUE\\\"}, \\\"python\\\": {\\\"userManagedDependencies\\\": false, \\\"interpreterPath\\\": \\\"python\\\", \\\"condaDependenciesFile\\\": null, \\\"baseCondaEnvironment\\\": null, \\\"condaDependencies\\\": {\\\"name\\\": \\\"project_environment\\\", \\\"dependencies\\\": [\\\"python=3.6.2\\\", {\\\"pip\\\": [\\\"azureml-defaults\\\"]}, \\\"pandas\\\", \\\"numpy\\\", \\\"scipy\\\", \\\"scikit-learn\\\", \\\"lightgbm\\\", \\\"joblib\\\"], \\\"channels\\\": [\\\"conda-forge\\\"]}}, \\\"docker\\\": {\\\"enabled\\\": true, \\\"baseImage\\\": \\\"mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04\\\", \\\"baseDockerfile\\\": null, \\\"sharedVolumes\\\": true, \\\"shmSize\\\": \\\"2g\\\", \\\"arguments\\\": [], \\\"baseImageRegistry\\\": {\\\"address\\\": null, \\\"username\\\": null, \\\"password\\\": null}}, \\\"spark\\\": {\\\"repositories\\\": [], \\\"packages\\\": [], \\\"precachePackages\\\": true}, \\\"databricks\\\": {\\\"mavenLibraries\\\": [], \\\"pypiLibraries\\\": [], \\\"rcranLibraries\\\": [], \\\"jarLibraries\\\": [], \\\"eggLibraries\\\": []}, \\\"inferencingStackVersion\\\": null}, \\\"history\\\": {\\\"outputCollection\\\": true, \\\"snapshotProject\\\": true, \\\"directoriesToWatch\\\": [\\\"logs\\\"]}, \\\"spark\\\": {\\\"configuration\\\": {\\\"spark.app.name\\\": \\\"Azure ML Experiment\\\", \\\"spark.yarn.maxAppAttempts\\\": 1}}, \\\"hdi\\\": {\\\"yarnDeployMode\\\": \\\"cluster\\\"}, \\\"tensorflow\\\": {\\\"workerCount\\\": 1, \\\"parameterServerCount\\\": 1}, \\\"mpi\\\": {\\\"processCountPerNode\\\": 1}, \\\"dataReferences\\\": {\\\"00b162eda80e4ee9a050e69c71311ecc\\\": {\\\"dataStoreName\\\": \\\"workspaceblobstore\\\", \\\"pathOnDataStore\\\": \\\"data\\\", \\\"mode\\\": \\\"mount\\\", \\\"overwrite\\\": false, \\\"pathOnCompute\\\": null}}, \\\"data\\\": {}, \\\"sourceDirectoryDataStore\\\": null, \\\"amlcompute\\\": {\\\"vmSize\\\": null, \\\"vmPriority\\\": null, \\\"retainCluster\\\": false, \\\"name\\\": null, \\\"clusterMaxNodeCount\\\": 1}}, \\\"TargetDetails\\\": null, \\\"SnapshotId\\\": \\\"f53e530a-0dc6-4573-af3b-fa3e6b6f9991\\\", \\\"TelemetryValues\\\": {\\\"amlClientType\\\": \\\"azureml-sdk-train\\\", \\\"amlClientModule\\\": \\\"azureml.train.hyperdrive._search\\\", \\\"amlClientFunction\\\": \\\"search\\\", \\\"tenantId\\\": \\\"72f988bf-86f1-41af-91ab-2d7cd011db47\\\", \\\"amlClientRequestId\\\": \\\"d33b8221-6a56-46a2-872d-59fb5518c495\\\", \\\"amlClientSessionId\\\": \\\"ec946709-8415-42aa-8488-c338bfd87e21\\\", \\\"subscriptionId\\\": \\\"9086b59a-02d7-4687-b3fd-e39fa5e0fd9b\\\", \\\"estimator\\\": \\\"Estimator\\\", \\\"samplingMethod\\\": \\\"BayesianOptimization\\\", \\\"terminationPolicy\\\": \\\"Default\\\", \\\"primaryMetricGoal\\\": \\\"minimize\\\", \\\"maxTotalRuns\\\": 20, \\\"maxConcurrentRuns\\\": 4, \\\"maxDurationMinutes\\\": 10080, \\\"computeTarget\\\": \\\"AmlCompute\\\", \\\"vmSize\\\": null}}}\", \"resume_child_runs\": \"null\", \"all_jobs_generated\": \"false\", \"cancellation_requested\": \"false\", \"progress_metadata_evaluation_timestamp\": \"\\\"2020-04-04T02:39:11.746519\\\"\", \"progress_metadata_digest\": \"\\\"b231935578bf29c38a1a8fe1476801df373a5b0316a3e88096fe736ec786869c\\\"\", \"progress_metadata_active_timestamp\": \"\\\"2020-04-04T02:39:11.746519\\\"\", \"environment_preparation_status\": \"PREPARED\", \"prepare_run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_preparation\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_0\": \"{\\\"--num-leaves\\\": 43, \\\"--min-data-in-leaf\\\": 40, \\\"--learning-rate\\\": 0.005, \\\"--feature-fraction\\\": 0.522105759494254, \\\"--bagging-fraction\\\": 0.44597750968785044, \\\"--bagging-freq\\\": 16, \\\"--max-rounds\\\": 1690, \\\"--max-lag\\\": 4, \\\"--window-size\\\": 25}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_1\": \"{\\\"--num-leaves\\\": 73, \\\"--min-data-in-leaf\\\": 60, \\\"--learning-rate\\\": 0.1, \\\"--feature-fraction\\\": 0.4059469819299132, \\\"--bagging-fraction\\\": 0.6418938497070497, \\\"--bagging-freq\\\": 16, \\\"--max-rounds\\\": 1620, \\\"--max-lag\\\": 13, \\\"--window-size\\\": 19}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_2\": \"{\\\"--num-leaves\\\": 108, \\\"--min-data-in-leaf\\\": 120, \\\"--learning-rate\\\": 0.05, \\\"--feature-fraction\\\": 0.21188946746489892, \\\"--bagging-fraction\\\": 0.604654482720839, \\\"--bagging-freq\\\": 4, \\\"--max-rounds\\\": 1240, \\\"--max-lag\\\": 6, \\\"--window-size\\\": 12}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_3\": \"{\\\"--num-leaves\\\": 9, \\\"--min-data-in-leaf\\\": 80, \\\"--learning-rate\\\": 0.015, \\\"--feature-fraction\\\": 0.8524889664424598, \\\"--bagging-fraction\\\": 0.3712070083444936, \\\"--bagging-freq\\\": 9, \\\"--max-rounds\\\": 110, \\\"--max-lag\\\": 15, \\\"--window-size\\\": 40}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_4\": \"{\\\"--num-leaves\\\": 11, \\\"--min-data-in-leaf\\\": 410, \\\"--learning-rate\\\": 0.005, \\\"--feature-fraction\\\": 0.237131500290646, \\\"--bagging-fraction\\\": 0.46710483442198847, \\\"--bagging-freq\\\": 2, \\\"--max-rounds\\\": 1040, \\\"--max-lag\\\": 21, \\\"--window-size\\\": 8}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_5\": \"{\\\"--num-leaves\\\": 46, \\\"--min-data-in-leaf\\\": 190, \\\"--learning-rate\\\": 0.0001, \\\"--feature-fraction\\\": 0.34701496623400496, \\\"--bagging-fraction\\\": 0.9120679296928682, \\\"--bagging-freq\\\": 6, \\\"--max-rounds\\\": 580, \\\"--max-lag\\\": 30, \\\"--window-size\\\": 23}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_6\": \"{\\\"--num-leaves\\\": 107, \\\"--min-data-in-leaf\\\": 250, \\\"--learning-rate\\\": 0.1, \\\"--feature-fraction\\\": 0.9161386628837784, \\\"--bagging-fraction\\\": 0.2417820471108519, \\\"--bagging-freq\\\": 9, \\\"--max-rounds\\\": 120, \\\"--max-lag\\\": 7, \\\"--window-size\\\": 23}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_7\": \"{\\\"--num-leaves\\\": 97, \\\"--min-data-in-leaf\\\": 180, \\\"--learning-rate\\\": 0.05, \\\"--feature-fraction\\\": 0.6031270996331206, \\\"--bagging-fraction\\\": 0.918316833768419, \\\"--bagging-freq\\\": 16, \\\"--max-rounds\\\": 1410, \\\"--max-lag\\\": 25, \\\"--window-size\\\": 29}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_8\": \"{\\\"--num-leaves\\\": 121, \\\"--min-data-in-leaf\\\": 270, \\\"--learning-rate\\\": 0.001, \\\"--feature-fraction\\\": 0.7262272957355567, \\\"--bagging-fraction\\\": 0.49925280404591377, \\\"--bagging-freq\\\": 8, \\\"--max-rounds\\\": 860, \\\"--max-lag\\\": 20, \\\"--window-size\\\": 26}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_9\": \"{\\\"--num-leaves\\\": 121, \\\"--min-data-in-leaf\\\": 310, \\\"--learning-rate\\\": 0.05, \\\"--feature-fraction\\\": 0.6457203702824046, \\\"--bagging-fraction\\\": 0.7834345415012108, \\\"--bagging-freq\\\": 15, \\\"--max-rounds\\\": 1340, \\\"--max-lag\\\": 24, \\\"--window-size\\\": 8}\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_10\": \"{\\\"--num-leaves\\\": 117, \\\"--min-data-in-leaf\\\": 290, \\\"--learning-rate\\\": 0.01, \\\"--feature-fraction\\\": 0.8910572969746846, \\\"--bagging-fraction\\\": 0.7682158168093952, \\\"--bagging-freq\\\": 1, \\\"--max-rounds\\\": 1470, \\\"--max-lag\\\": 33, \\\"--window-size\\\": 7}\"}, \"end_time_utc\": null, \"status\": \"Running\", \"log_files\": {\"azureml-logs/hyperdrive.txt\": \"https://chhamlws4931040064.blob.core.windows.net/azureml/ExperimentRun/dcid.HD_dcf456bc-203d-42aa-892e-23fe23133bb5/azureml-logs/hyperdrive.txt?sv=2019-02-02&sr=b&sig=NG%2FsCUOcXOTez806c1GJln0Ebbb2oTEtNtO9gMsR0vY%3D&st=2020-04-04T02%3A35%3A36Z&se=2020-04-04T10%3A45%3A36Z&sp=r\"}, \"log_groups\": [[\"azureml-logs/hyperdrive.txt\"]], \"run_duration\": \"0:06:25\", \"hyper_parameters\": {\"--num-leaves\": [\"quniform\", [8, 128, 1]], \"--min-data-in-leaf\": [\"quniform\", [20, 500, 10]], \"--learning-rate\": [\"choice\", [[0.0001, 0.001, 0.005, 0.01, 0.015, 0.02, 0.03, 0.05, 0.1]]], \"--feature-fraction\": [\"uniform\", [0.2, 1]], \"--bagging-fraction\": [\"uniform\", [0.1, 1]], \"--bagging-freq\": [\"quniform\", [1, 20, 1]], \"--max-rounds\": [\"quniform\", [50, 2000, 10]], \"--max-lag\": [\"quniform\", [3, 40, 1]], \"--window-size\": [\"quniform\", [3, 40, 1]]}}, \"child_runs\": [{\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_1\", \"run_number\": 305, \"metric\": 35.66304484, \"status\": \"Completed\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:40:19.067757Z\", \"end_time\": \"2020-04-04T02:42:42.663093Z\", \"created_time\": \"2020-04-04T02:39:43.617669Z\", \"created_time_dt\": \"2020-04-04T02:39:43.617669Z\", \"duration\": \"0:02:59\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 73, \"param_--min-data-in-leaf\": 60, \"param_--learning-rate\": 0.1, \"param_--feature-fraction\": 0.4059469819299132, \"param_--bagging-fraction\": 0.6418938497070497, \"param_--bagging-freq\": 16, \"param_--max-rounds\": 1620, \"param_--max-lag\": 13, \"param_--window-size\": 19, \"best_metric\": 35.66304484}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_2\", \"run_number\": 306, \"metric\": 31.52092181, \"status\": \"Completed\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:40:17.682969Z\", \"end_time\": \"2020-04-04T02:42:19.718203Z\", \"created_time\": \"2020-04-04T02:39:44.273565Z\", \"created_time_dt\": \"2020-04-04T02:39:44.273565Z\", \"duration\": \"0:02:35\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 108, \"param_--min-data-in-leaf\": 120, \"param_--learning-rate\": 0.05, \"param_--feature-fraction\": 0.21188946746489892, \"param_--bagging-fraction\": 0.604654482720839, \"param_--bagging-freq\": 4, \"param_--max-rounds\": 1240, \"param_--max-lag\": 6, \"param_--window-size\": 12, \"best_metric\": 31.52092181}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_0\", \"run_number\": 307, \"metric\": 40.01020292, \"status\": \"Completed\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:40:17.827364Z\", \"end_time\": \"2020-04-04T02:43:10.136186Z\", \"created_time\": \"2020-04-04T02:39:44.282105Z\", \"created_time_dt\": \"2020-04-04T02:39:44.282105Z\", \"duration\": \"0:03:25\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 43, \"param_--min-data-in-leaf\": 40, \"param_--learning-rate\": 0.005, \"param_--feature-fraction\": 0.522105759494254, \"param_--bagging-fraction\": 0.44597750968785044, \"param_--bagging-freq\": 16, \"param_--max-rounds\": 1690, \"param_--max-lag\": 4, \"param_--window-size\": 25, \"best_metric\": 31.52092181}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_3\", \"run_number\": 308, \"metric\": 54.46713976, \"status\": \"Completed\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:40:19.717567Z\", \"end_time\": \"2020-04-04T02:41:16.371071Z\", \"created_time\": \"2020-04-04T02:39:44.984587Z\", \"created_time_dt\": \"2020-04-04T02:39:44.984587Z\", \"duration\": \"0:01:31\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 9, \"param_--min-data-in-leaf\": 80, \"param_--learning-rate\": 0.015, \"param_--feature-fraction\": 0.8524889664424598, \"param_--bagging-fraction\": 0.3712070083444936, \"param_--bagging-freq\": 9, \"param_--max-rounds\": 110, \"param_--max-lag\": 15, \"param_--window-size\": 40, \"best_metric\": 31.52092181}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_4\", \"run_number\": 309, \"metric\": 43.36610118, \"status\": \"Completed\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:42:20.25632Z\", \"end_time\": \"2020-04-04T02:43:55.750217Z\", \"created_time\": \"2020-04-04T02:41:47.722315Z\", \"created_time_dt\": \"2020-04-04T02:41:47.722315Z\", \"duration\": \"0:02:08\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 11, \"param_--min-data-in-leaf\": 410, \"param_--learning-rate\": 0.005, \"param_--feature-fraction\": 0.237131500290646, \"param_--bagging-fraction\": 0.46710483442198847, \"param_--bagging-freq\": 2, \"param_--max-rounds\": 1040, \"param_--max-lag\": 21, \"param_--window-size\": 8, \"best_metric\": 31.52092181}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_6\", \"run_number\": 310, \"metric\": 36.42988546, \"status\": \"Completed\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:43:28.431416Z\", \"end_time\": \"2020-04-04T02:44:26.636679Z\", \"created_time\": \"2020-04-04T02:42:49.776024Z\", \"created_time_dt\": \"2020-04-04T02:42:49.776024Z\", \"duration\": \"0:01:36\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 107, \"param_--min-data-in-leaf\": 250, \"param_--learning-rate\": 0.1, \"param_--feature-fraction\": 0.9161386628837784, \"param_--bagging-fraction\": 0.2417820471108519, \"param_--bagging-freq\": 9, \"param_--max-rounds\": 120, \"param_--max-lag\": 7, \"param_--window-size\": 23, \"best_metric\": 31.52092181}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_5\", \"run_number\": 311, \"metric\": 74.39909023, \"status\": \"Completed\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:43:31.086471Z\", \"end_time\": \"2020-04-04T02:45:18.469123Z\", \"created_time\": \"2020-04-04T02:42:51.128442Z\", \"created_time_dt\": \"2020-04-04T02:42:51.128442Z\", \"duration\": \"0:02:27\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 46, \"param_--min-data-in-leaf\": 190, \"param_--learning-rate\": 0.0001, \"param_--feature-fraction\": 0.34701496623400496, \"param_--bagging-fraction\": 0.9120679296928682, \"param_--bagging-freq\": 6, \"param_--max-rounds\": 580, \"param_--max-lag\": 30, \"param_--window-size\": 23, \"best_metric\": 31.52092181}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_7\", \"run_number\": 312, \"metric\": null, \"status\": \"Running\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:43:59.44461Z\", \"end_time\": \"\", \"created_time\": \"2020-04-04T02:43:24.1603Z\", \"created_time_dt\": \"2020-04-04T02:43:24.1603Z\", \"duration\": \"0:02:12\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 97, \"param_--min-data-in-leaf\": 180, \"param_--learning-rate\": 0.05, \"param_--feature-fraction\": 0.6031270996331206, \"param_--bagging-fraction\": 0.918316833768419, \"param_--bagging-freq\": 16, \"param_--max-rounds\": 1410, \"param_--max-lag\": 25, \"param_--window-size\": 29, \"best_metric\": null}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_8\", \"run_number\": 313, \"metric\": null, \"status\": \"Running\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:45:11.897611Z\", \"end_time\": \"\", \"created_time\": \"2020-04-04T02:44:26.603338Z\", \"created_time_dt\": \"2020-04-04T02:44:26.603338Z\", \"duration\": \"0:01:09\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 121, \"param_--min-data-in-leaf\": 270, \"param_--learning-rate\": 0.001, \"param_--feature-fraction\": 0.7262272957355567, \"param_--bagging-fraction\": 0.49925280404591377, \"param_--bagging-freq\": 8, \"param_--max-rounds\": 860, \"param_--max-lag\": 20, \"param_--window-size\": 26, \"best_metric\": null}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_9\", \"run_number\": 314, \"metric\": null, \"status\": \"Running\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"2020-04-04T02:45:35.480471Z\", \"end_time\": \"\", \"created_time\": \"2020-04-04T02:45:02.392458Z\", \"created_time_dt\": \"2020-04-04T02:45:02.392458Z\", \"duration\": \"0:00:34\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 121, \"param_--min-data-in-leaf\": 310, \"param_--learning-rate\": 0.05, \"param_--feature-fraction\": 0.6457203702824046, \"param_--bagging-fraction\": 0.7834345415012108, \"param_--bagging-freq\": 15, \"param_--max-rounds\": 1340, \"param_--max-lag\": 24, \"param_--window-size\": 8, \"best_metric\": null}, {\"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_10\", \"run_number\": 315, \"metric\": null, \"status\": \"Starting\", \"run_type\": \"azureml.scriptrun\", \"training_percent\": null, \"start_time\": \"\", \"end_time\": \"\", \"created_time\": \"2020-04-04T02:45:33.616722Z\", \"created_time_dt\": \"2020-04-04T02:45:33.616722Z\", \"duration\": \"0:00:02\", \"hyperdrive_id\": \"dcf456bc-203d-42aa-892e-23fe23133bb5\", \"arguments\": null, \"param_--num-leaves\": 117, \"param_--min-data-in-leaf\": 290, \"param_--learning-rate\": 0.01, \"param_--feature-fraction\": 0.8910572969746846, \"param_--bagging-fraction\": 0.7682158168093952, \"param_--bagging-freq\": 1, \"param_--max-rounds\": 1470, \"param_--max-lag\": 33, \"param_--window-size\": 7, \"best_metric\": null}], \"children_metrics\": {\"categories\": [0], \"series\": {\"MAPE\": [{\"categories\": [305, 306, 307, 308, 309, 310, 311], \"mode\": \"markers\", \"name\": \"MAPE\", \"stepped\": false, \"type\": \"scatter\", \"data\": [35.66304484399933, 31.520921807705783, 40.01020292109138, 54.467139761173954, 43.36610118248853, 36.42988545942116, 74.39909022797315]}, {\"categories\": [305, 306, 307, 308, 309, 310, 311], \"mode\": \"lines\", \"name\": \"MAPE_min\", \"stepped\": true, \"type\": \"scatter\", \"data\": [35.66304484399933, 31.520921807705783, 31.520921807705783, 31.520921807705783, 31.520921807705783, 31.520921807705783, 31.520921807705783]}]}, \"metricName\": null, \"primaryMetricName\": \"MAPE\", \"showLegend\": false}, \"run_metrics\": [{\"name\": \"best_child_by_primary_metric\", \"run_id\": \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5\", \"categories\": [0], \"series\": [{\"data\": [{\"metric_name\": [\"MAPE\", \"MAPE\"], \"timestamp\": [\"2020-04-04 02:41:22.286881+00:00\", \"2020-04-04 02:42:27.993375+00:00\"], \"run_id\": [\"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_3\", \"HD_dcf456bc-203d-42aa-892e-23fe23133bb5_2\"], \"metric_value\": [54.467139761173954, 31.520921807705783], \"final\": [false, false]}]}]}], \"run_logs\": \"[2020-04-04T02:39:11.255619][API][INFO]Experiment created\\r\\n[2020-04-04T02:39:12.5213110Z][SCHEDULER][INFO]The execution environment is being prepared. Please be patient as it can take a few minutes.\\r\\n[2020-04-04T02:39:13.556831][GENERATOR][INFO]Trying to sample '4' jobs from the hyperparameter space\\r\\n[2020-04-04T02:39:14.060179][GENERATOR][INFO]Successfully sampled '4' jobs, they will soon be submitted to the execution target.\\r\\n[2020-04-04T02:39:42.9700580Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_0'\\r\\n[2020-04-04T02:39:42.9722386Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_1'\\r\\n[2020-04-04T02:39:42.9772902Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_2'\\r\\n[2020-04-04T02:39:42.9780717Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_3'\\r\\n[2020-04-04T02:39:42.9693756Z][SCHEDULER][INFO]The execution environment was successfully prepared.\\r\\n[2020-04-04T02:39:43.7589552Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_1'\\r\\n[2020-04-04T02:39:44.3434965Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_2'\\r\\n[2020-04-04T02:39:44.5008781Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_0'\\r\\n[2020-04-04T02:39:45.2071910Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_3'\\r\\n[2020-04-04T02:41:16.872902][GENERATOR][INFO]Trying to sample '1' jobs from the hyperparameter space\\r\\n[2020-04-04T02:41:17.410855][GENERATOR][INFO]Successfully sampled '1' jobs, they will soon be submitted to the execution target.\\r\\n[2020-04-04T02:41:46.2064520Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_4'\\r\\n[2020-04-04T02:41:47.8430229Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_4'\\r\\n[2020-04-04T02:42:47.917526][GENERATOR][INFO]Trying to sample '2' jobs from the hyperparameter space\\r\\n[2020-04-04T02:42:48.167748][GENERATOR][INFO]Successfully sampled '2' jobs, they will soon be submitted to the execution target.\\r\\n[2020-04-04T02:42:48.3844919Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_5'\\r\\n[2020-04-04T02:42:48.3858988Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_6'\\r\\n[2020-04-04T02:42:49.9149211Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_6'\\r\\n[2020-04-04T02:42:51.2342141Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_5'\\r\\n[2020-04-04T02:43:17.808295][GENERATOR][INFO]Trying to sample '1' jobs from the hyperparameter space\\r\\n[2020-04-04T02:43:18.413897][GENERATOR][INFO]Successfully sampled '1' jobs, they will soon be submitted to the execution target.\\r\\n[2020-04-04T02:43:21.8429304Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_7'\\r\\n[2020-04-04T02:43:24.2862575Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_7'\\r\\n[2020-04-04T02:44:20.899838][GENERATOR][INFO]Trying to sample '1' jobs from the hyperparameter space\\r\\n[2020-04-04T02:44:21.230671][GENERATOR][INFO]Successfully sampled '1' jobs, they will soon be submitted to the execution target.\\r\\n[2020-04-04T02:44:25.1026296Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_8'\\r\\n[2020-04-04T02:44:26.6770139Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_8'\\r\\n[2020-04-04T02:44:51.721028][GENERATOR][INFO]Trying to sample '1' jobs from the hyperparameter space\\r\\n[2020-04-04T02:44:52.063243][GENERATOR][INFO]Successfully sampled '1' jobs, they will soon be submitted to the execution target.\\r\\n[2020-04-04T02:44:57.2379682Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_9'\\r\\n[2020-04-04T02:45:02.4538892Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_9'\\r\\n[2020-04-04T02:45:21.786073][GENERATOR][INFO]Trying to sample '1' jobs from the hyperparameter space\\r\\n[2020-04-04T02:45:22.639217][GENERATOR][INFO]Successfully sampled '1' jobs, they will soon be submitted to the execution target.\\r\\n[2020-04-04T02:45:32.8066779Z][SCHEDULER][INFO]Scheduling job, id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_10'\\r\\n[2020-04-04T02:45:33.6834906Z][SCHEDULER][INFO]Successfully scheduled a job. Id='HD_dcf456bc-203d-42aa-892e-23fe23133bb5_10'\\n\", \"graph\": {}, \"widget_settings\": {\"childWidgetDisplay\": \"popup\", \"send_telemetry\": true, \"log_level\": \"INFO\", \"sdk_version\": \"1.0.85\"}, \"loading\": false}" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "RunDetails(htr).show()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_0': {'MAPE': 40.01020292109138},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_1': {'MAPE': 35.66304484399933},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_10': {'MAPE': 31.426060595052864},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_11': {'MAPE': 33.91326303044655},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_12': {'MAPE': 51.328982763337386},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_13': {'MAPE': 51.009816065385024},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_14': {'MAPE': 32.77447126411579},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_15': {'MAPE': 39.74068138374286},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_16': {'MAPE': 38.2882828405659},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_17': {'MAPE': 34.40702333027746},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_18': {'MAPE': 74.62836589958232},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_19': {'MAPE': 37.81360598994933},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_2': {'MAPE': 31.520921807705783},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_3': {'MAPE': 54.467139761173954},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_4': {'MAPE': 43.36610118248853},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_5': {'MAPE': 74.39909022797315},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_6': {'MAPE': 36.42988545942116},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_7': {'MAPE': 32.22186405710004},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_8': {'MAPE': 48.3703940647382},\n", + " 'HD_dcf456bc-203d-42aa-892e-23fe23133bb5_9': {'MAPE': 30.255644695749783}}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "htr.wait_for_completion()\n", + "htr.get_metrics()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The best model and its hyperparameter values can be retrieved as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['--data-folder', '$AZUREML_DATAREFERENCE_00b162eda80e4ee9a050e69c71311ecc', '--num-leaves', '121', '--min-data-in-leaf', '310', '--learning-rate', '0.05', '--feature-fraction', '0.645720370282405', '--bagging-fraction', '0.783434541501211', '--bagging-freq', '15', '--max-rounds', '1340', '--max-lag', '24', '--window-size', '8']\n" + ] + } + ], + "source": [ + "best_run = htr.get_best_run_by_primary_metric()\n", + "parameter_values = best_run.get_details()[\"runDefinition\"][\"arguments\"]\n", + "print(parameter_values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then register the folder (and all files in it) as a model named `lgbm-oj-forecast` under the workspace for deployment." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "model = best_run.register_model(\n", + " model_name=\"lgbm-oj-forecast\", model_path=\"outputs/model\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deploy the Model in ACI\n", + "\n", + "Now we are ready to deploy the model as a web service running in Azure Container Instance [ACI](https://azure.microsoft.com/en-us/services/container-instances/). Azure Machine Learning accomplishes this by constructing a Docker image with the scoring logic and model baked in.\n", + "\n", + "### Create score.py\n", + "\n", + "First, we will create a scoring script that will be invoked by the web service call.\n", + "\n", + "* Note that the scoring script must have two required functions, `init()` and `run(input_data)`.\n", + " - In `init()` function, you typically load the model into a global object. This function is executed only once when the Docker container is started.\n", + " - In `run(input_data)` function, the model is used to predict a value based on the input data. The input and output to run typically use JSON as serialization and de-serialization format but you are not limited to that." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting score.py\n" + ] + } + ], + "source": [ + "%%writefile score.py\n", + "import os\n", + "import json\n", + "import numpy as np\n", + "import pandas as pd\n", + "import lightgbm as lgb\n", + "\n", + "\n", + "def init():\n", + " global bst\n", + " model_root = os.getenv(\"AZUREML_MODEL_DIR\")\n", + " # The name of the folder in which to look for LightGBM model files\n", + " lgbm_model_folder = \"model\"\n", + " bst = lgb.Booster(\n", + " model_file=os.path.join(model_root, lgbm_model_folder, \"bst-model.txt\")\n", + " )\n", + "\n", + "\n", + "def run(raw_data):\n", + " columns = bst.feature_name()\n", + " data = np.array(json.loads(raw_data)[\"data\"])\n", + " test_df = pd.DataFrame(data=data, columns=columns)\n", + " # Make prediction\n", + " out = bst.predict(test_df)\n", + " return out.tolist()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create myenv.yml\n", + "\n", + "We also need to create an environment file so that Azure Machine Learning can install the necessary packages in the Docker image which are required by your scoring script. In this case, we need to specify packages `numpy`, `pandas`, and `lightgbm`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Conda environment specification. The dependencies defined in this file will\r\n", + "# be automatically provisioned for runs with userManagedDependencies=False.\r\n", + "\n", + "# Details about the Conda environment file format:\r\n", + "# https://conda.io/docs/user-guide/tasks/manage-environments.html#create-env-file-manually\r\n", + "\n", + "name: project_environment\n", + "dependencies:\n", + " # The python interpreter version.\r\n", + " # Currently Azure ML only supports 3.5.2 and later.\r\n", + "- python=3.6.2\n", + "\n", + "- pip:\n", + " - azureml-defaults\n", + "- numpy=1.16.2\n", + "- pandas=0.23.4\n", + "- lightgbm=2.3.0\n", + "channels:\n", + "- conda-forge\n", + "\n" + ] + } + ], + "source": [ + "cd = CondaDependencies.create()\n", + "cd.add_conda_package(\"numpy=1.16.2\")\n", + "cd.add_conda_package(\"pandas=0.23.4\")\n", + "cd.add_conda_package(\"lightgbm=2.3.0\")\n", + "cd.save_to_file(base_directory=\"./\", conda_file_path=\"myenv.yml\")\n", + "\n", + "print(cd.serialize_to_string())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Deploy to ACI\n", + "\n", + "We are almost ready to deploy. In the next cell, we first create the inference configuration and deployment configuration. Then, we deploy the model to ACI. This cell will run for several minutes." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running........................\n", + "Succeeded\n", + "ACI service creation operation finished, operation \"Succeeded\"\n", + "Healthy\n", + "CPU times: user 399 ms, sys: 181 ms, total: 580 ms\n", + "Wall time: 2min 33s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "inference_config = InferenceConfig(runtime=\"python\", entry_script=\"score.py\", conda_file=\"myenv.yml\")\n", + "\n", + "aciconfig = AciWebservice.deploy_configuration(\n", + " cpu_cores=1,\n", + " memory_gb=1,\n", + " tags={\"name\": \"ojdata\", \"framework\": \"LightGBM\"},\n", + " description=\"LightGBM model on Orange Juice data\",\n", + ")\n", + "\n", + "service = Model.deploy(\n", + " workspace=ws, name=\"lgbm-oj-svc\", models=[model], inference_config=inference_config, deployment_config=aciconfig\n", + ")\n", + "\n", + "service.wait_for_deployment(True)\n", + "print(service.state)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> Tip: If something goes wrong with the deployment, you could look at the logs from the service by running this command `print(service.get_logs())`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the scoring web service endpoint:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "http://33dfd29b-476b-4af9-9343-a96dff2bf80b.westus.azurecontainer.io/score\n" + ] + } + ], + "source": [ + "print(service.scoring_uri)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After the web service is successfully deployed, you will see a deployment in the Azure Machine Learning workspace on Azure portal\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Test the deployed model\n", + "\n", + "Let's test the deployed model. We create a few test data points and send them to the web service hosted in ACI. Note here we are using the run API in the SDK to invoke the service. You can also make raw HTTP calls using any HTTP tool such as curl.\n", + "\n", + "After the invocation, we print the returned predictions each of which represents the forecasted sales of a target store, brand in a given week as specified by `store, brand, week` in `used_columns`." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "prediction: [10657.690610049329, 17938.679182737964, 5974.42429028091]\n" + ] + } + ], + "source": [ + "# Prepare features according to the input schema of the best model\n", + "train_dir = os.path.join(DATA_DIR, \"train\")\n", + "max_lag = int(parameter_values[parameter_values.index(\"--max-lag\") + 1])\n", + "lags = np.arange(2, max_lag + 1)\n", + "window_size = int(parameter_values[parameter_values.index(\"--window-size\") + 1])\n", + "used_columns = [\n", + " \"store\",\n", + " \"brand\",\n", + " \"week\",\n", + " \"week_of_month\",\n", + " \"month\",\n", + " \"deal\",\n", + " \"feat\",\n", + " \"move\",\n", + " \"price\",\n", + " \"price_ratio\",\n", + "]\n", + "GAP = 2\n", + "features, train_end_week = create_features(\n", + " 1, train_dir, lags, window_size, used_columns\n", + ")\n", + "test_fea = features[features.week >= train_end_week + GAP].reset_index(drop=True)\n", + "test_fea.drop(\"move\", axis=1, inplace=True)\n", + "\n", + "# Pick a few test data points\n", + "test_samples = json.dumps({\"data\": np.array(test_fea.iloc[:3]).tolist()})\n", + "test_samples = bytes(test_samples, encoding=\"utf8\")\n", + "\n", + "# Predict using the deployed model\n", + "result = service.run(input_data=test_samples)\n", + "print(\"prediction:\", result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also send raw HTTP request to the service." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "POST to url http://33dfd29b-476b-4af9-9343-a96dff2bf80b.westus.azurecontainer.io/score\n", + "\n", + "input data: b'{\"data\": [[2.0, 1.0, 137.0, 4.0, 4.0, 0.0, 0.0, 0.0416446872, 1.1124927835293534, 12416.0, 28096.0, 15168.0, 20736.0, 31808.0, 25728.0, 43584.0, 5056.0, 20224.0, 6720.0, 5504.0, 3520.0, 9792.0, 13120.0, 13120.0, 17728.0, 8320.0, 5120.0, 6080.0, 7168.0, 34240.0, 7296.0, 9216.0, 22824.0], [2.0, 1.0, 138.0, 5.0, 4.0, 1.0, 1.0, 0.03734375, 0.9420125411290402, 12416.0, 12416.0, 28096.0, 15168.0, 20736.0, 31808.0, 25728.0, 43584.0, 5056.0, 20224.0, 6720.0, 5504.0, 3520.0, 9792.0, 13120.0, 13120.0, 17728.0, 8320.0, 5120.0, 6080.0, 7168.0, 34240.0, 7296.0, 23744.0], [2.0, 2.0, 137.0, 4.0, 4.0, 0.0, 0.0, 0.0519791667, 1.388567227553081, 11424.0, 4992.0, 7008.0, 6816.0, 5280.0, 7296.0, 5664.0, 17184.0, 6048.0, 8544.0, 12864.0, 18240.0, 6816.0, 8448.0, 9024.0, 9504.0, 9120.0, 10944.0, 16032.0, 7968.0, 8064.0, 8352.0, 7488.0, 8208.0]]}'\n", + "\n", + "prediction: [10657.690610049329, 17938.679182737964, 5974.42429028091]\n" + ] + } + ], + "source": [ + "headers = {\"Content-Type\": \"application/json\"}\n", + "\n", + "resp = requests.post(service.scoring_uri, test_samples, headers=headers)\n", + "\n", + "print(\"POST to url\", service.scoring_uri)\n", + "print(\"\")\n", + "print(\"input data:\", test_samples)\n", + "print(\"\")\n", + "print(\"prediction:\", resp.text)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Clean up\n", + "\n", + "After finishing the tests, you can delete the ACI deployment with a simple delete API call as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "service.delete()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Reading:\n", + "\n", + "\\[1\\] Training, hyperparameter tune, and deploy with TensorFlow: https://github.com/Azure/MachineLearningNotebooks/blob/master/how-to-use-azureml/ml-frameworks/tensorflow/deployment/train-hyperparameter-tune-deploy-with-tensorflow/train-hyperparameter-tune-deploy-with-tensorflow.ipynb
\n", + "\n", + "\\[2\\] AzureML HyperDrive package: https://docs.microsoft.com/en-us/python/api/azureml-train-core/azureml.train.hyperdrive?view=azure-ml-py" + ] + } + ], + "metadata": { + "author_info": { + "affiliation": "Microsoft", + "created_by": "Chenhui Hu" + }, + "kernelspec": { + "display_name": "forecasting_env", + "language": "python", + "name": "forecasting_env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/grocery_sales/python/README.md b/examples/grocery_sales/python/README.md new file mode 100644 index 00000000..8e87201e --- /dev/null +++ b/examples/grocery_sales/python/README.md @@ -0,0 +1,16 @@ +# Forecasting examples in Python + +This folder contains Jupyter notebooks with Python examples for building forecasting solutions. To run the notebooks, please ensure your environment is set up with required dependencies by following instructions in the [Setup guide](../../../docs/SETUP.md). + + +## Summary + +The following summarizes each directory of the Python best practice notebooks. + +| Directory | Content | Description | +| --- | --- | --- | +| [00_quick_start](./00_quick_start)| [autoarima_single_round.ipynb](./00_quick_start/autoarima_single_round.ipynb)
[azure_automl_single_round.ipynb](./00_quick_start/azure_automl_single_round.ipynb)
[lightgbm_single_round.ipynb](./00_quick_start/lightgbm_single_round.ipynb) | Quick start notebooks that demonstrate workflow of developing a forecasting model using one-round training and testing data| +| [01_prepare_data](./01_prepare_data) | [ojdata_exploration.ipynb](./01_prepare_data/ojdata_exploration.ipynb)
[ojdata_preparation.ipynb](./01_prepare_data/ojdata_preparation.ipynb) | Data exploration and preparation notebooks| +| [02_model](./02_model) | [dilatedcnn_multi_round.ipynb](./02_model/dilatedcnn_multi_round.ipynb)
[lightgbm_multi_round.ipynb](./02_model/lightgbm_multi_round.ipynb)
[autoarima_multi_round.ipynb](./02_model/autoarima_multi_round.ipynb) | Deep dive notebooks that perform multi-round training and testing of various classical and deep learning forecast algorithms| +| [03_model_tune_deploy](./03_model_tune_deploy/) | [azure_hyperdrive_lightgbm.ipynb](./03_model_tune_deploy/azure_hyperdrive_lightgbm.ipynb)
[aml_scripts/](./03_model_tune_deploy/aml_scripts) |
  • Example notebook for model tuning using Azure Machine Learning Service and deploying the best model on Azure
  • Scripts for model training and validation
| + diff --git a/fclib/README.md b/fclib/README.md new file mode 100644 index 00000000..75a72611 --- /dev/null +++ b/fclib/README.md @@ -0,0 +1,40 @@ +# Forecasting library + +Building forecasting models can involve tedious tasks ranging from data loading, dataset understanding, model development, model evaluation to deployment of trained models. To assist with these tasks, we developed a forecasting library - **fclib**. You'll see this library used widely in sample notebooks in [examples](../examples). The following provides a short description of the sub-modules. For more details about what functions/classes/utitilies are available and how to use them, please review the doc-strings provided with the code and see the sample notebooks in [examples](../examples) directory. + +## Submodules + +### [AzureML](fclib/azureml) + +The AzureML submodule contains utilities to connect to an Azure Machine Learning workspace, train, tune and operationalize forecasting models at scale using AzureML. + + +### [Common](fclib/common) + +This submodule contains high-level utilities that are commonly used in multiple algorithms as well as helper functions for visualizing forecasting predictions. + +### [Dataset](fclib/dataset) +This submodule includes helper functions for interacting with datasets used in the example notebooks, utility functions to process datasets for different models tasks, as well as utilities for splitting data for training/testing. For example, the [ojdata](fclib/dataset/ojdata.py) submodule will allow you to download and process Orange Juice data set, as well as split it into training and testing rounds. + +```python +from fclib.dataset.ojdata import download_ojdata, split_train_test + +download_ojdata(DATA_DIR) +train_df_list, test_df_list, _ = split_train_test( + DATA_DIR, + n_splits=N_SPLITS, + horizon=HORIZON, + gap=GAP, + first_week=FIRST_WEEK, + last_week=LAST_WEEK +) +``` + +### [Evaluation](fclib/evaluation) +Evaluation module includes functionalities for computing common forecasting evaluation metrics, more specifically `MAPE`, `sMAPE`, and `pinball loss`. + +### [Feature Engineering](fclib/feature_engineering) +Feature engineering module contains utilities to create various time series features, for example, week or day of month, lagged features, and moving average features. This module is used widely in machine-learning based approaches to forecasting, in which time series data is transformed into a tabular featurized dataset, that becomes input to a machine learning method. + +### [Models](fclib/models) +The models module contains implementations of various algorithms that can be used in addition to external packages to evaluate and develop new forecasting solutions. Some submodules found here are: `lightgbm`, `dilated cnn`, etc. A more detailed description of which algorithms are used in our examples can be found in [this README](../examples/oj_retail/python/README.md). \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/data/scripts/test-files.txt b/fclib/fclib/__init__.py similarity index 100% rename from prototypes/ES_RNN/sales_limited/data/scripts/test-files.txt rename to fclib/fclib/__init__.py diff --git a/fclib/fclib/__version__.py b/fclib/fclib/__version__.py new file mode 100644 index 00000000..97b8b400 --- /dev/null +++ b/fclib/fclib/__version__.py @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +__version__ = "0.0.1" diff --git a/fclib/fclib/azureml/__init__.py b/fclib/fclib/azureml/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fclib/fclib/azureml/azureml_utils.py b/fclib/fclib/azureml/azureml_utils.py new file mode 100644 index 00000000..922bddb1 --- /dev/null +++ b/fclib/fclib/azureml/azureml_utils.py @@ -0,0 +1,150 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +This file contains utility functions for interacting with Azure ML Resources. +Reused code from +https://github.com/microsoft/nlp-recipes/blob/master/utils_nlp/azureml/azureml_utils.py +""" + +import os +from azureml.core.authentication import AzureCliAuthentication +from azureml.core.authentication import InteractiveLoginAuthentication +from azureml.core.authentication import AuthenticationException +from azureml.core import Workspace +from azureml.exceptions import ProjectSystemException +from azureml.core.compute import ComputeTarget, AmlCompute +from azureml.core.compute_target import ComputeTargetException + + +def get_auth(): + """ + Method to get the correct Azure ML Authentication type + + Always start with CLI Authentication and if it fails, fall back + to interactive login + """ + try: + auth_type = AzureCliAuthentication() + auth_type.get_authentication_header() + except AuthenticationException: + auth_type = InteractiveLoginAuthentication() + return auth_type + + +def get_or_create_workspace( + config_path="./.azureml", subscription_id=None, resource_group=None, workspace_name=None, workspace_region=None, +): + """ + Method to get or create workspace. + + Args: + config_path: optional directory to look for / store config.json file (defaults to current + directory) + subscription_id: Azure subscription id + resource_group: Azure resource group to create workspace and related resources + workspace_name: name of azure ml workspace + workspace_region: region for workspace + + Returns: + obj: AzureML workspace if one exists already with the name otherwise creates a new one. + """ + config_file_path = "." + + if config_path is not None: + config_dir, config_file_name = os.path.split(config_path) + if config_file_name != "config.json": + config_file_path = os.path.join(config_path, "config.json") + + try: + # Get existing azure ml workspace + if os.path.isfile(config_file_path): + ws = Workspace.from_config(config_file_path, auth=get_auth()) + else: + ws = Workspace.get( + name=workspace_name, subscription_id=subscription_id, resource_group=resource_group, auth=get_auth(), + ) + + except ProjectSystemException: + # This call might take a minute or two. + print("Creating new workspace") + ws = Workspace.create( + name=workspace_name, + subscription_id=subscription_id, + resource_group=resource_group, + create_resource_group=True, + location=workspace_region, + auth=get_auth(), + ) + + ws.write_config(path=config_path) + return ws + + +def get_or_create_amlcompute( + workspace, compute_name, vm_size="", min_nodes=0, max_nodes=None, idle_seconds_before_scaledown=None, verbose=False, +): + """ + Get or create AmlCompute as the compute target. If a cluster of the same name is found, + attach it and rescale accordingly. Otherwise, create a new cluster. + + Args: + workspace (Workspace): workspace + compute_name (str): name + vm_size (str, optional): vm size + min_nodes (int, optional): minimum number of nodes in cluster + max_nodes (None, optional): maximum number of nodes in cluster + idle_seconds_before_scaledown (None, optional): how long to wait before the cluster + autoscales down + verbose (bool, optional): if true, print logs + Returns: + Compute target + """ + try: + if verbose: + print("Found compute target: {}".format(compute_name)) + + compute_target = ComputeTarget(workspace=workspace, name=compute_name) + if len(compute_target.list_nodes()) < max_nodes: + if verbose: + print("Rescaling to {} nodes".format(max_nodes)) + compute_target.update(max_nodes=max_nodes) + compute_target.wait_for_completion(show_output=verbose) + + except ComputeTargetException: + if verbose: + print("Creating new compute target: {}".format(compute_name)) + + compute_config = AmlCompute.provisioning_configuration( + vm_size=vm_size, + min_nodes=min_nodes, + max_nodes=max_nodes, + idle_seconds_before_scaledown=idle_seconds_before_scaledown, + ) + compute_target = ComputeTarget.create(workspace, compute_name, compute_config) + compute_target.wait_for_completion(show_output=verbose) + + return compute_target + + +def get_output_files(run, output_path, file_names=None): + """ + Method to get the output files from an AzureML output directory. + + Args: + file_names(list): Names of the files to download. + run(azureml.core.run.Run): Run object of the run. + output_path(str): Path to download the output files. + + Returns: None + + """ + os.makedirs(output_path, exist_ok=True) + + if file_names is None: + file_names = run.get_file_names() + + for f in file_names: + dest = os.path.join(output_path, f.split("/")[-1]) + print("Downloading file {} to {}...".format(f, dest)) + run.download_file(f, dest) diff --git a/fclib/fclib/common/__init__.py b/fclib/fclib/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fclib/fclib/common/plot.py b/fclib/fclib/common/plot.py new file mode 100644 index 00000000..6381f985 --- /dev/null +++ b/fclib/fclib/common/plot.py @@ -0,0 +1,104 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import math +import random +import itertools +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.ticker import MaxNLocator + + +def plot_predictions_with_history( + predictions, + history, + grain1_unique_vals, + grain2_unique_vals, + time_col_name, + target_col_name, + grain1_name="grain1", + grain2_name="grain2", + min_timestep=1, + num_samples=4, + predict_at_timestep=1, + line_at_predict_time=False, + title="Prediction results for a few sample time series", + x_label="time step", + y_label="target value", + random_seed=2, +): + """Plot prediction results with historical values + + Args: + predictions (pd.DataFrame): Prediction results with a time step column (e.g., week_index), a + forecasted value column (e.g., forecasted sales of each store-brand), and two columns that + identify each individual time series (e.g., store_id and brand_id) + history (pd.Dataframe): A dataframe containing historical values of the prediction target, a + time step column, and two columns that specify each time series + grain1_unique_vals (list): Unique values of the 1st column indicating the granularity of + the time series data (e.g, store_list) + grain2_unique_vals (list): Unique values of the 2nd column indicating the granularity of + the time series data (e.g., brand_list) + time_col_name (str): Name of the time step column (e.g., week_index) + target_col_name (str): Name of the forecast target column (e.g., unit_sales) + grain1_name (str): Name of the 1st column indicating the time series graunularity + grain2_name (str): Name of the 2nd column indicating the time series graunularity + min_timestep (int): Minimum time steps in the plots + num_samples (int): Number of samples from all the time series (each combination of + grain1 column and grain2 column gives an individual time series) + predict_at_timestep (int): Time step at which the forecasts are made + line_at_predict_time (bool): Whether to add a vertical line indicating the time step + when the forecasts are made + title (str): Overall title of the plots + x_label (str): Label of the x-axis of the plots + y_label (str): Label of the y-axis of the plots + random_seed (int): Random seed used for sampling the time series + """ + + random.seed(random_seed) + + grain_combinations = list(itertools.product(grain1_unique_vals, grain2_unique_vals)) + sample_grain_combinations = random.sample(grain_combinations, num_samples) + max_timestep = max(predictions[time_col_name].unique()) + + fig, axes = plt.subplots(nrows=math.ceil(num_samples / 2), ncols=2, figsize=(15, 5 * math.ceil(num_samples / 2))) + if axes.ndim == 1: + axes = np.reshape(axes, (1, axes.shape[0])) + fig.suptitle(title, y=1.02, fontsize=20) + + sample_id = 0 + for row in axes: + for col in row: + if sample_id < len(sample_grain_combinations): + [grain1_id, grain2_id] = sample_grain_combinations[sample_id] + history_sub = history.loc[ + (history[grain1_name] == grain1_id) + & (history[grain2_name] == grain2_id) + & (history[time_col_name] <= max_timestep) + & (history[time_col_name] >= min_timestep) + ] + predictions_sub = predictions.loc[ + (predictions[grain1_name] == grain1_id) + & (predictions[grain2_name] == grain2_id) + & (predictions[time_col_name] >= min_timestep) + ] + col.plot(history_sub[time_col_name], history_sub[target_col_name], marker="o") + col.plot( + predictions_sub[time_col_name], + predictions_sub[target_col_name], + linestyle="--", + marker="^", + color="red", + ) + if line_at_predict_time: + col.axvline(x=predict_at_timestep, linestyle="--") + col.set_title("{} {} {} {}".format(grain1_name, grain1_id, grain2_name, grain2_id)) + col.xaxis.set_major_locator(MaxNLocator(integer=True)) + col.set_xlabel(x_label) + col.set_ylabel(y_label) + col.legend(labels=["actual", "predicted"]) + sample_id += 1 + else: + col.axis("off") + plt.tight_layout() diff --git a/fclib/fclib/common/utils.py b/fclib/fclib/common/utils.py new file mode 100644 index 00000000..6e963c6b --- /dev/null +++ b/fclib/fclib/common/utils.py @@ -0,0 +1,119 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import subprocess +import pandas as pd +from git import Repo +from sys import platform +from pkgutil import iter_modules + + +def git_repo_path(): + """Return the path of the forecasting repo""" + + repo = Repo(search_parent_directories=True) + return repo.working_dir + + +def module_exists(module_name): + """Check if a package is installed. + + Args: + module_name (str): name of the package/module + + Returns: + bool: True if module exists; otherwise False + """ + + return module_name in (name for loader, name, ispkg in iter_modules()) + + +def system_type(): + """Return type of the current operating system""" + + if platform == "linux" or platform == "linux2": + system_type = "linux" + elif platform == "darwin": + system_type = "mac" + elif platform == "win32": + system_type = "win" + return system_type + + +def module_path(env_name, module_name): + """Return the path of a module in a conda environment. + + Args: + env_name (str): name of the conda environment + module_name (str): name of the package/module + + Returns: + str: path of the package/module + """ + + system = system_type() + if system == "win": + command = "where " + module_name + else: + command = "which " + module_name + all_paths = subprocess.check_output(command, shell=True) + all_paths = all_paths.decode("utf-8").split("\n") + all_paths = [path for path in all_paths if env_name in path] + module_path = "" + if all_paths: + module_path = all_paths[0] + if system == "win": + # Remove additional char \r + module_path = module_path[:-1] + return module_path + + +# Source repo: +# https://github.com/Azure/MachineLearningNotebooks/blob/master/\ +# how-to-use-azureml/automated-machine-learning/forecasting-orange-\ +# juice-sales/forecasting_helper.py +def align_outputs( + y_predicted, + X_trans, + X_test, + y_test, + target_column_name, + predicted_column_name="predicted", + horizon_colname="horizon_origin", +): + """ + Demonstrates how to get the output aligned to the inputs + using pandas indexes. Helps understand what happened if + the output's shape differs from the input shape, or if + the data got re-sorted by time and grain during forecasting. + + + Typical causes of misalignment are: + * we predicted some periods that were missing in actuals -> drop from eval + * model was asked to predict past max_horizon -> increase max horizon + * data at start of X_test was needed for lags -> provide previous periods + """ + + if horizon_colname in X_trans: + df_fcst = pd.DataFrame({predicted_column_name: y_predicted, horizon_colname: X_trans[horizon_colname]}) + else: + df_fcst = pd.DataFrame({predicted_column_name: y_predicted}) + + # y and X outputs are aligned by forecast() function contract + df_fcst.index = X_trans.index + + # align original X_test to y_test + X_test_full = X_test.copy() + X_test_full[target_column_name] = y_test + + # X_test_full's index does not include origin, so reset for merge + df_fcst.reset_index(inplace=True) + X_test_full = X_test_full.reset_index().drop(columns="index") + together = df_fcst.merge(X_test_full, how="right") + + # drop rows where prediction or actuals are nan + # happens because of missing actuals + # or at edges of time due to lags/rolling windows + clean = together[together[[target_column_name, predicted_column_name]].notnull().all(axis=1)] + return clean diff --git a/fclib/fclib/dataset/__init__.py b/fclib/fclib/dataset/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fclib/fclib/dataset/load_oj_data.R b/fclib/fclib/dataset/load_oj_data.R new file mode 100755 index 00000000..31b05234 --- /dev/null +++ b/fclib/fclib/dataset/load_oj_data.R @@ -0,0 +1,34 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# This script retrieves the orangeJuice dataset from the bayesm R package and saves the data as csv. +# +# Two arguments must be supplied to this script: +# +# RDA_PATH - path to the local .rda file containing the data +# DATA_DIR - destination directory for saving processed .csv files + +args = commandArgs(trailingOnly=TRUE) + +# Test if there are at least two arguments: if not, return an error +if (length(args)==2) { + RDA_PATH <- args[1] + DATA_DIR <- args[2] +} else { + stop("Two arguments must be supplied - path to .rda file and destination data directory).", call.=FALSE) +} + +# Load the data from bayesm library +load(RDA_PATH) +yx <- orangeJuice[[1]] +storedemo <- orangeJuice[[2]] + +# Create a data directory +fpath <- file.path(DATA_DIR) +if(!dir.exists(fpath)) dir.create(fpath) + +# Write the data to csv files +write.csv(yx, file = file.path(fpath, "yx.csv"), quote = FALSE, na = " ", row.names = FALSE) +write.csv(storedemo, file = file.path(fpath, "storedemo.csv"), quote = FALSE, na = " ", row.names = FALSE) + +print(paste("Data download completed. Data saved to ", DATA_DIR)) diff --git a/fclib/fclib/dataset/ojdata.py b/fclib/fclib/dataset/ojdata.py new file mode 100644 index 00000000..d6f4b873 --- /dev/null +++ b/fclib/fclib/dataset/ojdata.py @@ -0,0 +1,493 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import os +import subprocess +import pandas as pd +import math +import datetime +import itertools +import argparse +import logging +import requests +from tqdm import tqdm + +from fclib.common.utils import git_repo_path +from fclib.feature_engineering.feature_utils import df_from_cartesian_product + +DATA_FILE_LIST = ["yx.csv", "storedemo.csv"] +SCRIPT_NAME = "load_oj_data.R" + +DEFAULT_TARGET_COL = "move" +DEFAULT_STATIC_FEA = None +DEFAULT_DYNAMIC_FEA = ["deal", "feat"] + +# The start datetime of the first week in the record +FIRST_WEEK_START = pd.to_datetime("1989-09-14 00:00:00") + +# Original data source +OJ_URL = "https://github.com/cran/bayesm/raw/master/data/orangeJuice.rda" + + +log = logging.getLogger(__name__) + + +def maybe_download(url, dest_directory, filename=None): + """Download a file if it is not already downloaded. + Args: + dest_directory (str): Destination directory. + url (str): URL of the file to download. + filename (str): File name. + + Returns: + str: File path of the file downloaded. + """ + if filename is None: + filename = url.split("/")[-1] + os.makedirs(dest_directory, exist_ok=True) + filepath = os.path.join(dest_directory, filename) + if not os.path.exists(filepath): + r = requests.get(url, stream=True) + total_size = int(r.headers.get("content-length", 0)) + block_size = 1024 + num_iterables = math.ceil(total_size / block_size) + + with open(filepath, "wb") as file: + for data in tqdm(r.iter_content(block_size), total=num_iterables, unit="KB", unit_scale=True,): + file.write(data) + else: + log.debug("File {} already downloaded".format(filepath)) + + return filepath + + +def download_ojdata(dest_dir="."): + """Download orange juice dataset from the original source. + + Args: + dest_dir (str): Directory path for the downloaded file + + Returns: + str: Path of the downloaded file. + """ + url = OJ_URL + rda_path = maybe_download(url, dest_directory=dest_dir) + + # Check if data files exist + data_exists = True + for f in DATA_FILE_LIST: + file_path = os.path.join(dest_dir, f) + data_exists = data_exists and os.path.exists(file_path) + + if not data_exists: + # Call data loading script + repo_path = git_repo_path() + script_path = os.path.join(repo_path, "fclib", "fclib", "dataset", SCRIPT_NAME) + + try: + print(f"Destination directory: {dest_dir}") + output = subprocess.run( + ["Rscript", script_path, rda_path, dest_dir], stderr=subprocess.PIPE, stdout=subprocess.PIPE + ) + print(output.stdout) + if output.returncode != 0: + raise Exception(f"Subprocess failed - {output.stderr}") + + except subprocess.CalledProcessError as e: + raise e + else: + print("Data already exists at the specified location.") + + +def complete_and_fill_df(df, stores, brands, weeks): + """Completes missing rows in Orange Juice datasets and fills in the missing values. + + Args: + df (pd.DataFrame): data frame to fill in the rows and missing values in + stores (list[int]): list of stores to include + brands (list[int]): list of brands to include + weeks (list[int]): list of weeks to include + + Returns: + pd.DataFrame: data frame with completed rows and missing values filled in + + """ + d = {"store": stores, "brand": brands, "week": weeks} + data_grid = df_from_cartesian_product(d) + # Complete all rows + df_filled = pd.merge(data_grid, df, how="left", on=["store", "brand", "week"]) + # Fill in missing values + df_filled = df_filled.groupby(["store", "brand"]).apply(lambda x: x.fillna(method="ffill").fillna(method="bfill")) + + return df_filled + + +def _gen_split_indices(n_splits=12, horizon=2, gap=2, first_week=40, last_week=156): + """Generate week splits for given parameters""" + test_start_index = last_week - (horizon * n_splits) + 1 + train_end_index_first = test_start_index - gap + train_end_index_last = train_end_index_first + (n_splits - 1) * horizon + + assert ( + test_start_index >= first_week + ), f"Please adjust your parameters, so that testing data (currently week {test_start_index}), \ + starts after the first available week (week {first_week})." + + assert ( + train_end_index_first >= first_week + ), f"Please adjust your parameters, so that last training data point (currently week {train_end_index_first}) \ + comes after the first available week (week {first_week})." + + test_start_week_list = list(range(test_start_index, (last_week - horizon + 1) + 1, horizon)) + test_end_week_list = list(range(test_start_index + horizon - 1, last_week + 1, horizon)) + train_end_week_list = list(range(train_end_index_first, train_end_index_last + 1, horizon)) + return test_start_week_list, test_end_week_list, train_end_week_list + + +def split_train_test(data_dir, n_splits=1, horizon=2, gap=2, first_week=40, last_week=156, write_csv=False): + """Generate training, testing, and auxiliary datasets. Training data includes the historical + sales and external features; testing data contains the future sales and external features; + auxiliary data includes the future price, deal, and advertisement information which can be + used for making predictions (we assume such auxiliary information is available at the time + when we generate the forecasts). Use this function to generate the train, test, aux data for + each forecast period on the fly, or use write_csv flag to write data to files. + + Note that train_*.csv files in /train folder contain all the features in the training period + and aux_*.csv files in /train folder contain all the features except 'logmove', 'constant', + 'profit' up until the forecast period end week. Both train_*.csv and auxi_*csv can be used for + generating forecasts in each split. However, test_*.csv files in /test folder can only be used + for model performance evaluation. + + Example: + data_dir = "/home/ojdata" + + train, test, aux = split_train_test(data_dir=data_dir, n_splits=5, horizon=3, write_csv=True) + + print(len(train)) + print(len(test)) + print(len(aux)) + + Args: + data_dir (str): location of the download directory + n_splits (int, optional): number of splits (folds) to generate (default: 1) + horizon (int, optional): forecasting horizon, number of weeks to forecast (default: 2) + gap (int, optional): gap between training and testing, number of weeks between last training + week and first test week (default: 2) + first_week (int, optional): first available week (default: 40) + last_week (int, optional): last available week (default: 156) + write_csv (Boolean, optional): Whether to write out the data files or not (default: False) + + Returns: + list[pandas.DataFrame]: a list containing train data frames for each split + list[pandas.DataFrame]: a list containing test data frames for each split + list[pandas.DataFrame]: a list containing aux data frames for each split + + """ + # Read sales data into dataframe + sales = pd.read_csv(os.path.join(data_dir, "yx.csv"), index_col=0) + + if write_csv: + TRAIN_DATA_DIR = os.path.join(data_dir, "train") + TEST_DATA_DIR = os.path.join(data_dir, "test") + if not os.path.isdir(TRAIN_DATA_DIR): + os.mkdir(TRAIN_DATA_DIR) + if not os.path.isdir(TEST_DATA_DIR): + os.mkdir(TEST_DATA_DIR) + + train_df_list = list() + test_df_list = list() + aux_df_list = list() + + test_start_week_list, test_end_week_list, train_end_week_list = _gen_split_indices( + n_splits, horizon, gap, first_week, last_week + ) + + for i in range(n_splits): + data_mask = (sales.week >= first_week) & (sales.week <= train_end_week_list[i]) + train_df = sales[data_mask].copy() + data_mask = (sales.week >= test_start_week_list[i]) & (sales.week <= test_end_week_list[i]) + test_df = sales[data_mask].copy() + data_mask = (sales.week >= first_week) & (sales.week <= test_end_week_list[i]) + aux_df = sales[data_mask].copy() + aux_df.drop(["logmove", "constant", "profit"], axis=1, inplace=True) + + if write_csv: + roundstr = "_" + str(i + 1) if n_splits > 1 else "" + train_df.to_csv(os.path.join(TRAIN_DATA_DIR, "train" + roundstr + ".csv")) + test_df.to_csv(os.path.join(TEST_DATA_DIR, "test" + roundstr + ".csv")) + aux_df.to_csv(os.path.join(TRAIN_DATA_DIR, "auxi" + roundstr + ".csv")) + + train_df_list.append(train_df) + test_df_list.append(test_df) + aux_df_list.append(aux_df) + + return train_df_list, test_df_list, aux_df_list + + +def specify_data_schema( + df, + time_col_name, + target_col_name, + frequency, + time_format, + ts_id_col_names=None, + static_feat_names=None, + dynamic_feat_names=None, + description=None, +): + """Specify the schema of a time series dataset. + + Args: + df (Pandas DataFrame): input time series dataframe + time_col_name (str): name of the timestamp column + target_col_name (str): name of the target column that need to be forecasted + frequency (str): frequency of the timestamps represented by the time series offset + aliases used in Pandas (e.g. "W" for weekly frequency). Please see + https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases + for details. + time_format (str): format of the timestamps (e.g., "%d.%m.%Y %H:%M:%S") + ts_id_col_names (list): names of the columns for identifying a unique time series of + the target variable + static_feat_names (list): names of the feature columns that do not change over time + dynamic_feat_names (list): names of the feature columns that can change over time + description (str): description of the data (e.g., "training set", "testing set") + + Note that static_feat_names should include column names of the static features + other than those in ts_id_col_names. In addition, dynamic_feat_names should not + include the timestamp column and the target column. + + Returns: + df_config (dict): configuration of the time series data + + TODO: Check if this is used before release. + + Examples: + >>> # Case 1 + >>> sales = {"timestamp": ["01/01/2001", "03/01/2001", "02/01/2001"], + >>> "sales": [1234, 2345, 1324], + >>> "store": ["1001", "1002", "1001"], + >>> "brand": ["1", "2", "1"], + >>> "income": [53000, 65000, 53000], + >>> "price": [10, 12, 11]} + >>> df = pd.DataFrame(sales) + >>> time_col_name = "timestamp" + >>> target_col_name = "sales" + >>> ts_id_col_names = ["store", "brand"] + >>> static_feat_names = ["income"] + >>> dynamic_feat_names = ["price"] + >>> frequency = "MS" #monthly start + >>> time_format = "%m/%d/%Y" + >>> df_config = specify_data_schema(df, time_col_name, + >>> target_col_name, frequency, + >>> time_format, ts_id_col_names, + >>> static_feat_names, dynamic_feat_names) + >>> print(df_config) + {'time_col_name': 'timestamp', 'target_col_name': 'sales', 'frequency': 'MS', 'time_format': '%m/%d/%Y', 'ts_id_col_names': ['store', 'brand'], 'static_feat_names': ['income'], 'dynamic_feat_names': ['price'], 'description': None} + + >>> # Case 2 + >>> sales = {"timestamp": ["01/01/2001", "02/01/2001", "03/01/2001"], + >>> "sales": [1234, 2345, 1324], + >>> "store": ["1001", "1001", "1001"], + >>> "brand": ["1", "1", "1"], + >>> "income": [53000, 53000, 53000], + >>> "price": [10, 12, 11]} + >>> df = pd.DataFrame(sales) + >>> time_col_name = "timestamp" + >>> target_col_name = "sales" + >>> ts_id_col_names = None + >>> static_feat_names = ["store", "brand", "income"] + >>> dynamic_feat_names = ["price"] + >>> frequency = "MS" #monthly start + >>> time_format = "%m/%d/%Y" + >>> df_config = specify_data_schema(df, time_col_name, + >>> target_col_name, frequency, + >>> time_format, ts_id_col_names, + >>> static_feat_names, dynamic_feat_names) + >>> print(df_config) + {'time_col_name': 'timestamp', 'target_col_name': 'sales', 'frequency': 'MS', 'time_format': '%m/%d/%Y', 'ts_id_col_names': None, 'static_feat_names': ['store', 'brand', 'income'], 'dynamic_feat_names': ['price'], 'description': None} + """ + if len(df) == 0: + raise ValueError("Input time series dataframe should not be empty.") + + df_col_names = list(df) + _check_col_names(df_col_names, time_col_name, "timestamp") + _check_col_names(df_col_names, target_col_name, "target") + _check_time_format(df, time_col_name, time_format) + _check_frequency(df, time_col_name, frequency, time_format, ts_id_col_names) + if ts_id_col_names is not None: + _check_col_names(df_col_names, ts_id_col_names, "name_list") + if static_feat_names is not None: + _check_col_names(df_col_names, static_feat_names, "name_list") + _check_static_feat(df, ts_id_col_names, static_feat_names) + if dynamic_feat_names is not None: + _check_col_names(df_col_names, dynamic_feat_names, "name_list") + + # Configuration of the time series data + df_config = { + "time_col_name": time_col_name, + "target_col_name": target_col_name, + "frequency": frequency, + "time_format": time_format, + "ts_id_col_names": ts_id_col_names, + "static_feat_names": static_feat_names, + "dynamic_feat_names": dynamic_feat_names, + "description": description, + } + return df_config + + +def _check_col_names(df_col_names, input_col_names, input_type): + """Check if input column/feature names are valid. + """ + if input_type in ["timestamp", "target"]: + assert isinstance(input_col_names, str) + if input_col_names not in df_col_names: + raise ValueError("Invalid {} column name. It cannot be found in the input dataframe.".format(input_type)) + else: + assert isinstance(input_col_names, list) + for c in input_col_names: + if c not in df_col_names: + raise ValueError(c + " is an invalid column name. It cannot be found in the input dataframe.") + + +def _check_time_format(df, time_col_name, time_format): + """Check if the timestamp format is valid. + """ + try: + pd.to_datetime(df[time_col_name], format=time_format) + except Exception: + raise ValueError("Incorrect date format is specified.") + + +def _check_frequency(df, time_col_name, frequency, time_format, ts_id_col_names): + """Check if the data frequency is valid. + """ + try: + df[time_col_name] = pd.to_datetime(df[time_col_name], format=time_format) + timestamps_all = pd.date_range(min(df[time_col_name]), end=max(df[time_col_name]), freq=frequency) + except Exception: + raise ValueError( + "Input data frequency is invalid. Please use the aliases in " + + "https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases" + ) + + condition1 = (ts_id_col_names is None) and (not set(df[time_col_name]) <= set(timestamps_all)) + condition2 = (ts_id_col_names is not None) and ( + not all(df.groupby(ts_id_col_names).apply(lambda x: set(x[time_col_name]) <= set(timestamps_all))) + ) + if condition1 or condition2: + raise ValueError( + "Timestamp(s) with irregular frequency in the input dataframe. Please make sure the frequency " + + "of each time series is as what specified by 'frequency'." + ) + + +def _check_static_feat(df, ts_id_col_names, static_feat_names): + """Check if the input static features change over time and include ts_id_col_names. + """ + for feat in static_feat_names: + condition1 = (ts_id_col_names is None) and (df[feat].nunique() > 1) + condition2 = (ts_id_col_names is not None) and (df.groupby(ts_id_col_names)[feat].nunique().max() > 1) + if condition1 or condition2: + raise ValueError("Input feature column {} is supposed to be static but it is not.".format(feat)) + + +def specify_retail_data_schema( + data_dir, + sales=None, + target_col_name=DEFAULT_TARGET_COL, + static_feat_names=DEFAULT_STATIC_FEA, + dynamic_feat_names=DEFAULT_DYNAMIC_FEA, + description=None, +): + """Specify data schema of OrangeJuice dataset. + + Example: + data_dir = "/home/forecasting/ojdata" + df_config, sales = specify_retail_data_schema(data_dir) + print(df_config) + + Args: + sales (Pandas DataFrame): sales data in the current forecast split + target_col_name (str): name of the target column that need to be forecasted + static_feat_names (list): names of the feature columns that do not change over time + dynamic_feat_names (list): names of the feature columns that can change over time + description (str): description of the data (e.g., "training set", "testing set") + + Returns: + df_config (dict): configuration of the time series data + df (Pandas DataFrame): sales data combined with store demographic features + """ + # Read the 1st split of training data if "sales" is not specified + if not sales: + print("Sales dataframe is not given! The 1st split of training data will be used.") + sales = pd.read_csv(os.path.join(data_dir, "train", "train_round_1.csv"), index_col=False) + aux = pd.read_csv(os.path.join(data_dir, "train", "aux_round_1.csv"), index_col=False) + # Merge with future price, deal, and advertisement info + aux_features = [ + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + "deal", + "feat", + ] + sales = pd.merge(sales, aux, how="right", on=["store", "brand", "week"] + aux_features) + + # Read store demographic data + storedemo = pd.read_csv(os.path.join(data_dir, "storedemo.csv"), index_col=False) + + # Compute unit sales + sales["move"] = sales["logmove"].apply(lambda x: round(math.exp(x)) if x > 0 else 0) + + # Make sure each time series has the same time span + store_list = sales["store"].unique() + brand_list = sales["brand"].unique() + week_list = range(sales["week"].min(), sales["week"].max() + 1) + item_list = list(itertools.product(store_list, brand_list, week_list)) + item_df = pd.DataFrame.from_records(item_list, columns=["store", "brand", "week"]) + sales = item_df.merge(sales, how="left", on=["store", "brand", "week"]) + + # Merge with storedemo + df = sales.merge(storedemo, how="left", left_on="store", right_on="STORE") + df.drop("STORE", axis=1, inplace=True) + + # Create timestamp + df["timestamp"] = df["week"].apply(lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x - 1) * 7)) + + df_config = specify_data_schema( + df, + time_col_name="timestamp", + target_col_name=target_col_name, + frequency="W-THU", + time_format="%Y-%m-%d", + ts_id_col_names=["store", "brand"], + static_feat_names=static_feat_names, + dynamic_feat_names=dynamic_feat_names, + description=description, + ) + return df_config, df + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument("--data-dir", help="Data download directory") + args = parser.parse_args() + + download_ojdata(args.data_dir) + # train, test, aux = split_train_test(data_dir=data_dir, n_splits=1, horizon=2, write_csv=True) + + # print((test[0].week)) + # print((test[1].week)) + # print((test[2].week)) + # print((test[3].week)) + # print((test[4].week)) diff --git a/fclib/fclib/evaluation/__init__.py b/fclib/fclib/evaluation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/common/evaluation_utils.py b/fclib/fclib/evaluation/evaluation_utils.py similarity index 50% rename from common/evaluation_utils.py rename to fclib/fclib/evaluation/evaluation_utils.py index d688f86a..6ed95fb4 100644 --- a/common/evaluation_utils.py +++ b/fclib/fclib/evaluation/evaluation_utils.py @@ -1,16 +1,23 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + import pandas as pd + def MAPE(predictions, actuals): """ Implements Mean Absolute Percent Error (MAPE). Args: - predictions (pandas.Series): a vector of predicted values. - actuals (pandas.Series): a vector of actual values. + predictions (array like): a vector of predicted values. + actuals (array like): a vector of actual values. Returns: - MAPE value + numpy.float: MAPE value """ + if not (isinstance(actuals, pd.Series) and isinstance(predictions, pd.Series)): + predictions, actuals = pd.Series(predictions), pd.Series(actuals) + return ((predictions - actuals).abs() / actuals).mean() @@ -19,12 +26,15 @@ def sMAPE(predictions, actuals): Implements Symmetric Mean Absolute Percent Error (sMAPE). Args: - predictions (pandas.Series): a vector of predicted values. - actuals (pandas.Series): a vector of actual values. + predictions (array like): a vector of predicted values. + actuals (array like): a vector of actual values. Returns: - sMAPE value + numpy.float: sMAPE value """ + if not (isinstance(actuals, pd.Series) and isinstance(predictions, pd.Series)): + predictions, actuals = pd.Series(predictions), pd.Series(actuals) + return ((predictions - actuals).abs() / (predictions.abs() + actuals.abs())).mean() @@ -41,5 +51,5 @@ def pinball_loss(predictions, actuals, q): Returns: A pandas Series of pinball loss values for each prediction. """ - zeros = pd.Series([0]*len(predictions)) - return (predictions-actuals).combine(zeros, max)*(1-q) + (actuals-predictions).combine(zeros, max)*q \ No newline at end of file + zeros = pd.Series([0] * len(predictions)) + return (predictions - actuals).combine(zeros, max) * (1 - q) + (actuals - predictions).combine(zeros, max) * q diff --git a/fclib/fclib/feature_engineering/__init__.py b/fclib/fclib/feature_engineering/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fclib/fclib/feature_engineering/feature_utils.py b/fclib/fclib/feature_engineering/feature_utils.py new file mode 100644 index 00000000..f3b57d48 --- /dev/null +++ b/fclib/fclib/feature_engineering/feature_utils.py @@ -0,0 +1,1094 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +This file contains utility functions for creating features for time +series forecasting applications. All functions defined assume that +there is no missing data. +""" + +import calendar +import itertools +import pandas as pd +import numpy as np +import datetime +from datetime import timedelta +from sklearn.preprocessing import MinMaxScaler +from dateutil.relativedelta import relativedelta + +ALLOWED_TIME_COLUMN_TYPES = [ + pd.Timestamp, + pd.DatetimeIndex, + datetime.datetime, + datetime.date, +] + +# 0: Monday, 2: T/W/TR, 4: F, 5:SA, 6: S +WEEK_DAY_TYPE_MAP = {1: 2, 3: 2} # Map for converting Wednesday and +# Thursday to have the same code as Tuesday +HOLIDAY_CODE = 7 +SEMI_HOLIDAY_CODE = 8 # days before and after a holiday + +DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" + + +def is_datetime_like(x): + """Function that checks if a data frame column x is of a datetime type.""" + return any(isinstance(x, col_type) for col_type in ALLOWED_TIME_COLUMN_TYPES) + + +def day_type(datetime_col, holiday_col=None, semi_holiday_offset=timedelta(days=1)): + """ + Convert datetime_col to 7 day types + 0: Monday + 2: Tuesday, Wednesday, and Thursday + 4: Friday + 5: Saturday + 6: Sunday + 7: Holiday + 8: Days before and after a holiday + + Args: + datetime_col: Datetime column. + holiday_col: Holiday code column. Default value None. + semi_holiday_offset: Time difference between the date before (or after) + the holiday and the holiday. Default value timedelta(days=1). + + Returns: + A numpy array containing converted datatime_col into day types. + """ + + datetype = pd.DataFrame({"DayType": datetime_col.dt.dayofweek}) + datetype.replace({"DayType": WEEK_DAY_TYPE_MAP}, inplace=True) + + if holiday_col: + holiday_mask = holiday_col > 0 + datetype.loc[holiday_mask, "DayType"] = HOLIDAY_CODE + + # Create a temporary Date column to calculate dates near the holidays + datetype["Date"] = pd.to_datetime(datetime_col.dt.date, format=DATETIME_FORMAT) + holiday_dates = set(datetype.loc[holiday_mask, "Date"]) + + semi_holiday_dates = [ + pd.date_range(start=d - semi_holiday_offset, end=d + semi_holiday_offset, freq="D") for d in holiday_dates + ] + + # Flatten the list of lists + semi_holiday_dates = [d for dates in semi_holiday_dates for d in dates] + + semi_holiday_dates = set(semi_holiday_dates) + semi_holiday_dates = semi_holiday_dates.difference(holiday_dates) + + datetype.loc[datetype["Date"].isin(semi_holiday_dates), "DayType"] = SEMI_HOLIDAY_CODE + + return datetype["DayType"].values + + +def hour_of_day(datetime_col): + """Returns the hour from a datetime column.""" + return datetime_col.dt.hour + + +def time_of_year(datetime_col): + """ + Time of year is a cyclic variable that indicates the annual position and + repeats each year. It is each year linearly increasing over time going + from 0 on January 1 at 00:00 to 1 on December 31st at 23:00. The values + are normalized to be between [0; 1]. + + Args: + datetime_col: Datetime column. + + Returns: + A numpy array containing converted datatime_col into time of year. + """ + + time_of_year = pd.DataFrame( + {"DayOfYear": datetime_col.dt.dayofyear, "HourOfDay": datetime_col.dt.hour, "Year": datetime_col.dt.year} + ) + time_of_year["TimeOfYear"] = (time_of_year["DayOfYear"] - 1) * 24 + time_of_year["HourOfDay"] + + time_of_year["YearLength"] = time_of_year["Year"].apply(lambda y: 366 if calendar.isleap(y) else 365) + + time_of_year["TimeOfYear"] = time_of_year["TimeOfYear"] / (time_of_year["YearLength"] * 24 - 1) + + return time_of_year["TimeOfYear"].values + + +def week_of_year(datetime_col): + """Returns the week from a datetime column.""" + return datetime_col.dt.week + + +def week_of_month(date_time): + """Returns the week of the month for a specified date. + + Args: + dt (Datetime): Input date + + Returns: + wom (Integer): Week of the month of the input date + """ + + def _week_of_month(date_time): + from math import ceil + + first_day = date_time.replace(day=1) + dom = date_time.day + adjusted_dom = dom + first_day.weekday() + wom = int(ceil(adjusted_dom / 7.0)) + return wom + + if isinstance(date_time, pd.Series): + return date_time.apply(lambda x: _week_of_month(x)) + else: + return _week_of_month(date_time) + + +def month_of_year(date_time_col): + """Returns the month from a datetime column.""" + return date_time_col.dt.month + + +def day_of_week(date_time_col): + """Returns the day of week from a datetime column.""" + return date_time_col.dt.dayofweek + + +def day_of_month(date_time_col): + """Returns the day of month from a datetime column.""" + return date_time_col.dt.day + + +def day_of_year(date_time_col): + """Returns the day of year from a datetime column.""" + return date_time_col.dt.dayofyear + + +def encoded_month_of_year(month_of_year): + """ + Create one hot encoding of month of year. + """ + month_of_year = pd.get_dummies(month_of_year, prefix="MonthOfYear") + + return month_of_year + + +def encoded_day_of_week(day_of_week): + """ + Create one hot encoding of day_of_week. + """ + day_of_week = pd.get_dummies(day_of_week, prefix="DayOfWeek") + + return day_of_week + + +def encoded_day_of_month(day_of_month): + """ + Create one hot encoding of day_of_month. + """ + day_of_month = pd.get_dummies(day_of_month, prefix="DayOfMonth") + + return day_of_month + + +def encoded_day_of_year(day_of_year): + """ + Create one hot encoding of day_of_year. + """ + day_of_year = pd.get_dummies(day_of_year) + + return day_of_year + + +def encoded_hour_of_day(hour_of_day): + """ + Create one hot encoding of hour_of_day. + """ + hour_of_day = pd.get_dummies(hour_of_day, prefix="HourOfDay") + + return hour_of_day + + +def encoded_week_of_year(week_of_year): + """ + Create one hot encoding of week_of_year. + """ + week_of_year = pd.get_dummies(week_of_year, prefix="WeekOfYear") + + return week_of_year + + +def normalized_current_year(datetime_col, min_year, max_year): + """ + Temporal feature indicating the position of the year of a record in the + entire time period under consideration, normalized to be between 0 and 1. + + Args: + datetime_col: Datetime column. + min_year: minimum value of year. + max_year: maximum value of year. + + Returns: + float: the position of the current year in the min_year:max_year range + """ + year = datetime_col.dt.year + + if max_year != min_year: + current_year = (year - min_year) / (max_year - min_year) + elif max_year == min_year: + current_year = 0 + + return current_year + + +def normalized_current_date(datetime_col, min_date, max_date): + """ + Temporal feature indicating the position of the date of a record in the + entire time period under consideration, normalized to be between 0 and 1. + + Args: + datetime_col: Datetime column. + min_date: minimum value of date. + max_date: maximum value of date. + + Returns: + float: the position of the current date in the min_date:max_date range + """ + date = datetime_col.dt.date + current_date = (date - min_date).apply(lambda x: x.days) + + if max_date != min_date: + current_date = current_date / (max_date - min_date).days + elif max_date == min_date: + current_date = 0 + + return current_date + + +def normalized_current_datehour(datetime_col, min_datehour, max_datehour): + """ + Temporal feature indicating the position of the hour of a record in the + entire time period under consideration, normalized to be between 0 and 1. + + Args: + datetime_col: Datetime column. + min_datehour: minimum value of datehour. + max_datehour: maximum value of datehour. + + Returns: + float: the position of the current datehour in the min_datehour:max_datehour range + """ + current_datehour = (datetime_col - min_datehour).apply(lambda x: x.days * 24 + x.seconds / 3600) + + max_min_diff = max_datehour - min_datehour + + if max_min_diff != 0: + current_datehour = current_datehour / (max_min_diff.days * 24 + max_min_diff.seconds / 3600) + elif max_min_diff == 0: + current_datehour = 0 + + return current_datehour + + +def normalized_columns(datetime_col, value_col, mode="log", output_colname="normalized_columns"): + """ + Creates columns normalized to be log of input columns devided by global average of each columns, + or normalized using maximum and minimum. + + Args: + datetime_col: Datetime column. + value_col: Value column to be normalized. + mode: Normalization mode, + accepted values are 'log' and 'minmax'. Default value 'log'. + + Returns: + Normalized value column. + """ + + if not is_datetime_like(datetime_col): + datetime_col = pd.to_datetime(datetime_col, format=DATETIME_FORMAT) + + df = pd.DataFrame({"Datetime": datetime_col, "value": value_col}) + df.set_index("Datetime", inplace=True) + + if not df.index.is_monotonic: + df.sort_index(inplace=True) + + if mode == "log": + mean_value = df["value"].mean() + if mean_value != 0: + df[output_colname] = np.log(df["value"] / mean_value) + elif mean_value == 0: + df[output_colname] = 0 + elif mode == "minmax": + min_value = min(df["value"]) + max_value = max(df["value"]) + if min_value != max_value: + df[output_colname] = (df["value"] - min_value) / (max_value - min_value) + elif min_value == max_value: + df[output_colname] = 0 + else: + raise ValueError("Valid values for mode are 'log' and 'minmax'") + + return df[[output_colname]] + + +def fourier_approximation(t, n, period): + """ + Generic helper function to create Fourier Series at different harmonies (n) and periods. + + Args: + t: Datetime column. + n: Harmonies, n=0, 1, 2, 3,... + period: Period of the datetime variable t. + + Returns: + float: Sine component + float: Cosine component + """ + x = n * 2 * np.pi * t / period + x_sin = np.sin(x) + x_cos = np.cos(x) + + return x_sin, x_cos + + +def annual_fourier(datetime_col, n_harmonics): + """ + Creates Annual Fourier Series at different harmonies (n). + + Args: + datetime_col: Datetime column. + n_harmonics: Harmonies, n=0, 1, 2, 3,... + + Returns: + dict: Output dictionary containing sine and cosine components of + the Fourier series for all harmonies. + """ + day_of_year = datetime_col.dt.dayofyear + + output_dict = {} + for n in range(1, n_harmonics + 1): + sin, cos = fourier_approximation(day_of_year, n, 365.24) + + output_dict["annual_sin_" + str(n)] = sin + output_dict["annual_cos_" + str(n)] = cos + + return output_dict + + +def weekly_fourier(datetime_col, n_harmonics): + """ + Creates Weekly Fourier Series at different harmonies (n). + + Args: + datetime_col: Datetime column. + n_harmonics: Harmonies, n=0, 1, 2, 3,... + + Returns: + dict: Output dictionary containing sine and cosine components of + the Fourier series for all harmonies. + """ + day_of_week = datetime_col.dt.dayofweek + 1 + + output_dict = {} + for n in range(1, n_harmonics + 1): + sin, cos = fourier_approximation(day_of_week, n, 7) + + output_dict["weekly_sin_" + str(n)] = sin + output_dict["weekly_cos_" + str(n)] = cos + + return output_dict + + +def daily_fourier(datetime_col, n_harmonics): + """ + Creates Daily Fourier Series at different harmonies (n). + + Args: + datetime_col: Datetime column. + n_harmonics: Harmonies, n=0, 1, 2, 3,... + + Returns: + dict: Output dictionary containing sine and cosine components of + the Fourier series for all harmonies. + """ + hour_of_day = datetime_col.dt.hour + 1 + + output_dict = {} + for n in range(1, n_harmonics + 1): + sin, cos = fourier_approximation(hour_of_day, n, 24) + + output_dict["daily_sin_" + str(n)] = sin + output_dict["daily_cos_" + str(n)] = cos + + return output_dict + + +def same_week_day_hour_lag( + datetime_col, value_col, n_years=3, week_window=1, agg_func="mean", q=None, output_colname="SameWeekHourLag" +): + """ + Creates a lag feature by calculating quantiles, mean and std of values of and + around the same week, same day of week, and same hour of day, of previous years. + + Args: + datetime_col: Datetime column. + value_col: Feature value column to create lag feature from. + n_years: Number of previous years data to use. Default value 3. + week_window: Number of weeks before and after the same week to use, + which should help reduce noise in the data. Default value 1. + agg_func: Aggregation function to apply on multiple previous values, + accepted values are 'mean', 'quantile', 'std'. Default value 'mean'. + q: If agg_func is 'quantile', taking value between 0 and 1. + output_colname: name of the output lag feature column. + Default value 'SameWeekHourLag'. + + Returns: + pd.DataFrame: data frame containing the newly created lag + feature as a column. + """ + + if not is_datetime_like(datetime_col): + datetime_col = pd.to_datetime(datetime_col, format=DATETIME_FORMAT) + min_time_stamp = min(datetime_col) + max_time_stamp = max(datetime_col) + + df = pd.DataFrame({"Datetime": datetime_col, "value": value_col}) + df.set_index("Datetime", inplace=True) + + week_lag_base = 52 + week_lag_last_year = list(range(week_lag_base - week_window, week_lag_base + week_window + 1)) + week_lag_all = [] + for y in range(n_years): + week_lag_all += [x + y * 52 for x in week_lag_last_year] + + week_lag_cols = [] + for w in week_lag_all: + if (max_time_stamp - timedelta(weeks=w)) >= min_time_stamp: + col_name = "week_lag_" + str(w) + week_lag_cols.append(col_name) + + lag_datetime = df.index.get_level_values(0) - timedelta(weeks=w) + valid_lag_mask = lag_datetime >= min_time_stamp + + df[col_name] = np.nan + + df.loc[valid_lag_mask, col_name] = df.loc[lag_datetime[valid_lag_mask], "value"].values + + # Additional aggregation options will be added as needed + if agg_func == "mean" and q is None: + df[output_colname] = round(df[week_lag_cols].mean(axis=1)) + elif agg_func == "quantile" and q is not None: + df[output_colname] = round(df[week_lag_cols].quantile(q, axis=1)) + elif agg_func == "std" and q is None: + df[output_colname] = round(df[week_lag_cols].std(axis=1)) + + return df[[output_colname]] + + +def same_day_hour_lag( + datetime_col, value_col, n_years=3, day_window=1, agg_func="mean", q=None, output_colname="SameDayHourLag" +): + """ + Creates a lag feature by calculating quantiles, mean, and std of values of + and around the same day of year, and same hour of day, of previous years. + + Args: + datetime_col: Datetime column. + value_col: Feature value column to create lag feature from. + n_years: Number of previous years data to use. Default value 3. + day_window: Number of days before and after the same day to use, + which should help reduce noise in the data. Default value 1. + agg_func: Aggregation function to apply on multiple previous values, + accepted values are 'mean', 'quantile', 'std'. Default value 'mean'. + q: If agg_func is 'quantile', taking value between 0 and 1. + output_colname: name of the output lag feature column. + Default value 'SameDayHourLag'. + + Returns: + pd.DataFrame: data frame containing the newly created lag + feature as a column. + """ + + if not is_datetime_like(datetime_col): + datetime_col = pd.to_datetime(datetime_col, format=DATETIME_FORMAT) + min_time_stamp = min(datetime_col) + max_time_stamp = max(datetime_col) + + df = pd.DataFrame({"Datetime": datetime_col, "value": value_col}) + df.set_index("Datetime", inplace=True) + + day_lag_base = 365 + day_lag_last_year = list(range(day_lag_base - day_window, day_lag_base + day_window + 1)) + day_lag_all = [] + for y in range(n_years): + day_lag_all += [x + y * 365 for x in day_lag_last_year] + + day_lag_cols = [] + for d in day_lag_all: + if (max_time_stamp - timedelta(days=d)) >= min_time_stamp: + col_name = "day_lag_" + str(d) + day_lag_cols.append(col_name) + + lag_datetime = df.index.get_level_values(0) - timedelta(days=d) + valid_lag_mask = lag_datetime >= min_time_stamp + + df[col_name] = np.nan + + df.loc[valid_lag_mask, col_name] = df.loc[lag_datetime[valid_lag_mask], "value"].values + + # Additional aggregation options will be added as needed + if agg_func == "mean" and q is None: + df[output_colname] = round(df[day_lag_cols].mean(axis=1)) + elif agg_func == "quantile" and q is not None: + df[output_colname] = round(df[day_lag_cols].quantile(q, axis=1)) + elif agg_func == "std" and q is None: + df[output_colname] = round(df[day_lag_cols].std(axis=1)) + + return df[[output_colname]] + + +def same_day_hour_moving_average( + datetime_col, + value_col, + window_size, + start_week, + average_count, + forecast_creation_time, + output_col_prefix="moving_average_lag_", +): + """ + Creates moving average features by averaging values of the same day of + week and same hour of day of previous weeks. + + Args: + datetime_col: Datetime column + value_col: Feature value column to create moving average features from. + window_size: Number of weeks used to compute the average. + start_week: First week of the first moving average feature. + average_count: Number of moving average features to create. + forecast_creation_time: The time point when the feature is created. + This value is used to prevent using data that are not available + at forecast creation time to compute features. + output_col_prefix: Prefix of the output columns. The start week of each + moving average feature is added at the end. Default value 'moving_average_lag_'. + + Returns: + pd.DataFrame: data frame containing the newly created lag features as + columns. + + For example, start_week = 9, window_size=4, and average_count = 3 will + create three moving average features. + 1) moving_average_lag_9: average the same day and hour values of the 9th, + 10th, 11th, and 12th weeks before the current week. + 2) moving_average_lag_10: average the same day and hour values of the + 10th, 11th, 12th, and 13th weeks before the current week. + 3) moving_average_lag_11: average the same day and hour values of the + 11th, 12th, 13th, and 14th weeks before the current week. + """ + + df = pd.DataFrame({"Datetime": datetime_col, "value": value_col}) + df.set_index("Datetime", inplace=True) + + df = df.asfreq("H") + + if not df.index.is_monotonic: + df.sort_index(inplace=True) + + df["fct_diff"] = df.index - forecast_creation_time + df["fct_diff"] = df["fct_diff"].apply(lambda x: x.days * 24 + x.seconds / 3600) + max_diff = max(df["fct_diff"]) + + for i in range(average_count): + output_col = output_col_prefix + str(start_week + i) + week_lag_start = start_week + i + hour_lags = [(week_lag_start + w) * 24 * 7 for w in range(window_size)] + hour_lags = [h for h in hour_lags if h > max_diff] + if hour_lags: + tmp_df = df[["value"]].copy() + tmp_col_all = [] + for h in hour_lags: + tmp_col = "tmp_lag_" + str(h) + tmp_col_all.append(tmp_col) + tmp_df[tmp_col] = tmp_df["value"].shift(h) + + df[output_col] = round(tmp_df[tmp_col_all].mean(axis=1)) + df.drop(["fct_diff", "value"], inplace=True, axis=1) + + return df + + +def same_day_hour_moving_quantile( + datetime_col, + value_col, + window_size, + start_week, + quantile_count, + q, + forecast_creation_time, + output_col_prefix="moving_quatile_lag_", +): + """ + Creates a series of quantiles features by calculating quantiles of values of + the same day of week and same hour of day of previous weeks. + + Args: + datetime_col: Datetime column + value_col: Feature value column to create quantile features from. + window_size: Number of weeks used to compute the quantile. + start_week: First week of the first moving quantile feature. + quantile_count: Number of quantile features to create. + q: quantile to compute from history values, should be between 0 and 1. + forecast_creation_time: The time point when the feature is created. + This value is used to prevent using data that are not available + at forecast creation time to compute features. + output_col_prefix: Prefix of the output columns. The start week of each + moving average feature is added at the end. Default value 'moving_quatile_lag_'. + + Returns: + pd.DataFrame: data frame containing the newly created lag features as + columns. + + For example, start_week = 9, window_size=4, and quantile_count = 3 will + create three quantiles features. + 1) moving_quantile_lag_9: calculate quantile of the same day and hour values of the 9th, + 10th, 11th, and 12th weeks before the current week. + 2) moving_quantile_lag_10: calculate quantile of average the same day and hour values of the + 10th, 11th, 12th, and 13th weeks before the current week. + 3) moving_quantile_lag_11: calculate quantile of average the same day and hour values of the + 11th, 12th, 13th, and 14th weeks before the current week. + """ + + df = pd.DataFrame({"Datetime": datetime_col, "value": value_col}) + df.set_index("Datetime", inplace=True) + + df = df.asfreq("H") + + if not df.index.is_monotonic: + df.sort_index(inplace=True) + + df["fct_diff"] = df.index - forecast_creation_time + df["fct_diff"] = df["fct_diff"].apply(lambda x: x.days * 24 + x.seconds / 3600) + max_diff = max(df["fct_diff"]) + + for i in range(quantile_count): + output_col = output_col_prefix + str(start_week + i) + week_lag_start = start_week + i + hour_lags = [(week_lag_start + w) * 24 * 7 for w in range(window_size)] + hour_lags = [h for h in hour_lags if h > max_diff] + if hour_lags: + tmp_df = df[["value"]].copy() + tmp_col_all = [] + for h in hour_lags: + tmp_col = "tmp_lag_" + str(h) + tmp_col_all.append(tmp_col) + tmp_df[tmp_col] = tmp_df["value"].shift(h) + + df[output_col] = round(tmp_df[tmp_col_all].quantile(q, axis=1)) + + df.drop(["fct_diff", "value"], inplace=True, axis=1) + + return df + + +def same_day_hour_moving_std( + datetime_col, + value_col, + window_size, + start_week, + std_count, + forecast_creation_time, + output_col_prefix="moving_std_lag_", +): + """ + Creates standard deviation features by calculating std of values of the + same day of week and same hour of day of previous weeks. + + Args: + datetime_col: Datetime column + value_col: Feature value column to create moving std features from. + window_size: Number of weeks used to compute the std. + start_week: First week of the first moving std feature. + std_count: Number of moving std features to create. + forecast_creation_time: The time point when the feature is created. + This value is used to prevent using data that are not available at + forecast creation time to compute features. + output_col_prefix: Prefix of the output columns. The start week of each + moving average feature is added at the end. Default value 'moving_std_lag_'. + + Returns: + pd.DataFrame: data frame containing the newly created lag features as + columns. + + For example, start_week = 9, window_size=4, and std_count = 3 will + create three moving std features. + 1) moving_std_lag_9: calculate std of the same day and hour values of the 9th, + 10th, 11th, and 12th weeks before the current week. + 2) moving_std_lag_10: calculate std of the same day and hour values of the + 10th, 11th, 12th, and 13th weeks before the current week. + 3) moving_std_lag_11: calculate std of the same day and hour values of the + 11th, 12th, 13th, and 14th weeks before the current week. + """ + + df = pd.DataFrame({"Datetime": datetime_col, "value": value_col}) + df.set_index("Datetime", inplace=True) + + df = df.asfreq("H") + + if not df.index.is_monotonic: + df.sort_index(inplace=True) + + df["fct_diff"] = df.index - forecast_creation_time + df["fct_diff"] = df["fct_diff"].apply(lambda x: x.days * 24 + x.seconds / 3600) + max_diff = max(df["fct_diff"]) + + for i in range(std_count): + output_col = output_col_prefix + str(start_week + i) + week_lag_start = start_week + i + hour_lags = [(week_lag_start + w) * 24 * 7 for w in range(window_size)] + hour_lags = [h for h in hour_lags if h > max_diff] + if hour_lags: + tmp_df = df[["value"]].copy() + tmp_col_all = [] + for h in hour_lags: + tmp_col = "tmp_lag_" + str(h) + tmp_col_all.append(tmp_col) + tmp_df[tmp_col] = tmp_df["value"].shift(h) + + df[output_col] = round(tmp_df[tmp_col_all].std(axis=1)) + + df.drop(["value", "fct_diff"], inplace=True, axis=1) + + return df + + +def same_day_hour_moving_agg( + datetime_col, + value_col, + window_size, + start_week, + count, + forecast_creation_time, + agg_func="mean", + q=None, + output_col_prefix="moving_agg_lag_", +): + """ + Creates a series of aggregation features by calculating mean, quantiles, + or std of values of the same day of week and same hour of day of previous weeks. + + Args: + datetime_col: Datetime column + value_col: Feature value column to create aggregation features from. + window_size: Number of weeks used to compute the aggregation. + start_week: First week of the first aggregation feature. + count: Number of aggregation features to create. + forecast_creation_time: The time point when the feature is created. + This value is used to prevent using data that are not available + at forecast creation time to compute features. + agg_func: Aggregation function to apply on multiple previous values, + accepted values are 'mean', 'quantile', 'std'. + q: If agg_func is 'quantile', taking value between 0 and 1. + output_col_prefix: Prefix of the output columns. The start week of each + moving average feature is added at the end. Default value 'moving_agg_lag_'. + + Returns: + pd.DataFrame: data frame containing the newly created lag features as + columns. + + For example, start_week = 9, window_size=4, and count = 3 will + create three aggregation of features. + 1) moving_agg_lag_9: aggregate the same day and hour values of the 9th, + 10th, 11th, and 12th weeks before the current week. + 2) moving_agg_lag_10: aggregate the same day and hour values of the + 10th, 11th, 12th, and 13th weeks before the current week. + 3) moving_agg_lag_11: aggregate the same day and hour values of the + 11th, 12th, 13th, and 14th weeks before the current week. + """ + + df = pd.DataFrame({"Datetime": datetime_col, "value": value_col}) + df.set_index("Datetime", inplace=True) + + df = df.asfreq("H") + + if not df.index.is_monotonic: + df.sort_index(inplace=True) + + df["fct_diff"] = df.index - forecast_creation_time + df["fct_diff"] = df["fct_diff"].apply(lambda x: x.days * 24 + x.seconds / 3600) + max_diff = max(df["fct_diff"]) + + for i in range(count): + output_col = output_col_prefix + str(start_week + i) + week_lag_start = start_week + i + hour_lags = [(week_lag_start + w) * 24 * 7 for w in range(window_size)] + hour_lags = [h for h in hour_lags if h > max_diff] + if hour_lags: + tmp_df = df[["value"]].copy() + tmp_col_all = [] + for h in hour_lags: + tmp_col = "tmp_lag_" + str(h) + tmp_col_all.append(tmp_col) + tmp_df[tmp_col] = tmp_df["value"].shift(h) + + if agg_func == "mean" and q is None: + df[output_col] = round(tmp_df[tmp_col_all].mean(axis=1)) + elif agg_func == "quantile" and q is not None: + df[output_col] = round(tmp_df[tmp_col_all].quantile(q, axis=1)) + elif agg_func == "std" and q is None: + df[output_col] = round(tmp_df[tmp_col_all].std(axis=1)) + + df.drop(["fct_diff", "value"], inplace=True, axis=1) + + return df + + +def df_from_cartesian_product(dict_in): + """Generate a Pandas dataframe from Cartesian product of lists. + + Args: + dict_in (Dictionary): Dictionary containing multiple lists, e.g. {"fea1": list1, "fea2": list2} + + Returns: + df (Dataframe): Dataframe corresponding to the Caresian product of the lists + """ + from itertools import product + + cart = list(product(*dict_in.values())) + df = pd.DataFrame(cart, columns=dict_in.keys()) + return df + + +def lagged_features(df, lags): + """Create lagged features based on time series data. + + Args: + df (Dataframe): Input time series data sorted by time + lags (List): Lag lengths + + Returns: + fea (Dataframe): Lagged features + """ + df_list = [] + for lag in lags: + df_shifted = df.shift(lag) + df_shifted.columns = [x + "_lag" + str(lag) for x in df_shifted.columns] + df_list.append(df_shifted) + fea = pd.concat(df_list, axis=1) + return fea + + +def moving_averages(df, start_step, window_size=None): + """Compute averages of every feature over moving time windows. + + Args: + df (Dataframe): Input features as a dataframe + start_step (Integer): Starting time step of rolling mean + window_size (Integer): Windows size of rolling mean + + Returns: + fea (Dataframe): Dataframe consisting of the moving averages + """ + if window_size is None: + # Use a large window to compute average over all historical data + window_size = df.shape[0] + fea = df.shift(start_step).rolling(min_periods=1, center=False, window=window_size).mean() + fea.columns = fea.columns + "_mean" + return fea + + +def combine_features(df, lag_fea, lags, window_size, used_columns): + """Combine lag features, moving average features, and orignal features in the data. + + Args: + df (Dataframe): Time series data including the target series and external features + lag_fea (List): A list of column names for creating lagged features + lags (Numpy Array): Numpy array including all the lags + window_size (Integer): Window size of rolling mean + used_columns (List): A list containing the names of columns that are needed in the + input dataframe (including the target column) + + Returns: + fea_all (Dataframe): Dataframe including all the features + """ + lagged_fea = lagged_features(df[lag_fea], lags) + moving_avg = moving_averages(df[lag_fea], 2, window_size) + fea_all = pd.concat([df[used_columns], lagged_fea, moving_avg], axis=1) + return fea_all + + +def gen_sequence(df, seq_len, seq_cols, start_timestep=0, end_timestep=None): + """Reshape time series features into an array of dimension (# of time steps, # of + features). + + Args: + df (pd.Dataframe): Dataframe including time series data for a specific grain of a + multi-granular time series, e.g., data of a specific store-brand combination for + time series data involving multiple stores and brands + seq_len (int): Number of previous time series values to be used to form feature + sequences which can be used for model training + seq_cols (list[str]): A list of names of the feature columns + start_timestep (int): First time step you can use to create feature sequences + end_timestep (int): Last time step you can use to create feature sequences + + Returns: + object: A generator object for iterating all the feature sequences + """ + data_array = df[seq_cols].values + if end_timestep is None: + end_timestep = df.shape[0] + for start, stop in zip( + range(start_timestep, end_timestep - seq_len + 2), range(start_timestep + seq_len, end_timestep + 2) + ): + yield data_array[start:stop, :] + + +def gen_sequence_array(df_all, seq_len, seq_cols, grain1_name, grain2_name, start_timestep=0, end_timestep=None): + """Combine feature sequences for all the combinations of (grain1_name, grain2_name) into a + 3-dimensional array. + + Args: + df_all (pd.Dataframe): Time series data of all the grains for multi-granular data + seq_len (int): Number of previous time series values to be used to form sequences + seq_cols (list[str]): A list of names of the feature columns + grain1_name (str): Name of the 1st column indicating the time series graunularity + grain2_name (str): Name of the 2nd column indicating the time series graunularity + start_timestep (int): First time step you can use to create feature sequences + end_timestep (int): Last time step you can use to create feature sequences + + Returns: + seq_array (np.array): An array of feature sequences for all combinations of granularities + """ + seq_gen = ( + list( + gen_sequence( + df_all[(df_all[grain1_name] == grain1) & (df_all[grain2_name] == grain2)], + seq_len, + seq_cols, + start_timestep, + end_timestep, + ) + ) + for grain1, grain2 in itertools.product(df_all[grain1_name].unique(), df_all[grain2_name].unique()) + ) + seq_array = np.concatenate(list(seq_gen)).astype(np.float32) + return seq_array + + +def static_feature_array(df_all, total_timesteps, seq_cols, grain1_name, grain2_name): + """Generate an arary which encodes all the static features. + + Args: + df_all (pd.DataFrame): Time series data of all the grains for multi-granular data + total_timesteps (int): Total number of training samples for modeling + seq_cols (list[str]): A list of names of the static feature columns, e.g. store ID + grain1_name (str): Name of the 1st column indicating the time series graunularity + grain2_name (str): Name of the 2nd column indicating the time series graunularity + + Return: + fea_array (np.array): An array of static features of all the grains, e.g. all the + combinations of stores and brands in retail sale forecasting + """ + fea_df = ( + df_all.groupby([grain1_name, grain2_name]).apply(lambda x: x.iloc[:total_timesteps, :]).reset_index(drop=True) + ) + fea_array = fea_df[seq_cols].values + return fea_array + + +def normalize_columns(df, seq_cols, scaler=MinMaxScaler()): + """Normalize a subset of columns of a dataframe. + + Args: + df (pd.DataFrame): Input dataframe + seq_cols (list[str]): A list of names of columns to be normalized + scaler (object): A scikit learn scaler object + + Returns: + pd.DataFrame: Normalized dataframe + object: Scaler object + """ + cols_fixed = df.columns.difference(seq_cols) + df_scaled = pd.DataFrame(scaler.fit_transform(df[seq_cols]), columns=seq_cols, index=df.index) + df_scaled = pd.concat([df[cols_fixed], df_scaled], axis=1) + return df_scaled, scaler + + +def get_datetime_col(df, datetime_colname): + """ + Helper function for extracting the datetime column as datetime type from + a data frame. + + Args: + df: pandas DataFrame containing the column to convert + datetime_colname: name of the column to be converted + + Returns: + pandas.Series: converted column + + Raises: + Exception: if datetime_colname does not exist in the dateframe df. + Exception: if datetime_colname cannot be converted to datetime type. + """ + if datetime_colname in df.index.names: + datetime_col = df.index.get_level_values(datetime_colname) + elif datetime_colname in df.columns: + datetime_col = df[datetime_colname] + else: + raise Exception("Column or index {0} does not exist in the data " "frame".format(datetime_colname)) + + if not is_datetime_like(datetime_col): + datetime_col = pd.to_datetime(df[datetime_colname]) + return datetime_col + + +def get_month_day_range(date): + """ + Returns the first date and last date of the month of the given date. + """ + # Replace the date in the original timestamp with day 1 + first_day = date + relativedelta(day=1) + # Replace the date in the original timestamp with day 1 + # Add a month to get to the first day of the next month + # Subtract one day to get the last day of the current month + last_day = date + relativedelta(day=1, months=1, days=-1, hours=23) + return first_day, last_day + + +def add_datetime(input_datetime, unit, add_count): + """ + Function to add a specified units of time (years, months, weeks, days, + hours, or minutes) to the input datetime. + + Args: + input_datetime: datatime to be added to + unit: unit of time, valid values: 'year', 'month', 'week', + 'day', 'hour', 'minute'. + add_count: number of units to add + + Returns: + New datetime after adding the time difference to input datetime. + + Raises: + Exception: if invalid unit is provided. Valid units are: + 'year', 'month', 'week', 'day', 'hour', 'minute'. + """ + if unit == "Y": + new_datetime = input_datetime + relativedelta(years=add_count) + elif unit == "M": + new_datetime = input_datetime + relativedelta(months=add_count) + elif unit == "W": + new_datetime = input_datetime + relativedelta(weeks=add_count) + elif unit == "D": + new_datetime = input_datetime + relativedelta(days=add_count) + elif unit == "h": + new_datetime = input_datetime + relativedelta(hours=add_count) + elif unit == "m": + new_datetime = input_datetime + relativedelta(minutes=add_count) + else: + raise Exception( + "Invalid backtest step unit, {}, provided. Valid " "step units are Y, M, W, D, h, " "and m".format(unit) + ) + return new_datetime diff --git a/fclib/fclib/models/__init__.py b/fclib/fclib/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fclib/fclib/models/dilated_cnn.py b/fclib/fclib/models/dilated_cnn.py new file mode 100644 index 00000000..6d140ce0 --- /dev/null +++ b/fclib/fclib/models/dilated_cnn.py @@ -0,0 +1,81 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +This file contains utility functions for builing Dilated CNN model to solve time series forecasting problems. +""" + + +from math import ceil, log +from tensorflow.keras.layers import Input, Lambda, Embedding, Conv1D, Dropout, Flatten, Dense, concatenate +from tensorflow.keras.models import Model + + +def create_dcnn_model( + seq_len, + n_dyn_fea=1, + n_outputs=1, + n_dilated_layers=3, + kernel_size=2, + n_filters=3, + dropout_rate=0.1, + max_cat_id=[1e3, 1e3], +): + """Create a Dilated CNN model. + + Args: + seq_len (int): Input sequence length + n_dyn_fea (int): Number of dynamic features + n_outputs (int): Number of outputs of the network + kernel_size (int): Kernel size of each convolutional layer + n_filters (int): Number of filters in each convolutional layer + dropout_rate (float): Dropout rate in the network + max_cat_id (list[int]): Each entry in the list represents the maximum value of the ID of a specific categorical variable. + + Returns: + object: Keras Model object + """ + # Sequential input for dynamic features + seq_in = Input(shape=(seq_len, n_dyn_fea)) + + # Categorical input + n_cat_fea = len(max_cat_id) + cat_fea_in = Input(shape=(n_cat_fea,), dtype="uint8") + cat_flatten = [] + for i, m in enumerate(max_cat_id): + cat_fea = Lambda(lambda x, i: x[:, i, None], arguments={"i": i})(cat_fea_in) + cat_fea_embed = Embedding(m + 1, ceil(log(m + 1)), input_length=1)(cat_fea) + cat_flatten.append(Flatten()(cat_fea_embed)) + + # Dilated convolutional layers + conv1d_layers = [] + conv1d_layers.append( + Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=1, padding="causal", activation="relu")(seq_in) + ) + for i in range(1, n_dilated_layers): + conv1d_layers.append( + Conv1D( + filters=n_filters, kernel_size=kernel_size, dilation_rate=2 ** i, padding="causal", activation="relu" + )(conv1d_layers[i - 1]) + ) + + # Skip connections + if n_dilated_layers > 1: + c = concatenate([conv1d_layers[0], conv1d_layers[-1]]) + else: + c = conv1d_layers[0] + + # Output of convolutional layers + conv_out = Conv1D(8, 1, activation="relu")(c) + conv_out = Dropout(dropout_rate)(conv_out) + conv_out = Flatten()(conv_out) + + # Concatenate with categorical features + x = concatenate([conv_out] + cat_flatten) + x = Dense(16, activation="relu")(x) + output = Dense(n_outputs, activation="linear")(x) + + # Define model interface + model = Model(inputs=[seq_in, cat_fea_in], outputs=output) + + return model diff --git a/fclib/fclib/models/lightgbm.py b/fclib/fclib/models/lightgbm.py new file mode 100644 index 00000000..8b89e462 --- /dev/null +++ b/fclib/fclib/models/lightgbm.py @@ -0,0 +1,30 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +This file contains utility functions for builing LightGBM model to +solve time series forecasting problems. +""" + +import pandas as pd + + +def predict(df, model, target_col, idx_cols, integer_output=True): + """Predict target variable with a trained LightGBM model. + + Args: + df (pandas.DataFrame): Dataframe including all needed features + model (lightgbm.Booster): Trained LightGBM booster model + target_col (str): Name of the target column + idx_col (list[str]): List of the names of the index columns, e.g. ["store", "brand", "week"] + integer_output (bool): It it is True, the forecast will be rounded to an integer + + Returns: + pandas.DataFrame including the predictions of the target variable + """ + if target_col in df.columns: + df = df.drop(target_col, axis=1) + predictions = pd.DataFrame({target_col: model.predict(df)}) + if integer_output: + predictions[target_col] = predictions[target_col].apply(lambda x: round(x)) + return pd.concat([df[idx_cols].reset_index(drop=True), predictions], axis=1) diff --git a/fclib/fclib/models/multiple_linear_regression.py b/fclib/fclib/models/multiple_linear_regression.py new file mode 100644 index 00000000..f9c8568f --- /dev/null +++ b/fclib/fclib/models/multiple_linear_regression.py @@ -0,0 +1,76 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +This file contains utility functions for builing multiple linear regression +models to forecast many time series individually. +""" + +import pandas as pd +from sklearn.linear_model import LinearRegression + + +def fit(train_df, grain_col_names, fea_col_names=[], target_col_name="target"): + """Train multiple linear regression models with each being trained on an individual time + series specified by columns in grain_col_names. + + Args: + train_df (pandas.DataFrame): Training data frame including all the features + grain_col_names (list[str]): List of the column names that specify each time series + fea_col_names (list[str]): List of the names of columns that we want to use as input features + target_col_name (str): Name of the target column + + Returns: + dict: Dictionary including all the trained linear regression models + """ + lr_models = {} + if not fea_col_names: + fea_col_names = list(train_df.columns) + fea_col_names.remove(target_col_name) + for name, group in train_df.groupby(grain_col_names): + lr = LinearRegression() + lr.fit(group[fea_col_names], group[target_col_name]) + lr_models[name] = lr + return lr_models + + +def predict( + test_df, lr_models, time_col_name, grain_col_names, fea_col_names=[], nonnegative_output=True, integer_output=True +): + """Predict target variable with multiple linear regression models that have been trained. + + Args: + test_df (pandas.DataFrame): Dataframe including all needed features + lr_models (dict): A dictionary that includes all the trained linear regression models with format + {(grain1, grain2, ...): model1, (grain1, grain2, ...): model2, ...} + time_col_name (str): Name of the time column + grain_col_names (list[str]): List of the column names that specify each time series + fea_col_names (list[str]): List of the names of the columns that are needed for generating predictions + positive_output (bool): If it is True, negative forecasts will be replaced by 0 + integer_output (bool): If it is True, the forecast will be rounded to an integer + + Returns: + pandas.DataFrame including the predictions of the target variable + """ + pred_dfs = [] + if not fea_col_names: + fea_col_names = list(test_df.columns) + for name, group in test_df.groupby(grain_col_names): + lr = lr_models[name] + cur_pred = lr.predict(group[fea_col_names]) + dict1 = { + time_col_name: list(group[time_col_name]), + "prediction": cur_pred, + } + dict2 = dict(zip(grain_col_names, name)) + for grain in grain_col_names: + dict2[grain] = [dict2[grain]] * len(cur_pred) + cur_pred_df = pd.DataFrame({**dict1, **dict2}) + pred_dfs.append(cur_pred_df) + pred_all = pd.concat(pred_dfs) + pred_all.reset_index(drop=True, inplace=True) + if nonnegative_output: + pred_all["prediction"] = pred_all["prediction"].apply(lambda x: max(0, x)) + if integer_output: + pred_all["prediction"] = pred_all["prediction"].apply(lambda x: round(x)) + return pred_all diff --git a/fclib/requirements.txt b/fclib/requirements.txt new file mode 100644 index 00000000..6952f30c --- /dev/null +++ b/fclib/requirements.txt @@ -0,0 +1,10 @@ +pandas==0.23.4 +datetime>=4.3 +scikit-learn==0.20.3 +numpy==1.16.2 +requests>=2.23.0 +tqdm>=4.43.0 +matplotlib>=3.1.2 +tensorflow==2.0 +gitpython>=3.0.8 +azureml-sdk==1.0.85 diff --git a/fclib/setup.py b/fclib/setup.py new file mode 100644 index 00000000..b5ad76e3 --- /dev/null +++ b/fclib/setup.py @@ -0,0 +1,54 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# /* spell-checker: disable */ +import os + +try: + from setuptools import setup, find_packages +except ImportError: + from distutils.core import setup, find_packages + + +# Package meta-data. +NAME = "fclib" +DESCRIPTION = "A library for forecasting utilities" +URL = "" +EMAIL = "" +AUTHOR = "Forecasting team at AI CAT Microsoft" +LICENSE = "MIT" +LONG_DESCRIPTION = DESCRIPTION + + +with open("requirements.txt") as f: + requirements = f.read().splitlines() + + +here = os.path.abspath(os.path.dirname(__file__)) + +# Load the package's __version__.py module as a dictionary. +about = {} +with open(os.path.join(here, NAME, "__version__.py")) as f: + exec(f.read(), about) + + +setup( + name=NAME, + version=about["__version__"], + url=URL, + license=LICENSE, + author=AUTHOR, + author_email=EMAIL, + description=DESCRIPTION, + long_description=LONG_DESCRIPTION, + scripts=[], + packages=find_packages(), + include_package_data=True, + install_requires=requirements, + classifiers=[ + "Development Status :: 1 - Alpha", + "Intended Audience :: Data Scientists & Developers", + "Operating System :: POSIX", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python :: 3.6", + ], +) diff --git a/fclib/tests/source_entire.R b/fclib/tests/source_entire.R new file mode 100644 index 00000000..fd8883e4 --- /dev/null +++ b/fclib/tests/source_entire.R @@ -0,0 +1,34 @@ +#!/usr/bin/Rscript +# +# Source entire R testing files +# +# Note that we first define a function to source entire folder including R files. Then, +# we simply source all .R files within the specified folder. + +## Define a function to source entire folder +source_entire_folder <- function(folderName, verbose=FALSE, showWarnings=TRUE) { + # Find all .R files within a folder and soruces them + # + # Args: + # folderName: Name of the folder including R files to be sourced. + # verbose: If TRUE, print message; if not, not. Default is FALSE. + # + # Returns: + # NULL. + files <- list.files(folderName, full.names=FALSE) + # Grab only R files that start with the word 'test' + files <- files[grepl("\\.[rR]$", files)] + files <- files[grepl("^test", files)] + if (!length(files) && showWarnings) + warning("No R test files in ", folderName) + for (f in files) { + if (verbose) + cat("sourcing: ", f, "\n") + ## TODO: add caught whether error or not and return that + try(source(paste(folderName, f, sep='/'), local=FALSE, echo=FALSE), silent=!verbose) + } + return(invisible(NULL)) +} + +## Source all .R files within the folder of tests/unit +source_entire_folder('./tests/unit', verbose=TRUE) \ No newline at end of file diff --git a/fclib/tests/test_datasets.R b/fclib/tests/test_datasets.R new file mode 100644 index 00000000..ba03870e --- /dev/null +++ b/fclib/tests/test_datasets.R @@ -0,0 +1,47 @@ +#!/usr/bin/Rscript +# +# Test download retail data +# +# Note that we define a function to test download_data.r file in retail benchmarking, +# based on output checking. + +## Define a function to test download_data.r file in retail benchmarking. +test_download_retail_data <- function() { + # Test download_data.r file in retail benchmarking + # + # Args: + # NULL. + # + # Returns: + # NULL. + BENCHMARK_DIR <- file.path('./retail_sales', 'OrangeJuice_Pt_3Weeks_Weekly') + DATA_DIR <- file.path(BENCHMARK_DIR, 'data') + SCRIPT_PATH <- file.path(BENCHMARK_DIR, 'common', 'download_data.r') + # Call data download script + source(SCRIPT_PATH) + # Check downloaded data + sales <- read.csv(file.path(DATA_DIR, 'yx.csv')) + if(all(dim(sales) == c(106139, 19)) == FALSE) { + stop("There is something wrong") + } + column_names <- c('store', 'brand', 'week', 'logmove', 'constant', + 'price1', 'price2', 'price3', 'price4', 'price5', + 'price6', 'price7', 'price8', 'price9', 'price10', + 'price11', 'deal', 'feat', 'profit') + if(all(colnames(sales) == column_names) == FALSE) { + stop("There is something wrong") + } + storedemo <- read.csv(file.path(DATA_DIR, 'storedemo.csv')) + if(all(dim(storedemo) == c(83, 12)) == FALSE) { + stop("There is something wrong") + } + column_names <- c('STORE', 'AGE60', 'EDUC', 'ETHNIC', 'INCOME', + 'HHLARGE', 'WORKWOM', 'HVAL150', 'SSTRDIST', + 'SSTRVOL', 'CPDIST5', 'CPWVOL5') + if(all(colnames(storedemo) == column_names) == FALSE) { + stop("There is something wrong") + } +} + +## Test download_data.r file in retail benchmarking. +test_download_retail_data() \ No newline at end of file diff --git a/fclib/tests/test_datasets.py b/fclib/tests/test_datasets.py new file mode 100644 index 00000000..4e5d5a08 --- /dev/null +++ b/fclib/tests/test_datasets.py @@ -0,0 +1,64 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os +import pandas as pd +from tempfile import TemporaryDirectory + +from fclib.dataset.ojdata import download_ojdata + + +def test_download_retail_data(): + + DATA_FILE_LIST = ["yx.csv", "storedemo.csv"] + + with TemporaryDirectory() as tmpdirname: + print("Created temporary directory", tmpdirname) + + # Download the data to the temp directory + download_ojdata(tmpdirname) + # Check downloaded data + DATA_DIM_LIST = [(106139, 19), (83, 12)] + COLUMN_NAME_LIST = [ + [ + "store", + "brand", + "week", + "logmove", + "constant", + "price1", + "price2", + "price3", + "price4", + "price5", + "price6", + "price7", + "price8", + "price9", + "price10", + "price11", + "deal", + "feat", + "profit", + ], + [ + "STORE", + "AGE60", + "EDUC", + "ETHNIC", + "INCOME", + "HHLARGE", + "WORKWOM", + "HVAL150", + "SSTRDIST", + "SSTRVOL", + "CPDIST5", + "CPWVOL5", + ], + ] + for idx, f in enumerate(DATA_FILE_LIST): + file_path = os.path.join(tmpdirname, f) + assert os.path.exists(file_path) + df = pd.read_csv(file_path, index_col=None) + assert df.shape == DATA_DIM_LIST[idx] + assert list(df) == COLUMN_NAME_LIST[idx] diff --git a/forecasting.Rproj b/forecasting.Rproj new file mode 100644 index 00000000..f06cf89a --- /dev/null +++ b/forecasting.Rproj @@ -0,0 +1,12 @@ +Version: 1.0 + +RestoreWorkspace: No +SaveWorkspace: No +AlwaysSaveHistory: No + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 4 +Encoding: UTF-8 + +RnwWeave: knitr diff --git a/prototypes/ES_RNN/M4/data/Test/README.md b/prototypes/ES_RNN/M4/data/Test/README.md deleted file mode 100644 index 46dda3d6..00000000 --- a/prototypes/ES_RNN/M4/data/Test/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Please use the testing data stored in blob storage Test under this container -https://tsperfmainstorage.blob.core.windows.net/m4-dataset-es-rnn -You can find storage account tsperfmainstorage in resource group tsperf. diff --git a/prototypes/ES_RNN/M4/data/Train/README.md b/prototypes/ES_RNN/M4/data/Train/README.md deleted file mode 100644 index 9a08bb19..00000000 --- a/prototypes/ES_RNN/M4/data/Train/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Please use the training data stored in blob storage Train under this container -https://tsperfmainstorage.blob.core.windows.net/m4-dataset-es-rnn -You can find storage account tsperfmainstorage in resource group tsperf. diff --git a/prototypes/ES_RNN/M4/data/scripts/ES_RNN M4 Sanity Check.ipynb b/prototypes/ES_RNN/M4/data/scripts/ES_RNN M4 Sanity Check.ipynb deleted file mode 100644 index 8fd2097c..00000000 --- a/prototypes/ES_RNN/M4/data/scripts/ES_RNN M4 Sanity Check.ipynb +++ /dev/null @@ -1,4128 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Q11967963.178588.118186.437933.468030.548658.688241.177971.4
0Q37829966.3309934.4009943.0209971.9109952.5009933.3209938.9309971.920
1Q1383311335.50011514.20011504.20011592.50011308.90011545.30011579.00011720.400
2Q209249954.4309671.4809566.5309851.54010097.2009885.2209700.5809825.740
3Q224032546.1102531.3702558.4702546.0202546.0702549.1602583.2202576.440
4Q664513883.50014069.70014147.40014344.60014433.90014720.60014815.70015098.400
5Q50435746.7906402.2006240.3406205.1406248.6706770.7706654.7206649.510
6Q1178412433.20012466.80012512.60012703.80012680.20012709.90012741.90012937.400
7Q11034518.4704533.1804580.8104627.8604633.7504657.8704698.6604747.860
8Q131832785.7602702.6402799.0102844.8102807.9202765.8902889.0002923.370
9Q87023356.2202852.7703303.3403270.2803511.6302990.4803574.8303207.580
10Q1482710549.70010632.00010627.90010604.60010625.60010703.40010681.30010669.200
11Q177092443.2702709.2202306.1002428.5902593.1702811.2702352.4102472.070
12Q237766716.1706695.6106716.6506684.6906650.6206679.9306724.7006694.140
13Q81439120.0908705.4909460.2708942.09010028.1009068.3009886.6209327.820
14Q196666778.6906764.0206805.8106868.0006867.2906876.2706951.9407014.040
15Q310210557.00010568.40010444.70010558.20010638.50010685.60010550.50010633.100
16Q200273265.7003266.4303245.0203246.5903217.1903222.8003211.5203221.870
17Q84831355.4601425.3601581.8201401.4501479.0901512.8701667.8601471.160
18Q170991228.5501238.1801247.3501261.0701242.9301258.4401267.4001278.080
19Q2044930.8004424.5804878.3605010.0804953.4304418.3104897.7105078.940
20Q99488745.1208810.7308933.0509077.1409094.0809185.6009315.9409465.310
21Q92843721.8204294.1303977.2904436.2403733.1004387.3104119.5204613.240
22Q134601822.1301842.6001849.6301850.6201829.7401847.0701851.2001850.190
23Q76029444.3909469.7309429.8609774.4509932.66010005.4009928.29010253.600
24Q130544163.4404174.7204174.8704220.1704235.8704253.1604214.6904212.210
25Q188993506.0103955.0803337.9603731.5703598.8504284.1303445.6203828.290
26Q102085896.9405114.1405439.9405520.0706070.5705319.0005604.7905710.120
27Q136277693.3707577.7107564.9407547.9007557.4307491.9307481.9507474.090
28Q2134510180.60010215.10010220.00010045.90010115.20010151.70010175.90010035.000
29Q69212751.3102753.6502684.9002781.0702758.5502796.2002729.3302795.920
..............................
11969Q174394081.6004150.4004155.9104191.9804228.1304295.9104297.9604329.480
11970Q319510038.80010072.70010117.20010116.90010040.10010104.10010155.50010136.000
11971Q15688915.955926.643921.357912.892916.857929.176919.543906.205
11972Q13511218.5201202.7201210.5901210.8701216.7801206.9601215.6601216.850
11973Q1316410211.20010765.80010226.60010120.7009273.6709864.8409666.0009863.000
11974Q150566989.7605541.0705908.5606886.0306833.0605552.9805945.5107044.700
11975Q2367710034.40010037.20010040.50010126.30010163.20010137.80010156.60010249.400
11976Q4689348.7709998.96010671.10010381.8009443.46010114.70010773.00010464.700
11977Q189658438.0808473.7608488.4808478.6208598.0908636.9108676.3708708.140
11978Q52396212.3806450.6706805.3206632.0806344.8106520.1006856.5306753.160
11979Q105272955.5002843.5902921.7602881.7203278.9403132.9103189.4103081.570
11980Q10081083.2101088.5601087.8601096.6601092.1001098.8701098.8601107.450
11981Q18062769.776903.492834.518831.141798.469907.186837.381834.146
11982Q146277571.1709471.0906049.5605730.2007662.0609893.6906345.5606098.180
11983Q550312566.70012675.30013209.80013581.80013476.50013620.40014111.30014555.400
11984Q168778490.6707147.9305781.6209049.4307940.7806635.8705631.5308802.880
11985Q231623690.2103786.6403807.3903828.6703821.8003920.1203961.2803988.650
11986Q197412216.4902218.1902202.1102212.5102243.1402250.3202234.2402249.190
11987Q22711744.7101750.1401750.4501771.3101782.2501792.5601792.9301813.870
11988Q122502443.2703502.7202171.3902424.3402448.4703458.4502208.7402441.920
11989Q232199309.0709355.8009481.5409381.9609440.8109586.5909666.0309561.190
11990Q6223908.7103995.0404027.0104107.5604020.9204109.0204145.9504213.280
11991Q123232447.5302458.6502465.9502487.6302433.8602450.7102470.6102478.990
11992Q1615810011.70011548.7009007.71010012.30010080.60011868.3009202.44010094.900
11993Q214813812.2903747.7403778.3203721.0103829.3503718.2403761.0703691.880
11994Q178267631.0207880.4007214.7908049.3008046.9908226.6607484.2008355.670
11995Q1697910998.20011101.10011003.80011139.10011283.40011360.60011259.20011383.800
11996Q48257278.0506920.4407407.2607393.9807549.1007093.0607554.4807561.380
11997Q160865374.0105664.7205436.8505393.6905400.7605701.1605486.3905452.750
11998Q189026673.2207140.2706688.7906782.7206652.5607052.0606645.4506762.730
\n", - "

11999 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " Q1196 7963.17 8588.11 8186.43 7933.46 8030.54 \\\n", - "0 Q3782 9966.330 9934.400 9943.020 9971.910 9952.500 \n", - "1 Q13833 11335.500 11514.200 11504.200 11592.500 11308.900 \n", - "2 Q20924 9954.430 9671.480 9566.530 9851.540 10097.200 \n", - "3 Q22403 2546.110 2531.370 2558.470 2546.020 2546.070 \n", - "4 Q6645 13883.500 14069.700 14147.400 14344.600 14433.900 \n", - "5 Q5043 5746.790 6402.200 6240.340 6205.140 6248.670 \n", - "6 Q11784 12433.200 12466.800 12512.600 12703.800 12680.200 \n", - "7 Q1103 4518.470 4533.180 4580.810 4627.860 4633.750 \n", - "8 Q13183 2785.760 2702.640 2799.010 2844.810 2807.920 \n", - "9 Q8702 3356.220 2852.770 3303.340 3270.280 3511.630 \n", - "10 Q14827 10549.700 10632.000 10627.900 10604.600 10625.600 \n", - "11 Q17709 2443.270 2709.220 2306.100 2428.590 2593.170 \n", - "12 Q23776 6716.170 6695.610 6716.650 6684.690 6650.620 \n", - "13 Q8143 9120.090 8705.490 9460.270 8942.090 10028.100 \n", - "14 Q19666 6778.690 6764.020 6805.810 6868.000 6867.290 \n", - "15 Q3102 10557.000 10568.400 10444.700 10558.200 10638.500 \n", - "16 Q20027 3265.700 3266.430 3245.020 3246.590 3217.190 \n", - "17 Q8483 1355.460 1425.360 1581.820 1401.450 1479.090 \n", - "18 Q17099 1228.550 1238.180 1247.350 1261.070 1242.930 \n", - "19 Q204 4930.800 4424.580 4878.360 5010.080 4953.430 \n", - "20 Q9948 8745.120 8810.730 8933.050 9077.140 9094.080 \n", - "21 Q9284 3721.820 4294.130 3977.290 4436.240 3733.100 \n", - "22 Q13460 1822.130 1842.600 1849.630 1850.620 1829.740 \n", - "23 Q7602 9444.390 9469.730 9429.860 9774.450 9932.660 \n", - "24 Q13054 4163.440 4174.720 4174.870 4220.170 4235.870 \n", - "25 Q18899 3506.010 3955.080 3337.960 3731.570 3598.850 \n", - "26 Q10208 5896.940 5114.140 5439.940 5520.070 6070.570 \n", - "27 Q13627 7693.370 7577.710 7564.940 7547.900 7557.430 \n", - "28 Q21345 10180.600 10215.100 10220.000 10045.900 10115.200 \n", - "29 Q6921 2751.310 2753.650 2684.900 2781.070 2758.550 \n", - "... ... ... ... ... ... ... \n", - "11969 Q17439 4081.600 4150.400 4155.910 4191.980 4228.130 \n", - "11970 Q3195 10038.800 10072.700 10117.200 10116.900 10040.100 \n", - "11971 Q15688 915.955 926.643 921.357 912.892 916.857 \n", - "11972 Q1351 1218.520 1202.720 1210.590 1210.870 1216.780 \n", - "11973 Q13164 10211.200 10765.800 10226.600 10120.700 9273.670 \n", - "11974 Q15056 6989.760 5541.070 5908.560 6886.030 6833.060 \n", - "11975 Q23677 10034.400 10037.200 10040.500 10126.300 10163.200 \n", - "11976 Q468 9348.770 9998.960 10671.100 10381.800 9443.460 \n", - "11977 Q18965 8438.080 8473.760 8488.480 8478.620 8598.090 \n", - "11978 Q5239 6212.380 6450.670 6805.320 6632.080 6344.810 \n", - "11979 Q10527 2955.500 2843.590 2921.760 2881.720 3278.940 \n", - "11980 Q1008 1083.210 1088.560 1087.860 1096.660 1092.100 \n", - "11981 Q18062 769.776 903.492 834.518 831.141 798.469 \n", - "11982 Q14627 7571.170 9471.090 6049.560 5730.200 7662.060 \n", - "11983 Q5503 12566.700 12675.300 13209.800 13581.800 13476.500 \n", - "11984 Q16877 8490.670 7147.930 5781.620 9049.430 7940.780 \n", - "11985 Q23162 3690.210 3786.640 3807.390 3828.670 3821.800 \n", - "11986 Q19741 2216.490 2218.190 2202.110 2212.510 2243.140 \n", - "11987 Q2271 1744.710 1750.140 1750.450 1771.310 1782.250 \n", - "11988 Q12250 2443.270 3502.720 2171.390 2424.340 2448.470 \n", - "11989 Q23219 9309.070 9355.800 9481.540 9381.960 9440.810 \n", - "11990 Q622 3908.710 3995.040 4027.010 4107.560 4020.920 \n", - "11991 Q12323 2447.530 2458.650 2465.950 2487.630 2433.860 \n", - "11992 Q16158 10011.700 11548.700 9007.710 10012.300 10080.600 \n", - "11993 Q21481 3812.290 3747.740 3778.320 3721.010 3829.350 \n", - "11994 Q17826 7631.020 7880.400 7214.790 8049.300 8046.990 \n", - "11995 Q16979 10998.200 11101.100 11003.800 11139.100 11283.400 \n", - "11996 Q4825 7278.050 6920.440 7407.260 7393.980 7549.100 \n", - "11997 Q16086 5374.010 5664.720 5436.850 5393.690 5400.760 \n", - "11998 Q18902 6673.220 7140.270 6688.790 6782.720 6652.560 \n", - "\n", - " 8658.68 8241.17 7971.4 \n", - "0 9933.320 9938.930 9971.920 \n", - "1 11545.300 11579.000 11720.400 \n", - "2 9885.220 9700.580 9825.740 \n", - "3 2549.160 2583.220 2576.440 \n", - "4 14720.600 14815.700 15098.400 \n", - "5 6770.770 6654.720 6649.510 \n", - "6 12709.900 12741.900 12937.400 \n", - "7 4657.870 4698.660 4747.860 \n", - "8 2765.890 2889.000 2923.370 \n", - "9 2990.480 3574.830 3207.580 \n", - "10 10703.400 10681.300 10669.200 \n", - "11 2811.270 2352.410 2472.070 \n", - "12 6679.930 6724.700 6694.140 \n", - "13 9068.300 9886.620 9327.820 \n", - "14 6876.270 6951.940 7014.040 \n", - "15 10685.600 10550.500 10633.100 \n", - "16 3222.800 3211.520 3221.870 \n", - "17 1512.870 1667.860 1471.160 \n", - "18 1258.440 1267.400 1278.080 \n", - "19 4418.310 4897.710 5078.940 \n", - "20 9185.600 9315.940 9465.310 \n", - "21 4387.310 4119.520 4613.240 \n", - "22 1847.070 1851.200 1850.190 \n", - "23 10005.400 9928.290 10253.600 \n", - "24 4253.160 4214.690 4212.210 \n", - "25 4284.130 3445.620 3828.290 \n", - "26 5319.000 5604.790 5710.120 \n", - "27 7491.930 7481.950 7474.090 \n", - "28 10151.700 10175.900 10035.000 \n", - "29 2796.200 2729.330 2795.920 \n", - "... ... ... ... \n", - "11969 4295.910 4297.960 4329.480 \n", - "11970 10104.100 10155.500 10136.000 \n", - "11971 929.176 919.543 906.205 \n", - "11972 1206.960 1215.660 1216.850 \n", - "11973 9864.840 9666.000 9863.000 \n", - "11974 5552.980 5945.510 7044.700 \n", - "11975 10137.800 10156.600 10249.400 \n", - "11976 10114.700 10773.000 10464.700 \n", - "11977 8636.910 8676.370 8708.140 \n", - "11978 6520.100 6856.530 6753.160 \n", - "11979 3132.910 3189.410 3081.570 \n", - "11980 1098.870 1098.860 1107.450 \n", - "11981 907.186 837.381 834.146 \n", - "11982 9893.690 6345.560 6098.180 \n", - "11983 13620.400 14111.300 14555.400 \n", - "11984 6635.870 5631.530 8802.880 \n", - "11985 3920.120 3961.280 3988.650 \n", - "11986 2250.320 2234.240 2249.190 \n", - "11987 1792.560 1792.930 1813.870 \n", - "11988 3458.450 2208.740 2441.920 \n", - "11989 9586.590 9666.030 9561.190 \n", - "11990 4109.020 4145.950 4213.280 \n", - "11991 2450.710 2470.610 2478.990 \n", - "11992 11868.300 9202.440 10094.900 \n", - "11993 3718.240 3761.070 3691.880 \n", - "11994 8226.660 7484.200 8355.670 \n", - "11995 11360.600 11259.200 11383.800 \n", - "11996 7093.060 7554.480 7561.380 \n", - "11997 5701.160 5486.390 5452.750 \n", - "11998 7052.060 6645.450 6762.730 \n", - "\n", - "[11999 rows x 9 columns]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "quarterly910 = pd.read_csv('./../output/Quarterly2019-01-16_10_05Final/Quarterly_9_1_0_LB0.csv')\n", - "quarterly910" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "#function that handles the entire transformation process for dataframes containing the forecast outputs from \n", - "def transformer(outframe): \n", - " #add current headers as last column\n", - " last_entry = list(outframe.keys())\n", - " #make a new data frame for last col and append it to input df\n", - " append_frame = pd.DataFrame([last_entry], columns=last_entry)\n", - " updated = outframe.append(append_frame, ignore_index=True)\n", - " \n", - " #rename column headings\n", - " #build map of old column headings to their replacement\n", - " rename_map = dict()\n", - " keys = list(outframe.keys())\n", - " for i in range(len(keys)): \n", - " rename_map[keys[i]] = 'V' + str(i+1)\n", - " rename_map\n", - " \n", - " #modify headers to mirror that of the dataframe\n", - " updated = updated.rename(index=int, columns=rename_map)\n", - " \n", - " return updated" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "quarterly910 = transformer(pd.read_csv('./../output/Quarterly2019-01-16_10_05Final/Quarterly_9_1_0_LB0.csv'))\n", - "quarterly911 = transformer(pd.read_csv('./../output/Quarterly2019-01-16_10_05Final/Quarterly_9_1_1_LB0.csv'))\n", - "quarterly912 = transformer(pd.read_csv('./../output/Quarterly2019-01-16_10_05Final/Quarterly_9_1_2_LB0.csv'))\n", - "quarterly920 = transformer(pd.read_csv('./../output/Quarterly2019-01-16_10_05Final/Quarterly_9_2_0_LB0.csv'))\n", - "quarterly921 = transformer(pd.read_csv('./../output/Quarterly2019-01-16_10_05Final/Quarterly_9_2_1_LB0.csv'))\n", - "quarterly922 = transformer(pd.read_csv('./../output/Quarterly2019-01-16_10_05Final/Quarterly_9_2_2_LB0.csv'))" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
V1V2V3V4V5V6V7V8V9
0Q16790.6436986598.9522026608.5271736765.9140146992.9490036931.5390007161.2408696981.304105
1Q27081.7096696789.4147236895.8385457050.5089397155.2069697075.4450007373.8323837339.981903
2Q37188.8935966986.3304007025.1620337066.2707247129.5455427079.7190007242.2590027043.345329
3Q47679.1025647483.0946577510.2123807600.1481937714.3980107677.5710007922.6361577707.159526
4Q51150.000000995.0000001083.0000001465.0000001079.000000948.0000001298.0000001763.000000
5Q69761.3000009808.8000009912.1000009985.60000010009.8000009980.30000010102.60000010168.400000
6Q73345.6000003378.1000003376.1000003389.1000003421.6000003409.3000003433.6000003452.900000
7Q82618.8000002622.7000002656.9000002695.4000002669.3000002676.7000002750.0000002778.700000
8Q92455.9000002468.4000002483.6000002508.1000002506.4000002503.8000002527.0000002528.800000
9Q102524.5000002538.0000002567.1000002563.8000002562.0000002551.1000002569.9000002581.800000
10Q111158.3000001153.0000001160.9000001145.8000001169.3000001156.0000001156.2000001156.100000
11Q123153.0000003097.0000003256.0000003385.0000003264.0000002977.0000003349.0000003657.000000
12Q131779.6000001787.0000001814.6000001818.9000001850.7000001846.3000001848.1000001854.000000
13Q1412680.00000012420.00000012630.00000012560.00000013660.00000012180.00000012600.00000012800.000000
14Q151415.0000001322.0000001276.0000001463.0000001260.0000001281.0000001510.0000001497.000000
15Q162166.0000002344.0000002226.0000002417.0000002321.0000002224.0000002329.0000002423.000000
16Q172420.7000002505.6000002462.6000002501.0000002547.8000002528.8000002553.9000002547.100000
17Q184907.0000005013.0000005200.0000005202.0000004724.0000004933.0000004979.0000004868.000000
18Q195576.0000005652.0000005862.0000005916.0000005762.0000005860.0000006212.0000006187.000000
19Q206286.0000006368.0000006414.0000006531.0000006555.0000006432.0000006504.0000006596.000000
20Q219547.0000009720.0000009905.00000010123.0000009862.0000009957.00000010302.00000010331.000000
21Q225090.0000005374.0000005365.0000005335.0000005372.0000005396.0000005351.0000005433.000000
22Q235993.0000005936.1000006063.8000006197.4000006101.3000006063.9000006204.5000006310.400000
23Q242333.4000002317.9000002360.1000002402.7000002367.3000002348.4000002371.2000002383.900000
24Q251388.3000001365.2000001387.6000001412.4000001392.4000001400.0000001384.0000001400.000000
25Q267880.0000007310.0000007780.0000009370.0000007940.0000007040.0000008980.0000009900.000000
26Q279347.0000009279.0000009395.0000009567.0000009295.0000009287.0000009535.0000009526.000000
27Q285080.0000004910.0000004970.0000005170.0000005430.0000005110.0000005050.0000005100.000000
28Q291980.0000001960.0000001870.0000001850.0000001910.0000002050.0000001960.0000001990.000000
29Q303130.0000003180.0000003120.0000003110.0000003140.0000003230.0000003160.0000003160.000000
..............................
23970Q239715246.2000006344.2000005463.0000005152.2000006338.9000007133.1000006679.3000006511.000000
23971Q239723103.9000003322.6000003611.7000003648.7000003516.5000003944.5000003777.2000003831.900000
23972Q239733061.8000003158.8000003182.8000003131.7000003255.1000003428.5000003279.5000003321.600000
23973Q239742623.3000002630.3000002550.1000002693.2000002646.7000002677.3000002987.2000003014.200000
23974Q239752340.2000002198.7000002237.2000002360.0000002328.0000002334.4000002692.6000002673.900000
23975Q239764811.7820004722.8950004579.4820004764.6230005012.6920005312.1610004876.4010004925.657000
23976Q239772020.0000003490.0000001980.0000002070.0000002550.0000002840.0000002050.0000002070.000000
23977Q23978871.0000001173.000000951.000000957.0000001199.000000913.000000943.0000001098.000000
23978Q239792766.0000002786.0000003029.0000003055.0000003126.0000003225.0000003346.0000003416.000000
23979Q239801687.0000001701.0000001848.0000001862.0000001907.0000001967.0000002042.0000002084.000000
23980Q2398111030.00000011100.00000012050.00000012130.00000012310.00000012670.00000013120.00000013370.000000
23981Q239821726.0000001739.0000001882.0000001894.0000001925.0000001985.0000002053.0000002090.000000
23982Q23983270.000000590.000000300.000000320.000000390.000000570.000000320.000000280.000000
23983Q2398410790.00000010850.00000011810.00000011930.00000012190.00000012580.00000013040.00000013320.000000
23984Q239852876.0000003157.0000003498.0000003270.0000003349.0000003569.0000003970.0000003632.000000
23985Q239862075.0000002277.0000002521.0000002356.0000002414.0000002571.0000002860.0000002616.000000
23986Q23987862.0000001056.5000001556.8000001197.8000001232.6000001085.8000001437.2000001215.600000
23987Q23988842.8000001035.3000001532.8000001175.4000001209.7000001061.3000001410.0000001190.700000
23988Q239898000.0000008800.00000010500.0000009800.00000010000.00000010700.00000011900.00000010900.000000
23989Q239903047.6000003301.3000003693.8000003265.9000003285.8000003218.9000003509.1000003227.600000
23990Q239913142.9000003309.5000003466.1000003378.7000003399.0000003220.6000003278.4000003348.300000
23991Q239925045.0000002424.0000005297.0000003145.0000003240.000000972.0000004808.0000002142.000000
23992Q239931641.4000001594.1000002253.9000002216.1000001438.9000002143.5000001792.9000001574.700000
23993Q239942080.0000003550.0000002050.0000002140.0000002620.0000002920.0000002130.0000002150.000000
23994Q239954793.1000004777.7000004721.5000004740.1000004802.2000004851.0000004855.7000004818.700000
23995Q239962160.0000002170.0000002200.0000002190.0000002130.0000002150.0000002170.0000002150.000000
23996Q2399710180.00000010180.00000010000.00000010000.00000010170.00000010170.00000010170.00000010160.000000
23997Q2399810180.00000010180.00000010170.00000010170.00000010340.00000010340.00000010330.00000010330.000000
23998Q239991229.1506011210.8586571183.1069341182.7778621157.0356291066.3414361151.7122051175.424226
23999Q240004265.5081884399.4711704184.8195164263.6560554347.6341724339.9683923994.7431884157.187970
\n", - "

24000 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " V1 V2 V3 V4 V5 \\\n", - "0 Q1 6790.643698 6598.952202 6608.527173 6765.914014 \n", - "1 Q2 7081.709669 6789.414723 6895.838545 7050.508939 \n", - "2 Q3 7188.893596 6986.330400 7025.162033 7066.270724 \n", - "3 Q4 7679.102564 7483.094657 7510.212380 7600.148193 \n", - "4 Q5 1150.000000 995.000000 1083.000000 1465.000000 \n", - "5 Q6 9761.300000 9808.800000 9912.100000 9985.600000 \n", - "6 Q7 3345.600000 3378.100000 3376.100000 3389.100000 \n", - "7 Q8 2618.800000 2622.700000 2656.900000 2695.400000 \n", - "8 Q9 2455.900000 2468.400000 2483.600000 2508.100000 \n", - "9 Q10 2524.500000 2538.000000 2567.100000 2563.800000 \n", - "10 Q11 1158.300000 1153.000000 1160.900000 1145.800000 \n", - "11 Q12 3153.000000 3097.000000 3256.000000 3385.000000 \n", - "12 Q13 1779.600000 1787.000000 1814.600000 1818.900000 \n", - "13 Q14 12680.000000 12420.000000 12630.000000 12560.000000 \n", - "14 Q15 1415.000000 1322.000000 1276.000000 1463.000000 \n", - "15 Q16 2166.000000 2344.000000 2226.000000 2417.000000 \n", - "16 Q17 2420.700000 2505.600000 2462.600000 2501.000000 \n", - "17 Q18 4907.000000 5013.000000 5200.000000 5202.000000 \n", - "18 Q19 5576.000000 5652.000000 5862.000000 5916.000000 \n", - "19 Q20 6286.000000 6368.000000 6414.000000 6531.000000 \n", - "20 Q21 9547.000000 9720.000000 9905.000000 10123.000000 \n", - "21 Q22 5090.000000 5374.000000 5365.000000 5335.000000 \n", - "22 Q23 5993.000000 5936.100000 6063.800000 6197.400000 \n", - "23 Q24 2333.400000 2317.900000 2360.100000 2402.700000 \n", - "24 Q25 1388.300000 1365.200000 1387.600000 1412.400000 \n", - "25 Q26 7880.000000 7310.000000 7780.000000 9370.000000 \n", - "26 Q27 9347.000000 9279.000000 9395.000000 9567.000000 \n", - "27 Q28 5080.000000 4910.000000 4970.000000 5170.000000 \n", - "28 Q29 1980.000000 1960.000000 1870.000000 1850.000000 \n", - "29 Q30 3130.000000 3180.000000 3120.000000 3110.000000 \n", - "... ... ... ... ... ... \n", - "23970 Q23971 5246.200000 6344.200000 5463.000000 5152.200000 \n", - "23971 Q23972 3103.900000 3322.600000 3611.700000 3648.700000 \n", - "23972 Q23973 3061.800000 3158.800000 3182.800000 3131.700000 \n", - "23973 Q23974 2623.300000 2630.300000 2550.100000 2693.200000 \n", - "23974 Q23975 2340.200000 2198.700000 2237.200000 2360.000000 \n", - "23975 Q23976 4811.782000 4722.895000 4579.482000 4764.623000 \n", - "23976 Q23977 2020.000000 3490.000000 1980.000000 2070.000000 \n", - "23977 Q23978 871.000000 1173.000000 951.000000 957.000000 \n", - "23978 Q23979 2766.000000 2786.000000 3029.000000 3055.000000 \n", - "23979 Q23980 1687.000000 1701.000000 1848.000000 1862.000000 \n", - "23980 Q23981 11030.000000 11100.000000 12050.000000 12130.000000 \n", - "23981 Q23982 1726.000000 1739.000000 1882.000000 1894.000000 \n", - "23982 Q23983 270.000000 590.000000 300.000000 320.000000 \n", - "23983 Q23984 10790.000000 10850.000000 11810.000000 11930.000000 \n", - "23984 Q23985 2876.000000 3157.000000 3498.000000 3270.000000 \n", - "23985 Q23986 2075.000000 2277.000000 2521.000000 2356.000000 \n", - "23986 Q23987 862.000000 1056.500000 1556.800000 1197.800000 \n", - "23987 Q23988 842.800000 1035.300000 1532.800000 1175.400000 \n", - "23988 Q23989 8000.000000 8800.000000 10500.000000 9800.000000 \n", - "23989 Q23990 3047.600000 3301.300000 3693.800000 3265.900000 \n", - "23990 Q23991 3142.900000 3309.500000 3466.100000 3378.700000 \n", - "23991 Q23992 5045.000000 2424.000000 5297.000000 3145.000000 \n", - "23992 Q23993 1641.400000 1594.100000 2253.900000 2216.100000 \n", - "23993 Q23994 2080.000000 3550.000000 2050.000000 2140.000000 \n", - "23994 Q23995 4793.100000 4777.700000 4721.500000 4740.100000 \n", - "23995 Q23996 2160.000000 2170.000000 2200.000000 2190.000000 \n", - "23996 Q23997 10180.000000 10180.000000 10000.000000 10000.000000 \n", - "23997 Q23998 10180.000000 10180.000000 10170.000000 10170.000000 \n", - "23998 Q23999 1229.150601 1210.858657 1183.106934 1182.777862 \n", - "23999 Q24000 4265.508188 4399.471170 4184.819516 4263.656055 \n", - "\n", - " V6 V7 V8 V9 \n", - "0 6992.949003 6931.539000 7161.240869 6981.304105 \n", - "1 7155.206969 7075.445000 7373.832383 7339.981903 \n", - "2 7129.545542 7079.719000 7242.259002 7043.345329 \n", - "3 7714.398010 7677.571000 7922.636157 7707.159526 \n", - "4 1079.000000 948.000000 1298.000000 1763.000000 \n", - "5 10009.800000 9980.300000 10102.600000 10168.400000 \n", - "6 3421.600000 3409.300000 3433.600000 3452.900000 \n", - "7 2669.300000 2676.700000 2750.000000 2778.700000 \n", - "8 2506.400000 2503.800000 2527.000000 2528.800000 \n", - "9 2562.000000 2551.100000 2569.900000 2581.800000 \n", - "10 1169.300000 1156.000000 1156.200000 1156.100000 \n", - "11 3264.000000 2977.000000 3349.000000 3657.000000 \n", - "12 1850.700000 1846.300000 1848.100000 1854.000000 \n", - "13 13660.000000 12180.000000 12600.000000 12800.000000 \n", - "14 1260.000000 1281.000000 1510.000000 1497.000000 \n", - "15 2321.000000 2224.000000 2329.000000 2423.000000 \n", - "16 2547.800000 2528.800000 2553.900000 2547.100000 \n", - "17 4724.000000 4933.000000 4979.000000 4868.000000 \n", - "18 5762.000000 5860.000000 6212.000000 6187.000000 \n", - "19 6555.000000 6432.000000 6504.000000 6596.000000 \n", - "20 9862.000000 9957.000000 10302.000000 10331.000000 \n", - "21 5372.000000 5396.000000 5351.000000 5433.000000 \n", - "22 6101.300000 6063.900000 6204.500000 6310.400000 \n", - "23 2367.300000 2348.400000 2371.200000 2383.900000 \n", - "24 1392.400000 1400.000000 1384.000000 1400.000000 \n", - "25 7940.000000 7040.000000 8980.000000 9900.000000 \n", - "26 9295.000000 9287.000000 9535.000000 9526.000000 \n", - "27 5430.000000 5110.000000 5050.000000 5100.000000 \n", - "28 1910.000000 2050.000000 1960.000000 1990.000000 \n", - "29 3140.000000 3230.000000 3160.000000 3160.000000 \n", - "... ... ... ... ... \n", - "23970 6338.900000 7133.100000 6679.300000 6511.000000 \n", - "23971 3516.500000 3944.500000 3777.200000 3831.900000 \n", - "23972 3255.100000 3428.500000 3279.500000 3321.600000 \n", - "23973 2646.700000 2677.300000 2987.200000 3014.200000 \n", - "23974 2328.000000 2334.400000 2692.600000 2673.900000 \n", - "23975 5012.692000 5312.161000 4876.401000 4925.657000 \n", - "23976 2550.000000 2840.000000 2050.000000 2070.000000 \n", - "23977 1199.000000 913.000000 943.000000 1098.000000 \n", - "23978 3126.000000 3225.000000 3346.000000 3416.000000 \n", - "23979 1907.000000 1967.000000 2042.000000 2084.000000 \n", - "23980 12310.000000 12670.000000 13120.000000 13370.000000 \n", - "23981 1925.000000 1985.000000 2053.000000 2090.000000 \n", - "23982 390.000000 570.000000 320.000000 280.000000 \n", - "23983 12190.000000 12580.000000 13040.000000 13320.000000 \n", - "23984 3349.000000 3569.000000 3970.000000 3632.000000 \n", - "23985 2414.000000 2571.000000 2860.000000 2616.000000 \n", - "23986 1232.600000 1085.800000 1437.200000 1215.600000 \n", - "23987 1209.700000 1061.300000 1410.000000 1190.700000 \n", - "23988 10000.000000 10700.000000 11900.000000 10900.000000 \n", - "23989 3285.800000 3218.900000 3509.100000 3227.600000 \n", - "23990 3399.000000 3220.600000 3278.400000 3348.300000 \n", - "23991 3240.000000 972.000000 4808.000000 2142.000000 \n", - "23992 1438.900000 2143.500000 1792.900000 1574.700000 \n", - "23993 2620.000000 2920.000000 2130.000000 2150.000000 \n", - "23994 4802.200000 4851.000000 4855.700000 4818.700000 \n", - "23995 2130.000000 2150.000000 2170.000000 2150.000000 \n", - "23996 10170.000000 10170.000000 10170.000000 10160.000000 \n", - "23997 10340.000000 10340.000000 10330.000000 10330.000000 \n", - "23998 1157.035629 1066.341436 1151.712205 1175.424226 \n", - "23999 4347.634172 4339.968392 3994.743188 4157.187970 \n", - "\n", - "[24000 rows x 9 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#load test data\n", - "test_quarterly = pd.read_csv('./../Test/Quarterly-test.csv')\n", - "test_quarterly" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([308.96211001, 397.91577315, 456.18793109, 515.84167931,\n", - " 588.53980593, 652.53190271, 700.01172281, 746.78732059])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#function to find mean mae between two df's\n", - "def mae_finder(forecast, test): \n", - " total_mae = np.zeros(8) #mape for values v2 through v8\n", - " \n", - " for index, val in forecast.iterrows(): \n", - " forecast_code = forecast['V1'][index]\n", - " test_index = int(forecast_code[1:]) - 1\n", - "\n", - " #isolate rows relevant to the mape\n", - " test_row = list(test.iloc[test_index])\n", - " forecast_row = list(forecast.iloc[index])\n", - " #calculate the mae\n", - " row_mae = np.absolute(np.asarray(test_row[1:], dtype=float) - np.asarray(forecast_row[1:], dtype=float))\n", - "# print(forecast_code, test_row[1], forecast_row[1])\n", - "\n", - " total_mae = np.add(total_mae, row_mae)\n", - " \n", - " average_mae = total_mae * 1/(forecast.shape[0])\n", - " return average_mae\n", - "\n", - "mae_finder(quarterly910, test_quarterly)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "#find MAE for each of the forecast files\n", - "mae910 = mae_finder(quarterly910, test_quarterly)\n", - "mae911 = mae_finder(quarterly911, test_quarterly)\n", - "mae912 = mae_finder(quarterly912, test_quarterly)\n", - "mae920 = mae_finder(quarterly920, test_quarterly)\n", - "mae921 = mae_finder(quarterly921, test_quarterly)\n", - "mae922 = mae_finder(quarterly922, test_quarterly)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[308.96211001 397.91577315 456.18793109 515.84167931 588.53980593\n", - " 652.53190271 700.01172281 746.78732059]\n", - "[317.69561195 406.98731278 448.95936218 510.64312613 585.88064271\n", - " 654.22979036 699.39111315 734.51823288]\n", - "[309.06047725 393.05978755 449.29351596 500.34833131 580.76258817\n", - " 647.83754269 696.23386745 737.8567271 ]\n", - "[328.04388295 405.57146454 455.93666913 518.51271116 599.70302105\n", - " 659.46899925 699.55660556 743.45585613]\n", - "[320.28650986 396.45696385 462.82188907 519.60971893 595.04959443\n", - " 648.00065885 700.57551582 749.84192092]\n", - "[323.75163132 409.78456323 462.39853919 527.95867532 599.22912357\n", - " 656.06311578 706.17948724 748.01748845]\n" - ] - } - ], - "source": [ - "print(mae910)\n", - "print(mae911)\n", - "print(mae912)\n", - "print(mae920)\n", - "print(mae921)\n", - "print(mae922)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "n_groups = 8\n", - "tup910 = tuple(mae910)\n", - "tup911 = tuple(mae911)\n", - "tup912 = tuple(mae912)\n", - "tup920 = tuple(mae920)\n", - "tup921 = tuple(mae921)\n", - "tup922 = tuple(mae922)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "#MAE GRAPH\n", - "# create plot\n", - "fig, ax = plt.subplots(figsize=(8, 6))\n", - "index = np.arange(n_groups)\n", - "bar_width = 0.15\n", - "opacity = 0.8\n", - "\n", - "#data for bars\n", - "rects1 = plt.bar(index, tup910, bar_width,\n", - " alpha=opacity,\n", - " color='b',\n", - " label='MAE for (9, 1, 0)')\n", - " \n", - "rects2 = plt.bar(index + bar_width, tup911, bar_width,\n", - " alpha=opacity,\n", - " color='g',\n", - " label='MAE for (9, 1, 1)')\n", - " \n", - "rects3 = plt.bar(index + 2 * bar_width, tup912, bar_width,\n", - " alpha=opacity,\n", - " color='r',\n", - " label='MAE for (9, 1, 2)')\n", - " \n", - "rects4 = plt.bar(index + 3 * bar_width, tup920, bar_width,\n", - " alpha=opacity,\n", - " color='c',\n", - " label='MAE for (9, 2, 0)')\n", - "\n", - "rects5 = plt.bar(index + 4 * bar_width, tup921, bar_width,\n", - " alpha=opacity,\n", - " color='m',\n", - " label='MAE for (9, 2, 1)')\n", - " \n", - "rects6 = plt.bar(index + 5 * bar_width, tup922, bar_width,\n", - " alpha=opacity,\n", - " color='y',\n", - " label='MAE for (9, 2, 2)')\n", - "\n", - "#fill in plot details\n", - "plt.xlabel('Time Step after End of Training', fontsize=16)\n", - "plt.ylabel('Mean Absolute Error', fontsize=16)\n", - "plt.title('MAE for Each Forecasted Position', fontsize=18)\n", - "plt.xticks(index + bar_width * 2.5, ('t1', 't2', 't3', 't4', 't5', 't6', 't7', 't8'))\n", - "plt.legend()\n", - "\n", - "#show plot\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[317.96670388970944,\n", - " 401.62931084871656,\n", - " 455.9329844358737,\n", - " 515.485707027718,\n", - " 591.527462644222,\n", - " 653.0220016062417,\n", - " 700.324718672281,\n", - " 743.4129243453746]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#MEAN MAE CALCULATION\n", - "mean_mae = list(np.mean([mae910, mae911, mae912, mae920, mae921, mae922], axis=0))\n", - "mean_mae" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "No handles with labels found to put in legend.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "#MAPE GRAPH\n", - "# create plot\n", - "fig, ax = plt.subplots(figsize=(8, 6))\n", - "index = np.arange(n_groups)\n", - "bar_width = 0.7\n", - "opacity = 0.5\n", - "\n", - "#data for bars\n", - "rects1 = plt.bar(index, tuple(mean_mae), bar_width,\n", - " alpha=opacity,\n", - " color='g')\n", - "\n", - "#fill in plot details\n", - "plt.xlabel('Time Step after End of Training', fontsize=16)\n", - "plt.ylabel('Mean Absolute Error', fontsize=16)\n", - "plt.title('MAE for Each Forecasted Position Over Six Sessions', fontsize=18)\n", - "plt.xticks(index, ('t1', 't2', 't3', 't4', 't5', 't6', 't7', 't8'), fontsize=12)\n", - "plt.yticks(fontsize=12)\n", - "plt.legend()\n", - "\n", - "#show plot\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 6.09254532, 8.13991257, 9.60668219, 10.72591707, 12.74998037,\n", - " 13.97945109, 14.50403842, 16.25036052])" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#function to find mean mape between two df's\n", - "def mape_finder(forecast, test): \n", - " total_mape = np.zeros(8) #mape for values v2 through v8\n", - " \n", - " for index, val in forecast.iterrows(): \n", - " forecast_code = forecast['V1'][index]\n", - " test_index = int(forecast_code[1:]) - 1\n", - "\n", - " #isolate rows relevant to the mape\n", - " test_row = list(test.iloc[test_index])\n", - " forecast_row = list(forecast.iloc[index])\n", - " #calculate the mae\n", - " row_mape = np.absolute(np.divide(np.asarray(test_row[1:], dtype=float) - np.asarray(forecast_row[1:], dtype=float), \n", - " np.asarray(test_row[1:], dtype=float)))\n", - "# print(forecast_code, test_row[1], forecast_row[1])\n", - "\n", - " total_mape = np.add(total_mape, row_mape)\n", - " \n", - " average_mape = total_mape * 1/(forecast.shape[0]) * 100\n", - " return average_mape\n", - "\n", - "mape_finder(quarterly910, test_quarterly)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "#find MAPE for each of the forecast files\n", - "mape910 = mape_finder(quarterly910, test_quarterly)\n", - "mape911 = mape_finder(quarterly911, test_quarterly)\n", - "mape912 = mape_finder(quarterly912, test_quarterly)\n", - "mape920 = mape_finder(quarterly920, test_quarterly)\n", - "mape921 = mape_finder(quarterly921, test_quarterly)\n", - "mape922 = mape_finder(quarterly922, test_quarterly)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[6.104821694316674,\n", - " 8.060104385387103,\n", - " 9.348758277030383,\n", - " 10.483381270419134,\n", - " 12.254125362033001,\n", - " 13.735441922444288,\n", - " 14.245988297894357,\n", - " 15.813211872628509]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#MEAN MAPE CALCULATION\n", - "mean_mape = list(np.mean([mape910, mape911, mape912, mape920, mape921, mape922], axis=0))\n", - "mean_mape" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "No handles with labels found to put in legend.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "#MAPE GRAPH\n", - "# create plot\n", - "fig, ax = plt.subplots(figsize=(8, 6))\n", - "index = np.arange(n_groups)\n", - "bar_width = 0.7\n", - "opacity = 0.5\n", - "\n", - "#data for bars\n", - "rects1 = plt.bar(index, tuple(mean_mape), bar_width,\n", - " alpha=opacity,\n", - " color='g')\n", - "\n", - "#fill in plot details\n", - "plt.xlabel('Time Step after End of Training', fontsize=16)\n", - "plt.ylabel('Mean Absolute Percentage Error (%)', fontsize=16)\n", - "plt.title('MAPE for Each Forecasted Position Over Six Sessions', fontsize=18)\n", - "plt.xticks(index, ('t1', 't2', 't3', 't4', 't5', 't6', 't7', 't8'), fontsize=12)\n", - "plt.yticks(fontsize=12)\n", - "plt.legend()\n", - "\n", - "#show plot\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
V1V2V3V4V5V6V7V8V9V10...V858V859V860V861V862V863V864V865V866V867
0Q17407.4123147528.5660747374.7092257395.5148487654.0079897686.8478357578.1907437904.3767167744.049254...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1Q27552.4546197541.7745717466.5683367550.3333548067.1315228063.7010177901.0293128155.3873168031.010328...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2Q38463.8421938366.1023098269.5021928256.9853258726.9176478733.2435918664.2600878717.3945688662.139727...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3Q48498.9411948409.9264428391.4413818292.8603108798.5211188753.9903558740.0625568695.5406518627.447488...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4Q51835.0000002322.0000003059.0000001883.0000001896.0000002060.0000002764.0000001743.0000001561.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
5Q68873.0000008949.0000008929.9000008986.3000008943.2000008979.0000008965.9000008892.7000008857.500000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
6Q73431.0000003418.3000003385.3000003447.1000003435.4000003431.7000003388.0000003371.7000003360.100000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7Q82599.1000002626.5000002607.0000002628.2000002558.3000002567.3000002558.7000002513.5000002457.500000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
8Q92856.2000002869.8000002874.8000002873.4000002861.6000002849.0000002822.8000002779.2000002793.200000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
9Q102329.0000002349.9000002332.9000002381.5000002382.6000002405.0000002411.0000002428.5000002391.600000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
10Q111082.5000001076.1000001063.1000001091.0000001105.4000001109.6000001092.5000001114.4000001103.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
11Q123726.0000004048.0000004704.0000003856.0000003782.0000004107.0000004437.0000003784.0000003694.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
12Q13926.900000953.500000945.100000939.700000974.100000989.600000999.2000001001.9000001045.600000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
13Q145370.0000004940.0000005660.0000005660.0000005780.0000005920.0000006410.0000006010.0000006170.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
14Q151527.0000001576.0000001641.0000001599.0000001613.0000001516.0000001571.0000001615.0000001461.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
15Q16755.000000878.000000762.000000854.000000832.000000915.000000846.000000834.000000931.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
16Q171821.7000001836.6000001846.9000001848.8000001840.9000001876.9000001890.0000001823.9000001857.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
17Q185483.0000005952.0000005639.0000005873.0000005126.0000005868.0000005789.0000005645.0000005487.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
18Q195409.0000005137.0000005218.0000005088.0000005070.0000005128.0000005132.0000005149.0000005091.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
19Q205712.0000005744.0000005731.0000005741.0000005795.0000005891.0000005823.0000005655.0000005684.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
20Q2110035.0000009874.0000009804.0000009755.0000009677.0000009858.0000009722.0000009622.0000009583.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
21Q223572.0000003612.0000003559.0000003747.0000003667.0000003795.0000003693.0000003660.0000003662.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22Q234262.0000004387.1000004503.4000004363.8000004242.0000004267.0000004375.5000004253.8000004194.200000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23Q242525.1000002579.1000002596.2000002542.0000002552.9000002544.8000002581.8000002480.3000002487.200000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
24Q251576.5000001619.0000001618.9000001567.9000001565.4000001567.1000001570.7000001505.1000001538.900000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
25Q268230.0000007610.0000009930.0000007930.0000004810.0000008250.0000008780.0000007570.0000007000.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
26Q279192.0000009420.0000009459.0000009363.0000009141.0000009096.0000009500.0000009191.0000009118.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
27Q283720.0000003730.0000003720.0000003810.0000003850.0000003910.0000003920.0000003980.0000004050.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
28Q292000.0000001930.0000001970.0000002110.0000002030.0000001960.0000001970.0000002020.0000002110.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
29Q302930.0000002880.0000002900.0000002950.0000002960.0000002930.0000002890.0000003030.0000003050.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
23970Q239712150.3000001941.4000001812.0000002207.5000001865.2000001611.8000002097.1000002228.8000002196.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23971Q239721538.8000001586.7000001463.0000001616.0000001538.1000001260.2000002044.9000002052.3000002238.100000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23972Q23973754.400000882.300000975.8000001010.400000989.6000001070.3000001319.0000001238.7000001257.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23973Q239743056.9000002897.2000002865.8000003024.7000003390.5000003306.3000003563.0000003830.1000003827.500000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23974Q239752076.2000001902.9000001948.5000002050.9000002287.1000002213.8000002426.3000002547.9000002563.100000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23975Q239761148.6030001169.2470001186.9320001214.5900001140.3580001208.9200001306.9320001363.0170002181.112000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23976Q239771210.0000001260.0000001290.0000001340.0000001400.0000001460.0000001550.0000001640.0000001740.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23977Q23978336.000000349.000000360.000000372.000000387.000000408.000000430.000000455.000000481.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23978Q23979258.000000269.000000281.000000295.000000311.000000334.000000364.000000396.000000435.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23979Q23980158.000000164.000000172.000000180.000000190.000000204.000000222.000000242.000000265.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23980Q239812070.0000002050.0000002040.0000002070.0000002140.0000002300.0000002530.0000002820.0000003150.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23981Q23982324.000000320.000000320.000000323.000000335.000000359.000000396.000000442.000000493.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23982Q239831490.0000001540.0000001590.0000001650.0000001720.0000001800.0000001900.0000002020.0000002130.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23983Q239841000.0000001050.0000001090.0000001150.0000001210.0000001300.0000001420.0000001540.0000001700.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23984Q23985526.000000544.000000554.000000566.000000570.000000595.000000615.000000636.000000632.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23985Q23986386.000000398.000000405.000000414.000000417.000000437.000000449.000000465.000000464.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23986Q23987682.700000709.700000718.200000729.100000747.300000764.700000793.700000821.400000833.200000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23987Q23988680.100000707.000000715.400000726.200000744.400000761.800000790.600000818.200000830.100000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23988Q239891100.0000001100.0000001200.0000001200.0000001200.0000001200.0000001300.0000001300.0000001300.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23989Q23990949.200000976.200000985.400000998.0000001020.1000001044.5000001082.5000001121.7000001146.300000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23990Q23991959.000000975.400000982.700000991.7000001030.0000001045.3000001080.0000001113.5000001158.800000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23991Q2399291.0000001631.0000001385.000000107.000000107.0000001834.0000001720.000000117.000000143.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23992Q23993100.700000136.700000130.000000137.300000141.500000226.300000152.800000152.000000271.700000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23993Q2399440350.00000029770.00000043610.00000022600.0000004630.0000001210.00000043850.00000039530.00000052540.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23994Q239951024.4000001043.1000001054.5000001106.9000001130.4000001156.4000001160.0000001209.2000001232.200000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23995Q239962400.0000002370.0000002310.0000002370.0000002420.0000002420.0000002310.0000002340.0000002370.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23996Q239976920.0000006790.0000006790.0000006900.0000006900.0000007000.0000006770.0000006770.0000006880.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23997Q239986920.0000006790.0000006790.0000006900.0000006900.0000007000.0000006770.0000006770.0000006880.000000...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23998Q23999471.250000519.550000582.860000632.200000654.600000673.713100718.077300734.126900855.044400...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23999Q240001340.3483201604.6647121592.2225441900.7763521776.7427661988.2396002213.9491832193.1683752109.802704...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "

24000 rows × 867 columns

\n", - "
" - ], - "text/plain": [ - " V1 V2 V3 V4 V5 \\\n", - "0 Q1 7407.412314 7528.566074 7374.709225 7395.514848 \n", - "1 Q2 7552.454619 7541.774571 7466.568336 7550.333354 \n", - "2 Q3 8463.842193 8366.102309 8269.502192 8256.985325 \n", - "3 Q4 8498.941194 8409.926442 8391.441381 8292.860310 \n", - "4 Q5 1835.000000 2322.000000 3059.000000 1883.000000 \n", - "5 Q6 8873.000000 8949.000000 8929.900000 8986.300000 \n", - "6 Q7 3431.000000 3418.300000 3385.300000 3447.100000 \n", - "7 Q8 2599.100000 2626.500000 2607.000000 2628.200000 \n", - "8 Q9 2856.200000 2869.800000 2874.800000 2873.400000 \n", - "9 Q10 2329.000000 2349.900000 2332.900000 2381.500000 \n", - "10 Q11 1082.500000 1076.100000 1063.100000 1091.000000 \n", - "11 Q12 3726.000000 4048.000000 4704.000000 3856.000000 \n", - "12 Q13 926.900000 953.500000 945.100000 939.700000 \n", - "13 Q14 5370.000000 4940.000000 5660.000000 5660.000000 \n", - "14 Q15 1527.000000 1576.000000 1641.000000 1599.000000 \n", - "15 Q16 755.000000 878.000000 762.000000 854.000000 \n", - "16 Q17 1821.700000 1836.600000 1846.900000 1848.800000 \n", - "17 Q18 5483.000000 5952.000000 5639.000000 5873.000000 \n", - "18 Q19 5409.000000 5137.000000 5218.000000 5088.000000 \n", - "19 Q20 5712.000000 5744.000000 5731.000000 5741.000000 \n", - "20 Q21 10035.000000 9874.000000 9804.000000 9755.000000 \n", - "21 Q22 3572.000000 3612.000000 3559.000000 3747.000000 \n", - "22 Q23 4262.000000 4387.100000 4503.400000 4363.800000 \n", - "23 Q24 2525.100000 2579.100000 2596.200000 2542.000000 \n", - "24 Q25 1576.500000 1619.000000 1618.900000 1567.900000 \n", - "25 Q26 8230.000000 7610.000000 9930.000000 7930.000000 \n", - "26 Q27 9192.000000 9420.000000 9459.000000 9363.000000 \n", - "27 Q28 3720.000000 3730.000000 3720.000000 3810.000000 \n", - "28 Q29 2000.000000 1930.000000 1970.000000 2110.000000 \n", - "29 Q30 2930.000000 2880.000000 2900.000000 2950.000000 \n", - "... ... ... ... ... ... \n", - "23970 Q23971 2150.300000 1941.400000 1812.000000 2207.500000 \n", - "23971 Q23972 1538.800000 1586.700000 1463.000000 1616.000000 \n", - "23972 Q23973 754.400000 882.300000 975.800000 1010.400000 \n", - "23973 Q23974 3056.900000 2897.200000 2865.800000 3024.700000 \n", - "23974 Q23975 2076.200000 1902.900000 1948.500000 2050.900000 \n", - "23975 Q23976 1148.603000 1169.247000 1186.932000 1214.590000 \n", - "23976 Q23977 1210.000000 1260.000000 1290.000000 1340.000000 \n", - "23977 Q23978 336.000000 349.000000 360.000000 372.000000 \n", - "23978 Q23979 258.000000 269.000000 281.000000 295.000000 \n", - "23979 Q23980 158.000000 164.000000 172.000000 180.000000 \n", - "23980 Q23981 2070.000000 2050.000000 2040.000000 2070.000000 \n", - "23981 Q23982 324.000000 320.000000 320.000000 323.000000 \n", - "23982 Q23983 1490.000000 1540.000000 1590.000000 1650.000000 \n", - "23983 Q23984 1000.000000 1050.000000 1090.000000 1150.000000 \n", - "23984 Q23985 526.000000 544.000000 554.000000 566.000000 \n", - "23985 Q23986 386.000000 398.000000 405.000000 414.000000 \n", - "23986 Q23987 682.700000 709.700000 718.200000 729.100000 \n", - "23987 Q23988 680.100000 707.000000 715.400000 726.200000 \n", - "23988 Q23989 1100.000000 1100.000000 1200.000000 1200.000000 \n", - "23989 Q23990 949.200000 976.200000 985.400000 998.000000 \n", - "23990 Q23991 959.000000 975.400000 982.700000 991.700000 \n", - "23991 Q23992 91.000000 1631.000000 1385.000000 107.000000 \n", - "23992 Q23993 100.700000 136.700000 130.000000 137.300000 \n", - "23993 Q23994 40350.000000 29770.000000 43610.000000 22600.000000 \n", - "23994 Q23995 1024.400000 1043.100000 1054.500000 1106.900000 \n", - "23995 Q23996 2400.000000 2370.000000 2310.000000 2370.000000 \n", - "23996 Q23997 6920.000000 6790.000000 6790.000000 6900.000000 \n", - "23997 Q23998 6920.000000 6790.000000 6790.000000 6900.000000 \n", - "23998 Q23999 471.250000 519.550000 582.860000 632.200000 \n", - "23999 Q24000 1340.348320 1604.664712 1592.222544 1900.776352 \n", - "\n", - " V6 V7 V8 V9 V10 \\\n", - "0 7654.007989 7686.847835 7578.190743 7904.376716 7744.049254 \n", - "1 8067.131522 8063.701017 7901.029312 8155.387316 8031.010328 \n", - "2 8726.917647 8733.243591 8664.260087 8717.394568 8662.139727 \n", - "3 8798.521118 8753.990355 8740.062556 8695.540651 8627.447488 \n", - "4 1896.000000 2060.000000 2764.000000 1743.000000 1561.000000 \n", - "5 8943.200000 8979.000000 8965.900000 8892.700000 8857.500000 \n", - "6 3435.400000 3431.700000 3388.000000 3371.700000 3360.100000 \n", - "7 2558.300000 2567.300000 2558.700000 2513.500000 2457.500000 \n", - "8 2861.600000 2849.000000 2822.800000 2779.200000 2793.200000 \n", - "9 2382.600000 2405.000000 2411.000000 2428.500000 2391.600000 \n", - "10 1105.400000 1109.600000 1092.500000 1114.400000 1103.000000 \n", - "11 3782.000000 4107.000000 4437.000000 3784.000000 3694.000000 \n", - "12 974.100000 989.600000 999.200000 1001.900000 1045.600000 \n", - "13 5780.000000 5920.000000 6410.000000 6010.000000 6170.000000 \n", - "14 1613.000000 1516.000000 1571.000000 1615.000000 1461.000000 \n", - "15 832.000000 915.000000 846.000000 834.000000 931.000000 \n", - "16 1840.900000 1876.900000 1890.000000 1823.900000 1857.000000 \n", - "17 5126.000000 5868.000000 5789.000000 5645.000000 5487.000000 \n", - "18 5070.000000 5128.000000 5132.000000 5149.000000 5091.000000 \n", - "19 5795.000000 5891.000000 5823.000000 5655.000000 5684.000000 \n", - "20 9677.000000 9858.000000 9722.000000 9622.000000 9583.000000 \n", - "21 3667.000000 3795.000000 3693.000000 3660.000000 3662.000000 \n", - "22 4242.000000 4267.000000 4375.500000 4253.800000 4194.200000 \n", - "23 2552.900000 2544.800000 2581.800000 2480.300000 2487.200000 \n", - "24 1565.400000 1567.100000 1570.700000 1505.100000 1538.900000 \n", - "25 4810.000000 8250.000000 8780.000000 7570.000000 7000.000000 \n", - "26 9141.000000 9096.000000 9500.000000 9191.000000 9118.000000 \n", - "27 3850.000000 3910.000000 3920.000000 3980.000000 4050.000000 \n", - "28 2030.000000 1960.000000 1970.000000 2020.000000 2110.000000 \n", - "29 2960.000000 2930.000000 2890.000000 3030.000000 3050.000000 \n", - "... ... ... ... ... ... \n", - "23970 1865.200000 1611.800000 2097.100000 2228.800000 2196.000000 \n", - "23971 1538.100000 1260.200000 2044.900000 2052.300000 2238.100000 \n", - "23972 989.600000 1070.300000 1319.000000 1238.700000 1257.000000 \n", - "23973 3390.500000 3306.300000 3563.000000 3830.100000 3827.500000 \n", - "23974 2287.100000 2213.800000 2426.300000 2547.900000 2563.100000 \n", - "23975 1140.358000 1208.920000 1306.932000 1363.017000 2181.112000 \n", - "23976 1400.000000 1460.000000 1550.000000 1640.000000 1740.000000 \n", - "23977 387.000000 408.000000 430.000000 455.000000 481.000000 \n", - "23978 311.000000 334.000000 364.000000 396.000000 435.000000 \n", - "23979 190.000000 204.000000 222.000000 242.000000 265.000000 \n", - "23980 2140.000000 2300.000000 2530.000000 2820.000000 3150.000000 \n", - "23981 335.000000 359.000000 396.000000 442.000000 493.000000 \n", - "23982 1720.000000 1800.000000 1900.000000 2020.000000 2130.000000 \n", - "23983 1210.000000 1300.000000 1420.000000 1540.000000 1700.000000 \n", - "23984 570.000000 595.000000 615.000000 636.000000 632.000000 \n", - "23985 417.000000 437.000000 449.000000 465.000000 464.000000 \n", - "23986 747.300000 764.700000 793.700000 821.400000 833.200000 \n", - "23987 744.400000 761.800000 790.600000 818.200000 830.100000 \n", - "23988 1200.000000 1200.000000 1300.000000 1300.000000 1300.000000 \n", - "23989 1020.100000 1044.500000 1082.500000 1121.700000 1146.300000 \n", - "23990 1030.000000 1045.300000 1080.000000 1113.500000 1158.800000 \n", - "23991 107.000000 1834.000000 1720.000000 117.000000 143.000000 \n", - "23992 141.500000 226.300000 152.800000 152.000000 271.700000 \n", - "23993 4630.000000 1210.000000 43850.000000 39530.000000 52540.000000 \n", - "23994 1130.400000 1156.400000 1160.000000 1209.200000 1232.200000 \n", - "23995 2420.000000 2420.000000 2310.000000 2340.000000 2370.000000 \n", - "23996 6900.000000 7000.000000 6770.000000 6770.000000 6880.000000 \n", - "23997 6900.000000 7000.000000 6770.000000 6770.000000 6880.000000 \n", - "23998 654.600000 673.713100 718.077300 734.126900 855.044400 \n", - "23999 1776.742766 1988.239600 2213.949183 2193.168375 2109.802704 \n", - "\n", - " ... V858 V859 V860 V861 V862 V863 V864 V865 V866 V867 \n", - "0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "1 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "2 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "3 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "4 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "5 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "6 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "7 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "8 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "9 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "10 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "11 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "12 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "13 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "14 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "15 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "16 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "17 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "18 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "19 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "20 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "21 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "22 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "24 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "25 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "26 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "27 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "28 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "29 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "... ... ... ... ... ... ... ... ... ... ... ... \n", - "23970 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23971 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23972 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23973 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23974 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23975 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23976 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23977 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23978 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23979 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23980 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23981 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23982 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23983 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23984 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23985 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23986 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23987 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23988 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23989 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23990 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23991 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23992 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23993 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23994 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23995 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23996 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23997 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23998 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23999 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", - "\n", - "[24000 rows x 867 columns]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#second sanity check: make sure training and test data are continuous without any weird behaviors\n", - "train_quarterly = pd.read_csv('./../Train/quarterly-train.csv')\n", - "train_quarterly" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Index: 13356\n", - "Time series: Q13357\n" - ] - } - ], - "source": [ - "#combine training and test data for a single row\n", - "index = np.random.choice(24000) #24000 is the number of time series provided in the dataset\n", - "print(\"Index: \", index)\n", - "print(\"Time series: Q\" + str(index+1))\n", - "\n", - "#extract the training and test portions from respective df's\n", - "train_row = list(train_quarterly.iloc[index])\n", - "train_row = [x for x in train_row if not pd.isnull(x)][1:]\n", - "# print(train_row)\n", - "test_row = list(test_quarterly.iloc[index])[1:]\n", - "# print(test_row)\n", - "\n", - "#put training and test portions together to form a single array\n", - "ts = train_row + test_row\n", - "#ts" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "#plot for training\n", - "xtrain = list(range(1, len(train_row) + 1))\n", - "ytrain = train_row\n", - "\n", - "#yrange for plot\n", - "ymin = min(ts) - 10\n", - "ymax = max(ts) + 10\n", - "\n", - "plt.subplot(1, 2, 1)\n", - "plt.scatter(xtrain,ytrain)\n", - "plt.xlabel('Time')\n", - "plt.ylabel('Value')\n", - "plt.title('Training Data')\n", - "axes = plt.gca()\n", - "axes.set_ylim([ymin, ymax])\n", - "\n", - "\n", - "#plot for test data\n", - "xtest = list(range(1, len(test_row) + 1))\n", - "ytest = test_row\n", - "\n", - "plt.subplot(1, 2, 2)\n", - "plt.scatter(xtest, ytest)\n", - "plt.xlabel('Time')\n", - "plt.ylabel('Value')\n", - "plt.title('Test Data')\n", - "axes = plt.gca()\n", - "axes.set_ylim([ymin, ymax])\n", - "\n", - "#display a plot to ensure that the training and test data we are using appear to be correct (i.e. the test data sequentially\n", - "#follows the training data)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/prototypes/ES_RNN/M4/github/ES_RNN_SlawekSmyl.pdf b/prototypes/ES_RNN/M4/github/ES_RNN_SlawekSmyl.pdf deleted file mode 100644 index 9ab07327..00000000 Binary files a/prototypes/ES_RNN/M4/github/ES_RNN_SlawekSmyl.pdf and /dev/null differ diff --git a/prototypes/ES_RNN/M4/github/R/merge.R b/prototypes/ES_RNN/M4/github/R/merge.R deleted file mode 100644 index ffc34eca..00000000 --- a/prototypes/ES_RNN/M4/github/R/merge.R +++ /dev/null @@ -1,143 +0,0 @@ -# Merging outputs, per category, M4 competition, for point forecasts, so for ES_RNN and ES_RNN_E -# Author: Slawek Smyl, Mar-May 2018 - - -#The c++ executables write to one (occasinally two, sorry :-), so in such case move files to one dir before continuing) directories. -#(One logical run of several instances of the same program will produce a number files, e.g. outputs with different ibig value) -#This script merges, averages values, and writes them down to the same directory - FOREC_DIR -############################################################################### - -#directory that should include all *-train.csv files, as well as M4-info.csv -DATA_DIR="F:/progs/data/M4DataSet/" -m4Info_df=read.csv(paste0(DATA_DIR,"M4-info.csv")) -options(stringsAsFactors =FALSE) - -#directory with all the output files produced by the c++ code we want to merge -FOREC_DIR='F:\\progs\\data\\M4\\Quarterly2018-05-31_09_30' #do not end with separator - -LBACK=1 #shoud be as in the c++ code, LBACK>0 means backtesting -SP="Quarterly" -#SP="Yearly" -#SP="Daily" -#SP="Hourly" - -#//----------------PARAMS ---------- comment/uncomment following 3 variables -#for ES_RNN_E, so for all except Monthly and Quarterly runs: -#NUM_OF_SEEDS=1 -#NUM_OF_CHUNKS=1 -#IBIGS= - -#for ES_RNN (do for Monthly and Quarterly): -NUM_OF_CHUNKS=2 #same as NUM_OF_CHUNKS constant the the c++ cource code, changing it is not recommended. -NUM_OF_SEEDS=3 #It is equal to the number of seeds in the startup script, (or number of teams of worker processes) -# so number_of_concurrent_executables==number_of_lines_in_the_running script/NUM_OF_CHUNKS, and number_of_chunks -#E.g if using following script for ES_RNN: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -# we have here three seeds: 10,20,30, and two chunks: 1,2. (The pairs of workes have IBIG offsets of 0,5,10) -IBIGS=3 #number of complete runs by each executables, so if programs are not interrupted, this should be equal to the constant BIG_LOOP in the c++ code, by default 3. - - -m4_df=read.csv(paste0(DATA_DIR,SP,"-train.csv")) - -sMAPE<-function(forec,actual) { - mean(abs(forec-actual)/(abs(forec)+abs(actual)))*200 -} -errorFunc=sMAPE - - -spInfo_df=m4Info_df[m4Info_df$SP==SP,] -ids=spInfo_df$M4id -horizon=spInfo_df[1,"Horizon"] - -#VARIABLE + "_" + to_string(seedForChunks) + "_" + to_string(chunkNo) + "_" + to_string(ibigDb)+"_LB"+ to_string(LBACK)+ ".csv"; -inputFiles=list.files(path = FOREC_DIR, pattern = paste0(SP,".*LB",LBACK), full.names = T) -if (length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS) { - stop("length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS") -} - - -comp_df=NULL -fil=inputFiles[1] -for (fil in inputFiles) { - print(fil) - c_df=read.csv(fil, header=F) - comp_df=rbind(comp_df,c_df) -} -names(comp_df)[1]='id' - -forecSeries=sort(unique(comp_df$id)) -if (length(forecSeries)!=length(ids) && LBACK==0) { - stop(paste0("Expected number of cases:",length(ids)," but got:",length(forecSeries))) -} - -SIZE_OF_CHUNK=1000 -out_df=NULL; ou_df=NULL -fSeries=forecSeries[1] -for (fSeries in forecSeries) { - oneSeriesForecs_df=comp_df[comp_df$id==fSeries,] - o1=colMeans(oneSeriesForecs_df[,2:ncol(oneSeriesForecs_df)]) - o_df=data.frame(id=fSeries, as.list(o1), stringsAsFactors =F) - ou_df=rbind(ou_df, o_df) - if (nrow(ou_df)>=SIZE_OF_CHUNK) { - out_df=rbind(out_df,ou_df) - ou_df=NULL - print(nrow(out_df)) - } -} -out_df=rbind(out_df,ou_df) -print(nrow(out_df)) -out_df=out_df[order(as.integer(substring(out_df$id, 2))),] - -#FOREC_DIR="e:\\temp" -outPath=paste0(FOREC_DIR,'\\',SP,"Forec.csv") -write.csv(out_df,file=outPath,row.names = F) - -################ Main work done, now just diagnostics calculations and plots - -#display a sample of forecasts and, if LBACK>0, actuals -MAX_NUM_OF_POINTS_TO_SHOW=200 -for (i in 1:100) { - irand=sample(1:length(forecSeries),1) - fSeries=forecSeries[irand] - forec=as.numeric(out_df[out_df$id==fSeries,2:ncol(out_df)]) - actual=as.numeric(m4_df[m4_df$V1==fSeries,2:ncol(m4_df)]) - actual=actual[!is.na(actual)] - if (length(actual)>MAX_NUM_OF_POINTS_TO_SHOW) { - actual=actual[(length(actual)-MAX_NUM_OF_POINTS_TO_SHOW):length(actual)] - } - if (LBACK==0) { - plot(c(actual,forec), col=c(rep(1,length(actual)),rep(2,length(forec))), main=fSeries) - } else { - ymin=min(actual,forec) - ymax=max(actual,forec) - plot(1:length(actual),actual, main=fSeries, ylim=c(ymin,ymax)) - lines((length(actual)-length(forec)+1):length(actual), forec, col=2, type='p') - } - - Sys.sleep(5) -} - - -#calc error metrics -if (LBACK>0) { - summErrors=0 - fSeries=forecSeries[1] - i=1 - for (fSeries in forecSeries) { - if (i%%1000==0) - cat(".") - forec=as.numeric(out_df[out_df$id==fSeries,2:ncol(out_df)]) - actual=as.numeric(m4_df[m4_df$V1==fSeries,2:ncol(m4_df)]) - actual=actual[!is.na(actual)] - actual=actual[(length(actual)-LBACK*horizon+1):(length(actual)-(LBACK-1)*horizon)] - summErrors=summErrors+errorFunc(forec,actual) - i=i+1 - } - print(".") - print(paste0("avg error:",round(summErrors/length(forecSeries),2))) -} diff --git a/prototypes/ES_RNN/M4/github/R/merge_PI.R b/prototypes/ES_RNN/M4/github/R/merge_PI.R deleted file mode 100644 index f99a641f..00000000 --- a/prototypes/ES_RNN/M4/github/R/merge_PI.R +++ /dev/null @@ -1,210 +0,0 @@ -# Merging outputs, per category, M4 competition, for Prediction Intervals , so for ES_RNN_PI and ES_RNN_E_PI -# Author: Slawek Smyl, Mar-May 2018 - - -#The c++ executables write to one (occasinally two, sorry :-), so in such case move files to one dir before continuing) directories. -#(One logical run of several instances of the same program will produce a number files, e.g. outputs with different ibig value) -#This script merges, averages values, and writes them down to the same directory - FOREC_DIR -############################################################################### - -#directory that should include all *-train.csv files, as well as M4-info.csv -DATA_DIR="F:/progs/data/M4DataSet/" -m4Info_df=read.csv(paste0(DATA_DIR,"M4-info.csv")) -options(stringsAsFactors =FALSE) -memory.limit(10000) - -#directory with all the output files produced by the c++ code we want to merge -FOREC_DIR='F:\\progs\\data\\M4\\Hourlygood' #do not end with separator - -LBACK=1 #shoud be as in the c++ code, LBACK>0 means backtesting -#SP="Quarterly" -#SP="Yearly" -#SP="Daily" -SP="Hourly" -m4_df=read.csv(paste0(DATA_DIR,SP,"-train.csv")) - - -#//----------------PARAMS ---------- comment/uncomment following 3 variables -#for ES_RNN_E_PI, so for all except Monthly and Quarterly runs: -NUM_OF_SEEDS=1 -NUM_OF_CHUNKS=1 -#IBIGS=/2 -IBIGS=6 - -#for ES_RNN_PI (do for Monthly and Quarterly): -#NUM_OF_CHUNKS=2 #same as NUM_OF_CHUNKS constant the the c++ cource code, changing it is not recommended. -#NUM_OF_SEEDS=3 #It is equal to the number of seeds in the startup script, (or number of teams of worker processes) -# so number_of_concurrent_executables==number_of_lines_in_the_running script/NUM_OF_CHUNKS, and number_of_chunks -#E.g if using following script for ES_RNN: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -# we have here three seeds: 10,20,30, and two chunks: 1,2. (The pairs of workes have IBIG offsets of 0,5,10) -#IBIGS=3 #number of complete runs by each executables, so if programs are not interrupted, this should be equal to the constant BIG_LOOP in the c++ code, by default 3. - -ALPHA = 0.05; -ALPHA_MULTIP = 2 / ALPHA; - -MSIS<-function(forecL,forecH,actual) { - sumDiffs=0 - for (i in 1:(length(actual)-seasonality)) { - sumDiffs=sumDiffs+abs(actual[i+seasonality]-actual[i]) - } - avgAbsDiff=sumDiffs/(length(actual)-seasonality) - - actual=actual[(length(actual)-LBACK*horizon+1):(length(actual)-(LBACK-1)*horizon)] - - msis=sum(forecH-forecL)+sum(pmax(0,forecL-actual))*ALPHA_MULTIP+sum(pmax(0,actual-forecH))*ALPHA_MULTIP - msis/horizon/avgAbsDiff -} -errorFunc=MSIS - -spInfo_df=m4Info_df[m4Info_df$SP==SP,] -ids=spInfo_df$M4id -horizon=spInfo_df[1,"Horizon"] -seasonality=spInfo_df[1,"Frequency"] - - -#lower -#VARIABLE + "_" + to_string(seedForChunks) + "_" + to_string(chunkNo) + "_" + to_string(ibigDb)+"_LB"+ to_string(LBACK)+ ".csv"; -inputFiles=list.files(path = FOREC_DIR, pattern = paste0(SP,".*LLB",LBACK), full.names = T) -if (length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS) { - stop("length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS") -} - -comp_df=NULL -fil=inputFiles[1] -for (fil in inputFiles) { - print(fil) - c_df=read.csv(fil, header=F) - comp_df=rbind(comp_df,c_df) -} -names(comp_df)[1]='id' - -forecSeries=sort(unique(comp_df$id)) -if (length(forecSeries)!=length(ids) && LBACK==0) { - stop(paste0("Expected number of cases:",length(ids)," but got:",length(forecSeries))) -} - -SIZE_OF_CHUNK=1000 -out_df=NULL; ou_df=NULL -fSeries=forecSeries[1] -for (fSeries in forecSeries) { - oneSeriesForecs_df=comp_df[comp_df$id==fSeries,] - o1=colMeans(oneSeriesForecs_df[,2:ncol(oneSeriesForecs_df)]) - o_df=data.frame(id=fSeries, as.list(o1), stringsAsFactors =F) - ou_df=rbind(ou_df, o_df) - if (nrow(ou_df)>=SIZE_OF_CHUNK) { - out_df=rbind(out_df,ou_df) - ou_df=NULL - print(nrow(out_df)) - } -} -out_df=rbind(out_df,ou_df) -print(nrow(out_df)) -out_df=out_df[order(as.integer(substring(out_df$id, 2))),] - -outPath=paste0(FOREC_DIR,'\\',SP,"ForecL.csv") -write.csv(out_df,file=outPath,row.names = F) - -lower_df=out_df - -##################################### -#higher -inputFiles=list.files(path = FOREC_DIR, pattern = paste0(SP,".*HLB",LBACK), full.names = T) -if (length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS) { - stop("length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS") -} - -comp_df=NULL -fil=inputFiles[1] -for (fil in inputFiles) { - print(fil) - c_df=read.csv(fil, header=F) - comp_df=rbind(comp_df,c_df) -} -names(comp_df)[1]='id' - -forecSeries=sort(unique(comp_df$id)) -if (length(forecSeries)!=length(ids) && LBACK==0) { - print(paste0("Warning. Expected number of cases:",length(ids)," but got:",length(forecSeries))) -} - -SIZE_OF_CHUNK=1000 -out_df=NULL; ou_df=NULL -fSeries=forecSeries[1] -for (fSeries in forecSeries) { - oneSeriesForecs_df=comp_df[comp_df$id==fSeries,] - o1=colMeans(oneSeriesForecs_df[,2:ncol(oneSeriesForecs_df)]) - o_df=data.frame(id=fSeries, as.list(o1), stringsAsFactors =F) - ou_df=rbind(ou_df, o_df) - if (nrow(ou_df)>=SIZE_OF_CHUNK) { - out_df=rbind(out_df,ou_df) - ou_df=NULL - print(nrow(out_df)) - } -} -out_df=rbind(out_df,ou_df) -print(nrow(out_df)) -out_df=out_df[order(as.integer(substring(out_df$id, 2))),] - -outPath=paste0(FOREC_DIR,'\\',SP,"ForecH.csv") -write.csv(out_df,file=outPath,row.names = F) - -higher_df=out_df - - -################ Main work done, now just diagnostics calculations and plots - -#display a sample of forecasts and, if LBACK>0, actuals -MAX_NUM_OF_POINTS_TO_SHOW=200 -i=1 -for (i in 1:100) { - irand=sample(1:length(forecSeries),1) - fSeries=forecSeries[irand] - forecL=as.numeric(lower_df[lower_df$id==fSeries,2:ncol(lower_df)]) - forecH=as.numeric(higher_df[higher_df$id==fSeries,2:ncol(higher_df)]) - actual=as.numeric(m4_df[m4_df$V1==fSeries,2:ncol(m4_df)]) - actual=actual[!is.na(actual)] - if (length(actual)>MAX_NUM_OF_POINTS_TO_SHOW) { - actual=actual[(length(actual)-MAX_NUM_OF_POINTS_TO_SHOW):length(actual)] - } - if (LBACK==0) { - plot(c(actual,forecH), col=c(rep(1,length(actual)),rep(2,length(forecH))), main=fSeries) - lines(c(actual,forecL), col=c(rep(1,length(actual)),rep(3,length(forecL))), type='p') - } else { - ymin=min(actual,forecL) - ymax=max(actual,forecH) - plot(1:length(actual),actual, main=fSeries, ylim=c(ymin,ymax)) - lines((length(actual)-length(forecH)+1):length(actual), forecH, col=2, type='p') - lines((length(actual)-length(forecL)+1):length(actual), forecL, col=3, type='p') - } - - Sys.sleep(5) -} - - - -#calc error metric: MSIS -if (LBACK>0) { - summErrors=0 - fSeries=forecSeries[1] - i=1 - for (fSeries in forecSeries) { - if (i%%1000==0) - cat(".") - forecL=as.numeric(lower_df[lower_df$id==fSeries,2:ncol(lower_df)]) - forecH=as.numeric(higher_df[higher_df$id==fSeries,2:ncol(higher_df)]) - actual=as.numeric(m4_df[m4_df$V1==fSeries,2:ncol(m4_df)]) - actual=actual[!is.na(actual)] - summErrors=summErrors+errorFunc(forecL, forecH, actual) - i=i+1 - } - print(".") - print(paste0("avg error:",round(summErrors/length(forecSeries),2))) -} - - diff --git a/prototypes/ES_RNN/M4/github/R/readme.txt b/prototypes/ES_RNN/M4/github/R/readme.txt deleted file mode 100644 index 3244c6da..00000000 --- a/prototypes/ES_RNN/M4/github/R/readme.txt +++ /dev/null @@ -1,8 +0,0 @@ -When the c++ workers run, they output results (forecasts) to a directory or two. -(Sorry occasionally two directories are filled, in such case first "manually" put all the output files to a single dir) -These scripts merge them into one file and save it, show a sample of graphs, and if this is backtesting run (LBACK>0), calculate some accuracy metrics. - -Both scripts needs to be updated with your input, output dirs, and other params, see inside, there are a lot of comments there. - -merge.R is meant to be used for point forecst runs, so for ES_RNN and ES_RNN_E programs. -mergePI.R - for Prediction Interval runs, so for ES_RNN_PI and ES_RNN_E_PI programs. diff --git a/prototypes/ES_RNN/M4/github/c++/ES_RNN.cc b/prototypes/ES_RNN/M4/github/c++/ES_RNN.cc deleted file mode 100644 index b1d0f43f..00000000 --- a/prototypes/ES_RNN/M4/github/c++/ES_RNN.cc +++ /dev/null @@ -1,1194 +0,0 @@ -/*ES-RNN: ES-RNN Exponential Smoothing Recurrent Neural Network hybrid. Point forecast. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. -It is meant to be used for Monthly and Quarterly series of M4 competition, becasue the DE (Diversified Ensemble) version is too slow. -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -It has to be invoked in pair of executables, passing at least two integers: seedForChunks, chunkNo -so e.g. create a script with following lines on Windows -start 10 1 -start 10 2 -Modern computers have at more then 2 cores, so e.g. on 6-core machine create and run the following script with 3 pairs of workers: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -seedForChunks have to be the same withion one pair, chunk numbers have to be 1 and 2. -We have added here the third parameter: ibigOffset. The straddle should be equal or bigger than BIG_LOOP. -Each pair goes through BIG_LOOP (by default 3, change in code below if you want) of model fitting and prediction, -so 2 pairs, as above, will produce 6 forecasts to be ensembled later, in R. -By increasing number of pairs, e.g. to 6 on 12-core computer, one can reduce BIG_LOOP to 1, so reduce execution time, and still have 6 forecasts - -a decent number to ensemble (in a separate R script). - -There are three blocks of parameters below, one active (starting with //PARAMS--------------) and two inactive. -The active block is setup as in the final run of forecasting quarterly series. Similarly Monthly block. -The Daily block is more of a demo, allowing to run quickly forecast for Daily series, although with slightly worse performance (use another program ES_RNN_E.cc for it). It was not used for the final submission. -So, you need comment/uncomment to have one block of interest active. - - -*/ - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Quarterly"; -const string run = "50/45 (1,2),(4,8), LR=0.001/{10,1e-4f}, EPOCHS=15, LVP=80 40*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 45; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE. - -vector> dilations={{1,2},{4,8}};//Each vector represents one chunk of Dilateed LSTMS, connected in standard resnNet fashion -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM //so for Quarterly series, we do not use either the more advanced residual connections nor attention. -const bool ADD_NL_LAYER=false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -const float INITIAL_LEARNING_RATE = 0.001f; -const map LEARNING_RATES = { { 10,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 15; -const unsigned int STATE_HSIZE = 40; - -const int SEASONALITY = 4; -const unsigned int INPUT_SIZE = 4; -const int INPUT_SIZE_I= INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 8; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; -const int MIN_INP_SEQ_LEN = 0; -const float LEVEL_VARIABILITY_PENALTY = 80; //Multiplier for L" penalty against wigglines of level vector. Important. -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - - - -/* -string VARIABLE = "Monthly"; -const string run = "50/49 Res (1,3,6,12), LR=5e-4 {12,1e-4f}, EPOCHS=10, 20*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -#define USE_RESIDUAL_LSTM //so for Monthly we use only one block, so no standard resNet shortcuts, but instead but of the special residual shortcuts, after https://arxiv.org/abs/1701.03360. -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -vector> dilations={{1,3,6,12}};//so for Monthly we use only one block, so no standard resNet shortcut -const float INITIAL_LEARNING_RATE = 5e-4; -const map LEARNING_RATES = { { 12,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 10; -const unsigned int STATE_HSIZE = 50; - -const float LEVEL_VARIABILITY_PENALTY = 50; //Multiplier for L" penalty against wigglines of level vector. - -const int SEASONALITY = 12; -const unsigned int OUTPUT_SIZE = 18; -const unsigned int INPUT_SIZE = 12; -const int INPUT_SIZE_I= INPUT_SIZE; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years -*/ - - -/* -string VARIABLE = "Daily"; -const string run = "50/49 NL LRMult=1.5, 3/5 (1,7,28) LR=3e-4 {9,1e-4f} EPOCHS=15, LVP=100 HSIZE=40 20w"; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = true; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,7,28 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 9,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1.5; -const int NUM_OF_TRAIN_EPOCHS = 15; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const int INPUT_SIZE_I = INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 14; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to max of last 20 years -*/ - -Expression squash(Expression& x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 40; -#else - const int MAX_NUM_OF_SERIES = -1; //use all series -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6;//in data provided -const int BIG_LOOP = 3; -const int NUM_OF_CHUNKS = 2; -const float EPS=1e-6; -const int AVERAGING_LEVEL=5; -const bool USE_MEDIAN = false; -const int MIDDLE_POS_FOR_AVG = 2; //if using medians - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=20; -const float C_STATE_PENALTY = 0; - -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN=true; -const float TAU = PERCENTILE / 100.; -const float TRAINING_TAU = TRAINING_PERCENTILE / 100.; -const unsigned ATTENTION_HSIZE=STATE_HSIZE; - -const bool USE_AUTO_LEARNING_RATE=false; -//if USE_AUTO_LEARNING_RATE, and only if LBACK>0 -const float MIN_LEARNING_RATE = 0.0001f; -const float LR_RATIO = sqrt(10); -const float LR_TOLERANCE_MULTIP = 1.005; -const int L3_PERIOD = 2; -const int MIN_EPOCHS_BEFORE_CHANGING_LRATE = 2; - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; //construct one-hot vector indicating which categories are used - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { //takes in parameters from line stream (seedsForChunks, chunkNum) - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE_I) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE_I; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE_I; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE_I); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) { //chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; -}; - -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - vector levels; - vector seasons; -}; - - -Expression pinBallLoss(const Expression& out_ex, const Expression& actuals_ex) {//used by Dynet, learning loss function - vector losses; - for (unsigned int indx = 0; indx as_scalar(forec.value())) - losses.push_back((actual - forec)*TRAINING_TAU); - else - losses.push_back((actual - forec)*(TRAINING_TAU - 1)); - } - return sum(losses) / OUTPUT_SIZE * 2; -} - - -//weighted quantile Loss, used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect) { //Looks like a swalek thing (not standard) - float sumf = 0; float suma=0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*TAU; - else - sumf = sumf + (actual - forec)*(TAU - 1); - } - return sumf / suma * 200; -} - -//used just for diagnostics, if LBACK>0 and PERCENTILE==50 -float sMAPE(vector& out_vect, vector& actuals_vect) { - float sumf = 0; - for (unsigned int indx = 0; indx& out_vect, vector& actuals_vect) { //use sMAPE or wQuant loss - if (PERCENTILE==50) - return sMAPE(out_vect, actuals_vect); - else - return wQuantLoss(out_vect, actuals_vect); -} - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int seedForChunks = 10; //Yes it runs, without any params, but it will work only on 1/NUM_OF_CHUNKS of all cases. The system is expected to run in NUM_OF_CHUNKS multiples. - int chunkNo = 1; - int ibigOffset = 0; - if (argc >= 3) { - seedForChunks = atoi(argv[1]); - chunkNo = atoi(argv[2]); - } - if (argc >= 4) - ibigOffset = atoi(argv[3]); - - if (chunkNo > NUM_OF_CHUNKS) { - cerr << "chunkNo > NUM_OF_CHUNKS"; - exit(-1); - } - else if (chunkNo <= 0) { - cerr << "chunkNo <= 0"; - exit(-1); - } - - cout<0) - std::cout<< " ibigOffset:"<< ibigOffset; //if continuing prematurely stopped run - if (LBACK>0) - std::cout<<" lback:"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)run.c_str(), 0, &nullTerminatedStringOfRun)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE_I+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister) - mt19937 rngForChunks(seedForChunks); - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 48/2=24k, for monthly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); //take in lines - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - allSeries_map[series] = m4Obj; - } - if (MAX_NUM_OF_SERIES>0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - - int series_len=(int)series_vect.size(); - int chunkSize= series_len/NUM_OF_CHUNKS; - std::cout << "num of series:" << series_vect.size() <<" size of chunk:"<< chunkSize< uniOnSeries(0, chunkSize -1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>> testResults_map((int)chunkSize*1.5); - set diagSeries; - - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - ParameterCollection pc; - ParameterCollection perSeriesPC; - - float learning_rate= INITIAL_LEARNING_RATE; //TRAINING CODE STARTS HERE - AdamTrainer trainer(pc, learning_rate, 0.9, 0.999, EPS); - trainer.clip_threshold = GRADIENT_CLIPPING; - AdamTrainer perSeriesTrainer(perSeriesPC, learning_rate*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainer.clip_threshold = GRADIENT_CLIPPING; - - #if defined USE_RESIDUAL_LSTM - vector rNNStack; - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(AttentiveDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, ATTENTION_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(DilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il oneChunk_vect(start,end); - if (PRINT_DIAGN) { - for (int k = 0; k<10; k++) //diag - cout << oneChunk_vect[k] << " "; - cout << endl; - } - if (chunkNo == NUM_OF_CHUNKS) - cout<<"last chunk size:"<< oneChunk_vect.size()< additionalParams_map((int)oneChunk_vect.size()*1.5); //per series - unordered_map*> historyOfAdditionalParams_map((int)oneChunk_vect.size()*1.5); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) {//setup - string series = *iter; - AdditionalParams addParams; - addParams.levSm = perSeriesPC.add_parameters({ 1 }, 0.5); //level smoothing - addParams.sSm = perSeriesPC.add_parameters({ 1 }, 0.5); //seasonality smoothing - for (int isea = 0; isea(); - } - - for (int iEpoch=0; iEpoch testLosses; //test losses of all series in this epoch - vector testAvgLosses; //test avg (over last few epochs) losses of all series in this epoch - vector trainingLosses; //training losses of all series in one epoch - vector forecLosses; vector levVarLosses; vector stateLosses; - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&iEpoch, 0, NULL)); - #endif - - for (auto iter = oneChunk_vect.begin() ; iter != oneChunk_vect.end(); ++iter) { - string series=*iter; - auto m4Obj = allSeries_map[series]; - - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); - #endif - - ComputationGraph cg; - for (int il=0; il season_exVect;//vector, because we do not know how long the series is - for (int iseas=0; iseas seas==1 - season_exVect.push_back(seas);//Expression is a simple struct, without any storage management, so the auto copy constructor works OK. - } - season_exVect.push_back(season_exVect[0]); - - vector logDiffOfLevels_vect; - vector levels_exVect; - Expression lev=cdiv(input(cg, m4Obj.vals[0]), season_exVect[0]); - levels_exVect.push_back(lev); - for (int i=1; i 0) { - vector levelVarLoss_v; - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx=season_exVect.size()-SEASONALITY; - for (int i=0;i<(OUTPUT_SIZE_I-SEASONALITY);i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx+i]); - } - vector losses; - for (int i=INPUT_SIZE_I-1; i<(m4Obj.n- OUTPUT_SIZE_I); i++) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() +i+1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex=input(cg,{INPUT_SIZE},input_vect); - Expression input1_ex=cdiv(input0_ex,inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]); - joinedInput_ex.emplace_back(noise(squash(input1_ex), NOISE_STD)); //normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex=concatenate(outputSeasonality_exVect); - - first = m4Obj.vals.begin() +i+1; - pastLast = m4Obj.vals.begin() +i+1+OUTPUT_SIZE_I; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels0_ex=input(cg,{OUTPUT_SIZE},labels_vect); - Expression labels1_ex=cdiv(labels0_ex,outputSeasonality_ex); //deseasonalization - labels1_ex= cdiv(labels1_ex, levels_exVect[i]);//normalization - Expression labels_ex=squash(labels1_ex); - - Expression loss_ex=pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE_I+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - } - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; it maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax = it; - layerOfMax = il; - chunkOfMax = irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - cout << " min season=" << minSeason << endl; - cout << " min level=" << minLevel << endl; - cout << " max abs:" << maxAbs << " at time:" << timeOfMax << " at layer:" << layerOfMax << " and chunk:" << chunkOfMax << endl; - - //diagSeries.insert(series); - pc.reset_gradient(); - perSeriesPC.reset_gradient(); - } - - //saving per-series values for diagnostics purposes - AdditionalParamsF &histAdditionalParams= historyOfAdditionalParams_map[series]->at(iEpoch); - histAdditionalParams.levSm=as_scalar(levSm_ex.value()); - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea=0; isea::const_iterator firstE = season_exVect.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex = concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression input1_ex = cdiv(input0_ex, inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]);//normalization - joinedInput_ex.emplace_back(squash(input1_ex)); - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - Expression out_ex; - if (ADD_NL_LAYER) { - out_ex=MLPW_ex*rnn_ex+MLPB_ex; - out_ex = adapterW_ex*tanh(out_ex)+adapterB_ex; - } else - out_ex=adapterW_ex*rnn_ex+adapterB_ex; - - out_ex = cmult(expand(out_ex), outputSeasonality_ex)*levels_exVect[i];//back to original scale - vector out_vect = as_vector(out_ex.value()); - - if (LBACK > 0) { - float qLoss = errorFunc(out_vect, m4Obj.testVals); - testLosses.push_back(qLoss); - } - - testResults_map[series][iEpoch%AVERAGING_LEVEL] = out_vect; - if (iEpoch >= AVERAGING_LEVEL) { - if (USE_MEDIAN) { - if (testResults_map[series][AVERAGING_LEVEL].size() == 0) - testResults_map[series][AVERAGING_LEVEL] = out_vect; //just to initialized, to make space. The values will be overwritten - for (int iii = 0; iii < OUTPUT_SIZE_I; iii++) { - vector temp_vect2; - for (int ii = 0; ii firstForec = testResults_map[series][0]; - testResults_map[series][AVERAGING_LEVEL] = firstForec; - for (int ii = 1; ii nextForec = testResults_map[series][ii]; - for (int iii = 0; iii 0) { - float qLoss = errorFunc(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals); - testAvgLosses.push_back(qLoss); - - #if defined USE_ODBC //save - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&forecastLoss, 0, NULL)); - - for (int io = 0; io < OUTPUT_SIZE_I; io++) { - int ipos=OFFSET_TO_FIRST_ACTUAL + 1 + 2*io; - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&m4Obj.testVals[io], 0, NULL)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos+1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&testResults_map[series][AVERAGING_LEVEL][io], 0, NULL)); - } - if (MAX_NUM_OF_SERIES<0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLExecute(hInsertStmt)); - #endif - } - } //time to average - }//last anchor point of the series - }//through TEST loop - }//through series - - - if (iEpoch % FREQ_OF_TEST == 0) { - float averageTrainingLoss = accumulate(trainingLosses.begin(), trainingLosses.end(), 0.0) / trainingLosses.size(); - - cout << ibig << " " << iEpoch << " loss:" << averageTrainingLoss * 100; - if (LEVEL_VARIABILITY_PENALTY > 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forecast loss:" << averageForecLoss*100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - - float averageTestLoss=0; - if (LBACK > 0) { - float averageTestLoss = accumulate(testLosses.begin(), testLosses.end(), 0.0) / testLosses.size(); - cout<<" Test loss:" << averageTestLoss; - if (iEpoch >= AVERAGING_LEVEL) { - float averageTestAvgLoss = accumulate(testAvgLosses.begin(), testAvgLosses.end(), 0.0) / testAvgLosses.size();//of this epoch - cout << " avgLoss:" << averageTestAvgLoss; - } - if (USE_AUTO_LEARNING_RATE) - perfValid_vect.push_back(averageTestLoss); - } - cout << endl; - } - - if (USE_AUTO_LEARNING_RATE) { - bool changeL2Rate = false; - if (iEpoch >= 2) { - if (iEpoch < L3_PERIOD) - changeL2Rate = perfValid_vect[perfValid_vect.size() - 2] MIN_LEARNING_RATE && (iEpoch - epochOfLastChangeOfLRate) >= MIN_EPOCHS_BEFORE_CHANGING_LRATE) { - learning_rate /= LR_RATIO; - cout << "decreasing LR to:" << learning_rate << endl; - epochOfLastChangeOfLRate = iEpoch; - trainer.learning_rate = learning_rate; - } - } - #if defined USE_ODBC - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLEndTran( - SQL_HANDLE_DBC, - hDbc, - SQL_COMMIT)); - #endif - }//through epochs - - if (PRINT_DIAGN) {//some diagnostic info - set diagSeries; - for (int i = 0; i<1; i++) {//add a few normal ones - int irand = uniOnSeries(rng); - diagSeries.insert(oneChunk_vect[irand]); - } - for (auto series : diagSeries) { - cout << endl << series << endl; - array* historyOfAdditionalParams_ptrToArr = historyOfAdditionalParams_map[series]; - cout << "lSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levSm << " "; - cout << endl; - cout << "sSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).sSm << " "; - cout << endl; - cout << "seasons:" << endl; - for (int isea = 0; iseaat(iEpoch).initSeasonality[isea] << " "; - cout << endl; - } - cout << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levels.size()>0) { - cout << "levels:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).levels.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).levels[iv] << ", "; - cout << endl; - cout << "seas:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).seasons.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).seasons[iv] << ", "; - cout << endl; - } - } - } - } - - //save the forecast to outputFile - ofstream outputFile; - outputFile.open(outputPath); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) { - string series = *iter; - outputFile<< series; - for (int io=0; io 0 -start 10 -start 20 -start 30 -on 4-core computer. -In this setup, learning and fitting would be repeated 4*3 times, probably unnecessarily too many, 6-8 independent runs should be enough for a good ensemble. -Therefore if running on say 8 core machine , one can extend the above script to 8 concurrent executions and reduce BIG_LOOP to 1. -(Creating final forecasts is done in a supplied R script) - -There are four blocks of parameters below, one active (starting with //PARAMS--------------) and three inactive. -These blocks are as they were during the final forecasting run. You need comment/uncomment to have one block of interest active. -*/ - - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -//#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Hourly"; -const string run = "50/49 Att 4/5 1,4)(24,168) LR=0.01,{7,5e-3f},{18,1e-3f},{22,3e-4f} EPOCHS=27, LVP=10, CSP=1"; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const float PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 2;//0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 24; -const int SEASONALITY2 = 168; -vector> dilations = { { 1,4 },{ 24, 168 } }; - -const float INITIAL_LEARNING_RATE = 0.01f; -const map LEARNING_RATES = { { 7,5e-3f },{ 18,1e-3f },{ 22,3e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 27; - -float LEVEL_VARIABILITY_PENALTY = 10; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 1; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 24; -const unsigned int OUTPUT_SIZE = 48; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 53 * SEASONALITY2 + MIN_SERIES_LENGTH; //==all -const int TOPN = 4; - - -/* -string VARIABLE = "Weekly"; -const string run = "50/47 Att 3/5 (1,52) LR=1e-3 {11,3e-4f}, {17,1e-4f} EPOCHS=23, LVP=100 6y"; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 47; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 0; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 52; -const int SEASONALITY2 = 0; -vector> dilations = { { 1, 52 } }; - -const float INITIAL_LEARNING_RATE = 1e-3; -const map LEARNING_RATES = { { 11,3e-4f },{ 17,1e-4f } }; //at which epoch we manually set them up to what -const int NUM_OF_TRAIN_EPOCHS = 23; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; -const float PER_SERIES_LR_MULTIP = 1; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 10; -const unsigned int OUTPUT_SIZE = 13; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#81 380 935 1023 1604 2598 -const int MAX_SERIES_LENGTH = 6 * SEASONALITY + MIN_SERIES_LENGTH; //==all -const int TOPN = 3; -*/ - -/* -string VARIABLE = "Daily"; -const string run = "Final 50/49 730 4/5 (1,3)(7,14) LR=3e-4 {9,1e-4f} EPOCHS=13, LVP=100 13w"; -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,3 },{ 7, 14 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 9,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 13; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const unsigned int OUTPUT_SIZE = 14; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //##93 323 2940 2357 4197 9919 -const int MAX_SERIES_LENGTH = 13 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* -string VARIABLE = "Yearly"; -const string run = "50 Att 4/5 (1,6) LR=1e-4 EPOCHS=12, 60*"; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const float PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 50; - -const int SEASONALITY_NUM = 0; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 0; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,6 } }; - -const float INITIAL_LEARNING_RATE = 1e-4; -const map LEARNING_RATES = { { 15,1e-5 } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 12; - -float LEVEL_VARIABILITY_PENALTY = 0; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 30; - -const unsigned int INPUT_SIZE = 4; -const unsigned int OUTPUT_SIZE = 6; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#13.00 20.00 29.00 31.32 40.00 835.00 -const int MAX_SERIES_LENGTH = 60 + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -//end of VARIABLE-specific params - -const int BIG_LOOP = 3; -const int NUM_OF_NETS = 5; -const unsigned int ATTENTION_HSIZE = STATE_HSIZE; - - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 20; -#else - const int MAX_NUM_OF_SERIES = -1; -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6; -const int AVERAGING_LEVEL = 5; -const float EPS=1e-6; - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=50; -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN = false; -const float TAU = PERCENTILE / 100.; -const float TRAINING_TAU = TRAINING_PERCENTILE / 100.; - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - - -Expression squash(Expression& x) { - return log(x); -} -float squash(float x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} -float expand(float x) { - return exp(x); -} - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - -#if defined USE_ODBC -void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); -#endif - - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; - Parameter sSm2; - array initSeasonality2; -}; -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - float sSm2; - array initSeasonality2; - vector levels; - vector seasons; - vector seasons2; -}; - - -array perfToRanking (array perf_arr) { - array index; - - for (int itop=0; itop losses; - for (unsigned int indx = 0; indx as_scalar(forec.value())) - losses.push_back((actual - forec)*TRAINING_TAU); - else - losses.push_back((actual - forec)*(TRAINING_TAU - 1)); - } - return sum(losses) / OUTPUT_SIZE * 2; -} - - -// weighted quantile Loss, used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect) { - float sumf = 0; float suma=0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*TAU; - else - sumf = sumf + (actual - forec)*(TAU - 1); - } - return sumf / suma * 200; -} - -//used just for diagnostics, if LBACK>0 and PERCENTILE==50 -float sMAPE(vector& out_vect, vector& actuals_vect) { - float sumf = 0; - for (unsigned int indx = 0; indx& out_vect, vector& actuals_vect) { - if (PERCENTILE==50) - return sMAPE(out_vect, actuals_vect); - else - return wQuantLoss(out_vect, actuals_vect); -} - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int ibigOffset = 0; - if (argc == 2) - ibigOffset = atoi(argv[1]); - - cout << VARIABLE<<" "< 0) { - cout<<"Warning. LEVEL_VARIABILITY_PENALTY has to be equal zero if SEASONALITY_NUM==0"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)run.c_str(), 0, &nullTerminatedStringOfRun)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 24k for yearly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - allSeries_map[series] = m4Obj; - } - if (MAX_NUM_OF_SERIES>0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - cout << "num of series:" << series_vect.size() << endl; - - unsigned int series_len=(unsigned int)series_vect.size(); - uniform_int_distribution uniOnSeries(0,series_len-1); // closed interval [a, b] - uniform_int_distribution uniOnNets(0,NUM_OF_NETS-1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>> testResults_map((int)series_len*1.5);//per series, etc... - unordered_map> finalResults_map((int)series_len*1.5);//per series - set diagSeries; - - unordered_map> netRanking_map; - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - //create nets - array paramsCollection_arr;//per net - array perSeriesParamsCollection_arr;//per net - array trainers_arr; - array perSeriesTrainers_arr; - - - #if defined USE_RESIDUAL_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #elif defined USE_ATTENTIVE_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #else - array, NUM_OF_NETS> rnnStack_arr; - #endif - - array MLPW_parArr; - array MLPB_parArr; - array adapterW_parArr; - array adapterB_parArr; - - //this is not a history, this is the real stuff - unordered_map* > additionalParams_mapOfArr((int)series_len*1.5); //per series, per net - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - additionalParams_mapOfArr[series]=new array(); - } - - for (int inet=0; inetclip_threshold = GRADIENT_CLIPPING; - perSeriesTrainers_arr[inet]=new AdamTrainer (perSeriesPC, INITIAL_LEARNING_RATE*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainers_arr[inet]->clip_threshold = GRADIENT_CLIPPING; - - auto& rNNStack=rnnStack_arr[inet]; - #if defined USE_RESIDUAL_LSTM - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il* additionalParams_arr=additionalParams_mapOfArr[series]; - additionalParams_arr->at(inet).levSm=perSeriesPC.add_parameters({1}, 0.5);//per series, per net - if (SEASONALITY_NUM > 0) { - additionalParams_arr->at(inet).sSm = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - if (SEASONALITY_NUM > 1) { - additionalParams_arr->at(inet).sSm2 = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality2[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - } - }//seting up, through nets - - //history of params. Series->[NUM_OF_NETS,NUM_OF_TRAIN_EPOCHS] - unordered_map, NUM_OF_NETS>*> historyOfAdditionalParams_map((int)series_len*1.5); - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - historyOfAdditionalParams_map[series]=new array, NUM_OF_NETS>(); - } - - //first assignment. Yes, we are using vector , so the very first time the duplicates are possible. But a set can't be sorted - array, NUM_OF_NETS> seriesAssignment;//every net has an array - for (int j=0; j> netPerf_map; - for (int inet=0; inetlearning_rate = LEARNING_RATES.at(iEpoch); - if (inet==0) - cout << "changing LR to:" << trainer->learning_rate << endl; - perSeriesTrainer->learning_rate = LEARNING_RATES.at(iEpoch)*PER_SERIES_LR_MULTIP; - } - - auto& rNNStack=rnnStack_arr[inet]; - Parameter& MLPW_par = MLPW_parArr[inet]; - Parameter& MLPB_par = MLPB_parArr[inet]; - Parameter& adapterW_par=adapterW_parArr[inet]; - Parameter& adapterB_par=adapterB_parArr[inet]; - - vector oneNetAssignments=seriesAssignment[inet]; - random_shuffle (oneNetAssignments.begin(), oneNetAssignments.end()); - - vector epochLosses; - vector forecLosses; vector levVarLosses; vector stateLosses; - for (auto iter = oneNetAssignments.begin() ; iter != oneNetAssignments.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - - ComputationGraph cg; - for (int il=0; ilat(inet); - array& historyOfAdditionalParams_arr=historyOfAdditionalParams_map[series]->at(inet); - - Expression MLPW_ex,MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex= parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea logDiffOfLevels_vect; - vector levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - Expression levelVarLoss_ex; - if (LEVEL_VARIABILITY_PENALTY > 0) { - vector levelVarLoss_v; - for (int i = 1; i losses;//losses of steps through single time series - for (int i=INPUT_SIZE-1; i<(m4Obj.n- OUTPUT_SIZE); i++) { - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - - first = m4Obj.vals.begin() + i + 1; - pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - firstE = season_exVect.begin() + i + 1; - pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - - firstE = season2_exVect.begin() + i + 1; - pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - }//through points of a series - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; itupdate();//update shared weights - perSeriesTrainer->update(); //update params of this series only - } catch (exception& e) { //long diagnostics for this unlikely event :-) - cerr<<"cought exception while doing "< maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax=it; - layerOfMax=il; - chunkOfMax= irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - if (SEASONALITY_NUM > 0) - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - if (SEASONALITY_NUM > 1) - cout << "sSm2:" << as_scalar(sSm2_ex.value()) << endl; - cout << "max abs:" << maxAbs <<" at time:"<< timeOfMax<<" at layer:"<< layerOfMax<<" and chunk:"<< chunkOfMax< 0) { - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea = 0; isea 1) { - histAdditionalParams.sSm2 = as_scalar(sSm2_ex.value()); - for (int isea=0; isea 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forec loss:" << averageForecLoss * 100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - cout<at(inet); - Expression MLPW_ex, MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex = parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; i0 then this is shortened, so it always contains data awe have right to access - Expression newLevel_ex = m4Obj.vals[i] * cdiv(levSm_ex, season_exVect[i]) + (1 - levSm_ex)*levels_exVect[i - 1]; - levels_exVect.push_back(newLevel_ex); - - Expression newSeason_ex = m4Obj.vals[i] * cdiv(sSm_ex, newLevel_ex) + (1 - sSm_ex)*season_exVect[i]; - season_exVect.push_back(newSeason_ex); - } - - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - - Expression inputSeasonality_ex; Expression inputSeasonality2_ex; - Expression outputSeasonality_ex; Expression outputSeasonality2_ex; - vector losses;//losses of steps through single time series - Expression out_ex;//we declare it here, bcause the last one will be the forecast - for (int i=INPUT_SIZE-1; i::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il::const_iterator first = m4Obj.vals.begin() + i + 1; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression loss_ex = pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); //training area losses - } - - if (i==(m4Obj.n-1)) {//validation loss - out_ex=expand(out_ex)*levels_exVect[i];//back to original scale - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - out_ex = cmult(out_ex, outputSeasonality_ex);//reseasonalize - } - if (SEASONALITY_NUM > 1 ) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - out_ex = cmult(out_ex, outputSeasonality2_ex);//reseasonalize - } - //we do not need the matching label here, because we do not bother calculate valid losses of each net across all series. - //We care about best and topn performance - } - }//end of going through all point of a series - - Expression loss_exp = average(losses); - float loss = as_scalar(cg.forward(loss_exp));//training loss of a single series - netPerf_map[series][inet]=loss; - - //unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>, BIG_LOOP>> testResults_map((int)series_len*1.5);//per series, big loop, etc... - //No epoch here, because this will just reflect the current (latest) situation - the last few epochs - vector out_vect=as_vector(out_ex.value()); - testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]=out_vect; - if (iEpoch>=AVERAGING_LEVEL && iEpoch % FREQ_OF_TEST==0) { - vector firstForec=testResults_map[series][inet][0]; - testResults_map[series][inet][AVERAGING_LEVEL]=firstForec; - for (int ii=1; ii nextForec=testResults_map[series][inet][ii]; - for (int iii=0; iii0 && iEpoch % FREQ_OF_TEST==0) { - //now that we have saved outputs of all nets on all series, let's calc how best and topn combinations performed during current epoch. - vector bestEpochLosses; - vector bestEpochAvgLosses; - vector topnEpochLosses; - vector topnEpochAvgLosses; - - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); -#endif - - float avgLoss; - vector avgLatest; - vector avgAvg; - - for (int itop=0; itop 0) { - float qLoss = errorFunc(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals); - bestEpochLosses.push_back(qLoss); - } - avgLatest=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]; //used later for calculating topn loss - - if (iEpoch>=AVERAGING_LEVEL) { - if (LBACK > 0) { - float qLoss = errorFunc(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals); - bestEpochAvgLosses.push_back(qLoss); - } - avgAvg=testResults_map[series][inet][AVERAGING_LEVEL]; - } - } else { - for (int iii=0; iii=AVERAGING_LEVEL) - avgAvg[iii]+=testResults_map[series][inet][AVERAGING_LEVEL][iii]; - } - } - }//through topn - - for (int iii=0; iii 0) { - float qLoss = errorFunc(avgLatest, m4Obj.testVals); - topnEpochLosses.push_back(qLoss); - } - - if (iEpoch>=AVERAGING_LEVEL) { - for (int iii = 0; iii 0) { -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&avgLoss, 0, NULL)); - - for (int iii=0; iii 0) { - float bestEpochLoss=accumulate( bestEpochLosses.begin(), bestEpochLosses.end(), 0.0)/bestEpochLosses.size(); - float topnEpochLoss=accumulate( topnEpochLosses.begin(), topnEpochLosses.end(), 0.0)/topnEpochLosses.size(); - cout<=AVERAGING_LEVEL) { - float bestEpochAvgLoss=accumulate( bestEpochAvgLosses.begin(), bestEpochAvgLosses.end(), 0.0)/bestEpochAvgLosses.size(); - float topnEpochAvgLoss=accumulate( topnEpochAvgLosses.begin(), topnEpochAvgLosses.end(), 0.0)/topnEpochAvgLosses.size(); - cout<<" bestAvg:"<> netRanking_map - netRanking_map[series]=perfToRanking(netPerf_map[series]); - - for (int itop=0; itop diagSeries; - for (int i=0; i<1; i++) {//add a few normal ones - int irand=uniOnSeries(rng); - diagSeries.insert(series_vect[irand]); - } - for(auto series : diagSeries) { - cout<at(inet); - for (int iEpoch=0; iEpoch 0 ) { - cout<<"sSm:"<at(inet); - for (int iEpoch=0; iEpoch 1 ) { - cout<<"sSm2:"<at(inet); - for (int iEpoch=0; iEpochat(inet); - for (int iEpoch = 0; iEpoch0) { - cout << "levels:" << iEpoch<<" "; - for (int iv = 0; iv 0 ) { - cout << "seasons:" << iEpoch<<" "; - for (int iv = 0; iv 1 ) { - cout << "seasons2:" << iEpoch<<" "; - for (int iv = 0; iv 0 -start 10 -start 20 -start 30 -on 4-core computer. -In this setup, learning and fitting would be repeated 4*3 times, probably unnecessarily too many, 6-8 independent runs should be enough for a good ensemble. -Therefore if running on say 8 core machine , one can extend the above script to 8 concurrent executions and reduce BIG_LOOP to 1. -(Creating final forecasts is done in a supplied R script) - -There are four blocks of parameters below, one active (starting with //PARAMS--------------) and three inactive. -These blocks are as they were during the final forecasting run. You need comment/uncomment to have one block of interest active. -*/ - - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -//#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- - -string VARIABLE = "Hourly"; -const string run0 = "(1,4)(24,168) LR=0.01, {25,3e-3f} EPOCHS=37, LVP=10, CSP=0"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 2;//0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 24; -const int SEASONALITY2 = 168; -vector> dilations = { { 1,4 },{ 24, 168 } }; - -const float INITIAL_LEARNING_RATE = 0.01f; -const map LEARNING_RATES = { { 20,1e-3f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 37; - -float LEVEL_VARIABILITY_PENALTY = 10; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 24; -const unsigned int OUTPUT_SIZE = 48; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 53 * SEASONALITY2 + MIN_SERIES_LENGTH; //==all -const int TOPN = 4; - - -/* -string VARIABLE = "Weekly"; -const string run0 = "Att 4/5 (1,52) LR=1e-3 {15,3e-4f} EPOCHS=31, LVP=100 6y"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 52; -const int SEASONALITY2 = 0; -vector> dilations = { { 1, 52 } }; - -const float INITIAL_LEARNING_RATE = 1e-3; -const map LEARNING_RATES = { { 15,3e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 31; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 10; -const unsigned int OUTPUT_SIZE = 13; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#81 380 935 1023 1604 2598 -const int MAX_SERIES_LENGTH = 6 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* - -string VARIABLE = "Daily"; -const string run0 = "4/5 (1,3)(7,14) LR=3e-4 {13,1e-4f} EPOCHS=21, LVP=100 13w"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER=false; - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,3 },{ 7, 14 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 13,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 21; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const unsigned int OUTPUT_SIZE = 14; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //##93 323 2940 2357 4197 9919 -const int MAX_SERIES_LENGTH = 13 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* -string VARIABLE = "Yearly"; -const string run0 = "Att NL 4/5 (1,6) LR=1e-4 {17,3e-5}{22,1e-5} EPOCHS=29, 60*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = true; - -const int SEASONALITY_NUM = 0; //0 means no seasonality -const int SEASONALITY = 1; //for no seasonality, set it to 1, important -const int SEASONALITY2 = 0; -vector> dilations = { { 1,6 } }; - -const float INITIAL_LEARNING_RATE = 1e-4; -const map LEARNING_RATES = { { 17,3e-5 },{ 22,1e-5 } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 29; - -float LEVEL_VARIABILITY_PENALTY = 0; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 30; - -const unsigned int INPUT_SIZE = 4; -const unsigned int OUTPUT_SIZE = 6; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#13.00 20.00 29.00 31.32 40.00 835.00 -const int MAX_SERIES_LENGTH = 60 + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; - -const int BIG_LOOP = 3; -const int NUM_OF_NETS = 5; -const unsigned ATTENTION_HSIZE = STATE_HSIZE; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 20; -#else - const int MAX_NUM_OF_SERIES = -1; -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6; -const int AVERAGING_LEVEL = 5; -const float EPS=1e-6; - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=50; -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN = false; - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - - -Expression squash(Expression& x) { - return log(x); -} -float squash(float x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} -float expand(float x) { - return exp(x); -} - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - float meanAbsSeasDiff; - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - - meanAbsSeasDiff = 0; - float sumf = 0; - for (int ip = SEASONALITY; ip0) - meanAbsSeasDiff = sumf / (vals.size() - SEASONALITY); - - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - -#if defined USE_ODBC -void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); -#endif - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; - Parameter sSm2; - array initSeasonality2; -}; -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - float sSm2; - array initSeasonality2; - vector levels; - vector seasons; - vector seasons2; -}; - - -array perfToRanking (array perf_arr) { - array index; - - for (int itop=0; itop losses; - for (unsigned int indx = 0; indx as_scalar(forecH.value())) - loss = loss + (actual - forecH)*ALPHA_MULTIP; - losses.push_back(loss); - } - return sum(losses) / OUTPUT_SIZE; -} - -// weighted quantile Loss -float wQuantLoss(vector& out_vect, vector& actuals_vect, float tau, int offset) {//used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 - float sumf = 0; float suma = 0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*tau; - else - sumf = sumf + (actual - forec)*(tau - 1); - } - return sumf / suma * 200; -} - -float errorFunc(vector& out_vect, vector& actuals_vect, float meanAbsSeasDiff) { - float sumf=0; - for (unsigned int indx = 0; indx forecH) - loss = loss + (actualf - forecH)*ALPHA_MULTIP; - sumf+=loss; - } - return sumf / (OUTPUT_SIZE*meanAbsSeasDiff); -} - - - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int ibigOffset = 0; - if (argc == 2) - ibigOffset = atoi(argv[1]); - - cout< 0) { - cout<<"Warning. LEVEL_VARIABILITY_PENALTY has to be equal zero if SEASONALITY_NUM==0"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 24k for yearly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - if (m4Obj.meanAbsSeasDiff==0) { - cout<<"Warning, flat series:"<0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - cout << "num of series:" << series_vect.size() << endl; - - unsigned int series_len=(unsigned int)series_vect.size(); - uniform_int_distribution uniOnSeries(0,series_len-1); // closed interval [a, b] - uniform_int_distribution uniOnNets(0,NUM_OF_NETS-1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>> testResults_map((int)series_len*1.5);//per series, etc... - unordered_map> finalResults_map((int)series_len*1.5);//per series - set diagSeries; - - unordered_map> netRanking_map; - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - //create nets - array paramsCollection_arr;//per net - array perSeriesParamsCollection_arr;//per net - array trainers_arr; - array perSeriesTrainers_arr; - - - #if defined USE_RESIDUAL_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #elif defined USE_ATTENTIVE_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #else - array, NUM_OF_NETS> rnnStack_arr; - #endif - - array MLPW_parArr; - array MLPB_parArr; - array adapterW_parArr; - array adapterB_parArr; - - //this is not a history, this is the real stuff - unordered_map* > additionalParams_mapOfArr((int)series_len*1.5); //per series, per net - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - additionalParams_mapOfArr[series]=new array(); - } - - for (int inet=0; inetclip_threshold = GRADIENT_CLIPPING; - perSeriesTrainers_arr[inet]=new AdamTrainer (perSeriesPC, INITIAL_LEARNING_RATE*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainers_arr[inet]->clip_threshold = GRADIENT_CLIPPING; - - auto& rNNStack=rnnStack_arr[inet]; - #if defined USE_RESIDUAL_LSTM - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il* additionalParams_arr=additionalParams_mapOfArr[series]; - additionalParams_arr->at(inet).levSm=perSeriesPC.add_parameters({1}, 0.5);//per series, per net - if (SEASONALITY_NUM > 0) { - additionalParams_arr->at(inet).sSm = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - if (SEASONALITY_NUM > 1) { - additionalParams_arr->at(inet).sSm2 = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality2[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - } - }//seting up, through nets - - //history of params. Series->[NUM_OF_NETS,NUM_OF_TRAIN_EPOCHS] - unordered_map, NUM_OF_NETS>*> historyOfAdditionalParams_map((int)series_len*1.5); - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - historyOfAdditionalParams_map[series]=new array, NUM_OF_NETS>(); - } - - //first assignment. Yes, we are using vector , so the very first time the duplicates are possible. But a set can't be sorted - array, NUM_OF_NETS> seriesAssignment;//every net has an array - for (int j=0; j> netPerf_map; - for (int inet=0; inetlearning_rate = LEARNING_RATES.at(iEpoch); - if (inet==0) - cout << "changing LR to:" << trainer->learning_rate << endl; - perSeriesTrainer->learning_rate = LEARNING_RATES.at(iEpoch)*PER_SERIES_LR_MULTIP; - } - - auto& rNNStack=rnnStack_arr[inet]; - Parameter& MLPW_par = MLPW_parArr[inet]; - Parameter& MLPB_par = MLPB_parArr[inet]; - Parameter& adapterW_par=adapterW_parArr[inet]; - Parameter& adapterB_par=adapterB_parArr[inet]; - - vector oneNetAssignments=seriesAssignment[inet]; - random_shuffle (oneNetAssignments.begin(), oneNetAssignments.end()); - - vector epochLosses; - vector forecLosses; vector levVarLosses; vector stateLosses; - for (auto iter = oneNetAssignments.begin() ; iter != oneNetAssignments.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - - ComputationGraph cg; - for (int il=0; ilat(inet); - array& historyOfAdditionalParams_arr=historyOfAdditionalParams_map[series]->at(inet); - - Expression MLPW_ex,MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex= parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea logDiffOfLevels_vect; - vector levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - Expression levelVarLoss_ex; - if (LEVEL_VARIABILITY_PENALTY > 0) { - vector levelVarLoss_v; - for (int i = 1; i losses;//losses of steps through single time series - for (int i=INPUT_SIZE-1; i<(m4Obj.n- OUTPUT_SIZE); i++) { - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - - first = m4Obj.vals.begin() + i + 1; - pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - firstE = season_exVect.begin() + i + 1; - pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - - firstE = season2_exVect.begin() + i + 1; - pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - }//through points of a series - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; itupdate();//update shared weights - perSeriesTrainer->update();//update params of this series only - } catch (exception& e) {//it may happen occasionally. I believe it is due to not robust enough implementation of squashing functions in Dynet. When abs(x)>35 NAs appear. - //so the code below is trying to produce some diagnostics, hopefully useful when setting LEVEL_VARIABILITY_PENALTY and C_STATE_PENALTY. - cerr<<"cought exception while doing "< maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax=it; - layerOfMax=il; - chunkOfMax= irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - if (SEASONALITY_NUM > 0) - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - if (SEASONALITY_NUM > 1) - cout << "sSm2:" << as_scalar(sSm2_ex.value()) << endl; - cout << "max abs:" << maxAbs <<" at time:"<< timeOfMax<<" at layer:"<< layerOfMax<<" and chunk:"<< chunkOfMax< 0) { - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea = 0; isea 1) { - histAdditionalParams.sSm2 = as_scalar(sSm2_ex.value()); - for (int isea=0; isea 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forec loss:" << averageForecLoss * 100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - cout<at(inet); - Expression MLPW_ex, MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex = parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; i0 then this is shortened, so it always contains data awe have right to access - Expression newLevel_ex = m4Obj.vals[i] * cdiv(levSm_ex, season_exVect[i]) + (1 - levSm_ex)*levels_exVect[i - 1]; - levels_exVect.push_back(newLevel_ex); - - Expression newSeason_ex = m4Obj.vals[i] * cdiv(sSm_ex, newLevel_ex) + (1 - sSm_ex)*season_exVect[i]; - season_exVect.push_back(newSeason_ex); - } - - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - - Expression inputSeasonality_ex; Expression inputSeasonality2_ex; - Expression outputSeasonality_ex; Expression outputSeasonality2_ex; - vector losses;//losses of steps through single time series - Expression out_ex;//we declare it here, bcause the last one will be the forecast - for (int i=INPUT_SIZE-1; i::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il::const_iterator first = m4Obj.vals.begin() + i + 1; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE;//checking if enough elements is in the vecor was done a few pe - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - //Expression loss_ex = pinBallLoss(out_ex, labels_ex); - Expression loss_ex = MSIS(out_ex, labels_ex); - if (i>=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); //training area losses - } - - if (i==(m4Obj.n-1)) {//validation loss - out_ex=expand(out_ex)*levels_exVect[i];//back to original scale - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios=0; ios 1 ) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios = 0; ios, AVERAGING_LEVEL+1>, NUM_OF_NETS>, BIG_LOOP>> testResults_map((int)series_len*1.5);//per series, big loop, etc... - //No epoch here, because this will just reflect the current (latest) situation - the last few epochs - vector out_vect=as_vector(out_ex.value()); - testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]=out_vect; - if (iEpoch>=AVERAGING_LEVEL && iEpoch % FREQ_OF_TEST==0) { - vector firstForec=testResults_map[series][inet][0]; - testResults_map[series][inet][AVERAGING_LEVEL]=firstForec; - for (int ii=1; ii nextForec=testResults_map[series][inet][ii]; - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - testResults_map[series][inet][AVERAGING_LEVEL][iii]+=nextForec[iii]; - } - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - testResults_map[series][inet][AVERAGING_LEVEL][iii]/=AVERAGING_LEVEL; - } //time to average - }//through series - } //through nets - - if (iEpoch>0 && iEpoch % FREQ_OF_TEST==0) { - //now that we have saved outputs of all nets on all series, let's calc how best and topn combinations performed during current epoch. - vector bestEpochLosses; - vector bestEpochAvgLosses; - vector topnEpochLosses; - vector topnEpochAvgLosses; - vector bestEpochLossesL; - vector bestEpochAvgLossesL; - vector topnEpochLossesL; - vector topnEpochAvgLossesL; - vector bestEpochLossesH; - vector bestEpochAvgLossesH; - vector topnEpochLossesH; - vector topnEpochAvgLossesH; - - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); -#endif - - float avgLoss; - vector avgLatest; - vector avgAvg; - - for (int itop=0; itop 0) { - float qLoss = errorFunc(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - bestEpochLosses.push_back(qLoss); - - qLoss=wQuantLoss(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - bestEpochLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - bestEpochLossesH.push_back(qLoss); - } - avgLatest=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]; //used later for calculating topn loss - - if (iEpoch>=AVERAGING_LEVEL) { - if (LBACK > 0) { - float qLoss = errorFunc(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - bestEpochAvgLosses.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - bestEpochAvgLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - bestEpochAvgLossesH.push_back(qLoss); - } - avgAvg=testResults_map[series][inet][AVERAGING_LEVEL]; - } - } else { - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) { - avgLatest[iii]+=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL][iii];//calculate current topn - if (iEpoch>=AVERAGING_LEVEL) - avgAvg[iii]+=testResults_map[series][inet][AVERAGING_LEVEL][iii]; - } - } - }//through topn - - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - avgLatest[iii]/=TOPN; - - if (LBACK > 0) { - float qLoss = errorFunc(avgLatest, m4Obj.testVals, m4Obj.meanAbsSeasDiff); - topnEpochLosses.push_back(qLoss); - - qLoss = wQuantLoss(avgLatest, m4Obj.testVals, TAUL, 0); - topnEpochLossesL.push_back(qLoss); - - qLoss = wQuantLoss(avgLatest, m4Obj.testVals, TAUH, OUTPUT_SIZE); - topnEpochLossesH.push_back(qLoss); - } - - if (iEpoch>=AVERAGING_LEVEL) { - for (int iii = 0; iii<2*OUTPUT_SIZE; iii++) - avgAvg[iii] /= TOPN; - - finalResults_map[series] = avgAvg; - - if (LBACK > 0) { -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&avgLoss, 0, NULL)); - - for (int iv=0; iv<2; iv++) { - if (iv==0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runL.c_str(), 0, &nullTerminatedStringOfRun)) - else - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runH.c_str(), 0, &nullTerminatedStringOfRun)); - - for (int iii=0; iii 0) { - float bestEpochLoss=accumulate( bestEpochLosses.begin(), bestEpochLosses.end(), 0.0)/bestEpochLosses.size(); - float topnEpochLoss=accumulate( topnEpochLosses.begin(), topnEpochLosses.end(), 0.0)/topnEpochLosses.size(); - float bestEpochLossL = accumulate(bestEpochLossesL.begin(), bestEpochLossesL.end(), 0.0) / bestEpochLossesL.size(); - float topnEpochLossL = accumulate(topnEpochLossesL.begin(), topnEpochLossesL.end(), 0.0) / topnEpochLossesL.size(); - float bestEpochLossH = accumulate(bestEpochLossesH.begin(), bestEpochLossesH.end(), 0.0) / bestEpochLossesH.size(); - float topnEpochLossH = accumulate(topnEpochLossesH.begin(), topnEpochLossesH.end(), 0.0) / topnEpochLossesH.size(); - cout<=AVERAGING_LEVEL) { - float bestEpochAvgLoss=accumulate( bestEpochAvgLosses.begin(), bestEpochAvgLosses.end(), 0.0)/bestEpochAvgLosses.size(); - float topnEpochAvgLoss=accumulate( topnEpochAvgLosses.begin(), topnEpochAvgLosses.end(), 0.0)/topnEpochAvgLosses.size(); - float bestEpochAvgLossL = accumulate(bestEpochAvgLossesL.begin(), bestEpochAvgLossesL.end(), 0.0) / bestEpochAvgLossesL.size(); - float topnEpochAvgLossL = accumulate(topnEpochAvgLossesL.begin(), topnEpochAvgLossesL.end(), 0.0) / topnEpochAvgLossesL.size(); - float bestEpochAvgLossH = accumulate(bestEpochAvgLossesH.begin(), bestEpochAvgLossesH.end(), 0.0) / bestEpochAvgLossesH.size(); - float topnEpochAvgLossH = accumulate(topnEpochAvgLossesH.begin(), topnEpochAvgLossesH.end(), 0.0) / topnEpochAvgLossesH.size(); - cout<<" bestAvg:"<> netRanking_map - netRanking_map[series]=perfToRanking(netPerf_map[series]); - - for (int itop=0; itop diagSeries; - for (int i=0; i<1; i++) {//add a few normal ones - int irand=uniOnSeries(rng); - diagSeries.insert(series_vect[irand]); - } - for(auto series : diagSeries) { - cout<at(inet); - for (int iEpoch=0; iEpoch 0 ) { - cout<<"sSm:"<at(inet); - for (int iEpoch=0; iEpoch 1 ) { - cout<<"sSm2:"<at(inet); - for (int iEpoch=0; iEpochat(inet); - for (int iEpoch = 0; iEpoch0) { - cout << "levels:" << iEpoch<<" "; - for (int iv = 0; iv 0 ) { - cout << "seasons:" << iEpoch<<" "; - for (int iv = 0; iv 1 ) { - cout << "seasons2:" << iEpoch<<" "; - for (int iv = 0; iv 10 1 -start 10 2 -Modern computers have at more then 2 cores, so e.g. on 6-core machine create and run the following script with 3 pairs of workers: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -seedForChunks have to be the same withion one pair, chunk numbers have to be 1 and 2. -We have added here the third parameter: ibigOffset. The straddle should be equal or bigger than BIG_LOOP. -Each pair goes through BIG_LOOP (by default 3, change in code below if you want) of model fitting and prediction, -so 2 pairs, as above, will produce 6 forecasts to be ensembled later, in R. -By increasing number of pairs, e.g. to 6 on 12-core computer, one can reduce BIG_LOOP to 1, so reduce execution time, and still have 6 forecasts - -a decent number to ensemble (in a separate, supplied R script). - -There are three blocks of parameters below, one active (starting with //PARAMS--------------) and two inactive. -The active block is setup as in the final run of forecasting quarterly series. Similarly Monthly block. -The Daily block is more of a demo, allowing to run quickly forecast for Daily series, although with slightly worse performance (use another program ES_RNN_E.cc for it). It was not used for the final submission. -So, you need comment/uncomment to have one block of interest active. - - -*/ - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Quarterly"; -const string run0 = "(1,2),(4,8), LR=1e-3/{7,3e-4f},{11,1e-4f}, EPOCHS=16, LVP=200 40*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -vector> dilations = { { 1,2 },{ 4,8 } };//Each vector represents one chunk of Dilateed LSTMS, connected in resnNet fashion -const float INITIAL_LEARNING_RATE = 1e-3f; -//else -const map LEARNING_RATES = { { 7,3e-4f },{ 11,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -const int NUM_OF_TRAIN_EPOCHS = 16; -const unsigned int STATE_HSIZE = 40; - -const int SEASONALITY = 4; -const unsigned int INPUT_SIZE = 4; -const int INPUT_SIZE_I = INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 8; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I + MIN_INP_SEQ_LEN + 2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - -const float LEVEL_VARIABILITY_PENALTY = 200; //Multiplier for L" penalty against wigglines of level vector. - - -/* -string VARIABLE = "Monthly"; -const string run0 = "Res(1,3,6,12), LR=1e-3 {8,3e-4f},{13,1e-4f}, EPOCHS=14, LVP=50, 20*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -vector> dilations = { { 1,3,6,12 } };//Each vector represents one chunk of Dilateed LSTMS, connected in resnNet fashion^M -const float INITIAL_LEARNING_RATE = 1e-3f; -const map LEARNING_RATES = { { 8,3e-4f },{ 13,1e-4f } }; //at which epoch we set them up to what^M -const float PER_SERIES_LR_MULTIP = 1; - -const int NUM_OF_TRAIN_EPOCHS = 14; -const unsigned int STATE_HSIZE = 50; - -const float LEVEL_VARIABILITY_PENALTY = 50; //Multiplier for L" penalty against wigglines of level vector. - -const int SEASONALITY = 12; -const unsigned int OUTPUT_SIZE = 18; -const unsigned int INPUT_SIZE = 12; -const int INPUT_SIZE_I = INPUT_SIZE; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I + MIN_INP_SEQ_LEN + 2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; -*/ - -Expression squash(Expression& x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 40; -#else - const int MAX_NUM_OF_SERIES = -1; //use all series -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6;//in data provided -const int BIG_LOOP = 3; -const int NUM_OF_CHUNKS = 2; -const float EPS=1e-6; -const int AVERAGING_LEVEL=5; -const bool USE_MEDIAN = false; -const int MIDDLE_POS_FOR_AVG = 2; //if using medians - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=20; -const float C_STATE_PENALTY = 0; - -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN=true; -const unsigned ATTENTION_HSIZE=STATE_HSIZE; - -const bool USE_AUTO_LEARNING_RATE=false; -//if USE_AUTO_LEARNING_RATE, and only if LBACK>0 -const float MIN_LEARNING_RATE = 0.0001f; -const float LR_RATIO = sqrt(10); -const float LR_TOLERANCE_MULTIP = 1.005; -const int L3_PERIOD = 2; -const int MIN_EPOCHS_BEFORE_CHANGING_LRATE = 2; - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - float meanAbsSeasDiff; - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - - meanAbsSeasDiff = 0; - float sumf = 0; - for (int ip = SEASONALITY; ip0) - meanAbsSeasDiff = sumf / (vals.size() - SEASONALITY); - - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE_I) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE_I; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE_I; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE_I); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; -}; - -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - vector levels; - vector seasons; -}; - -//loss function -Expression MSIS(const Expression& out_ex, const Expression& actuals_ex) { - vector losses; - for (unsigned int indx = 0; indx as_scalar(forecH.value())) - loss = loss + (actual - forecH)*ALPHA_MULTIP; - losses.push_back(loss); - } - Expression ret = sum(losses) / OUTPUT_SIZE; - #if defined _DEBUG - float retf = as_scalar(ret.value()); - if (retf>100) { - vector out_vect = as_vector(out_ex.value()); - vector actuals_vect = as_vector(actuals_ex.value()); - for (int i = 0; i0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect, float tau, int offset) {//used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 - float sumf = 0; float suma = 0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*tau; - else - sumf = sumf + (actual - forec)*(tau - 1); - } - return sumf / suma * 200; -} - -//MSIS operating on floats, used for validation -float errorFunc(vector& out_vect, vector& actuals_vect, float meanAbsSeasDiff) { - float sumf=0; - for (unsigned int indx = 0; indx forecH) - loss = loss + (actualf - forecH)*ALPHA_MULTIP; - sumf+=loss; - } - return sumf / (OUTPUT_SIZE*meanAbsSeasDiff); -} - - - - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int seedForChunks = 10; //Yes it runs, without any params, but it will work only on 1/NUM_OF_CHUNKS of all cases. The system is expected to run in NUM_OF_CHUNKS multiples. - int chunkNo = 1; - int ibigOffset = 0; - if (argc >= 3) { - seedForChunks = atoi(argv[1]); - chunkNo = atoi(argv[2]); - } - if (argc >= 4) - ibigOffset = atoi(argv[3]); - - if (chunkNo > NUM_OF_CHUNKS) { - cerr << "chunkNo > NUM_OF_CHUNKS"; - exit(-1); - } - else if (chunkNo <= 0) { - cerr << "chunkNo <= 0"; - exit(-1); - } - - cout<0) - std::cout<< " ibigOffset:"<< ibigOffset; //if continuing prematurely stopped run - if (LBACK>0) - std::cout<<" lback:"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE_I+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister) - mt19937 rngForChunks(seedForChunks); - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 48/2=24k, for monthly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - if (m4Obj.meanAbsSeasDiff==0) { - cout<<"Warning, flat series:"<0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - - int series_len=(int)series_vect.size(); - int chunkSize= series_len/NUM_OF_CHUNKS; - std::cout << "num of series:" << series_vect.size() <<" size of chunk:"<< chunkSize< uniOnSeries(0, chunkSize -1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>> testResults_map((int)chunkSize*1.5); - set diagSeries; - - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - ParameterCollection pc; - ParameterCollection perSeriesPC; - - float learning_rate= INITIAL_LEARNING_RATE; - AdamTrainer trainer(pc, learning_rate, 0.9, 0.999, EPS); - trainer.clip_threshold = GRADIENT_CLIPPING; - AdamTrainer perSeriesTrainer(perSeriesPC, learning_rate*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainer.clip_threshold = GRADIENT_CLIPPING; - - #if defined USE_RESIDUAL_LSTM - vector rNNStack; - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(AttentiveDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, ATTENTION_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(DilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il oneChunk_vect(start,end); - if (PRINT_DIAGN) { - for (int k = 0; k<10; k++) //diag - cout << oneChunk_vect[k] << " "; - cout << endl; - } - if (chunkNo == NUM_OF_CHUNKS) - cout<<"last chunk size:"<< oneChunk_vect.size()< additionalParams_map((int)oneChunk_vect.size()*1.5); //per series - unordered_map*> historyOfAdditionalParams_map((int)oneChunk_vect.size()*1.5); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) {//setup - string series = *iter; - AdditionalParams addParams; - addParams.levSm = perSeriesPC.add_parameters({ 1 }, 0.5); //level smoothing - addParams.sSm = perSeriesPC.add_parameters({ 1 }, 0.5); //seasonality smoothing - for (int isea = 0; isea(); - } - - for (int iEpoch=0; iEpoch testLosses; //test losses of all series in this epoch - vector testAvgLosses; //test avg (over last few epochs) losses of all series in this epoch - vector testLossesL; //lower quantile loss - vector testAvgLossesL; //lower quantile loss - vector testLossesH; //higher quantile loss - vector testAvgLossesH; //higher quantile loss - vector trainingLosses; //training losses of all series in one epoch - vector forecLosses; vector levVarLosses; vector stateLosses; - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&iEpoch, 0, NULL)); - #endif - - for (auto iter = oneChunk_vect.begin() ; iter != oneChunk_vect.end(); ++iter) { - string series=*iter; - auto m4Obj = allSeries_map[series]; - - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); - #endif - - ComputationGraph cg; - for (int il=0; il season_exVect;//vector, because we do not know how long the series is - for (int iseas=0; iseas seas==1 - season_exVect.push_back(seas);//Expression is a simple struct, without any storage management, so the auto copy constructor works OK. - } - season_exVect.push_back(season_exVect[0]); - - vector logDiffOfLevels_vect; - vector levels_exVect; - Expression lev=cdiv(input(cg, m4Obj.vals[0]), season_exVect[0]); - levels_exVect.push_back(lev); - for (int i=1; i 0) { - vector levelVarLoss_v; - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx=season_exVect.size()-SEASONALITY; - for (int i=0;i<(OUTPUT_SIZE_I-SEASONALITY);i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx+i]); - } - vector losses; - for (int i=INPUT_SIZE_I-1; i<(m4Obj.n- OUTPUT_SIZE_I); i++) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() +i+1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex=input(cg,{INPUT_SIZE},input_vect); - Expression input1_ex=cdiv(input0_ex,inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]); - joinedInput_ex.emplace_back(noise(squash(input1_ex), NOISE_STD)); //normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex=concatenate(outputSeasonality_exVect); - - first = m4Obj.vals.begin() +i+1; - pastLast = m4Obj.vals.begin() +i+1+OUTPUT_SIZE_I; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels0_ex=input(cg,{OUTPUT_SIZE},labels_vect); - Expression labels1_ex=cdiv(labels0_ex,outputSeasonality_ex); //deseasonalization - labels1_ex= cdiv(labels1_ex, levels_exVect[i]);//normalization - Expression labels_ex=squash(labels1_ex); - - Expression loss_ex=MSIS(out_ex, labels_ex);//although out_ex has doubled size, labels_ex have normal size. NB, we do not have duplicated labels during training. - //Expression loss_ex=pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE_I+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - } - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; it maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax = it; - layerOfMax = il; - chunkOfMax = irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - cout << " min season=" << minSeason << endl; - cout << " min level=" << minLevel << endl; - cout << " max abs:" << maxAbs << " at time:" << timeOfMax << " at layer:" << layerOfMax << " and chunk:" << chunkOfMax << endl; - - //diagSeries.insert(series); - pc.reset_gradient(); - perSeriesPC.reset_gradient(); - } - - //saving per-series values for diagnostics purposes - AdditionalParamsF &histAdditionalParams= historyOfAdditionalParams_map[series]->at(iEpoch); - histAdditionalParams.levSm=as_scalar(levSm_ex.value()); - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea=0; isea::const_iterator firstE = season_exVect.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex = concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression input1_ex = cdiv(input0_ex, inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]);//normalization - joinedInput_ex.emplace_back(squash(input1_ex)); - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios=0; ios out_vect = as_vector(out_ex.value()); - - if (LBACK > 0) { - float qLoss = errorFunc(out_vect, m4Obj.testVals, m4Obj.meanAbsSeasDiff); - testLosses.push_back(qLoss); - - qLoss = wQuantLoss(out_vect, m4Obj.testVals, TAUL, 0); - testLossesL.push_back(qLoss); - - qLoss = wQuantLoss(out_vect, m4Obj.testVals, TAUH, OUTPUT_SIZE); - testLossesH.push_back(qLoss); - } - - testResults_map[series][iEpoch%AVERAGING_LEVEL] = out_vect; - if (iEpoch >= AVERAGING_LEVEL) { - if (USE_MEDIAN) { - if (testResults_map[series][AVERAGING_LEVEL].size() == 0) - testResults_map[series][AVERAGING_LEVEL] = out_vect; //just to initialized, to make space. The values will be overwritten - for (int iii = 0; iii < OUTPUT_SIZE_I*2; iii++) { - vector temp_vect2; - for (int ii = 0; ii firstForec = testResults_map[series][0]; - testResults_map[series][AVERAGING_LEVEL] = firstForec; - for (int ii = 1; ii nextForec = testResults_map[series][ii]; - for (int iii = 0; iii 0) { - float qLoss = errorFunc(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - testAvgLosses.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - testAvgLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - testAvgLossesH.push_back(qLoss); - - #if defined USE_ODBC //save - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&forecastLoss, 0, NULL)); - - for (int iv = 0; iv<2; iv++) { - if (iv == 0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runL.c_str(), 0, &nullTerminatedStringOfRun)) - else - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runH.c_str(), 0, &nullTerminatedStringOfRun)); - - for (int io = 0; io < OUTPUT_SIZE_I; io++) { - int ipos=OFFSET_TO_FIRST_ACTUAL + 1 + 2*io; - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&m4Obj.testVals[io], 0, NULL)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos+1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&testResults_map[series][AVERAGING_LEVEL][io + iv*OUTPUT_SIZE_I], 0, NULL)); - } - if (MAX_NUM_OF_SERIES<0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLExecute(hInsertStmt)); - } - #endif - } //lback>0 - } //time to average - }//last anchor point of the series - }//through TEST loop - }//through series - - - if (iEpoch % FREQ_OF_TEST == 0) { - float averageTrainingLoss = accumulate(trainingLosses.begin(), trainingLosses.end(), 0.0) / trainingLosses.size(); - - cout << ibig << " " << iEpoch << " loss:" << averageTrainingLoss * 100; - if (LEVEL_VARIABILITY_PENALTY > 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forecast loss:" << averageForecLoss*100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - - float averageTestLoss=0; - if (LBACK > 0) { - float averageTestLoss = accumulate(testLosses.begin(), testLosses.end(), 0.0) / testLosses.size(); - float averageTestLossL = accumulate(testLossesL.begin(), testLossesL.end(), 0.0) / testLossesL.size(); - float averageTestLossH = accumulate(testLossesH.begin(), testLossesH.end(), 0.0) / testLossesH.size(); - cout<<" Test loss:" << averageTestLoss<<" L:"<< averageTestLossL<<" H:"<< averageTestLossH; - if (iEpoch >= AVERAGING_LEVEL) { - float averageTestAvgLoss = accumulate(testAvgLosses.begin(), testAvgLosses.end(), 0.0) / testAvgLosses.size();//of this epoch - float averageTestAvgLossL = accumulate(testAvgLossesL.begin(), testAvgLossesL.end(), 0.0) / testAvgLossesL.size();//of this epoch - float averageTestAvgLossH = accumulate(testAvgLossesH.begin(), testAvgLossesH.end(), 0.0) / testAvgLossesH.size();//of this epoch - cout << " avgLoss:" << averageTestAvgLoss<<" L:"<< averageTestAvgLossL<<" H:"<< averageTestAvgLossH<= 2) { - if (iEpoch < L3_PERIOD) - changeL2Rate = perfValid_vect[perfValid_vect.size() - 2] MIN_LEARNING_RATE && (iEpoch - epochOfLastChangeOfLRate) >= MIN_EPOCHS_BEFORE_CHANGING_LRATE) { - learning_rate /= LR_RATIO; - cout << "decreasing LR to:" << learning_rate << endl; - epochOfLastChangeOfLRate = iEpoch; - trainer.learning_rate = learning_rate; - } - } - #if defined USE_ODBC - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLEndTran( - SQL_HANDLE_DBC, - hDbc, - SQL_COMMIT)); - #endif - }//through epochs - - if (PRINT_DIAGN) {//some diagnostic info - set diagSeries; - for (int i = 0; i<1; i++) {//add a few normal ones - int irand = uniOnSeries(rng); - diagSeries.insert(oneChunk_vect[irand]); - } - for (auto series : diagSeries) { - cout << endl << series << endl; - array* historyOfAdditionalParams_ptrToArr = historyOfAdditionalParams_map[series]; - cout << "lSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levSm << " "; - cout << endl; - cout << "sSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).sSm << " "; - cout << endl; - cout << "seasons:" << endl; - for (int isea = 0; iseaat(iEpoch).initSeasonality[isea] << " "; - cout << endl; - } - cout << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levels.size()>0) { - cout << "levels:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).levels.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).levels[iv] << ", "; - cout << endl; - cout << "seas:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).seasons.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).seasons[iv] << ", "; - cout << endl; - } - } - } - } - - //save the forecast to outputFile - ofstream outputFile; - outputFile.open(outputPathL); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) { - string series = *iter; - outputFile<< series; - for (int io=0; io -#include -#include -#include - -#if defined DEBUG - #define _DEBUG -#endif - -using namespace std; - -namespace dynet { - - // ResidualDilatedLSTMBuilder based on Vanilla LSTM - enum { _X2I, _H2I, _BI, _X2F, _H2F, _BF, _X2O, _H2O, _BO, _X2G, _H2G, _BG }; - enum { LN_GH, LN_BH, LN_GX, LN_BX, LN_GC, LN_BC }; - - ResidualDilatedLSTMBuilder::ResidualDilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), ln_lstm(false), forget_bias(1.f), dropout_masks_valid(false) { } - - ResidualDilatedLSTMBuilder::ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm, float forget_bias) : dilations(dilations), layers(unsigned(dilations.size())), - input_dim(input_dim), hid(hidden_dim), ln_lstm(ln_lstm), forget_bias(forget_bias), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("ResidualDilated-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_x2i = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_h2i = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - //Parameter p_c2i = model.add_parameters({hidden_dim, hidden_dim}); - Parameter p_bi = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_x2i, p_h2i, /*p_c2i,*/ p_bi }; - params.push_back(ps); - - if (ln_lstm) { - Parameter p_gh = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(1.f)); - Parameter p_bh = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - Parameter p_gx = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(1.f)); - Parameter p_bx = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - Parameter p_gc = model.add_parameters({ hidden_dim }, ParameterInitConst(1.f)); - Parameter p_bc = model.add_parameters({ hidden_dim }, ParameterInitConst(0.f)); - vector ln_ps = { p_gh, p_bh, p_gx, p_bx, p_gc, p_bc }; - ln_params.push_back(ln_ps); - } - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void ResidualDilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - if (ln_lstm)ln_param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); } - param_vars.push_back(vars); - if (ln_lstm) { - auto& ln_p = ln_params[i]; - vector ln_vars; - for (unsigned j = 0; j < ln_p.size(); ++j) { ln_vars.push_back(update ? parameter(cg, ln_p[j]) : const_parameter(cg, ln_p[j])); } - ln_param_vars.push_back(ln_vars); - } - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void ResidualDilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "ResidualDilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } - else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void ResidualDilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & ResidualDilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression ResidualDilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "ResidualDilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = h.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression ResidualDilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "ResidualDilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = c.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression ResidualDilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset = dilations[i] - 1; - const vector& vars = param_vars[i]; - - Expression i_h_tm1, i_c_tm1; - bool has_prev_state = (prev >= 0 || has_initial_state); - if (prev < dilation_offset) { - if (has_initial_state) { - // intial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } - else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } - else { - i_h_tm1 = h[prev - dilation_offset][i]; - i_c_tm1 = c[prev - dilation_offset][i]; - } - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - if (dropout_rate > 0.f) { - in = cmult(in, masks[i][0]); - } - if (has_prev_state && dropout_rate_h > 0.f) - i_h_tm1 = cmult(i_h_tm1, masks[i][1]); - // input - Expression tmp; - Expression i_ait; - Expression i_aft; - Expression i_aot; - Expression i_agt; - if (ln_lstm) { - const vector& ln_vars = ln_param_vars[i]; - if (has_prev_state) - tmp = vars[_BI] + layer_norm(vars[_X2I] * in, ln_vars[LN_GX], ln_vars[LN_BX]) + layer_norm(vars[_H2I] * i_h_tm1, ln_vars[LN_GH], ln_vars[LN_BH]); - else - tmp = vars[_BI] + layer_norm(vars[_X2I] * in, ln_vars[LN_GX], ln_vars[LN_BX]); - } - else { - if (has_prev_state) - tmp = affine_transform({ vars[_BI], vars[_X2I], in, vars[_H2I], i_h_tm1 }); - else - tmp = affine_transform({ vars[_BI], vars[_X2I], in }); - } - i_ait = pick_range(tmp, 0, hid); - i_aft = pick_range(tmp, hid, hid * 2); - i_aot = pick_range(tmp, hid * 2, hid * 3); - i_agt = pick_range(tmp, hid * 3, hid * 4); - Expression i_it = logistic(i_ait); - if (forget_bias != 0.0) - tmp = logistic(i_aft + forget_bias); - else - tmp = logistic(i_aft); - - Expression i_ft = tmp; - Expression i_ot = logistic(i_aot); - Expression i_gt = tanh(i_agt); - - ct[i] = has_prev_state ? (cmult(i_ft, i_c_tm1) + cmult(i_it, i_gt)) : cmult(i_it, i_gt); - if (ln_lstm) { - const vector& ln_vars = ln_param_vars[i]; - if (i==0) - in = ht[i] = cmult(i_ot, tanh(layer_norm(ct[i], ln_vars[LN_GC], ln_vars[LN_BC]))); - else - in = ht[i] = cmult(i_ot, in+tanh(layer_norm(ct[i], ln_vars[LN_GC], ln_vars[LN_BC]))); - } - else { - if (i==0) - in = ht[i] = cmult(i_ot, tanh(ct[i])); - else - in = ht[i] = cmult(i_ot, in+tanh(ct[i])); - } - } - return ht.back(); - } - - void ResidualDilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const ResidualDilatedLSTMBuilder & rnn_lstm = (const ResidualDilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy ResidualDilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - for (size_t i = 0; i < ln_params.size(); ++i) - for (size_t j = 0; j < ln_params[i].size(); ++j) - ln_params[i][j] = rnn_lstm.ln_params[i][j]; - } - - void ResidualDilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void ResidualDilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void ResidualDilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - - - - //enum { _X2I, _H2I, _BI, _X2F, _H2F, _BF, _X2O, _H2O, _BO, _X2G, _H2G, _BG }; - enum { _X2I_, _H2I_, _BI_, _XA1, _HA1, _SA1, _BA1, _A2, _B2 }; - - -//*************************** - - - - AttentiveDilatedLSTMBuilder::AttentiveDilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), weightnoise_std(0), dropout_masks_valid(false) { } - - AttentiveDilatedLSTMBuilder::AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model) - : max_dilations(max_dilations), layers(unsigned(max_dilations.size())), - input_dim(input_dim), hid(hidden_dim), attention_dim(attention_dim), weightnoise_std(0), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("compact-vanilla-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_Wx = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_Wh = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - Parameter p_b = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - Parameter p_Wxa1 = local_model.add_parameters({ attention_dim, layer_input_dim }); - Parameter p_Wha1 = local_model.add_parameters({ attention_dim, hidden_dim }); - Parameter p_Wsa1 = local_model.add_parameters({ attention_dim, hidden_dim }); - Parameter p_ba1 = local_model.add_parameters({ attention_dim }, ParameterInitConst(0.f)); - - Parameter p_Wa2 = local_model.add_parameters({ max_dilations[i], attention_dim }); - Parameter p_ba2 = local_model.add_parameters({ max_dilations[i] }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_Wx, p_Wh, p_b, p_Wxa1, p_Wha1, p_Wsa1, p_ba1, p_Wa2, p_ba2 }; - params.push_back(ps); - - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void AttentiveDilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { - vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); - } - param_vars.push_back(vars); - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void AttentiveDilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "AttentiveDilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } - else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void AttentiveDilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & AttentiveDilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression AttentiveDilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "AttentiveDilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = unsigned(h.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression AttentiveDilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "AttentiveDilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = unsigned(c.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression AttentiveDilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset= max_dilations[i]-1; - const vector& vars = param_vars[i]; - Expression i_h_tm1, i_c_tm1; - if (prev < dilation_offset) { - if (has_initial_state) { - // initial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } - else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } - else { - if (dilation_offset>0) { - //enum { _X2I, _H2I, _BI, _XA1, _HA1, _SA1, _BA1, _A2, _B2 }; - Expression weights_ex=vars[_XA1]*in+ vars[_HA1]*h[prev][i]+ vars[_SA1]*c[prev][i]+ vars[_BA1]; - weights_ex=tanh(weights_ex); - weights_ex=vars[_A2]* weights_ex+ vars[_B2]; - weights_ex =softmax(weights_ex); - #if defined _DEBUG - vector weights=as_vector(weights_ex.value()); - #endif - - unsigned indx=0; - Expression w_ex = pick(weights_ex, indx); - Expression avg_h= cmult(h[prev][i], w_ex); - for (indx=1; indx <= dilation_offset; indx++) {//dilation_offset==max_dilations[i]-1, so together with indx==0, we cover max_dilations[i] steps - w_ex = pick(weights_ex, indx); - avg_h = avg_h+cmult(h[prev- indx][i], w_ex); - } - i_h_tm1 = avg_h; - } else { - i_h_tm1 = h[prev- dilation_offset][i]; - } - i_c_tm1 = c[prev- dilation_offset][i]; - } - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - Expression gates_t = vanilla_lstm_gates_dropout({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], masks[i][0], masks[i][1], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - else { - Expression gates_t = vanilla_lstm_gates({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - } - return ht.back(); - } - - void AttentiveDilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const AttentiveDilatedLSTMBuilder & rnn_lstm = (const AttentiveDilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy AttentiveDilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - } - - void AttentiveDilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void AttentiveDilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void AttentiveDilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - void AttentiveDilatedLSTMBuilder::set_weightnoise(float std) { - DYNET_ARG_CHECK(std >= 0.f, "weight noise must have standard deviation >=0"); - weightnoise_std = std; - } - - //*/ - - DilatedLSTMBuilder::DilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), weightnoise_std(0), dropout_masks_valid(false) { } - - DilatedLSTMBuilder::DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model) - : dilations(dilations), layers(unsigned(dilations.size())), - input_dim(input_dim), hid(hidden_dim), weightnoise_std(0), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("compact-vanilla-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_Wx = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_Wh = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - Parameter p_b = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_Wx, p_Wh, p_b }; - params.push_back(ps); - - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void DilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); } - param_vars.push_back(vars); - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void DilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "DilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void DilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & DilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression DilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "DilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = unsigned(h.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression DilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "DilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = unsigned(c.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression DilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset = dilations[i] - 1; - const vector& vars = param_vars[i]; - Expression i_h_tm1, i_c_tm1; - if (prev < dilation_offset) { - if (has_initial_state) { - // initial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } else { // t > 0 - i_h_tm1 = h[prev - dilation_offset][i]; - i_c_tm1 = c[prev - dilation_offset][i]; - } - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - Expression gates_t = vanilla_lstm_gates_dropout({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], masks[i][0], masks[i][1], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } else { - Expression gates_t = vanilla_lstm_gates({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - } - return ht.back(); - } - - void DilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const DilatedLSTMBuilder & rnn_lstm = (const DilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy DilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - } - - void DilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void DilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void DilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - void DilatedLSTMBuilder::set_weightnoise(float std) { - DYNET_ARG_CHECK(std >= 0.f, "weight noise must have standard deviation >=0"); - weightnoise_std = std; - } - -} // namespace dynet diff --git a/prototypes/ES_RNN/M4/github/c++/slstm.h b/prototypes/ES_RNN/M4/github/c++/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/M4/github/c++/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M4.sln b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M4.sln deleted file mode 100644 index bb0f246f..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M4.sln +++ /dev/null @@ -1,58 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "M41", "M41\M41.vcxproj", "{928301A0-F01A-48F6-A499-851B3CE8BD4E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "M42", "M42\M42.vcxproj", "{A16B5466-E680-43F6-A884-A4A01EB78E50}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "M43", "M43\M43.vcxproj", "{BE951571-3F3A-4048-BAA3-0C05F38CFF42}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "M44", "M44\M44.vcxproj", "{7A192E0C-8F58-4D65-998E-3A7010AB5F87}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - RelWithDebug|x64 = RelWithDebug|x64 - RelWithDebug|x86 = RelWithDebug|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.Debug|x64.ActiveCfg = Debug|x64 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.Debug|x64.Build.0 = Debug|x64 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.Debug|x86.ActiveCfg = Debug|Win32 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.Debug|x86.Build.0 = Debug|Win32 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.RelWithDebug|x64.ActiveCfg = RelWithDebug|x64 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.RelWithDebug|x64.Build.0 = RelWithDebug|x64 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.RelWithDebug|x86.ActiveCfg = RelWithDebug|Win32 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.RelWithDebug|x86.Build.0 = RelWithDebug|Win32 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.Debug|x64.ActiveCfg = Debug|x64 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.Debug|x64.Build.0 = Debug|x64 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.Debug|x86.ActiveCfg = Debug|Win32 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.Debug|x86.Build.0 = Debug|Win32 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.RelWithDebug|x64.ActiveCfg = RelWithDebug|x64 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.RelWithDebug|x64.Build.0 = RelWithDebug|x64 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.RelWithDebug|x86.ActiveCfg = RelWithDebug|Win32 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.RelWithDebug|x86.Build.0 = RelWithDebug|Win32 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.Debug|x64.ActiveCfg = Debug|x64 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.Debug|x64.Build.0 = Debug|x64 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.Debug|x86.ActiveCfg = Debug|Win32 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.Debug|x86.Build.0 = Debug|Win32 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.RelWithDebug|x64.ActiveCfg = RelWithDebug|x64 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.RelWithDebug|x64.Build.0 = RelWithDebug|x64 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.RelWithDebug|x86.ActiveCfg = RelWithDebug|Win32 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.RelWithDebug|x86.Build.0 = RelWithDebug|Win32 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.Debug|x64.ActiveCfg = Debug|x64 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.Debug|x64.Build.0 = Debug|x64 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.Debug|x86.ActiveCfg = Debug|Win32 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.Debug|x86.Build.0 = Debug|Win32 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.RelWithDebug|x64.ActiveCfg = RelWithDebug|x64 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.RelWithDebug|x64.Build.0 = RelWithDebug|x64 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.RelWithDebug|x86.ActiveCfg = RelWithDebug|Win32 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.RelWithDebug|x86.Build.0 = RelWithDebug|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/ES_RNN.cc b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/ES_RNN.cc deleted file mode 100644 index de503796..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/ES_RNN.cc +++ /dev/null @@ -1,1194 +0,0 @@ -/*ES-RNN: ES-RNN Exponential Smoothing Recurrent Neural Network hybrid. Point forecast. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. -It is meant to be used for Monthly and Quarterly series of M4 competition, becasue the DE (Diversified Ensemble) version is too slow. -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -It has to be invoked in pair of executables, passing at least two integers: seedForChunks, chunkNo -so e.g. create a script with following lines on Windows -start 10 1 -start 10 2 -Modern computers have at more then 2 cores, so e.g. on 6-core machine create and run the following script with 3 pairs of workers: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -seedForChunks have to be the same withion one pair, chunk numbers have to be 1 and 2. -We have added here the third parameter: ibigOffset. The straddle should be equal or bigger than BIG_LOOP. -Each pair goes through BIG_LOOP (by default 3, change in code below if you want) of model fitting and prediction, -so 2 pairs, as above, will produce 6 forecasts to be ensembled later, in R. -By increasing number of pairs, e.g. to 6 on 12-core computer, one can reduce BIG_LOOP to 1, so reduce execution time, and still have 6 forecasts - -a decent number to ensemble (in a separate R script). - -There are three blocks of parameters below, one active (starting with //PARAMS--------------) and two inactive. -The active block is setup as in the final run of forecasting quarterly series. Similarly Monthly block. -The Daily block is more of a demo, allowing to run quickly forecast for Daily series, although with slightly worse performance (use another program ES_RNN_E.cc for it). It was not used for the final submission. -So, you need comment/uncomment to have one block of interest active. - - -*/ - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Quarterly"; -const string run = "50/45 (1,2),(4,8), LR=0.001/{10,1e-4f}, EPOCHS=15, LVP=80 40*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 45; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE. - -vector> dilations={{1,2},{4,8}};//Each vector represents one chunk of Dilateed LSTMS, connected in standard resnNet fashion -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM //so for Quarterly series, we do not use either the more advanced residual connections nor attention. -const bool ADD_NL_LAYER=false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -const float INITIAL_LEARNING_RATE = 0.001f; -const map LEARNING_RATES = { { 10,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 15; -const unsigned int STATE_HSIZE = 40; - -const int SEASONALITY = 4; -const unsigned int INPUT_SIZE = 4; -const int INPUT_SIZE_I= INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 8; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; -const int MIN_INP_SEQ_LEN = 0; -const float LEVEL_VARIABILITY_PENALTY = 80; //Multiplier for L" penalty against wigglines of level vector. Important. -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - - - -/* -string VARIABLE = "Monthly"; -const string run = "50/49 Res (1,3,6,12), LR=5e-4 {12,1e-4f}, EPOCHS=10, 20*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -#define USE_RESIDUAL_LSTM //so for Monthly we use only one block, so no standard resNet shortcuts, but instead but of the special residual shortcuts, after https://arxiv.org/abs/1701.03360. -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -vector> dilations={{1,3,6,12}};//so for Monthly we use only one block, so no standard resNet shortcut -const float INITIAL_LEARNING_RATE = 5e-4; -const map LEARNING_RATES = { { 12,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 10; -const unsigned int STATE_HSIZE = 50; - -const float LEVEL_VARIABILITY_PENALTY = 50; //Multiplier for L" penalty against wigglines of level vector. - -const int SEASONALITY = 12; -const unsigned int OUTPUT_SIZE = 18; -const unsigned int INPUT_SIZE = 12; -const int INPUT_SIZE_I= INPUT_SIZE; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years -*/ - - -/* -string VARIABLE = "Daily"; -const string run = "50/49 NL LRMult=1.5, 3/5 (1,7,28) LR=3e-4 {9,1e-4f} EPOCHS=15, LVP=100 HSIZE=40 20w"; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = true; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,7,28 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 9,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1.5; -const int NUM_OF_TRAIN_EPOCHS = 15; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const int INPUT_SIZE_I = INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 14; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to max of last 20 years -*/ - -Expression squash(Expression& x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 40; -#else - const int MAX_NUM_OF_SERIES = -1; //use all series -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6;//in data provided -const int BIG_LOOP = 3; -const int NUM_OF_CHUNKS = 2; -const float EPS=1e-6; -const int AVERAGING_LEVEL=5; -const bool USE_MEDIAN = false; -const int MIDDLE_POS_FOR_AVG = 2; //if using medians - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=20; -const float C_STATE_PENALTY = 0; - -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN=true; -const float TAU = PERCENTILE / 100.; -const float TRAINING_TAU = TRAINING_PERCENTILE / 100.; -const unsigned ATTENTION_HSIZE=STATE_HSIZE; - -const bool USE_AUTO_LEARNING_RATE=false; -//if USE_AUTO_LEARNING_RATE, and only if LBACK>0 -const float MIN_LEARNING_RATE = 0.0001f; -const float LR_RATIO = sqrt(10); -const float LR_TOLERANCE_MULTIP = 1.005; -const int L3_PERIOD = 2; -const int MIN_EPOCHS_BEFORE_CHANGING_LRATE = 2; - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE_I) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE_I; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE_I; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE_I); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) { //chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; -}; - -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - vector levels; - vector seasons; -}; - - -Expression pinBallLoss(const Expression& out_ex, const Expression& actuals_ex) {//used by Dynet, learning loss function - vector losses; - for (unsigned int indx = 0; indx as_scalar(forec.value())) - losses.push_back((actual - forec)*TRAINING_TAU); - else - losses.push_back((actual - forec)*(TRAINING_TAU - 1)); - } - return sum(losses) / OUTPUT_SIZE * 2; -} - - -//weighted quantile Loss, used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect) { - float sumf = 0; float suma=0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*TAU; - else - sumf = sumf + (actual - forec)*(TAU - 1); - } - return sumf / suma * 200; -} - -//used just for diagnostics, if LBACK>0 and PERCENTILE==50 -float sMAPE(vector& out_vect, vector& actuals_vect) { - float sumf = 0; - for (unsigned int indx = 0; indx& out_vect, vector& actuals_vect) { - if (PERCENTILE==50) - return sMAPE(out_vect, actuals_vect); - else - return wQuantLoss(out_vect, actuals_vect); -} - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int seedForChunks = 10; //Yes it runs, without any params, but it will work only on 1/NUM_OF_CHUNKS of all cases. The system is expected to run in NUM_OF_CHUNKS multiples. - int chunkNo = 1; - int ibigOffset = 0; - if (argc >= 3) { - seedForChunks = atoi(argv[1]); - chunkNo = atoi(argv[2]); - } - if (argc >= 4) - ibigOffset = atoi(argv[3]); - - if (chunkNo > NUM_OF_CHUNKS) { - cerr << "chunkNo > NUM_OF_CHUNKS"; - exit(-1); - } - else if (chunkNo <= 0) { - cerr << "chunkNo <= 0"; - exit(-1); - } - - cout<0) - std::cout<< " ibigOffset:"<< ibigOffset; //if continuing prematurely stopped run - if (LBACK>0) - std::cout<<" lback:"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)run.c_str(), 0, &nullTerminatedStringOfRun)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE_I+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister) - mt19937 rngForChunks(seedForChunks); - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 48/2=24k, for monthly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - allSeries_map[series] = m4Obj; - } - if (MAX_NUM_OF_SERIES>0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - - int series_len=(int)series_vect.size(); - int chunkSize= series_len/NUM_OF_CHUNKS; - std::cout << "num of series:" << series_vect.size() <<" size of chunk:"<< chunkSize< uniOnSeries(0, chunkSize -1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>> testResults_map((int)chunkSize*1.5); - set diagSeries; - - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - ParameterCollection pc; - ParameterCollection perSeriesPC; - - float learning_rate= INITIAL_LEARNING_RATE; - AdamTrainer trainer(pc, learning_rate, 0.9, 0.999, EPS); - trainer.clip_threshold = GRADIENT_CLIPPING; - AdamTrainer perSeriesTrainer(perSeriesPC, learning_rate*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainer.clip_threshold = GRADIENT_CLIPPING; - - #if defined USE_RESIDUAL_LSTM - vector rNNStack; - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(AttentiveDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, ATTENTION_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(DilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il oneChunk_vect(start,end); - if (PRINT_DIAGN) { - for (int k = 0; k<10; k++) //diag - cout << oneChunk_vect[k] << " "; - cout << endl; - } - if (chunkNo == NUM_OF_CHUNKS) - cout<<"last chunk size:"<< oneChunk_vect.size()< additionalParams_map((int)oneChunk_vect.size()*1.5); //per series - unordered_map*> historyOfAdditionalParams_map((int)oneChunk_vect.size()*1.5); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) {//setup - string series = *iter; - AdditionalParams addParams; - addParams.levSm = perSeriesPC.add_parameters({ 1 }, 0.5); //level smoothing - addParams.sSm = perSeriesPC.add_parameters({ 1 }, 0.5); //seasonality smoothing - for (int isea = 0; isea(); - } - - for (int iEpoch=0; iEpoch testLosses; //test losses of all series in this epoch - vector testAvgLosses; //test avg (over last few epochs) losses of all series in this epoch - vector trainingLosses; //training losses of all series in one epoch - vector forecLosses; vector levVarLosses; vector stateLosses; - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&iEpoch, 0, NULL)); - #endif - - for (auto iter = oneChunk_vect.begin() ; iter != oneChunk_vect.end(); ++iter) { - string series=*iter; - auto m4Obj = allSeries_map[series]; - - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); - #endif - - ComputationGraph cg; - for (int il=0; il season_exVect;//vector, because we do not know how long the series is - for (int iseas=0; iseas seas==1 - season_exVect.push_back(seas);//Expression is a simple struct, without any storage management, so the auto copy constructor works OK. - } - season_exVect.push_back(season_exVect[0]); - - vector logDiffOfLevels_vect; - vector levels_exVect; - Expression lev=cdiv(input(cg, m4Obj.vals[0]), season_exVect[0]); - levels_exVect.push_back(lev); - for (int i=1; i 0) { - vector levelVarLoss_v; - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx=season_exVect.size()-SEASONALITY; - for (int i=0;i<(OUTPUT_SIZE_I-SEASONALITY);i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx+i]); - } - vector losses; - for (int i=INPUT_SIZE_I-1; i<(m4Obj.n- OUTPUT_SIZE_I); i++) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() +i+1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex=input(cg,{INPUT_SIZE},input_vect); - Expression input1_ex=cdiv(input0_ex,inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]); - joinedInput_ex.emplace_back(noise(squash(input1_ex), NOISE_STD)); //normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex=concatenate(outputSeasonality_exVect); - - first = m4Obj.vals.begin() +i+1; - pastLast = m4Obj.vals.begin() +i+1+OUTPUT_SIZE_I; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels0_ex=input(cg,{OUTPUT_SIZE},labels_vect); - Expression labels1_ex=cdiv(labels0_ex,outputSeasonality_ex); //deseasonalization - labels1_ex= cdiv(labels1_ex, levels_exVect[i]);//normalization - Expression labels_ex=squash(labels1_ex); - - Expression loss_ex=pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE_I+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - } - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; it maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax = it; - layerOfMax = il; - chunkOfMax = irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - cout << " min season=" << minSeason << endl; - cout << " min level=" << minLevel << endl; - cout << " max abs:" << maxAbs << " at time:" << timeOfMax << " at layer:" << layerOfMax << " and chunk:" << chunkOfMax << endl; - - //diagSeries.insert(series); - pc.reset_gradient(); - perSeriesPC.reset_gradient(); - } - - //saving per-series values for diagnostics purposes - AdditionalParamsF &histAdditionalParams= historyOfAdditionalParams_map[series]->at(iEpoch); - histAdditionalParams.levSm=as_scalar(levSm_ex.value()); - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea=0; isea::const_iterator firstE = season_exVect.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex = concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression input1_ex = cdiv(input0_ex, inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]);//normalization - joinedInput_ex.emplace_back(squash(input1_ex)); - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - Expression out_ex; - if (ADD_NL_LAYER) { - out_ex=MLPW_ex*rnn_ex+MLPB_ex; - out_ex = adapterW_ex*tanh(out_ex)+adapterB_ex; - } else - out_ex=adapterW_ex*rnn_ex+adapterB_ex; - - out_ex = cmult(expand(out_ex), outputSeasonality_ex)*levels_exVect[i];//back to original scale - vector out_vect = as_vector(out_ex.value()); - - if (LBACK > 0) { - float qLoss = errorFunc(out_vect, m4Obj.testVals); - testLosses.push_back(qLoss); - } - - testResults_map[series][iEpoch%AVERAGING_LEVEL] = out_vect; - if (iEpoch >= AVERAGING_LEVEL) { - if (USE_MEDIAN) { - if (testResults_map[series][AVERAGING_LEVEL].size() == 0) - testResults_map[series][AVERAGING_LEVEL] = out_vect; //just to initialized, to make space. The values will be overwritten - for (int iii = 0; iii < OUTPUT_SIZE_I; iii++) { - vector temp_vect2; - for (int ii = 0; ii firstForec = testResults_map[series][0]; - testResults_map[series][AVERAGING_LEVEL] = firstForec; - for (int ii = 1; ii nextForec = testResults_map[series][ii]; - for (int iii = 0; iii 0) { - float qLoss = errorFunc(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals); - testAvgLosses.push_back(qLoss); - - #if defined USE_ODBC //save - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&forecastLoss, 0, NULL)); - - for (int io = 0; io < OUTPUT_SIZE_I; io++) { - int ipos=OFFSET_TO_FIRST_ACTUAL + 1 + 2*io; - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&m4Obj.testVals[io], 0, NULL)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos+1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&testResults_map[series][AVERAGING_LEVEL][io], 0, NULL)); - } - if (MAX_NUM_OF_SERIES<0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLExecute(hInsertStmt)); - #endif - } - } //time to average - }//last anchor point of the series - }//through TEST loop - }//through series - - - if (iEpoch % FREQ_OF_TEST == 0) { - float averageTrainingLoss = accumulate(trainingLosses.begin(), trainingLosses.end(), 0.0) / trainingLosses.size(); - - cout << ibig << " " << iEpoch << " loss:" << averageTrainingLoss * 100; - if (LEVEL_VARIABILITY_PENALTY > 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forecast loss:" << averageForecLoss*100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - - float averageTestLoss=0; - if (LBACK > 0) { - float averageTestLoss = accumulate(testLosses.begin(), testLosses.end(), 0.0) / testLosses.size(); - cout<<" Test loss:" << averageTestLoss; - if (iEpoch >= AVERAGING_LEVEL) { - float averageTestAvgLoss = accumulate(testAvgLosses.begin(), testAvgLosses.end(), 0.0) / testAvgLosses.size();//of this epoch - cout << " avgLoss:" << averageTestAvgLoss; - } - if (USE_AUTO_LEARNING_RATE) - perfValid_vect.push_back(averageTestLoss); - } - cout << endl; - } - - if (USE_AUTO_LEARNING_RATE) { - bool changeL2Rate = false; - if (iEpoch >= 2) { - if (iEpoch < L3_PERIOD) - changeL2Rate = perfValid_vect[perfValid_vect.size() - 2] MIN_LEARNING_RATE && (iEpoch - epochOfLastChangeOfLRate) >= MIN_EPOCHS_BEFORE_CHANGING_LRATE) { - learning_rate /= LR_RATIO; - cout << "decreasing LR to:" << learning_rate << endl; - epochOfLastChangeOfLRate = iEpoch; - trainer.learning_rate = learning_rate; - } - } - #if defined USE_ODBC - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLEndTran( - SQL_HANDLE_DBC, - hDbc, - SQL_COMMIT)); - #endif - }//through epochs - - if (PRINT_DIAGN) {//some diagnostic info - set diagSeries; - for (int i = 0; i<1; i++) {//add a few normal ones - int irand = uniOnSeries(rng); - diagSeries.insert(oneChunk_vect[irand]); - } - for (auto series : diagSeries) { - cout << endl << series << endl; - array* historyOfAdditionalParams_ptrToArr = historyOfAdditionalParams_map[series]; - cout << "lSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levSm << " "; - cout << endl; - cout << "sSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).sSm << " "; - cout << endl; - cout << "seasons:" << endl; - for (int isea = 0; iseaat(iEpoch).initSeasonality[isea] << " "; - cout << endl; - } - cout << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levels.size()>0) { - cout << "levels:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).levels.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).levels[iv] << ", "; - cout << endl; - cout << "seas:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).seasons.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).seasons[iv] << ", "; - cout << endl; - } - } - } - } - - //save the forecast to outputFile - ofstream outputFile; - outputFile.open(outputPath); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) { - string series = *iter; - outputFile<< series; - for (int io=0; io - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - RelWithDebug - Win32 - - - RelWithDebug - x64 - - - - - - - - - - - {928301A0-F01A-48F6-A499-851B3CE8BD4E} - Win32Proj - M41 - 8.1 - - - - Application - true - v140 - Unicode - - - Application - true - v140 - Unicode - - - Application - false - v140 - true - Unicode - - - Application - true - v140 - Unicode - Sequential - - - Application - true - v140 - Unicode - Sequential - - - Application - false - v140 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - false - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - NotUsing - Level1 - Disabled - WIN32;_WINDOWS;EIGEN_USE_MKL_ALL;EIGEN_FAST_MATH;NOMINMAX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - - - Console - true - E:\progs2\dynet\buildMKL\dynet\Debug - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - NotUsing - Level1 - MaxSpeed - WIN32;_WINDOWS;EIGEN_FAST_MATH;EIGEN_USE_MKL_ALL;NOMINMAX;NDEBUG_;CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - AnySuitable - true - Speed - AdvancedVectorExtensions - Default - MultiThreadedDLL - ProgramDatabase - true - false - - - Console - true - E:\progs2\dynet\buildMKL\dynet\RelWithDebInfo - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/M41.vcxproj.user b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/M41.vcxproj.user deleted file mode 100644 index 0129efb1..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/M41.vcxproj.user +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - WindowsLocalDebugger - - - - - WindowsLocalDebugger - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/slstm.cpp b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/slstm.cpp deleted file mode 100644 index ca53a03b..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/slstm.cpp +++ /dev/null @@ -1,729 +0,0 @@ -/* -My implementation of dilated LSTMs, based on Dynet LSTM builders -- DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) -- ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 -- AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#include "slstm.h" -#include "dynet/lstm.h" -#include "dynet/param-init.h" - -#include -#include -#include -#include - -#if defined DEBUG - #define _DEBUG -#endif - -using namespace std; - -namespace dynet { - - // ResidualDilatedLSTMBuilder based on Vanilla LSTM - enum { _X2I, _H2I, _BI, _X2F, _H2F, _BF, _X2O, _H2O, _BO, _X2G, _H2G, _BG }; - enum { LN_GH, LN_BH, LN_GX, LN_BX, LN_GC, LN_BC }; - - ResidualDilatedLSTMBuilder::ResidualDilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), ln_lstm(false), forget_bias(1.f), dropout_masks_valid(false) { } - - ResidualDilatedLSTMBuilder::ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm, float forget_bias) : dilations(dilations), layers(unsigned(dilations.size())), - input_dim(input_dim), hid(hidden_dim), ln_lstm(ln_lstm), forget_bias(forget_bias), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("ResidualDilated-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_x2i = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_h2i = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - //Parameter p_c2i = model.add_parameters({hidden_dim, hidden_dim}); - Parameter p_bi = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_x2i, p_h2i, /*p_c2i,*/ p_bi }; - params.push_back(ps); - - if (ln_lstm) { - Parameter p_gh = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(1.f)); - Parameter p_bh = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - Parameter p_gx = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(1.f)); - Parameter p_bx = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - Parameter p_gc = model.add_parameters({ hidden_dim }, ParameterInitConst(1.f)); - Parameter p_bc = model.add_parameters({ hidden_dim }, ParameterInitConst(0.f)); - vector ln_ps = { p_gh, p_bh, p_gx, p_bx, p_gc, p_bc }; - ln_params.push_back(ln_ps); - } - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void ResidualDilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - if (ln_lstm)ln_param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); } - param_vars.push_back(vars); - if (ln_lstm) { - auto& ln_p = ln_params[i]; - vector ln_vars; - for (unsigned j = 0; j < ln_p.size(); ++j) { ln_vars.push_back(update ? parameter(cg, ln_p[j]) : const_parameter(cg, ln_p[j])); } - ln_param_vars.push_back(ln_vars); - } - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void ResidualDilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "ResidualDilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } - else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void ResidualDilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & ResidualDilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression ResidualDilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "ResidualDilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = h.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression ResidualDilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "ResidualDilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = c.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression ResidualDilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset = dilations[i] - 1; - const vector& vars = param_vars[i]; - - Expression i_h_tm1, i_c_tm1; - bool has_prev_state = (prev >= 0 || has_initial_state); - if (prev < dilation_offset) { - if (has_initial_state) { - // intial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } - else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } - else { - i_h_tm1 = h[prev - dilation_offset][i]; - i_c_tm1 = c[prev - dilation_offset][i]; - } - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - if (dropout_rate > 0.f) { - in = cmult(in, masks[i][0]); - } - if (has_prev_state && dropout_rate_h > 0.f) - i_h_tm1 = cmult(i_h_tm1, masks[i][1]); - // input - Expression tmp; - Expression i_ait; - Expression i_aft; - Expression i_aot; - Expression i_agt; - if (ln_lstm) { - const vector& ln_vars = ln_param_vars[i]; - if (has_prev_state) - tmp = vars[_BI] + layer_norm(vars[_X2I] * in, ln_vars[LN_GX], ln_vars[LN_BX]) + layer_norm(vars[_H2I] * i_h_tm1, ln_vars[LN_GH], ln_vars[LN_BH]); - else - tmp = vars[_BI] + layer_norm(vars[_X2I] * in, ln_vars[LN_GX], ln_vars[LN_BX]); - } - else { - if (has_prev_state) - tmp = affine_transform({ vars[_BI], vars[_X2I], in, vars[_H2I], i_h_tm1 }); - else - tmp = affine_transform({ vars[_BI], vars[_X2I], in }); - } - i_ait = pick_range(tmp, 0, hid); - i_aft = pick_range(tmp, hid, hid * 2); - i_aot = pick_range(tmp, hid * 2, hid * 3); - i_agt = pick_range(tmp, hid * 3, hid * 4); - Expression i_it = logistic(i_ait); - if (forget_bias != 0.0) - tmp = logistic(i_aft + forget_bias); - else - tmp = logistic(i_aft); - - Expression i_ft = tmp; - Expression i_ot = logistic(i_aot); - Expression i_gt = tanh(i_agt); - - ct[i] = has_prev_state ? (cmult(i_ft, i_c_tm1) + cmult(i_it, i_gt)) : cmult(i_it, i_gt); - if (ln_lstm) { - const vector& ln_vars = ln_param_vars[i]; - if (i==0) - in = ht[i] = cmult(i_ot, tanh(layer_norm(ct[i], ln_vars[LN_GC], ln_vars[LN_BC]))); - else - in = ht[i] = cmult(i_ot, in+tanh(layer_norm(ct[i], ln_vars[LN_GC], ln_vars[LN_BC]))); - } - else { - if (i==0) - in = ht[i] = cmult(i_ot, tanh(ct[i])); - else - in = ht[i] = cmult(i_ot, in+tanh(ct[i])); - } - } - return ht.back(); - } - - void ResidualDilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const ResidualDilatedLSTMBuilder & rnn_lstm = (const ResidualDilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy ResidualDilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - for (size_t i = 0; i < ln_params.size(); ++i) - for (size_t j = 0; j < ln_params[i].size(); ++j) - ln_params[i][j] = rnn_lstm.ln_params[i][j]; - } - - void ResidualDilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void ResidualDilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void ResidualDilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - - - - //enum { _X2I, _H2I, _BI, _X2F, _H2F, _BF, _X2O, _H2O, _BO, _X2G, _H2G, _BG }; - enum { _X2I_, _H2I_, _BI_, _XA1, _HA1, _SA1, _BA1, _A2, _B2 }; - - -//*************************** - - - - AttentiveDilatedLSTMBuilder::AttentiveDilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), weightnoise_std(0), dropout_masks_valid(false) { } - - AttentiveDilatedLSTMBuilder::AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model) - : max_dilations(max_dilations), layers(unsigned(max_dilations.size())), - input_dim(input_dim), hid(hidden_dim), attention_dim(attention_dim), weightnoise_std(0), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("compact-vanilla-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_Wx = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_Wh = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - Parameter p_b = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - Parameter p_Wxa1 = local_model.add_parameters({ attention_dim, layer_input_dim }); - Parameter p_Wha1 = local_model.add_parameters({ attention_dim, hidden_dim }); - Parameter p_Wsa1 = local_model.add_parameters({ attention_dim, hidden_dim }); - Parameter p_ba1 = local_model.add_parameters({ attention_dim }, ParameterInitConst(0.f)); - - Parameter p_Wa2 = local_model.add_parameters({ max_dilations[i], attention_dim }); - Parameter p_ba2 = local_model.add_parameters({ max_dilations[i] }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_Wx, p_Wh, p_b, p_Wxa1, p_Wha1, p_Wsa1, p_ba1, p_Wa2, p_ba2 }; - params.push_back(ps); - - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void AttentiveDilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { - vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); - } - param_vars.push_back(vars); - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void AttentiveDilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "AttentiveDilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } - else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void AttentiveDilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & AttentiveDilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression AttentiveDilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "AttentiveDilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = unsigned(h.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression AttentiveDilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "AttentiveDilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = unsigned(c.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression AttentiveDilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset= max_dilations[i]-1; - const vector& vars = param_vars[i]; - Expression i_h_tm1, i_c_tm1; - if (prev < dilation_offset) { - if (has_initial_state) { - // initial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } - else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } - else { - if (dilation_offset>0) { - //enum { _X2I, _H2I, _BI, _XA1, _HA1, _SA1, _BA1, _A2, _B2 }; - Expression weights_ex=vars[_XA1]*in+ vars[_HA1]*h[prev][i]+ vars[_SA1]*c[prev][i]+ vars[_BA1]; - weights_ex=tanh(weights_ex); - weights_ex=vars[_A2]* weights_ex+ vars[_B2]; - weights_ex =softmax(weights_ex); - #if defined _DEBUG - vector weights=as_vector(weights_ex.value()); - #endif - - unsigned indx=0; - Expression w_ex = pick(weights_ex, indx); - Expression avg_h= cmult(h[prev][i], w_ex); - for (indx=1; indx <= dilation_offset; indx++) {//dilation_offset==max_dilations[i]-1, so together with indx==0, we cover max_dilations[i] steps - w_ex = pick(weights_ex, indx); - avg_h = avg_h+cmult(h[prev- indx][i], w_ex); - } - i_h_tm1 = avg_h; - } else { - i_h_tm1 = h[prev- dilation_offset][i]; - } - i_c_tm1 = c[prev- dilation_offset][i]; - } - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - Expression gates_t = vanilla_lstm_gates_dropout({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], masks[i][0], masks[i][1], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - else { - Expression gates_t = vanilla_lstm_gates({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - } - return ht.back(); - } - - void AttentiveDilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const AttentiveDilatedLSTMBuilder & rnn_lstm = (const AttentiveDilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy AttentiveDilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - } - - void AttentiveDilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void AttentiveDilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void AttentiveDilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - void AttentiveDilatedLSTMBuilder::set_weightnoise(float std) { - DYNET_ARG_CHECK(std >= 0.f, "weight noise must have standard deviation >=0"); - weightnoise_std = std; - } - - //*/ - - DilatedLSTMBuilder::DilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), weightnoise_std(0), dropout_masks_valid(false) { } - - DilatedLSTMBuilder::DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model) - : dilations(dilations), layers(unsigned(dilations.size())), - input_dim(input_dim), hid(hidden_dim), weightnoise_std(0), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("compact-vanilla-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_Wx = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_Wh = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - Parameter p_b = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_Wx, p_Wh, p_b }; - params.push_back(ps); - - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void DilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); } - param_vars.push_back(vars); - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void DilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "DilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void DilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & DilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression DilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "DilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = unsigned(h.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression DilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "DilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = unsigned(c.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression DilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset = dilations[i] - 1; - const vector& vars = param_vars[i]; - Expression i_h_tm1, i_c_tm1; - if (prev < dilation_offset) { - if (has_initial_state) { - // initial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } else { // t > 0 - i_h_tm1 = h[prev - dilation_offset][i]; - i_c_tm1 = c[prev - dilation_offset][i]; - } - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - Expression gates_t = vanilla_lstm_gates_dropout({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], masks[i][0], masks[i][1], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } else { - Expression gates_t = vanilla_lstm_gates({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - } - return ht.back(); - } - - void DilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const DilatedLSTMBuilder & rnn_lstm = (const DilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy DilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - } - - void DilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void DilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void DilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - void DilatedLSTMBuilder::set_weightnoise(float std) { - DYNET_ARG_CHECK(std >= 0.f, "weight noise must have standard deviation >=0"); - weightnoise_std = std; - } - -} // namespace dynet diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/slstm.h b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M41/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/ES_RNN_PI.cc b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/ES_RNN_PI.cc deleted file mode 100644 index d422584f..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/ES_RNN_PI.cc +++ /dev/null @@ -1,1247 +0,0 @@ -/*ES-RNN: ES-RNN Exponential Smoothing Recurrent Neural Network hybrid. Prediction intervals. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. -It is meant to be used for Monthly and Quarterly series of M4 competition, becasue the DE (Diversified Ensemble) version is too slow. -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -It has to be invoked in pair of executables, passing at least two integers: seedForChunks, chunkNo -so e.g. create a script with following lines on Windows -start 10 1 -start 10 2 -Modern computers have at more then 2 cores, so e.g. on 6-core machine create and run the following script with 3 pairs of workers: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -seedForChunks have to be the same withion one pair, chunk numbers have to be 1 and 2. -We have added here the third parameter: ibigOffset. The straddle should be equal or bigger than BIG_LOOP. -Each pair goes through BIG_LOOP (by default 3, change in code below if you want) of model fitting and prediction, -so 2 pairs, as above, will produce 6 forecasts to be ensembled later, in R. -By increasing number of pairs, e.g. to 6 on 12-core computer, one can reduce BIG_LOOP to 1, so reduce execution time, and still have 6 forecasts - -a decent number to ensemble (in a separate, supplied R script). - -There are three blocks of parameters below, one active (starting with //PARAMS--------------) and two inactive. -The active block is setup as in the final run of forecasting quarterly series. Similarly Monthly block. -The Daily block is more of a demo, allowing to run quickly forecast for Daily series, although with slightly worse performance (use another program ES_RNN_E.cc for it). It was not used for the final submission. -So, you need comment/uncomment to have one block of interest active. - - -*/ - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Quarterly"; -const string run0 = "(1,2),(4,8), LR=1e-3/{7,3e-4f},{11,1e-4f}, EPOCHS=16, LVP=200 40*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -vector> dilations = { { 1,2 },{ 4,8 } };//Each vector represents one chunk of Dilateed LSTMS, connected in resnNet fashion -const float INITIAL_LEARNING_RATE = 1e-3f; -//else -const map LEARNING_RATES = { { 7,3e-4f },{ 11,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -const int NUM_OF_TRAIN_EPOCHS = 16; -const unsigned int STATE_HSIZE = 40; - -const int SEASONALITY = 4; -const unsigned int INPUT_SIZE = 4; -const int INPUT_SIZE_I = INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 8; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I + MIN_INP_SEQ_LEN + 2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - -const float LEVEL_VARIABILITY_PENALTY = 200; //Multiplier for L" penalty against wigglines of level vector. - - -/* -string VARIABLE = "Monthly"; -const string run0 = "Res(1,3,6,12), LR=1e-3 {8,3e-4f},{13,1e-4f}, EPOCHS=14, LVP=50, 20*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -vector> dilations = { { 1,3,6,12 } };//Each vector represents one chunk of Dilateed LSTMS, connected in resnNet fashion^M -const float INITIAL_LEARNING_RATE = 1e-3f; -const map LEARNING_RATES = { { 8,3e-4f },{ 13,1e-4f } }; //at which epoch we set them up to what^M -const float PER_SERIES_LR_MULTIP = 1; - -const int NUM_OF_TRAIN_EPOCHS = 14; -const unsigned int STATE_HSIZE = 50; - -const float LEVEL_VARIABILITY_PENALTY = 50; //Multiplier for L" penalty against wigglines of level vector. - -const int SEASONALITY = 12; -const unsigned int OUTPUT_SIZE = 18; -const unsigned int INPUT_SIZE = 12; -const int INPUT_SIZE_I = INPUT_SIZE; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I + MIN_INP_SEQ_LEN + 2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; -*/ - -Expression squash(Expression& x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 40; -#else - const int MAX_NUM_OF_SERIES = -1; //use all series -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6;//in data provided -const int BIG_LOOP = 3; -const int NUM_OF_CHUNKS = 2; -const float EPS=1e-6; -const int AVERAGING_LEVEL=5; -const bool USE_MEDIAN = false; -const int MIDDLE_POS_FOR_AVG = 2; //if using medians - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=20; -const float C_STATE_PENALTY = 0; - -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN=true; -const unsigned ATTENTION_HSIZE=STATE_HSIZE; - -const bool USE_AUTO_LEARNING_RATE=false; -//if USE_AUTO_LEARNING_RATE, and only if LBACK>0 -const float MIN_LEARNING_RATE = 0.0001f; -const float LR_RATIO = sqrt(10); -const float LR_TOLERANCE_MULTIP = 1.005; -const int L3_PERIOD = 2; -const int MIN_EPOCHS_BEFORE_CHANGING_LRATE = 2; - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - float meanAbsSeasDiff; - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - - meanAbsSeasDiff = 0; - float sumf = 0; - for (int ip = SEASONALITY; ip0) - meanAbsSeasDiff = sumf / (vals.size() - SEASONALITY); - - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE_I) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE_I; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE_I; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE_I); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; -}; - -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - vector levels; - vector seasons; -}; - -//loss function -Expression MSIS(const Expression& out_ex, const Expression& actuals_ex) { - vector losses; - for (unsigned int indx = 0; indx as_scalar(forecH.value())) - loss = loss + (actual - forecH)*ALPHA_MULTIP; - losses.push_back(loss); - } - Expression ret = sum(losses) / OUTPUT_SIZE; - #if defined _DEBUG - float retf = as_scalar(ret.value()); - if (retf>100) { - vector out_vect = as_vector(out_ex.value()); - vector actuals_vect = as_vector(actuals_ex.value()); - for (int i = 0; i0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect, float tau, int offset) {//used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 - float sumf = 0; float suma = 0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*tau; - else - sumf = sumf + (actual - forec)*(tau - 1); - } - return sumf / suma * 200; -} - -//MSIS operating on floats, used for validation -float errorFunc(vector& out_vect, vector& actuals_vect, float meanAbsSeasDiff) { - float sumf=0; - for (unsigned int indx = 0; indx forecH) - loss = loss + (actualf - forecH)*ALPHA_MULTIP; - sumf+=loss; - } - return sumf / (OUTPUT_SIZE*meanAbsSeasDiff); -} - - - - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int seedForChunks = 10; //Yes it runs, without any params, but it will work only on 1/NUM_OF_CHUNKS of all cases. The system is expected to run in NUM_OF_CHUNKS multiples. - int chunkNo = 1; - int ibigOffset = 0; - if (argc >= 3) { - seedForChunks = atoi(argv[1]); - chunkNo = atoi(argv[2]); - } - if (argc >= 4) - ibigOffset = atoi(argv[3]); - - if (chunkNo > NUM_OF_CHUNKS) { - cerr << "chunkNo > NUM_OF_CHUNKS"; - exit(-1); - } - else if (chunkNo <= 0) { - cerr << "chunkNo <= 0"; - exit(-1); - } - - cout<0) - std::cout<< " ibigOffset:"<< ibigOffset; //if continuing prematurely stopped run - if (LBACK>0) - std::cout<<" lback:"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE_I+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister) - mt19937 rngForChunks(seedForChunks); - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 48/2=24k, for monthly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - if (m4Obj.meanAbsSeasDiff==0) { - cout<<"Warning, flat series:"<0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - - int series_len=(int)series_vect.size(); - int chunkSize= series_len/NUM_OF_CHUNKS; - std::cout << "num of series:" << series_vect.size() <<" size of chunk:"<< chunkSize< uniOnSeries(0, chunkSize -1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>> testResults_map((int)chunkSize*1.5); - set diagSeries; - - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - ParameterCollection pc; - ParameterCollection perSeriesPC; - - float learning_rate= INITIAL_LEARNING_RATE; - AdamTrainer trainer(pc, learning_rate, 0.9, 0.999, EPS); - trainer.clip_threshold = GRADIENT_CLIPPING; - AdamTrainer perSeriesTrainer(perSeriesPC, learning_rate*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainer.clip_threshold = GRADIENT_CLIPPING; - - #if defined USE_RESIDUAL_LSTM - vector rNNStack; - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(AttentiveDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, ATTENTION_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(DilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il oneChunk_vect(start,end); - if (PRINT_DIAGN) { - for (int k = 0; k<10; k++) //diag - cout << oneChunk_vect[k] << " "; - cout << endl; - } - if (chunkNo == NUM_OF_CHUNKS) - cout<<"last chunk size:"<< oneChunk_vect.size()< additionalParams_map((int)oneChunk_vect.size()*1.5); //per series - unordered_map*> historyOfAdditionalParams_map((int)oneChunk_vect.size()*1.5); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) {//setup - string series = *iter; - AdditionalParams addParams; - addParams.levSm = perSeriesPC.add_parameters({ 1 }, 0.5); //level smoothing - addParams.sSm = perSeriesPC.add_parameters({ 1 }, 0.5); //seasonality smoothing - for (int isea = 0; isea(); - } - - for (int iEpoch=0; iEpoch testLosses; //test losses of all series in this epoch - vector testAvgLosses; //test avg (over last few epochs) losses of all series in this epoch - vector testLossesL; //lower quantile loss - vector testAvgLossesL; //lower quantile loss - vector testLossesH; //higher quantile loss - vector testAvgLossesH; //higher quantile loss - vector trainingLosses; //training losses of all series in one epoch - vector forecLosses; vector levVarLosses; vector stateLosses; - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&iEpoch, 0, NULL)); - #endif - - for (auto iter = oneChunk_vect.begin() ; iter != oneChunk_vect.end(); ++iter) { - string series=*iter; - auto m4Obj = allSeries_map[series]; - - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); - #endif - - ComputationGraph cg; - for (int il=0; il season_exVect;//vector, because we do not know how long the series is - for (int iseas=0; iseas seas==1 - season_exVect.push_back(seas);//Expression is a simple struct, without any storage management, so the auto copy constructor works OK. - } - season_exVect.push_back(season_exVect[0]); - - vector logDiffOfLevels_vect; - vector levels_exVect; - Expression lev=cdiv(input(cg, m4Obj.vals[0]), season_exVect[0]); - levels_exVect.push_back(lev); - for (int i=1; i 0) { - vector levelVarLoss_v; - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx=season_exVect.size()-SEASONALITY; - for (int i=0;i<(OUTPUT_SIZE_I-SEASONALITY);i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx+i]); - } - vector losses; - for (int i=INPUT_SIZE_I-1; i<(m4Obj.n- OUTPUT_SIZE_I); i++) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() +i+1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex=input(cg,{INPUT_SIZE},input_vect); - Expression input1_ex=cdiv(input0_ex,inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]); - joinedInput_ex.emplace_back(noise(squash(input1_ex), NOISE_STD)); //normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex=concatenate(outputSeasonality_exVect); - - first = m4Obj.vals.begin() +i+1; - pastLast = m4Obj.vals.begin() +i+1+OUTPUT_SIZE_I; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels0_ex=input(cg,{OUTPUT_SIZE},labels_vect); - Expression labels1_ex=cdiv(labels0_ex,outputSeasonality_ex); //deseasonalization - labels1_ex= cdiv(labels1_ex, levels_exVect[i]);//normalization - Expression labels_ex=squash(labels1_ex); - - Expression loss_ex=MSIS(out_ex, labels_ex);//although out_ex has doubled size, labels_ex have normal size. NB, we do not have duplicated labels during training. - //Expression loss_ex=pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE_I+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - } - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; it maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax = it; - layerOfMax = il; - chunkOfMax = irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - cout << " min season=" << minSeason << endl; - cout << " min level=" << minLevel << endl; - cout << " max abs:" << maxAbs << " at time:" << timeOfMax << " at layer:" << layerOfMax << " and chunk:" << chunkOfMax << endl; - - //diagSeries.insert(series); - pc.reset_gradient(); - perSeriesPC.reset_gradient(); - } - - //saving per-series values for diagnostics purposes - AdditionalParamsF &histAdditionalParams= historyOfAdditionalParams_map[series]->at(iEpoch); - histAdditionalParams.levSm=as_scalar(levSm_ex.value()); - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea=0; isea::const_iterator firstE = season_exVect.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex = concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression input1_ex = cdiv(input0_ex, inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]);//normalization - joinedInput_ex.emplace_back(squash(input1_ex)); - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios=0; ios out_vect = as_vector(out_ex.value()); - - if (LBACK > 0) { - float qLoss = errorFunc(out_vect, m4Obj.testVals, m4Obj.meanAbsSeasDiff); - testLosses.push_back(qLoss); - - qLoss = wQuantLoss(out_vect, m4Obj.testVals, TAUL, 0); - testLossesL.push_back(qLoss); - - qLoss = wQuantLoss(out_vect, m4Obj.testVals, TAUH, OUTPUT_SIZE); - testLossesH.push_back(qLoss); - } - - testResults_map[series][iEpoch%AVERAGING_LEVEL] = out_vect; - if (iEpoch >= AVERAGING_LEVEL) { - if (USE_MEDIAN) { - if (testResults_map[series][AVERAGING_LEVEL].size() == 0) - testResults_map[series][AVERAGING_LEVEL] = out_vect; //just to initialized, to make space. The values will be overwritten - for (int iii = 0; iii < OUTPUT_SIZE_I*2; iii++) { - vector temp_vect2; - for (int ii = 0; ii firstForec = testResults_map[series][0]; - testResults_map[series][AVERAGING_LEVEL] = firstForec; - for (int ii = 1; ii nextForec = testResults_map[series][ii]; - for (int iii = 0; iii 0) { - float qLoss = errorFunc(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - testAvgLosses.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - testAvgLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - testAvgLossesH.push_back(qLoss); - - #if defined USE_ODBC //save - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&forecastLoss, 0, NULL)); - - for (int iv = 0; iv<2; iv++) { - if (iv == 0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runL.c_str(), 0, &nullTerminatedStringOfRun)) - else - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runH.c_str(), 0, &nullTerminatedStringOfRun)); - - for (int io = 0; io < OUTPUT_SIZE_I; io++) { - int ipos=OFFSET_TO_FIRST_ACTUAL + 1 + 2*io; - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&m4Obj.testVals[io], 0, NULL)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos+1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&testResults_map[series][AVERAGING_LEVEL][io + iv*OUTPUT_SIZE_I], 0, NULL)); - } - if (MAX_NUM_OF_SERIES<0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLExecute(hInsertStmt)); - } - #endif - } //lback>0 - } //time to average - }//last anchor point of the series - }//through TEST loop - }//through series - - - if (iEpoch % FREQ_OF_TEST == 0) { - float averageTrainingLoss = accumulate(trainingLosses.begin(), trainingLosses.end(), 0.0) / trainingLosses.size(); - - cout << ibig << " " << iEpoch << " loss:" << averageTrainingLoss * 100; - if (LEVEL_VARIABILITY_PENALTY > 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forecast loss:" << averageForecLoss*100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - - float averageTestLoss=0; - if (LBACK > 0) { - float averageTestLoss = accumulate(testLosses.begin(), testLosses.end(), 0.0) / testLosses.size(); - float averageTestLossL = accumulate(testLossesL.begin(), testLossesL.end(), 0.0) / testLossesL.size(); - float averageTestLossH = accumulate(testLossesH.begin(), testLossesH.end(), 0.0) / testLossesH.size(); - cout<<" Test loss:" << averageTestLoss<<" L:"<< averageTestLossL<<" H:"<< averageTestLossH; - if (iEpoch >= AVERAGING_LEVEL) { - float averageTestAvgLoss = accumulate(testAvgLosses.begin(), testAvgLosses.end(), 0.0) / testAvgLosses.size();//of this epoch - float averageTestAvgLossL = accumulate(testAvgLossesL.begin(), testAvgLossesL.end(), 0.0) / testAvgLossesL.size();//of this epoch - float averageTestAvgLossH = accumulate(testAvgLossesH.begin(), testAvgLossesH.end(), 0.0) / testAvgLossesH.size();//of this epoch - cout << " avgLoss:" << averageTestAvgLoss<<" L:"<< averageTestAvgLossL<<" H:"<< averageTestAvgLossH<= 2) { - if (iEpoch < L3_PERIOD) - changeL2Rate = perfValid_vect[perfValid_vect.size() - 2] MIN_LEARNING_RATE && (iEpoch - epochOfLastChangeOfLRate) >= MIN_EPOCHS_BEFORE_CHANGING_LRATE) { - learning_rate /= LR_RATIO; - cout << "decreasing LR to:" << learning_rate << endl; - epochOfLastChangeOfLRate = iEpoch; - trainer.learning_rate = learning_rate; - } - } - #if defined USE_ODBC - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLEndTran( - SQL_HANDLE_DBC, - hDbc, - SQL_COMMIT)); - #endif - }//through epochs - - if (PRINT_DIAGN) {//some diagnostic info - set diagSeries; - for (int i = 0; i<1; i++) {//add a few normal ones - int irand = uniOnSeries(rng); - diagSeries.insert(oneChunk_vect[irand]); - } - for (auto series : diagSeries) { - cout << endl << series << endl; - array* historyOfAdditionalParams_ptrToArr = historyOfAdditionalParams_map[series]; - cout << "lSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levSm << " "; - cout << endl; - cout << "sSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).sSm << " "; - cout << endl; - cout << "seasons:" << endl; - for (int isea = 0; iseaat(iEpoch).initSeasonality[isea] << " "; - cout << endl; - } - cout << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levels.size()>0) { - cout << "levels:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).levels.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).levels[iv] << ", "; - cout << endl; - cout << "seas:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).seasons.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).seasons[iv] << ", "; - cout << endl; - } - } - } - } - - //save the forecast to outputFile - ofstream outputFile; - outputFile.open(outputPathL); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) { - string series = *iter; - outputFile<< series; - for (int io=0; io - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - RelWithDebug - Win32 - - - RelWithDebug - x64 - - - - - - - - - - - {A16B5466-E680-43F6-A884-A4A01EB78E50} - Win32Proj - M42 - 8.1 - - - - Application - true - v140 - Unicode - - - Application - true - v140 - Unicode - - - Application - false - v140 - true - Unicode - - - Application - true - v140 - Unicode - Sequential - - - Application - true - v140 - Unicode - Sequential - - - Application - false - v140 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - false - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - NotUsing - Level1 - Disabled - WIN32;_WINDOWS;EIGEN_USE_MKL_ALL;EIGEN_FAST_MATH;NOMINMAX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - - - Console - true - E:\progs2\dynet\buildMKL\dynet\Debug - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - NotUsing - Level1 - MaxSpeed - WIN32;_WINDOWS;EIGEN_FAST_MATH;EIGEN_USE_MKL_ALL;NOMINMAX;NDEBUG_;CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - AnySuitable - true - Speed - AdvancedVectorExtensions - Default - MultiThreadedDLL - ProgramDatabase - true - false - - - Console - true - E:\progs2\dynet\buildMKL\dynet\RelWithDebInfo - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/M42.vcxproj.filters b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/M42.vcxproj.filters deleted file mode 100644 index d090dffe..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/M42.vcxproj.filters +++ /dev/null @@ -1,30 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - - - Header Files - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/M42.vcxproj.user b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/M42.vcxproj.user deleted file mode 100644 index 6fb136bf..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/M42.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/slstm.h b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M42/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/ES_RNN_E.cc b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/ES_RNN_E.cc deleted file mode 100644 index 5e39c33d..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/ES_RNN_E.cc +++ /dev/null @@ -1,1666 +0,0 @@ -/*ES-RNN-E: Exponential Smoothing Recurrent Neural Network hybrid, Ensemble of specialists. Point forecast. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. Non-seasonal, single, or double seasonal. -It is meant to be used for all types of series from M4 competition, except Monthly and Quarterly (for performance reasons - it is slower). -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -In contradistinction to ES-RNN, each executable uses all series, but in a similar manner repeating the whole learning process BIG_LOOP times (by default 3). -Invocation should pass BIG_LOOP offset -so e.g. create a script with following lines on Windows -start 0 -start 10 -start 20 -start 30 -on 4-core computer. -In this setup, learning and fitting would be repeated 4*3 times, probably unnecessarily too many, 6-8 independent runs should be enough for a good ensemble. -Therefore if running on say 8 core machine , one can extend the above script to 8 concurrent executions and reduce BIG_LOOP to 1. -(Creating final forecasts is done in a supplied R script) - -There are four blocks of parameters below, one active (starting with //PARAMS--------------) and three inactive. -These blocks are as they were during the final forecasting run. You need comment/uncomment to have one block of interest active. -*/ - - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -//#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Hourly"; -const string run = "50/49 Att 4/5 1,4)(24,168) LR=0.01,{7,5e-3f},{18,1e-3f},{22,3e-4f} EPOCHS=27, LVP=10, CSP=1"; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const float PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 2;//0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 24; -const int SEASONALITY2 = 168; -vector> dilations = { { 1,4 },{ 24, 168 } }; - -const float INITIAL_LEARNING_RATE = 0.01f; -const map LEARNING_RATES = { { 7,5e-3f },{ 18,1e-3f },{ 22,3e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 27; - -float LEVEL_VARIABILITY_PENALTY = 10; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 1; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 24; -const unsigned int OUTPUT_SIZE = 48; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 53 * SEASONALITY2 + MIN_SERIES_LENGTH; //==all -const int TOPN = 4; - - -/* -string VARIABLE = "Weekly"; -const string run = "50/47 Att 3/5 (1,52) LR=1e-3 {11,3e-4f}, {17,1e-4f} EPOCHS=23, LVP=100 6y"; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 47; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 0; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 52; -const int SEASONALITY2 = 0; -vector> dilations = { { 1, 52 } }; - -const float INITIAL_LEARNING_RATE = 1e-3; -const map LEARNING_RATES = { { 11,3e-4f },{ 17,1e-4f } }; //at which epoch we manually set them up to what -const int NUM_OF_TRAIN_EPOCHS = 23; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; -const float PER_SERIES_LR_MULTIP = 1; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 10; -const unsigned int OUTPUT_SIZE = 13; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#81 380 935 1023 1604 2598 -const int MAX_SERIES_LENGTH = 6 * SEASONALITY + MIN_SERIES_LENGTH; //==all -const int TOPN = 3; -*/ - -/* -string VARIABLE = "Daily"; -const string run = "Final 50/49 730 4/5 (1,3)(7,14) LR=3e-4 {9,1e-4f} EPOCHS=13, LVP=100 13w"; -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,3 },{ 7, 14 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 9,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 13; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const unsigned int OUTPUT_SIZE = 14; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //##93 323 2940 2357 4197 9919 -const int MAX_SERIES_LENGTH = 13 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* -string VARIABLE = "Yearly"; -const string run = "50 Att 4/5 (1,6) LR=1e-4 EPOCHS=12, 60*"; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const float PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 50; - -const int SEASONALITY_NUM = 0; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 0; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,6 } }; - -const float INITIAL_LEARNING_RATE = 1e-4; -const map LEARNING_RATES = { { 15,1e-5 } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 12; - -float LEVEL_VARIABILITY_PENALTY = 0; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 30; - -const unsigned int INPUT_SIZE = 4; -const unsigned int OUTPUT_SIZE = 6; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#13.00 20.00 29.00 31.32 40.00 835.00 -const int MAX_SERIES_LENGTH = 60 + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -//end of VARIABLE-specific params - -const int BIG_LOOP = 3; -const int NUM_OF_NETS = 5; -const unsigned int ATTENTION_HSIZE = STATE_HSIZE; - - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 20; -#else - const int MAX_NUM_OF_SERIES = -1; -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6; -const int AVERAGING_LEVEL = 5; -const float EPS=1e-6; - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=50; -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN = false; -const float TAU = PERCENTILE / 100.; -const float TRAINING_TAU = TRAINING_PERCENTILE / 100.; - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - - -Expression squash(Expression& x) { - return log(x); -} -float squash(float x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} -float expand(float x) { - return exp(x); -} - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - -#if defined USE_ODBC -void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); -#endif - - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; - Parameter sSm2; - array initSeasonality2; -}; -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - float sSm2; - array initSeasonality2; - vector levels; - vector seasons; - vector seasons2; -}; - - -array perfToRanking (array perf_arr) { - array index; - - for (int itop=0; itop losses; - for (unsigned int indx = 0; indx as_scalar(forec.value())) - losses.push_back((actual - forec)*TRAINING_TAU); - else - losses.push_back((actual - forec)*(TRAINING_TAU - 1)); - } - return sum(losses) / OUTPUT_SIZE * 2; -} - - -// weighted quantile Loss, used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect) { - float sumf = 0; float suma=0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*TAU; - else - sumf = sumf + (actual - forec)*(TAU - 1); - } - return sumf / suma * 200; -} - -//used just for diagnostics, if LBACK>0 and PERCENTILE==50 -float sMAPE(vector& out_vect, vector& actuals_vect) { - float sumf = 0; - for (unsigned int indx = 0; indx& out_vect, vector& actuals_vect) { - if (PERCENTILE==50) - return sMAPE(out_vect, actuals_vect); - else - return wQuantLoss(out_vect, actuals_vect); -} - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int ibigOffset = 0; - if (argc == 2) - ibigOffset = atoi(argv[1]); - - cout << VARIABLE<<" "< 0) { - cout<<"Warning. LEVEL_VARIABILITY_PENALTY has to be equal zero if SEASONALITY_NUM==0"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)run.c_str(), 0, &nullTerminatedStringOfRun)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 24k for yearly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - allSeries_map[series] = m4Obj; - } - if (MAX_NUM_OF_SERIES>0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - cout << "num of series:" << series_vect.size() << endl; - - unsigned int series_len=(unsigned int)series_vect.size(); - uniform_int_distribution uniOnSeries(0,series_len-1); // closed interval [a, b] - uniform_int_distribution uniOnNets(0,NUM_OF_NETS-1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>> testResults_map((int)series_len*1.5);//per series, etc... - unordered_map> finalResults_map((int)series_len*1.5);//per series - set diagSeries; - - unordered_map> netRanking_map; - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - //create nets - array paramsCollection_arr;//per net - array perSeriesParamsCollection_arr;//per net - array trainers_arr; - array perSeriesTrainers_arr; - - - #if defined USE_RESIDUAL_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #elif defined USE_ATTENTIVE_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #else - array, NUM_OF_NETS> rnnStack_arr; - #endif - - array MLPW_parArr; - array MLPB_parArr; - array adapterW_parArr; - array adapterB_parArr; - - //this is not a history, this is the real stuff - unordered_map* > additionalParams_mapOfArr((int)series_len*1.5); //per series, per net - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - additionalParams_mapOfArr[series]=new array(); - } - - for (int inet=0; inetclip_threshold = GRADIENT_CLIPPING; - perSeriesTrainers_arr[inet]=new AdamTrainer (perSeriesPC, INITIAL_LEARNING_RATE*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainers_arr[inet]->clip_threshold = GRADIENT_CLIPPING; - - auto& rNNStack=rnnStack_arr[inet]; - #if defined USE_RESIDUAL_LSTM - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il* additionalParams_arr=additionalParams_mapOfArr[series]; - additionalParams_arr->at(inet).levSm=perSeriesPC.add_parameters({1}, 0.5);//per series, per net - if (SEASONALITY_NUM > 0) { - additionalParams_arr->at(inet).sSm = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - if (SEASONALITY_NUM > 1) { - additionalParams_arr->at(inet).sSm2 = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality2[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - } - }//seting up, through nets - - //history of params. Series->[NUM_OF_NETS,NUM_OF_TRAIN_EPOCHS] - unordered_map, NUM_OF_NETS>*> historyOfAdditionalParams_map((int)series_len*1.5); - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - historyOfAdditionalParams_map[series]=new array, NUM_OF_NETS>(); - } - - //first assignment. Yes, we are using vector , so the very first time the duplicates are possible. But a set can't be sorted - array, NUM_OF_NETS> seriesAssignment;//every net has an array - for (int j=0; j> netPerf_map; - for (int inet=0; inetlearning_rate = LEARNING_RATES.at(iEpoch); - if (inet==0) - cout << "changing LR to:" << trainer->learning_rate << endl; - perSeriesTrainer->learning_rate = LEARNING_RATES.at(iEpoch)*PER_SERIES_LR_MULTIP; - } - - auto& rNNStack=rnnStack_arr[inet]; - Parameter& MLPW_par = MLPW_parArr[inet]; - Parameter& MLPB_par = MLPB_parArr[inet]; - Parameter& adapterW_par=adapterW_parArr[inet]; - Parameter& adapterB_par=adapterB_parArr[inet]; - - vector oneNetAssignments=seriesAssignment[inet]; - random_shuffle (oneNetAssignments.begin(), oneNetAssignments.end()); - - vector epochLosses; - vector forecLosses; vector levVarLosses; vector stateLosses; - for (auto iter = oneNetAssignments.begin() ; iter != oneNetAssignments.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - - ComputationGraph cg; - for (int il=0; ilat(inet); - array& historyOfAdditionalParams_arr=historyOfAdditionalParams_map[series]->at(inet); - - Expression MLPW_ex,MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex= parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea logDiffOfLevels_vect; - vector levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - Expression levelVarLoss_ex; - if (LEVEL_VARIABILITY_PENALTY > 0) { - vector levelVarLoss_v; - for (int i = 1; i losses;//losses of steps through single time series - for (int i=INPUT_SIZE-1; i<(m4Obj.n- OUTPUT_SIZE); i++) { - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - - first = m4Obj.vals.begin() + i + 1; - pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - firstE = season_exVect.begin() + i + 1; - pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - - firstE = season2_exVect.begin() + i + 1; - pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - }//through points of a series - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; itupdate();//update shared weights - perSeriesTrainer->update(); //update params of this series only - } catch (exception& e) { //long diagnostics for this unlikely event :-) - cerr<<"cought exception while doing "< maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax=it; - layerOfMax=il; - chunkOfMax= irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - if (SEASONALITY_NUM > 0) - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - if (SEASONALITY_NUM > 1) - cout << "sSm2:" << as_scalar(sSm2_ex.value()) << endl; - cout << "max abs:" << maxAbs <<" at time:"<< timeOfMax<<" at layer:"<< layerOfMax<<" and chunk:"<< chunkOfMax< 0) { - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea = 0; isea 1) { - histAdditionalParams.sSm2 = as_scalar(sSm2_ex.value()); - for (int isea=0; isea 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forec loss:" << averageForecLoss * 100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - cout<at(inet); - Expression MLPW_ex, MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex = parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; i0 then this is shortened, so it always contains data awe have right to access - Expression newLevel_ex = m4Obj.vals[i] * cdiv(levSm_ex, season_exVect[i]) + (1 - levSm_ex)*levels_exVect[i - 1]; - levels_exVect.push_back(newLevel_ex); - - Expression newSeason_ex = m4Obj.vals[i] * cdiv(sSm_ex, newLevel_ex) + (1 - sSm_ex)*season_exVect[i]; - season_exVect.push_back(newSeason_ex); - } - - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - - Expression inputSeasonality_ex; Expression inputSeasonality2_ex; - Expression outputSeasonality_ex; Expression outputSeasonality2_ex; - vector losses;//losses of steps through single time series - Expression out_ex;//we declare it here, bcause the last one will be the forecast - for (int i=INPUT_SIZE-1; i::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il::const_iterator first = m4Obj.vals.begin() + i + 1; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression loss_ex = pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); //training area losses - } - - if (i==(m4Obj.n-1)) {//validation loss - out_ex=expand(out_ex)*levels_exVect[i];//back to original scale - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - out_ex = cmult(out_ex, outputSeasonality_ex);//reseasonalize - } - if (SEASONALITY_NUM > 1 ) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - out_ex = cmult(out_ex, outputSeasonality2_ex);//reseasonalize - } - //we do not need the matching label here, because we do not bother calculate valid losses of each net across all series. - //We care about best and topn performance - } - }//end of going through all point of a series - - Expression loss_exp = average(losses); - float loss = as_scalar(cg.forward(loss_exp));//training loss of a single series - netPerf_map[series][inet]=loss; - - //unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>, BIG_LOOP>> testResults_map((int)series_len*1.5);//per series, big loop, etc... - //No epoch here, because this will just reflect the current (latest) situation - the last few epochs - vector out_vect=as_vector(out_ex.value()); - testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]=out_vect; - if (iEpoch>=AVERAGING_LEVEL && iEpoch % FREQ_OF_TEST==0) { - vector firstForec=testResults_map[series][inet][0]; - testResults_map[series][inet][AVERAGING_LEVEL]=firstForec; - for (int ii=1; ii nextForec=testResults_map[series][inet][ii]; - for (int iii=0; iii0 && iEpoch % FREQ_OF_TEST==0) { - //now that we have saved outputs of all nets on all series, let's calc how best and topn combinations performed during current epoch. - vector bestEpochLosses; - vector bestEpochAvgLosses; - vector topnEpochLosses; - vector topnEpochAvgLosses; - - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); -#endif - - float avgLoss; - vector avgLatest; - vector avgAvg; - - for (int itop=0; itop 0) { - float qLoss = errorFunc(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals); - bestEpochLosses.push_back(qLoss); - } - avgLatest=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]; //used later for calculating topn loss - - if (iEpoch>=AVERAGING_LEVEL) { - if (LBACK > 0) { - float qLoss = errorFunc(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals); - bestEpochAvgLosses.push_back(qLoss); - } - avgAvg=testResults_map[series][inet][AVERAGING_LEVEL]; - } - } else { - for (int iii=0; iii=AVERAGING_LEVEL) - avgAvg[iii]+=testResults_map[series][inet][AVERAGING_LEVEL][iii]; - } - } - }//through topn - - for (int iii=0; iii 0) { - float qLoss = errorFunc(avgLatest, m4Obj.testVals); - topnEpochLosses.push_back(qLoss); - } - - if (iEpoch>=AVERAGING_LEVEL) { - for (int iii = 0; iii 0) { -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&avgLoss, 0, NULL)); - - for (int iii=0; iii 0) { - float bestEpochLoss=accumulate( bestEpochLosses.begin(), bestEpochLosses.end(), 0.0)/bestEpochLosses.size(); - float topnEpochLoss=accumulate( topnEpochLosses.begin(), topnEpochLosses.end(), 0.0)/topnEpochLosses.size(); - cout<=AVERAGING_LEVEL) { - float bestEpochAvgLoss=accumulate( bestEpochAvgLosses.begin(), bestEpochAvgLosses.end(), 0.0)/bestEpochAvgLosses.size(); - float topnEpochAvgLoss=accumulate( topnEpochAvgLosses.begin(), topnEpochAvgLosses.end(), 0.0)/topnEpochAvgLosses.size(); - cout<<" bestAvg:"<> netRanking_map - netRanking_map[series]=perfToRanking(netPerf_map[series]); - - for (int itop=0; itop diagSeries; - for (int i=0; i<1; i++) {//add a few normal ones - int irand=uniOnSeries(rng); - diagSeries.insert(series_vect[irand]); - } - for(auto series : diagSeries) { - cout<at(inet); - for (int iEpoch=0; iEpoch 0 ) { - cout<<"sSm:"<at(inet); - for (int iEpoch=0; iEpoch 1 ) { - cout<<"sSm2:"<at(inet); - for (int iEpoch=0; iEpochat(inet); - for (int iEpoch = 0; iEpoch0) { - cout << "levels:" << iEpoch<<" "; - for (int iv = 0; iv 0 ) { - cout << "seasons:" << iEpoch<<" "; - for (int iv = 0; iv 1 ) { - cout << "seasons2:" << iEpoch<<" "; - for (int iv = 0; iv - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Source Files - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/M43.vcxproj b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/M43.vcxproj deleted file mode 100644 index 3ab126fa..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/M43.vcxproj +++ /dev/null @@ -1,227 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - RelWithDebug - Win32 - - - RelWithDebug - x64 - - - - - - - - - - - {BE951571-3F3A-4048-BAA3-0C05F38CFF42} - Win32Proj - M43 - 8.1 - - - - Application - true - v140 - Unicode - - - Application - true - v140 - Unicode - - - Application - false - v140 - true - Unicode - - - Application - true - v140 - Unicode - Sequential - - - Application - true - v140 - Unicode - Sequential - - - Application - false - v140 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - false - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - NotUsing - Level1 - Disabled - WIN32;_WINDOWS;EIGEN_USE_MKL_ALL;EIGEN_FAST_MATH;NOMINMAX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - - - Console - true - E:\progs2\dynet\buildMKL\dynet\Debug - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - NotUsing - Level1 - MaxSpeed - WIN32;_WINDOWS;EIGEN_FAST_MATH;EIGEN_USE_MKL_ALL;NOMINMAX;NDEBUG_;CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - AnySuitable - true - Speed - AdvancedVectorExtensions - Default - MultiThreadedDLL - ProgramDatabase - true - false - - - Console - true - E:\progs2\dynet\buildMKL\dynet\RelWithDebInfo - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/M43.vcxproj.user b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/M43.vcxproj.user deleted file mode 100644 index 6fb136bf..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/M43.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/slstm.h b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M43/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/ES_RNN_E_PI.cc b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/ES_RNN_E_PI.cc deleted file mode 100644 index f016c3a9..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/ES_RNN_E_PI.cc +++ /dev/null @@ -1,1745 +0,0 @@ -/*ES-RNN-E: Exponential Smoothing Recurrent Neural Network hybrid, Ensemble of specialists. Prediction Intervals forecast. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. Non-seasonal, single, or double seasonal. -It is meant to be used for all types of series from M4 competition, except Monthly and Quarterly (for performance reasons - Ensamble of Specilists is slower). -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -In contradistinction to ES-RNN, each executable uses all series, but in a similar manner repeating the whole learning process BIG_LOOP times (by default 3). -Invocation should pass BIG_LOOP offset -so e.g. create a script with following lines on Windows -start 0 -start 10 -start 20 -start 30 -on 4-core computer. -In this setup, learning and fitting would be repeated 4*3 times, probably unnecessarily too many, 6-8 independent runs should be enough for a good ensemble. -Therefore if running on say 8 core machine , one can extend the above script to 8 concurrent executions and reduce BIG_LOOP to 1. -(Creating final forecasts is done in a supplied R script) - -There are four blocks of parameters below, one active (starting with //PARAMS--------------) and three inactive. -These blocks are as they were during the final forecasting run. You need comment/uncomment to have one block of interest active. -*/ - - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -//#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- - -string VARIABLE = "Hourly"; -const string run0 = "(1,4)(24,168) LR=0.01, {25,3e-3f} EPOCHS=37, LVP=10, CSP=0"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 2;//0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 24; -const int SEASONALITY2 = 168; -vector> dilations = { { 1,4 },{ 24, 168 } }; - -const float INITIAL_LEARNING_RATE = 0.01f; -const map LEARNING_RATES = { { 20,1e-3f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 37; - -float LEVEL_VARIABILITY_PENALTY = 10; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 24; -const unsigned int OUTPUT_SIZE = 48; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 53 * SEASONALITY2 + MIN_SERIES_LENGTH; //==all -const int TOPN = 4; - - -/* -string VARIABLE = "Weekly"; -const string run0 = "Att 4/5 (1,52) LR=1e-3 {15,3e-4f} EPOCHS=31, LVP=100 6y"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 52; -const int SEASONALITY2 = 0; -vector> dilations = { { 1, 52 } }; - -const float INITIAL_LEARNING_RATE = 1e-3; -const map LEARNING_RATES = { { 15,3e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 31; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 10; -const unsigned int OUTPUT_SIZE = 13; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#81 380 935 1023 1604 2598 -const int MAX_SERIES_LENGTH = 6 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* - -string VARIABLE = "Daily"; -const string run0 = "4/5 (1,3)(7,14) LR=3e-4 {13,1e-4f} EPOCHS=21, LVP=100 13w"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER=false; - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,3 },{ 7, 14 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 13,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 21; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const unsigned int OUTPUT_SIZE = 14; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //##93 323 2940 2357 4197 9919 -const int MAX_SERIES_LENGTH = 13 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* -string VARIABLE = "Yearly"; -const string run0 = "Att NL 4/5 (1,6) LR=1e-4 {17,3e-5}{22,1e-5} EPOCHS=29, 60*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = true; - -const int SEASONALITY_NUM = 0; //0 means no seasonality -const int SEASONALITY = 1; //for no seasonality, set it to 1, important -const int SEASONALITY2 = 0; -vector> dilations = { { 1,6 } }; - -const float INITIAL_LEARNING_RATE = 1e-4; -const map LEARNING_RATES = { { 17,3e-5 },{ 22,1e-5 } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 29; - -float LEVEL_VARIABILITY_PENALTY = 0; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 30; - -const unsigned int INPUT_SIZE = 4; -const unsigned int OUTPUT_SIZE = 6; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#13.00 20.00 29.00 31.32 40.00 835.00 -const int MAX_SERIES_LENGTH = 60 + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; - -const int BIG_LOOP = 3; -const int NUM_OF_NETS = 5; -const unsigned ATTENTION_HSIZE = STATE_HSIZE; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 20; -#else - const int MAX_NUM_OF_SERIES = -1; -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6; -const int AVERAGING_LEVEL = 5; -const float EPS=1e-6; - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=50; -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN = false; - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - - -Expression squash(Expression& x) { - return log(x); -} -float squash(float x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} -float expand(float x) { - return exp(x); -} - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - float meanAbsSeasDiff; - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - - meanAbsSeasDiff = 0; - float sumf = 0; - for (int ip = SEASONALITY; ip0) - meanAbsSeasDiff = sumf / (vals.size() - SEASONALITY); - - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - -#if defined USE_ODBC -void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); -#endif - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; - Parameter sSm2; - array initSeasonality2; -}; -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - float sSm2; - array initSeasonality2; - vector levels; - vector seasons; - vector seasons2; -}; - - -array perfToRanking (array perf_arr) { - array index; - - for (int itop=0; itop losses; - for (unsigned int indx = 0; indx as_scalar(forecH.value())) - loss = loss + (actual - forecH)*ALPHA_MULTIP; - losses.push_back(loss); - } - return sum(losses) / OUTPUT_SIZE; -} - -// weighted quantile Loss -float wQuantLoss(vector& out_vect, vector& actuals_vect, float tau, int offset) {//used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 - float sumf = 0; float suma = 0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*tau; - else - sumf = sumf + (actual - forec)*(tau - 1); - } - return sumf / suma * 200; -} - -float errorFunc(vector& out_vect, vector& actuals_vect, float meanAbsSeasDiff) { - float sumf=0; - for (unsigned int indx = 0; indx forecH) - loss = loss + (actualf - forecH)*ALPHA_MULTIP; - sumf+=loss; - } - return sumf / (OUTPUT_SIZE*meanAbsSeasDiff); -} - - - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int ibigOffset = 0; - if (argc == 2) - ibigOffset = atoi(argv[1]); - - cout< 0) { - cout<<"Warning. LEVEL_VARIABILITY_PENALTY has to be equal zero if SEASONALITY_NUM==0"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 24k for yearly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - if (m4Obj.meanAbsSeasDiff==0) { - cout<<"Warning, flat series:"<0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - cout << "num of series:" << series_vect.size() << endl; - - unsigned int series_len=(unsigned int)series_vect.size(); - uniform_int_distribution uniOnSeries(0,series_len-1); // closed interval [a, b] - uniform_int_distribution uniOnNets(0,NUM_OF_NETS-1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>> testResults_map((int)series_len*1.5);//per series, etc... - unordered_map> finalResults_map((int)series_len*1.5);//per series - set diagSeries; - - unordered_map> netRanking_map; - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - //create nets - array paramsCollection_arr;//per net - array perSeriesParamsCollection_arr;//per net - array trainers_arr; - array perSeriesTrainers_arr; - - - #if defined USE_RESIDUAL_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #elif defined USE_ATTENTIVE_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #else - array, NUM_OF_NETS> rnnStack_arr; - #endif - - array MLPW_parArr; - array MLPB_parArr; - array adapterW_parArr; - array adapterB_parArr; - - //this is not a history, this is the real stuff - unordered_map* > additionalParams_mapOfArr((int)series_len*1.5); //per series, per net - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - additionalParams_mapOfArr[series]=new array(); - } - - for (int inet=0; inetclip_threshold = GRADIENT_CLIPPING; - perSeriesTrainers_arr[inet]=new AdamTrainer (perSeriesPC, INITIAL_LEARNING_RATE*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainers_arr[inet]->clip_threshold = GRADIENT_CLIPPING; - - auto& rNNStack=rnnStack_arr[inet]; - #if defined USE_RESIDUAL_LSTM - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il* additionalParams_arr=additionalParams_mapOfArr[series]; - additionalParams_arr->at(inet).levSm=perSeriesPC.add_parameters({1}, 0.5);//per series, per net - if (SEASONALITY_NUM > 0) { - additionalParams_arr->at(inet).sSm = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - if (SEASONALITY_NUM > 1) { - additionalParams_arr->at(inet).sSm2 = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality2[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - } - }//seting up, through nets - - //history of params. Series->[NUM_OF_NETS,NUM_OF_TRAIN_EPOCHS] - unordered_map, NUM_OF_NETS>*> historyOfAdditionalParams_map((int)series_len*1.5); - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - historyOfAdditionalParams_map[series]=new array, NUM_OF_NETS>(); - } - - //first assignment. Yes, we are using vector , so the very first time the duplicates are possible. But a set can't be sorted - array, NUM_OF_NETS> seriesAssignment;//every net has an array - for (int j=0; j> netPerf_map; - for (int inet=0; inetlearning_rate = LEARNING_RATES.at(iEpoch); - if (inet==0) - cout << "changing LR to:" << trainer->learning_rate << endl; - perSeriesTrainer->learning_rate = LEARNING_RATES.at(iEpoch)*PER_SERIES_LR_MULTIP; - } - - auto& rNNStack=rnnStack_arr[inet]; - Parameter& MLPW_par = MLPW_parArr[inet]; - Parameter& MLPB_par = MLPB_parArr[inet]; - Parameter& adapterW_par=adapterW_parArr[inet]; - Parameter& adapterB_par=adapterB_parArr[inet]; - - vector oneNetAssignments=seriesAssignment[inet]; - random_shuffle (oneNetAssignments.begin(), oneNetAssignments.end()); - - vector epochLosses; - vector forecLosses; vector levVarLosses; vector stateLosses; - for (auto iter = oneNetAssignments.begin() ; iter != oneNetAssignments.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - - ComputationGraph cg; - for (int il=0; ilat(inet); - array& historyOfAdditionalParams_arr=historyOfAdditionalParams_map[series]->at(inet); - - Expression MLPW_ex,MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex= parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea logDiffOfLevels_vect; - vector levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - Expression levelVarLoss_ex; - if (LEVEL_VARIABILITY_PENALTY > 0) { - vector levelVarLoss_v; - for (int i = 1; i losses;//losses of steps through single time series - for (int i=INPUT_SIZE-1; i<(m4Obj.n- OUTPUT_SIZE); i++) { - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - - first = m4Obj.vals.begin() + i + 1; - pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - firstE = season_exVect.begin() + i + 1; - pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - - firstE = season2_exVect.begin() + i + 1; - pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - }//through points of a series - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; itupdate();//update shared weights - perSeriesTrainer->update();//update params of this series only - } catch (exception& e) {//it may happen occasionally. I believe it is due to not robust enough implementation of squashing functions in Dynet. When abs(x)>35 NAs appear. - //so the code below is trying to produce some diagnostics, hopefully useful when setting LEVEL_VARIABILITY_PENALTY and C_STATE_PENALTY. - cerr<<"cought exception while doing "< maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax=it; - layerOfMax=il; - chunkOfMax= irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - if (SEASONALITY_NUM > 0) - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - if (SEASONALITY_NUM > 1) - cout << "sSm2:" << as_scalar(sSm2_ex.value()) << endl; - cout << "max abs:" << maxAbs <<" at time:"<< timeOfMax<<" at layer:"<< layerOfMax<<" and chunk:"<< chunkOfMax< 0) { - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea = 0; isea 1) { - histAdditionalParams.sSm2 = as_scalar(sSm2_ex.value()); - for (int isea=0; isea 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forec loss:" << averageForecLoss * 100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - cout<at(inet); - Expression MLPW_ex, MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex = parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; i0 then this is shortened, so it always contains data awe have right to access - Expression newLevel_ex = m4Obj.vals[i] * cdiv(levSm_ex, season_exVect[i]) + (1 - levSm_ex)*levels_exVect[i - 1]; - levels_exVect.push_back(newLevel_ex); - - Expression newSeason_ex = m4Obj.vals[i] * cdiv(sSm_ex, newLevel_ex) + (1 - sSm_ex)*season_exVect[i]; - season_exVect.push_back(newSeason_ex); - } - - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - - Expression inputSeasonality_ex; Expression inputSeasonality2_ex; - Expression outputSeasonality_ex; Expression outputSeasonality2_ex; - vector losses;//losses of steps through single time series - Expression out_ex;//we declare it here, bcause the last one will be the forecast - for (int i=INPUT_SIZE-1; i::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il::const_iterator first = m4Obj.vals.begin() + i + 1; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE;//checking if enough elements is in the vecor was done a few pe - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - //Expression loss_ex = pinBallLoss(out_ex, labels_ex); - Expression loss_ex = MSIS(out_ex, labels_ex); - if (i>=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); //training area losses - } - - if (i==(m4Obj.n-1)) {//validation loss - out_ex=expand(out_ex)*levels_exVect[i];//back to original scale - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios=0; ios 1 ) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios = 0; ios, AVERAGING_LEVEL+1>, NUM_OF_NETS>, BIG_LOOP>> testResults_map((int)series_len*1.5);//per series, big loop, etc... - //No epoch here, because this will just reflect the current (latest) situation - the last few epochs - vector out_vect=as_vector(out_ex.value()); - testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]=out_vect; - if (iEpoch>=AVERAGING_LEVEL && iEpoch % FREQ_OF_TEST==0) { - vector firstForec=testResults_map[series][inet][0]; - testResults_map[series][inet][AVERAGING_LEVEL]=firstForec; - for (int ii=1; ii nextForec=testResults_map[series][inet][ii]; - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - testResults_map[series][inet][AVERAGING_LEVEL][iii]+=nextForec[iii]; - } - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - testResults_map[series][inet][AVERAGING_LEVEL][iii]/=AVERAGING_LEVEL; - } //time to average - }//through series - } //through nets - - if (iEpoch>0 && iEpoch % FREQ_OF_TEST==0) { - //now that we have saved outputs of all nets on all series, let's calc how best and topn combinations performed during current epoch. - vector bestEpochLosses; - vector bestEpochAvgLosses; - vector topnEpochLosses; - vector topnEpochAvgLosses; - vector bestEpochLossesL; - vector bestEpochAvgLossesL; - vector topnEpochLossesL; - vector topnEpochAvgLossesL; - vector bestEpochLossesH; - vector bestEpochAvgLossesH; - vector topnEpochLossesH; - vector topnEpochAvgLossesH; - - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); -#endif - - float avgLoss; - vector avgLatest; - vector avgAvg; - - for (int itop=0; itop 0) { - float qLoss = errorFunc(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - bestEpochLosses.push_back(qLoss); - - qLoss=wQuantLoss(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - bestEpochLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - bestEpochLossesH.push_back(qLoss); - } - avgLatest=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]; //used later for calculating topn loss - - if (iEpoch>=AVERAGING_LEVEL) { - if (LBACK > 0) { - float qLoss = errorFunc(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - bestEpochAvgLosses.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - bestEpochAvgLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - bestEpochAvgLossesH.push_back(qLoss); - } - avgAvg=testResults_map[series][inet][AVERAGING_LEVEL]; - } - } else { - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) { - avgLatest[iii]+=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL][iii];//calculate current topn - if (iEpoch>=AVERAGING_LEVEL) - avgAvg[iii]+=testResults_map[series][inet][AVERAGING_LEVEL][iii]; - } - } - }//through topn - - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - avgLatest[iii]/=TOPN; - - if (LBACK > 0) { - float qLoss = errorFunc(avgLatest, m4Obj.testVals, m4Obj.meanAbsSeasDiff); - topnEpochLosses.push_back(qLoss); - - qLoss = wQuantLoss(avgLatest, m4Obj.testVals, TAUL, 0); - topnEpochLossesL.push_back(qLoss); - - qLoss = wQuantLoss(avgLatest, m4Obj.testVals, TAUH, OUTPUT_SIZE); - topnEpochLossesH.push_back(qLoss); - } - - if (iEpoch>=AVERAGING_LEVEL) { - for (int iii = 0; iii<2*OUTPUT_SIZE; iii++) - avgAvg[iii] /= TOPN; - - finalResults_map[series] = avgAvg; - - if (LBACK > 0) { -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&avgLoss, 0, NULL)); - - for (int iv=0; iv<2; iv++) { - if (iv==0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runL.c_str(), 0, &nullTerminatedStringOfRun)) - else - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runH.c_str(), 0, &nullTerminatedStringOfRun)); - - for (int iii=0; iii 0) { - float bestEpochLoss=accumulate( bestEpochLosses.begin(), bestEpochLosses.end(), 0.0)/bestEpochLosses.size(); - float topnEpochLoss=accumulate( topnEpochLosses.begin(), topnEpochLosses.end(), 0.0)/topnEpochLosses.size(); - float bestEpochLossL = accumulate(bestEpochLossesL.begin(), bestEpochLossesL.end(), 0.0) / bestEpochLossesL.size(); - float topnEpochLossL = accumulate(topnEpochLossesL.begin(), topnEpochLossesL.end(), 0.0) / topnEpochLossesL.size(); - float bestEpochLossH = accumulate(bestEpochLossesH.begin(), bestEpochLossesH.end(), 0.0) / bestEpochLossesH.size(); - float topnEpochLossH = accumulate(topnEpochLossesH.begin(), topnEpochLossesH.end(), 0.0) / topnEpochLossesH.size(); - cout<=AVERAGING_LEVEL) { - float bestEpochAvgLoss=accumulate( bestEpochAvgLosses.begin(), bestEpochAvgLosses.end(), 0.0)/bestEpochAvgLosses.size(); - float topnEpochAvgLoss=accumulate( topnEpochAvgLosses.begin(), topnEpochAvgLosses.end(), 0.0)/topnEpochAvgLosses.size(); - float bestEpochAvgLossL = accumulate(bestEpochAvgLossesL.begin(), bestEpochAvgLossesL.end(), 0.0) / bestEpochAvgLossesL.size(); - float topnEpochAvgLossL = accumulate(topnEpochAvgLossesL.begin(), topnEpochAvgLossesL.end(), 0.0) / topnEpochAvgLossesL.size(); - float bestEpochAvgLossH = accumulate(bestEpochAvgLossesH.begin(), bestEpochAvgLossesH.end(), 0.0) / bestEpochAvgLossesH.size(); - float topnEpochAvgLossH = accumulate(topnEpochAvgLossesH.begin(), topnEpochAvgLossesH.end(), 0.0) / topnEpochAvgLossesH.size(); - cout<<" bestAvg:"<> netRanking_map - netRanking_map[series]=perfToRanking(netPerf_map[series]); - - for (int itop=0; itop diagSeries; - for (int i=0; i<1; i++) {//add a few normal ones - int irand=uniOnSeries(rng); - diagSeries.insert(series_vect[irand]); - } - for(auto series : diagSeries) { - cout<at(inet); - for (int iEpoch=0; iEpoch 0 ) { - cout<<"sSm:"<at(inet); - for (int iEpoch=0; iEpoch 1 ) { - cout<<"sSm2:"<at(inet); - for (int iEpoch=0; iEpochat(inet); - for (int iEpoch = 0; iEpoch0) { - cout << "levels:" << iEpoch<<" "; - for (int iv = 0; iv 0 ) { - cout << "seasons:" << iEpoch<<" "; - for (int iv = 0; iv 1 ) { - cout << "seasons2:" << iEpoch<<" "; - for (int iv = 0; iv - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Source Files - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/M44.vcxproj b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/M44.vcxproj deleted file mode 100644 index 4b183143..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/M44.vcxproj +++ /dev/null @@ -1,227 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - RelWithDebug - Win32 - - - RelWithDebug - x64 - - - - - - - - - - - {7A192E0C-8F58-4D65-998E-3A7010AB5F87} - Win32Proj - M44 - 8.1 - - - - Application - true - v140 - Unicode - - - Application - true - v140 - Unicode - - - Application - false - v140 - true - Unicode - - - Application - true - v140 - Unicode - Sequential - - - Application - true - v140 - Unicode - Sequential - - - Application - false - v140 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - false - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - NotUsing - Level1 - Disabled - WIN32;_WINDOWS;EIGEN_USE_MKL_ALL;EIGEN_FAST_MATH;NOMINMAX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - - - Console - true - E:\progs2\dynet\buildMKL\dynet\Debug - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - NotUsing - Level1 - MaxSpeed - WIN32;_WINDOWS;EIGEN_FAST_MATH;EIGEN_USE_MKL_ALL;NOMINMAX;NDEBUG_;CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - AnySuitable - true - Speed - AdvancedVectorExtensions - Default - MultiThreadedDLL - ProgramDatabase - true - false - - - Console - true - E:\progs2\dynet\buildMKL\dynet\RelWithDebInfo - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/M44.vcxproj.user b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/M44.vcxproj.user deleted file mode 100644 index 6fb136bf..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/M44.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/slstm.h b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/M44/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/readme.txt b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/readme.txt deleted file mode 100644 index 2aea5134..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -This is Visual Studio 15 solution, with 4 projects, one for each .cc file. -Two targets are defined: Debug and RelWitDebug, which is Release with debug info, that I used normally. -You will need to update include and link paths to point to your installation of Dynet. -In x64\RelWithDebug directory you will find two example scripts to run the executables -in conjunction with one program started interactively inside VS. \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/x64/RelWithDebug/readme.txt b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/x64/RelWithDebug/readme.txt deleted file mode 100644 index 749c35a8..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/x64/RelWithDebug/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -These example run scripts. They are meant to be run on 6-core computer and assume that the program, -M41.exe has been started interactively in Visual Studio, so they add 5 processes. -run61.cmd should be run for ES_RNN and ES_RNN_PI, so Monthly and Quarterly series, -although for Monthly you probably want to use computer with more cores, unless you are fine waiting a week or so :-) -run61_e.cmd is for ES_RNN_E and ES_RNN_E_PI, so all other cases. \ No newline at end of file diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/x64/RelWithDebug/run61.cmd b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/x64/RelWithDebug/run61.cmd deleted file mode 100644 index b4db82a5..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/x64/RelWithDebug/run61.cmd +++ /dev/null @@ -1,5 +0,0 @@ -start M41 10 2 -start M41 11 1 5 -start M41 11 2 5 -start M41 12 1 10 -start M41 12 2 10 diff --git a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/x64/RelWithDebug/run61_e.cmd b/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/x64/RelWithDebug/run61_e.cmd deleted file mode 100644 index 31ce87f2..00000000 --- a/prototypes/ES_RNN/M4/github/c++/windows_VisualStudio/x64/RelWithDebug/run61_e.cmd +++ /dev/null @@ -1,5 +0,0 @@ -start M41 5 -start M41 10 -start M41 15 -start M41 20 -start M41 25 diff --git a/prototypes/ES_RNN/M4/github/readme.txt b/prototypes/ES_RNN/M4/github/readme.txt deleted file mode 100644 index e0f23354..00000000 --- a/prototypes/ES_RNN/M4/github/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -ES-RNN programs, related script, and docs. -M4 Forecasting Competition, 2018 -Slawek Smyl, Uber. - -The programs are in C++ and use Dynet - a Dynamic Graph NN system (https://github.com/clab/dynet) - - - - diff --git a/prototypes/ES_RNN/M4/github/sql/createM72nn_SQLServer.sql b/prototypes/ES_RNN/M4/github/sql/createM72nn_SQLServer.sql deleted file mode 100644 index f7b6385d..00000000 --- a/prototypes/ES_RNN/M4/github/sql/createM72nn_SQLServer.sql +++ /dev/null @@ -1,135 +0,0 @@ -USE [slawek] -GO - -/****** Object: Table [dbo].[M72nn] Script Date: 6/2/2018 9:37:26 AM ******/ -SET ANSI_NULLS ON -GO - -SET QUOTED_IDENTIFIER ON -GO - -SET ANSI_PADDING ON -GO - -CREATE TABLE [dbo].[M72nn]( - [run] [varchar](164) NOT NULL, - [LBack] [smallint] NOT NULL, - [iBig] [smallint] NOT NULL, - [series] [varchar](20) NOT NULL, - [epoch] [smallint] NOT NULL, - [actual1] [real] NULL, - [forec1] [real] NULL, - [actual2] [real] NULL, - [forec2] [real] NULL, - [actual3] [real] NULL, - [forec3] [real] NULL, - [actual4] [real] NULL, - [forec4] [real] NULL, - [actual5] [real] NULL, - [forec5] [real] NULL, - [actual6] [real] NULL, - [forec6] [real] NULL, - [actual7] [real] NULL, - [forec7] [real] NULL, - [actual8] [real] NULL, - [forec8] [real] NULL, - [actual9] [real] NULL, - [forec9] [real] NULL, - [actual10] [real] NULL, - [forec10] [real] NULL, - [actual11] [real] NULL, - [forec11] [real] NULL, - [actual12] [real] NULL, - [forec12] [real] NULL, - [actual13] [real] NULL, - [forec13] [real] NULL, - [actual14] [real] NULL, - [forec14] [real] NULL, - [actual15] [real] NULL, - [forec15] [real] NULL, - [actual16] [real] NULL, - [forec16] [real] NULL, - [actual17] [real] NULL, - [forec17] [real] NULL, - [actual18] [real] NULL, - [forec18] [real] NULL, - [actual19] [real] NULL, - [forec19] [real] NULL, - [actual20] [real] NULL, - [forec20] [real] NULL, - [actual21] [real] NULL, - [forec21] [real] NULL, - [actual22] [real] NULL, - [forec22] [real] NULL, - [actual23] [real] NULL, - [forec23] [real] NULL, - [actual24] [real] NULL, - [forec24] [real] NULL, - [actual25] [real] NULL, - [forec25] [real] NULL, - [actual26] [real] NULL, - [forec26] [real] NULL, - [actual27] [real] NULL, - [forec27] [real] NULL, - [actual28] [real] NULL, - [forec28] [real] NULL, - [actual29] [real] NULL, - [forec29] [real] NULL, - [actual30] [real] NULL, - [forec30] [real] NULL, - [actual31] [real] NULL, - [forec31] [real] NULL, - [actual32] [real] NULL, - [forec32] [real] NULL, - [actual33] [real] NULL, - [forec33] [real] NULL, - [actual34] [real] NULL, - [forec34] [real] NULL, - [actual35] [real] NULL, - [forec35] [real] NULL, - [actual36] [real] NULL, - [forec36] [real] NULL, - [actual37] [real] NULL, - [forec37] [real] NULL, - [actual38] [real] NULL, - [forec38] [real] NULL, - [actual39] [real] NULL, - [forec39] [real] NULL, - [actual40] [real] NULL, - [forec40] [real] NULL, - [actual41] [real] NULL, - [forec41] [real] NULL, - [actual42] [real] NULL, - [forec42] [real] NULL, - [actual43] [real] NULL, - [forec43] [real] NULL, - [actual44] [real] NULL, - [forec44] [real] NULL, - [actual45] [real] NULL, - [forec45] [real] NULL, - [actual46] [real] NULL, - [forec46] [real] NULL, - [actual47] [real] NULL, - [forec47] [real] NULL, - [actual48] [real] NULL, - [forec48] [real] NULL, - [trainingError] [real] NULL, - [variable] [varchar](20) NOT NULL, - [n] [smallint] NOT NULL, - [dateTimeOfPrediction] [datetime] NOT NULL, - CONSTRAINT [M72nn_pk] PRIMARY KEY CLUSTERED -( - [run] ASC, - [LBack] ASC, - [iBig] ASC, - [series] ASC, - [epoch] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -GO - -SET ANSI_PADDING OFF -GO - - diff --git a/prototypes/ES_RNN/M4/github/sql/createM72nn_mysql.txt b/prototypes/ES_RNN/M4/github/sql/createM72nn_mysql.txt deleted file mode 100644 index ac46daca..00000000 --- a/prototypes/ES_RNN/M4/github/sql/createM72nn_mysql.txt +++ /dev/null @@ -1,54 +0,0 @@ -CREATE TABLE M72nn( - run varchar(160) NOT NULL, - LBack smallint NOT NULL, - iBig smallint NOT NULL, - series varchar(20) NOT NULL, - epoch smallint NOT NULL, - actual1 float NULL, - forec1 float NULL, - actual2 float NULL, - forec2 float NULL, - actual3 float NULL, - forec3 float NULL, - actual4 float NULL, - forec4 float NULL, - actual5 float NULL, - forec5 float NULL, - actual6 float NULL, - forec6 float NULL, - actual7 float NULL, - forec7 float NULL, - actual8 float NULL, - forec8 float NULL, - actual9 float NULL, - forec9 float NULL, - actual10 float NULL, - forec10 float NULL, - actual11 float NULL, - forec11 float NULL, - actual12 float NULL, - forec12 float NULL, - actual13 float NULL, - forec13 float NULL, - actual14 float NULL, - forec14 float NULL, - actual15 float NULL, - forec15 float NULL, - actual16 float NULL, - forec16 float NULL, - actual17 float NULL, - forec17 float NULL, - actual18 float NULL, - forec18 float NULL, - trainingError float NULL, - variable varchar(20) NOT NULL, - n smallint NOT NULL, - dateTimeOfPrediction datetime NOT NULL, - CONSTRAINT M72nn_pk PRIMARY KEY CLUSTERED -( - run ASC, - LBack ASC, - iBig ASC, - series ASC, - epoch ASC)); - diff --git a/prototypes/ES_RNN/M4/github/sql/readme.txt b/prototypes/ES_RNN/M4/github/sql/readme.txt deleted file mode 100644 index 2e4add58..00000000 --- a/prototypes/ES_RNN/M4/github/sql/readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -I provide just two example table creation scrits, one for SQL Server and one for mysql. -The mysql table is limited to output vector 18, so would not be good for hourly runs. -Anyway, starting using the database is a large investment of time, apart from installationm, you also need to create auxiliary tables with MASE, and a lot of queries. -I do not have time to do all of it here and suspect there will be little interest in ODBC, so this is all what you get :-) diff --git a/prototypes/ES_RNN/README.md b/prototypes/ES_RNN/README.md deleted file mode 100644 index f2a4227e..00000000 --- a/prototypes/ES_RNN/README.md +++ /dev/null @@ -1,83 +0,0 @@ -# Forecasting with ES-RNNs -This folder contains the code from former extern Deepankar Gupta at Team Ilan. The Exponential-Smoothing Recurrent Neural Network (ES-RNN), developed by Uber Engineer and former Microsoft Engineer Slawek Smyl, is quite powerful and carries a lot of potential for forecasting. - -This Readme will cover three tasks that the ES-RNN can handle presently with regards to TSPerf. The first of these tasks is to run the ES-RNN with the M4 competition dataset that it was initially built for. The second task involves extending the ES-RNN to a subset of the Orange Juice Sales dataset from the *bayesm* R package. The third task involves expanding the ES-RNN to train on a greater portion of the same Orange Juice Sales dataset (more features). - -## 1. ES-RNN for M4 -The repository for this task can be found in `./M4`. The structure of this repository is identical to the structure of Slawek's M4 competition submission (). The link only has a zip file, which you must unzip in order to access the contents. - -Once unzipped, follow the instructions in `/ES_RNN/github/c++/readme.txt` to install dependencies (mainly Dynet). Once Dynet is installed and built, we can run the ES_RNN model. - -Before we run it, however, we must change file paths in ES_RNN.cc (and other ES_RNN files in the repo that you wish to use). The lines where we initialize the directory paths that we wish to use are lines 72 through 75. The data directory, which is originally located in the root of the M4 repo, has been conveniently relocated to `./M4/data`. `./M4/data/Train` is the path we want to use for `DATA_DIR` (line 72). Create the directory `./M4/data/output` if it is not already present, and set OUTPUT_DIR (line 74) to point to this directory. - -**Remember that file paths in Linux use single forward slashes ('/') while file paths in Windows use double backslashes ('\\'). Also note that in addition to M4-info.csv in `./M4/data/Train`, the file that provides the training data corresponds to the value of the constant `VARIABLE` in line 81 of `ES.RNN_cc`. - -We should now be ready to run the script. We can simply use Slawek's build_mkl file (also in the c++ folder), which compiles `ES_RNN.cc` and prepares an executable named `ES_RNN` that you can use. Note that you will have to open the file and modify the terminal command so that the file paths used point to your installation of dynet. Once done, simply initiate the following command on your terminal while in the c++ folder: -``` -./build_mkl ES_RNN -``` - -There will be several warnings printed, but as long as there are no errors, we are safe to proceed. We have two options for how we can run the `ES_RNN` executable. The first is simply to run the executable directly. We do this with the following command: -``` -./ES_RNN -``` -Note that `seed_for_chunks` and `chunk_number` are both integers. We must pass in a minimum of two integer arguments. We can pass a third integer argument for ibigOffset, making our command look like: -``` -./ES_RNN -``` -This parameter indicates where to continue a run that ended prematurely. Note that we can also simply execute the command without any arguments (the defaults are 10, 1, 0, respectively). - -The second method to run the ES_RNN executable is to run multiple processes at once. We can use Slawek's `run18` file (which is also located in the `c++` folder). This file triggers 18 different ES_RNN calls in parallel (don't worry, each process creates a different output repo). Note that these processes must come in pairs. The first call in each pair gets a `chunk_number` of 1 while the second call in each pair gets a `chunk_number` of 2. - -Notes about the `ES_RNN.cc` file: -- parameters of interest can be found from lines 72 through 106 and then lines 187 through 218. -- Command line arguments are parsed at the start of the main method (lines 380 through 399). -- The sales-info dataset is processed at lines 553 through 564. -- The actual training data is read at lines 566 through 586. -- The code for the actual model can be found starting at line 617 -- The trainer object is declared at line 611, but the actual training process starts at line 670 -- The test code starts at line 914. -- The code for saving the forecasts is located at 1115 to 1125. -- The `NUMBER_OF_TRAINING_EPOCHS` should be greater than or equal to the `AVERAGING_LEVEL`, or the code will run into a segmentation fault. - -Once the model is completed, the outputted forecasts can be found in `./M4/data/output`. To evaluate and sanity check the results, an iPython notebook, `./M4/data/scripts/ES_RNN M4 Sanity Check.ipynb`. - -## 2. ES-RNN for Limited Sales Dataset -The second phase of the project involves using the ES-RNN on the orange juice sales dataset from the *bayesm* R package. This is the first attempt at using the ES-RNN beyond its initial purpose, the M4 competition. As a result, we approach this problem by applying minimal changes to the model's code itself and by keeping the dataset as similar as possible to the M4 dataset. The original dataset, which can be found in the `./sales_limited/data` directory, has several features, including store, week, brand, (the log of) the number of juice cartons sold, prices for each brand, advertisement information, and so forth. - -We transform the dataset so that it only uses information about number of orange juice cartons of a given brand sold at a given store at a given week. We accomplish this using either the iPython notebook, `preprocessing.ipynb` or the python script `preprocessing.py`. The former can transform one file at a time (be sure to change the appropriate file path in the notebook to point to the file you wish to transform). The latter can transform multiple files in a single process. Just modify `./sales-limited/data/Train/training-files.txt` to have the number of files you wish to transform in the first line, followed by the file paths of the files you wish to transform (one per line). Then simply run the following command from `./sales-limited/data/scripts`. -``` -python preprocessing.py -``` -Like the M4 dataset, we have two main dataframes. The first shows time-series codes and store and brand information while the second shows time-series codes to the actual number of juice cartons sold per week (the time series). You can see examples of the tranformed dataframes in the iPython notebooks. - -The transformed data should have been created in `./sales-limited/data/Train`. Open the flie `./sales-limited/github/c++/ES_RNN.cc`, and make the following modifications: -- modify the DATA_DIR variable to point to `./sales-limited/data/Train`. -- modify `OUTPUT_DIR` to point to `./sales-limited/data/output`. -- modify `INPUT_PATH` to point to the correct training file. -- modiy `INFO_INPUT_PATH` to point to `DATA_DIR + "sales-info.csv"`. - -We now run the model the same way we did for the M4 competition. We first use build_mkl to generate the `ES_RNN` executable and then either run it manually or use the `run2` script to execute multiple commands in parallel. Note that information about the time taken by the processes is outputted in `./sales-limited/data/output/time`. - -The data outputted looks similar to the output of the M4. competition, which is not the format we wish to have it in. We can reformat it either using postprocessing.ipynb or by using postprocessing.py with the following command from `./sales-limited/data/scripts`: -``` -python postprocessing.py -``` -If we ran the model on the training rounds in TSPerf, then we can run evaluate.py as is in the TSPerf package to explore the MAPE for each round. - -IF THE EXISTING `ES_RNN.cc` FILE DOESN'T WORK, THEN PLEASE PULL MY GUARANTEED WORKING COPY FROM MY VM: -``` -scp -r deegup@workhorse.westus2.cloudapp.azure.com:~/M4/ES_RNN/github/c++/backups/ES_RNN_salesnaive_working.cc -``` - -## 3. Using External Features from the Sales Dataset -There are several features that have gone unused in our usage of the ES_RNN model to forecast on our transformed sales dataset. To accommodate these features, we transform our dataset by first filtering out the columns that we wish to use and then by adding a new column to the left of the dataframe for time-series IDs. Just like in the limited version of the problem (part 2 in this readme), we will also have an "info" dataframe where each time-series ID maps to store and brand information. This transformation is handled by the notebook `./sales_extfeatures/data/scripts/extfeatures_transformer.ipynb`. - -The process of accommodating a the other features has the following steps (based on my vision of it): -1. Modify the data parsing code to read the data and store all the features. -2. The time-series data contains weekly information. Instead of having a single entry for the number of orange juice containers sold in a given week, we will have a vector for each feature we wish to include during training. For all weeks with the same time-series ID, we will concatenate the vectors together, in chronological order. -3. We must update the input size and the output size (which should be the forecasting horizon times the length of each vector for each week for a given time series). - -An alternative, cleaner (but more involved) way we might be able to proceed this is to write a new struct for the new type of time-series described above. The default code simply uses a struct called M4TS. We can model the code for the new struct off of the code for the M4TS object, but it may be tough figuring out how to store as much data as is present in the retail sales dataset. - -I was in the process of modifying the `ES_RNN.cc` file to include the code for my approach for handling external features. If you ssh into `deegup@workhorse.westus2.cloudapp.azure.com`, my in-progress file is located at `~/M4/ES_RNN/github/c++/ES_RNN.cc`. \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_extfeatures/data/scripts/extfeatures_transformer.ipynb b/prototypes/ES_RNN/sales_extfeatures/data/scripts/extfeatures_transformer.ipynb deleted file mode 100644 index b58cbbd0..00000000 --- a/prototypes/ES_RNN/sales_extfeatures/data/scripts/extfeatures_transformer.ipynb +++ /dev/null @@ -1,5935 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
storebrandweeklogmoveconstantprice1price2price3price4price5price6price7price8price9price10price11dealfeatprofit
021409.01869510.0604690.0604970.0420310.0295310.0495310.0530210.0389060.0414060.0289060.0248440.03898410.037.992326
121468.72323110.0604690.0603120.0451560.0467190.0495310.0478130.0457810.0279690.0429690.0420310.03898400.030.126667
221478.25322810.0604690.0603120.0451560.0467190.0373440.0530210.0457810.0414060.0481250.0326560.03898400.030.000000
321488.98719710.0604690.0603120.0498440.0373440.0495310.0530210.0457810.0414060.0423440.0326560.03898400.029.950000
421509.09335710.0604690.0603120.0435940.0310940.0495310.0530210.0466480.0414060.0423440.0326560.03820300.029.920000
521518.87738210.0604690.0603120.0435940.0467190.0495310.0530210.0464560.0357810.0423440.0295310.03820300.029.920000
621529.29468210.0514060.0603120.0435940.0467190.0495310.0530210.0479690.0357810.0310940.0295310.03898410.027.125471
721538.95467410.0514060.0603120.0498440.0467190.0342190.0530210.0479690.0357810.0310940.0295310.03898410.027.125041
821549.04923210.0514060.0603120.0498440.0373440.0495310.0530210.0479690.0382810.0481250.0279690.03507810.027.082481
921578.61323010.0514060.0603120.0482810.0467190.0310940.0530210.0310940.0414060.0423440.0420310.03898410.027.061163
1021588.68067210.0556250.0478130.0467190.0467190.0465740.0530210.0479690.0420310.0310940.0193750.03898410.029.521087
1121599.03408010.0556250.0603120.0467190.0310940.0495310.0530210.0479690.0389060.0310940.0248440.03898410.031.299771
1221608.69148310.0556250.0603120.0467190.0467190.0310940.0467710.0479690.0389060.0310940.0248440.03898400.031.325914
1321618.83171210.0556250.0603120.0467190.0310940.0495310.0467710.0479690.0420310.0481250.0201560.03820310.031.419907
1421629.12869610.0604690.0603120.0467190.0467190.0310940.0530210.0479690.0420310.0435940.0154690.03820300.033.386667
1521639.40590710.0467190.0603120.0467190.0357810.0310940.0446870.0404690.0420310.0435940.0248440.03820310.019.730000
1621649.44715010.0467190.0561460.0467190.0357810.0495310.0446870.0404690.0310940.0435940.0389060.03820310.022.040909
1721658.78385610.0560940.0561460.0420310.0437020.0310940.0512750.0373440.0310940.0435940.0420310.03117200.035.353137
1821668.72323110.0560940.0415630.0420310.0404690.0310940.0514710.0373440.0420310.0310940.0217190.03117200.035.217500
1921679.95797610.0373440.0415630.0498440.0310940.0310940.0446870.0404690.0420310.0310940.0420310.03117200.025.086667
2021689.42674110.0373440.0561460.0498440.0264060.0310940.0446870.0404690.0420310.0310940.0420310.02335910.017.070052
2121699.15609510.0560940.0561460.0295310.0404690.0310940.0446870.0310940.0390620.0310940.0420310.02335910.043.958514
2221709.79367310.0404690.0561460.0498440.0404690.0404690.0446870.0404690.0390620.0389060.0154690.03507810.035.017143
2321719.14931610.0404690.0561460.0498440.0264060.0404690.0415630.0404690.0420310.0310940.0420310.02726610.031.038367
2421728.74385110.0560940.0373960.0498440.0264060.0310940.0415630.0404690.0357810.0310940.0420310.02726600.050.155714
2521738.84101410.0560940.0373960.0498440.0404690.0404690.0415630.0404690.0357810.0310940.0232810.02726600.048.598889
2621749.72722810.0389060.0373960.0420310.0404690.0389060.0431250.0404690.0420310.0310940.0232810.03507810.031.650000
2721758.74385110.0560940.0561460.0420310.0232810.0389060.0431250.0404690.0420310.0310940.0420310.02726600.051.318980
2821768.97916510.0560940.0561460.0498440.0232810.0389060.0431250.0310940.0342190.0310940.0420310.02726600.051.020565
2921778.72323110.0560940.0561460.0498440.0404690.0310940.0415630.0404690.0342190.0389060.0170310.03507800.051.144375
............................................................
106109137111319.63115410.0279690.0519790.0490800.0398200.0310940.0483950.0375000.0389060.0232810.0221870.02570310.017.170000
106110137111329.70406110.0305040.0519790.0435940.0339270.0331670.0457290.0310940.0389060.0253130.0248440.02632811.018.630000
106111137111338.99516510.0430560.0519790.0455420.0310940.0372050.0465790.0334700.0379690.0201560.0256250.02960910.025.350000
106112137111348.91247310.0390620.0493010.0495880.0323000.0310940.0509370.0420310.0357810.0220310.0310940.02960910.025.320000
106113137111359.90188610.0404730.0457290.0469570.0452230.0334930.0509370.0339410.0357810.0264060.0229690.02335911.05.350000
106114137111368.74385110.0498440.0474120.0476560.0465540.0435940.0509370.0310940.0357810.0268750.0201560.03242200.032.000000
106115137111378.91247310.0427850.0519790.0476560.0406210.0326560.0381250.0333530.0368750.0373440.0210940.03210900.031.720000
106116137111388.72323110.0373440.0389580.0476560.0357810.0435940.0509370.0420310.0389060.0373440.0310940.03242200.033.590000
106117137111399.05672310.0498440.0519790.0451560.0478130.0435940.0509370.0310940.0348440.0373440.0314060.03117200.030.620000
1061181371114010.03941610.0498440.0519790.0452390.0478130.0435940.0509370.0310940.0310940.0373440.0326560.02960911.031.420000
106119137111419.50599110.0498440.0519790.0467190.0467250.0326560.0381250.0420310.0389060.0373440.0264060.02960911.039.520000
106120137111428.94637510.0498440.0519790.0451560.0435940.0439110.0509370.0420310.0389060.0310940.0262500.03007810.040.770000
106121137111439.16951810.0389060.0519790.0451560.0445740.0451560.0509370.0420310.0389060.0362500.0271870.03148400.043.420000
106122137111449.12869610.0352180.0519790.0457030.0478130.0451560.0481250.0420310.0389060.0346880.0326560.03039111.041.380000
106123137111458.94637510.0310940.0519790.0467190.0478130.0451560.0446870.0420310.0392190.0342190.0318750.03179700.043.980000
106124137111469.01091310.0488990.0467710.0452620.0310940.0398390.0463190.0420310.0404690.0346880.0309370.03117200.037.510000
106125137111478.94637510.0417820.0486460.0420310.0322570.0312050.0509370.0420310.0404690.0335940.0271870.03117200.038.790000
106126137111488.80327410.0492700.0519790.0427350.0295310.0371800.0480530.0420310.0404690.0326560.0206250.03117200.039.720000
106127137111498.89508210.0496230.0519790.0457810.0478130.0451560.0457290.0420310.0404690.0326560.0234380.03117200.039.240000
106128137111508.34853810.0498440.0415630.0435940.0478130.0357810.0509370.0420310.0404690.0326560.0264060.03117200.037.540000
106129137111518.43554910.0495310.0514530.0460170.0478130.0448440.0506250.0416790.0370310.0326560.0232810.03085900.036.830000
106130137111528.84101410.0482810.0498960.0451560.0404690.0439060.0496880.0404690.0326560.0357810.0310940.02960911.034.160000
106131137111538.72323110.0498440.0519790.0467190.0348270.0310940.0496880.0420310.0381250.0373440.0314060.03117200.037.460000
106132137111548.70217810.0435940.0503690.0455100.0310940.0300330.0499220.0420310.0310940.0373440.0181250.03007800.035.190000
106133137111558.78385610.0432270.0483330.0434370.0310940.0264060.0484470.0407810.0310940.0323440.0204690.02835900.031.260000
106134137111569.38463010.0389060.0483330.0434370.0316650.0288110.0435420.0376560.0310940.0300000.0312500.02804710.030.500000
106135137111579.15609510.0415870.0483330.0434370.0443480.0310940.0435420.0376560.0368750.0300000.0303120.02804710.030.500000
106136137111589.14249010.0485400.0483330.0434370.0329140.0441260.0409290.0376560.0310940.0248440.0248440.02835910.032.360000
106137137111598.61323010.0435940.0483330.0434370.0279690.0404950.0363540.0376560.0310940.0270310.0232810.02898400.035.330000
106138137111608.96290410.0450630.0415630.0434370.0279690.0342190.0382160.0376560.0323440.0300000.0273440.02898400.035.440000
\n", - "

106139 rows × 19 columns

\n", - "
" - ], - "text/plain": [ - " store brand week logmove constant price1 price2 price3 \\\n", - "0 2 1 40 9.018695 1 0.060469 0.060497 0.042031 \n", - "1 2 1 46 8.723231 1 0.060469 0.060312 0.045156 \n", - "2 2 1 47 8.253228 1 0.060469 0.060312 0.045156 \n", - "3 2 1 48 8.987197 1 0.060469 0.060312 0.049844 \n", - "4 2 1 50 9.093357 1 0.060469 0.060312 0.043594 \n", - "5 2 1 51 8.877382 1 0.060469 0.060312 0.043594 \n", - "6 2 1 52 9.294682 1 0.051406 0.060312 0.043594 \n", - "7 2 1 53 8.954674 1 0.051406 0.060312 0.049844 \n", - "8 2 1 54 9.049232 1 0.051406 0.060312 0.049844 \n", - "9 2 1 57 8.613230 1 0.051406 0.060312 0.048281 \n", - "10 2 1 58 8.680672 1 0.055625 0.047813 0.046719 \n", - "11 2 1 59 9.034080 1 0.055625 0.060312 0.046719 \n", - "12 2 1 60 8.691483 1 0.055625 0.060312 0.046719 \n", - "13 2 1 61 8.831712 1 0.055625 0.060312 0.046719 \n", - "14 2 1 62 9.128696 1 0.060469 0.060312 0.046719 \n", - "15 2 1 63 9.405907 1 0.046719 0.060312 0.046719 \n", - "16 2 1 64 9.447150 1 0.046719 0.056146 0.046719 \n", - "17 2 1 65 8.783856 1 0.056094 0.056146 0.042031 \n", - "18 2 1 66 8.723231 1 0.056094 0.041563 0.042031 \n", - "19 2 1 67 9.957976 1 0.037344 0.041563 0.049844 \n", - "20 2 1 68 9.426741 1 0.037344 0.056146 0.049844 \n", - "21 2 1 69 9.156095 1 0.056094 0.056146 0.029531 \n", - "22 2 1 70 9.793673 1 0.040469 0.056146 0.049844 \n", - "23 2 1 71 9.149316 1 0.040469 0.056146 0.049844 \n", - "24 2 1 72 8.743851 1 0.056094 0.037396 0.049844 \n", - "25 2 1 73 8.841014 1 0.056094 0.037396 0.049844 \n", - "26 2 1 74 9.727228 1 0.038906 0.037396 0.042031 \n", - "27 2 1 75 8.743851 1 0.056094 0.056146 0.042031 \n", - "28 2 1 76 8.979165 1 0.056094 0.056146 0.049844 \n", - "29 2 1 77 8.723231 1 0.056094 0.056146 0.049844 \n", - "... ... ... ... ... ... ... ... ... \n", - "106109 137 11 131 9.631154 1 0.027969 0.051979 0.049080 \n", - "106110 137 11 132 9.704061 1 0.030504 0.051979 0.043594 \n", - "106111 137 11 133 8.995165 1 0.043056 0.051979 0.045542 \n", - "106112 137 11 134 8.912473 1 0.039062 0.049301 0.049588 \n", - "106113 137 11 135 9.901886 1 0.040473 0.045729 0.046957 \n", - "106114 137 11 136 8.743851 1 0.049844 0.047412 0.047656 \n", - "106115 137 11 137 8.912473 1 0.042785 0.051979 0.047656 \n", - "106116 137 11 138 8.723231 1 0.037344 0.038958 0.047656 \n", - "106117 137 11 139 9.056723 1 0.049844 0.051979 0.045156 \n", - "106118 137 11 140 10.039416 1 0.049844 0.051979 0.045239 \n", - "106119 137 11 141 9.505991 1 0.049844 0.051979 0.046719 \n", - "106120 137 11 142 8.946375 1 0.049844 0.051979 0.045156 \n", - "106121 137 11 143 9.169518 1 0.038906 0.051979 0.045156 \n", - "106122 137 11 144 9.128696 1 0.035218 0.051979 0.045703 \n", - "106123 137 11 145 8.946375 1 0.031094 0.051979 0.046719 \n", - "106124 137 11 146 9.010913 1 0.048899 0.046771 0.045262 \n", - "106125 137 11 147 8.946375 1 0.041782 0.048646 0.042031 \n", - "106126 137 11 148 8.803274 1 0.049270 0.051979 0.042735 \n", - "106127 137 11 149 8.895082 1 0.049623 0.051979 0.045781 \n", - "106128 137 11 150 8.348538 1 0.049844 0.041563 0.043594 \n", - "106129 137 11 151 8.435549 1 0.049531 0.051453 0.046017 \n", - "106130 137 11 152 8.841014 1 0.048281 0.049896 0.045156 \n", - "106131 137 11 153 8.723231 1 0.049844 0.051979 0.046719 \n", - "106132 137 11 154 8.702178 1 0.043594 0.050369 0.045510 \n", - "106133 137 11 155 8.783856 1 0.043227 0.048333 0.043437 \n", - "106134 137 11 156 9.384630 1 0.038906 0.048333 0.043437 \n", - "106135 137 11 157 9.156095 1 0.041587 0.048333 0.043437 \n", - "106136 137 11 158 9.142490 1 0.048540 0.048333 0.043437 \n", - "106137 137 11 159 8.613230 1 0.043594 0.048333 0.043437 \n", - "106138 137 11 160 8.962904 1 0.045063 0.041563 0.043437 \n", - "\n", - " price4 price5 price6 price7 price8 price9 price10 \\\n", - "0 0.029531 0.049531 0.053021 0.038906 0.041406 0.028906 0.024844 \n", - "1 0.046719 0.049531 0.047813 0.045781 0.027969 0.042969 0.042031 \n", - "2 0.046719 0.037344 0.053021 0.045781 0.041406 0.048125 0.032656 \n", - "3 0.037344 0.049531 0.053021 0.045781 0.041406 0.042344 0.032656 \n", - "4 0.031094 0.049531 0.053021 0.046648 0.041406 0.042344 0.032656 \n", - "5 0.046719 0.049531 0.053021 0.046456 0.035781 0.042344 0.029531 \n", - "6 0.046719 0.049531 0.053021 0.047969 0.035781 0.031094 0.029531 \n", - "7 0.046719 0.034219 0.053021 0.047969 0.035781 0.031094 0.029531 \n", - "8 0.037344 0.049531 0.053021 0.047969 0.038281 0.048125 0.027969 \n", - "9 0.046719 0.031094 0.053021 0.031094 0.041406 0.042344 0.042031 \n", - "10 0.046719 0.046574 0.053021 0.047969 0.042031 0.031094 0.019375 \n", - "11 0.031094 0.049531 0.053021 0.047969 0.038906 0.031094 0.024844 \n", - "12 0.046719 0.031094 0.046771 0.047969 0.038906 0.031094 0.024844 \n", - "13 0.031094 0.049531 0.046771 0.047969 0.042031 0.048125 0.020156 \n", - "14 0.046719 0.031094 0.053021 0.047969 0.042031 0.043594 0.015469 \n", - "15 0.035781 0.031094 0.044687 0.040469 0.042031 0.043594 0.024844 \n", - "16 0.035781 0.049531 0.044687 0.040469 0.031094 0.043594 0.038906 \n", - "17 0.043702 0.031094 0.051275 0.037344 0.031094 0.043594 0.042031 \n", - "18 0.040469 0.031094 0.051471 0.037344 0.042031 0.031094 0.021719 \n", - "19 0.031094 0.031094 0.044687 0.040469 0.042031 0.031094 0.042031 \n", - "20 0.026406 0.031094 0.044687 0.040469 0.042031 0.031094 0.042031 \n", - "21 0.040469 0.031094 0.044687 0.031094 0.039062 0.031094 0.042031 \n", - "22 0.040469 0.040469 0.044687 0.040469 0.039062 0.038906 0.015469 \n", - "23 0.026406 0.040469 0.041563 0.040469 0.042031 0.031094 0.042031 \n", - "24 0.026406 0.031094 0.041563 0.040469 0.035781 0.031094 0.042031 \n", - "25 0.040469 0.040469 0.041563 0.040469 0.035781 0.031094 0.023281 \n", - "26 0.040469 0.038906 0.043125 0.040469 0.042031 0.031094 0.023281 \n", - "27 0.023281 0.038906 0.043125 0.040469 0.042031 0.031094 0.042031 \n", - "28 0.023281 0.038906 0.043125 0.031094 0.034219 0.031094 0.042031 \n", - "29 0.040469 0.031094 0.041563 0.040469 0.034219 0.038906 0.017031 \n", - "... ... ... ... ... ... ... ... \n", - "106109 0.039820 0.031094 0.048395 0.037500 0.038906 0.023281 0.022187 \n", - "106110 0.033927 0.033167 0.045729 0.031094 0.038906 0.025313 0.024844 \n", - "106111 0.031094 0.037205 0.046579 0.033470 0.037969 0.020156 0.025625 \n", - "106112 0.032300 0.031094 0.050937 0.042031 0.035781 0.022031 0.031094 \n", - "106113 0.045223 0.033493 0.050937 0.033941 0.035781 0.026406 0.022969 \n", - "106114 0.046554 0.043594 0.050937 0.031094 0.035781 0.026875 0.020156 \n", - "106115 0.040621 0.032656 0.038125 0.033353 0.036875 0.037344 0.021094 \n", - "106116 0.035781 0.043594 0.050937 0.042031 0.038906 0.037344 0.031094 \n", - "106117 0.047813 0.043594 0.050937 0.031094 0.034844 0.037344 0.031406 \n", - "106118 0.047813 0.043594 0.050937 0.031094 0.031094 0.037344 0.032656 \n", - "106119 0.046725 0.032656 0.038125 0.042031 0.038906 0.037344 0.026406 \n", - "106120 0.043594 0.043911 0.050937 0.042031 0.038906 0.031094 0.026250 \n", - "106121 0.044574 0.045156 0.050937 0.042031 0.038906 0.036250 0.027187 \n", - "106122 0.047813 0.045156 0.048125 0.042031 0.038906 0.034688 0.032656 \n", - "106123 0.047813 0.045156 0.044687 0.042031 0.039219 0.034219 0.031875 \n", - "106124 0.031094 0.039839 0.046319 0.042031 0.040469 0.034688 0.030937 \n", - "106125 0.032257 0.031205 0.050937 0.042031 0.040469 0.033594 0.027187 \n", - "106126 0.029531 0.037180 0.048053 0.042031 0.040469 0.032656 0.020625 \n", - "106127 0.047813 0.045156 0.045729 0.042031 0.040469 0.032656 0.023438 \n", - "106128 0.047813 0.035781 0.050937 0.042031 0.040469 0.032656 0.026406 \n", - "106129 0.047813 0.044844 0.050625 0.041679 0.037031 0.032656 0.023281 \n", - "106130 0.040469 0.043906 0.049688 0.040469 0.032656 0.035781 0.031094 \n", - "106131 0.034827 0.031094 0.049688 0.042031 0.038125 0.037344 0.031406 \n", - "106132 0.031094 0.030033 0.049922 0.042031 0.031094 0.037344 0.018125 \n", - "106133 0.031094 0.026406 0.048447 0.040781 0.031094 0.032344 0.020469 \n", - "106134 0.031665 0.028811 0.043542 0.037656 0.031094 0.030000 0.031250 \n", - "106135 0.044348 0.031094 0.043542 0.037656 0.036875 0.030000 0.030312 \n", - "106136 0.032914 0.044126 0.040929 0.037656 0.031094 0.024844 0.024844 \n", - "106137 0.027969 0.040495 0.036354 0.037656 0.031094 0.027031 0.023281 \n", - "106138 0.027969 0.034219 0.038216 0.037656 0.032344 0.030000 0.027344 \n", - "\n", - " price11 deal feat profit \n", - "0 0.038984 1 0.0 37.992326 \n", - "1 0.038984 0 0.0 30.126667 \n", - "2 0.038984 0 0.0 30.000000 \n", - "3 0.038984 0 0.0 29.950000 \n", - "4 0.038203 0 0.0 29.920000 \n", - "5 0.038203 0 0.0 29.920000 \n", - "6 0.038984 1 0.0 27.125471 \n", - "7 0.038984 1 0.0 27.125041 \n", - "8 0.035078 1 0.0 27.082481 \n", - "9 0.038984 1 0.0 27.061163 \n", - "10 0.038984 1 0.0 29.521087 \n", - "11 0.038984 1 0.0 31.299771 \n", - "12 0.038984 0 0.0 31.325914 \n", - "13 0.038203 1 0.0 31.419907 \n", - "14 0.038203 0 0.0 33.386667 \n", - "15 0.038203 1 0.0 19.730000 \n", - "16 0.038203 1 0.0 22.040909 \n", - "17 0.031172 0 0.0 35.353137 \n", - "18 0.031172 0 0.0 35.217500 \n", - "19 0.031172 0 0.0 25.086667 \n", - "20 0.023359 1 0.0 17.070052 \n", - "21 0.023359 1 0.0 43.958514 \n", - "22 0.035078 1 0.0 35.017143 \n", - "23 0.027266 1 0.0 31.038367 \n", - "24 0.027266 0 0.0 50.155714 \n", - "25 0.027266 0 0.0 48.598889 \n", - "26 0.035078 1 0.0 31.650000 \n", - "27 0.027266 0 0.0 51.318980 \n", - "28 0.027266 0 0.0 51.020565 \n", - "29 0.035078 0 0.0 51.144375 \n", - "... ... ... ... ... \n", - "106109 0.025703 1 0.0 17.170000 \n", - "106110 0.026328 1 1.0 18.630000 \n", - "106111 0.029609 1 0.0 25.350000 \n", - "106112 0.029609 1 0.0 25.320000 \n", - "106113 0.023359 1 1.0 5.350000 \n", - "106114 0.032422 0 0.0 32.000000 \n", - "106115 0.032109 0 0.0 31.720000 \n", - "106116 0.032422 0 0.0 33.590000 \n", - "106117 0.031172 0 0.0 30.620000 \n", - "106118 0.029609 1 1.0 31.420000 \n", - "106119 0.029609 1 1.0 39.520000 \n", - "106120 0.030078 1 0.0 40.770000 \n", - "106121 0.031484 0 0.0 43.420000 \n", - "106122 0.030391 1 1.0 41.380000 \n", - "106123 0.031797 0 0.0 43.980000 \n", - "106124 0.031172 0 0.0 37.510000 \n", - "106125 0.031172 0 0.0 38.790000 \n", - "106126 0.031172 0 0.0 39.720000 \n", - "106127 0.031172 0 0.0 39.240000 \n", - "106128 0.031172 0 0.0 37.540000 \n", - "106129 0.030859 0 0.0 36.830000 \n", - "106130 0.029609 1 1.0 34.160000 \n", - "106131 0.031172 0 0.0 37.460000 \n", - "106132 0.030078 0 0.0 35.190000 \n", - "106133 0.028359 0 0.0 31.260000 \n", - "106134 0.028047 1 0.0 30.500000 \n", - "106135 0.028047 1 0.0 30.500000 \n", - "106136 0.028359 1 0.0 32.360000 \n", - "106137 0.028984 0 0.0 35.330000 \n", - "106138 0.028984 0 0.0 35.440000 \n", - "\n", - "[106139 rows x 19 columns]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#open sales csv\n", - "yx = pd.read_csv('../TSPerf/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/data/yx.csv')\n", - "yx" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "store_list = sorted(list(set(yx.iloc[:, 0])))\n", - "brand_list = sorted(list(set(yx.iloc[:, 1])))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(2, 1): 'E1',\n", - " (2, 2): 'E2',\n", - " (2, 3): 'E3',\n", - " (2, 4): 'E4',\n", - " (2, 5): 'E5',\n", - " (2, 6): 'E6',\n", - " (2, 7): 'E7',\n", - " (2, 8): 'E8',\n", - " (2, 9): 'E9',\n", - " (2, 10): 'E10',\n", - " (2, 11): 'E11',\n", - " (5, 1): 'E12',\n", - " (5, 2): 'E13',\n", - " (5, 3): 'E14',\n", - " (5, 4): 'E15',\n", - " (5, 5): 'E16',\n", - " (5, 6): 'E17',\n", - " (5, 7): 'E18',\n", - " (5, 8): 'E19',\n", - " (5, 9): 'E20',\n", - " (5, 10): 'E21',\n", - " (5, 11): 'E22',\n", - " (8, 1): 'E23',\n", - " (8, 2): 'E24',\n", - " (8, 3): 'E25',\n", - " (8, 4): 'E26',\n", - " (8, 5): 'E27',\n", - " (8, 6): 'E28',\n", - " (8, 7): 'E29',\n", - " (8, 8): 'E30',\n", - " (8, 9): 'E31',\n", - " (8, 10): 'E32',\n", - " (8, 11): 'E33',\n", - " (9, 1): 'E34',\n", - " (9, 2): 'E35',\n", - " (9, 3): 'E36',\n", - " (9, 4): 'E37',\n", - " (9, 5): 'E38',\n", - " (9, 6): 'E39',\n", - " (9, 7): 'E40',\n", - " (9, 8): 'E41',\n", - " (9, 9): 'E42',\n", - " (9, 10): 'E43',\n", - " (9, 11): 'E44',\n", - " (12, 1): 'E45',\n", - " (12, 2): 'E46',\n", - " (12, 3): 'E47',\n", - " (12, 4): 'E48',\n", - " (12, 5): 'E49',\n", - " (12, 6): 'E50',\n", - " (12, 7): 'E51',\n", - " (12, 8): 'E52',\n", - " (12, 9): 'E53',\n", - " (12, 10): 'E54',\n", - " (12, 11): 'E55',\n", - " (14, 1): 'E56',\n", - " (14, 2): 'E57',\n", - " (14, 3): 'E58',\n", - " (14, 4): 'E59',\n", - " (14, 5): 'E60',\n", - " (14, 6): 'E61',\n", - " (14, 7): 'E62',\n", - " (14, 8): 'E63',\n", - " (14, 9): 'E64',\n", - " (14, 10): 'E65',\n", - " (14, 11): 'E66',\n", - " (18, 1): 'E67',\n", - " (18, 2): 'E68',\n", - " (18, 3): 'E69',\n", - " (18, 4): 'E70',\n", - " (18, 5): 'E71',\n", - " (18, 6): 'E72',\n", - " (18, 7): 'E73',\n", - " (18, 8): 'E74',\n", - " (18, 9): 'E75',\n", - " (18, 10): 'E76',\n", - " (18, 11): 'E77',\n", - " (21, 1): 'E78',\n", - " (21, 2): 'E79',\n", - " (21, 3): 'E80',\n", - " (21, 4): 'E81',\n", - " (21, 5): 'E82',\n", - " (21, 6): 'E83',\n", - " (21, 7): 'E84',\n", - " (21, 8): 'E85',\n", - " (21, 9): 'E86',\n", - " (21, 10): 'E87',\n", - " (21, 11): 'E88',\n", - " (28, 1): 'E89',\n", - " (28, 2): 'E90',\n", - " (28, 3): 'E91',\n", - " (28, 4): 'E92',\n", - " (28, 5): 'E93',\n", - " (28, 6): 'E94',\n", - " (28, 7): 'E95',\n", - " (28, 8): 'E96',\n", - " (28, 9): 'E97',\n", - " (28, 10): 'E98',\n", - " (28, 11): 'E99',\n", - " (32, 1): 'E100',\n", - " (32, 2): 'E101',\n", - " (32, 3): 'E102',\n", - " (32, 4): 'E103',\n", - " (32, 5): 'E104',\n", - " (32, 6): 'E105',\n", - " (32, 7): 'E106',\n", - " (32, 8): 'E107',\n", - " (32, 9): 'E108',\n", - " (32, 10): 'E109',\n", - " (32, 11): 'E110',\n", - " (33, 1): 'E111',\n", - " (33, 2): 'E112',\n", - " (33, 3): 'E113',\n", - " (33, 4): 'E114',\n", - " (33, 5): 'E115',\n", - " (33, 6): 'E116',\n", - " (33, 7): 'E117',\n", - " (33, 8): 'E118',\n", - " (33, 9): 'E119',\n", - " (33, 10): 'E120',\n", - " (33, 11): 'E121',\n", - " (40, 1): 'E122',\n", - " (40, 2): 'E123',\n", - " (40, 3): 'E124',\n", - " (40, 4): 'E125',\n", - " (40, 5): 'E126',\n", - " (40, 6): 'E127',\n", - " (40, 7): 'E128',\n", - " (40, 8): 'E129',\n", - " (40, 9): 'E130',\n", - " (40, 10): 'E131',\n", - " (40, 11): 'E132',\n", - " (44, 1): 'E133',\n", - " (44, 2): 'E134',\n", - " (44, 3): 'E135',\n", - " (44, 4): 'E136',\n", - " (44, 5): 'E137',\n", - " (44, 6): 'E138',\n", - " (44, 7): 'E139',\n", - " (44, 8): 'E140',\n", - " (44, 9): 'E141',\n", - " (44, 10): 'E142',\n", - " (44, 11): 'E143',\n", - " (45, 1): 'E144',\n", - " (45, 2): 'E145',\n", - " (45, 3): 'E146',\n", - " (45, 4): 'E147',\n", - " (45, 5): 'E148',\n", - " (45, 6): 'E149',\n", - " (45, 7): 'E150',\n", - " (45, 8): 'E151',\n", - " (45, 9): 'E152',\n", - " (45, 10): 'E153',\n", - " (45, 11): 'E154',\n", - " (47, 1): 'E155',\n", - " (47, 2): 'E156',\n", - " (47, 3): 'E157',\n", - " (47, 4): 'E158',\n", - " (47, 5): 'E159',\n", - " (47, 6): 'E160',\n", - " (47, 7): 'E161',\n", - " (47, 8): 'E162',\n", - " (47, 9): 'E163',\n", - " (47, 10): 'E164',\n", - " (47, 11): 'E165',\n", - " (48, 1): 'E166',\n", - " (48, 2): 'E167',\n", - " (48, 3): 'E168',\n", - " (48, 4): 'E169',\n", - " (48, 5): 'E170',\n", - " (48, 6): 'E171',\n", - " (48, 7): 'E172',\n", - " (48, 8): 'E173',\n", - " (48, 9): 'E174',\n", - " (48, 10): 'E175',\n", - " (48, 11): 'E176',\n", - " (49, 1): 'E177',\n", - " (49, 2): 'E178',\n", - " (49, 3): 'E179',\n", - " (49, 4): 'E180',\n", - " (49, 5): 'E181',\n", - " (49, 6): 'E182',\n", - " (49, 7): 'E183',\n", - " (49, 8): 'E184',\n", - " (49, 9): 'E185',\n", - " (49, 10): 'E186',\n", - " (49, 11): 'E187',\n", - " (50, 1): 'E188',\n", - " (50, 2): 'E189',\n", - " (50, 3): 'E190',\n", - " (50, 4): 'E191',\n", - " (50, 5): 'E192',\n", - " (50, 6): 'E193',\n", - " (50, 7): 'E194',\n", - " (50, 8): 'E195',\n", - " (50, 9): 'E196',\n", - " (50, 10): 'E197',\n", - " (50, 11): 'E198',\n", - " (51, 1): 'E199',\n", - " (51, 2): 'E200',\n", - " (51, 3): 'E201',\n", - " (51, 4): 'E202',\n", - " (51, 5): 'E203',\n", - " (51, 6): 'E204',\n", - " (51, 7): 'E205',\n", - " (51, 8): 'E206',\n", - " (51, 9): 'E207',\n", - " (51, 10): 'E208',\n", - " (51, 11): 'E209',\n", - " (52, 1): 'E210',\n", - " (52, 2): 'E211',\n", - " (52, 3): 'E212',\n", - " (52, 4): 'E213',\n", - " (52, 5): 'E214',\n", - " (52, 6): 'E215',\n", - " (52, 7): 'E216',\n", - " (52, 8): 'E217',\n", - " (52, 9): 'E218',\n", - " (52, 10): 'E219',\n", - " (52, 11): 'E220',\n", - " (53, 1): 'E221',\n", - " (53, 2): 'E222',\n", - " (53, 3): 'E223',\n", - " (53, 4): 'E224',\n", - " (53, 5): 'E225',\n", - " (53, 6): 'E226',\n", - " (53, 7): 'E227',\n", - " (53, 8): 'E228',\n", - " (53, 9): 'E229',\n", - " (53, 10): 'E230',\n", - " (53, 11): 'E231',\n", - " (54, 1): 'E232',\n", - " (54, 2): 'E233',\n", - " (54, 3): 'E234',\n", - " (54, 4): 'E235',\n", - " (54, 5): 'E236',\n", - " (54, 6): 'E237',\n", - " (54, 7): 'E238',\n", - " (54, 8): 'E239',\n", - " (54, 9): 'E240',\n", - " (54, 10): 'E241',\n", - " (54, 11): 'E242',\n", - " (56, 1): 'E243',\n", - " (56, 2): 'E244',\n", - " (56, 3): 'E245',\n", - " (56, 4): 'E246',\n", - " (56, 5): 'E247',\n", - " (56, 6): 'E248',\n", - " (56, 7): 'E249',\n", - " (56, 8): 'E250',\n", - " (56, 9): 'E251',\n", - " (56, 10): 'E252',\n", - " (56, 11): 'E253',\n", - " (59, 1): 'E254',\n", - " (59, 2): 'E255',\n", - " (59, 3): 'E256',\n", - " (59, 4): 'E257',\n", - " (59, 5): 'E258',\n", - " (59, 6): 'E259',\n", - " (59, 7): 'E260',\n", - " (59, 8): 'E261',\n", - " (59, 9): 'E262',\n", - " (59, 10): 'E263',\n", - " (59, 11): 'E264',\n", - " (62, 1): 'E265',\n", - " (62, 2): 'E266',\n", - " (62, 3): 'E267',\n", - " (62, 4): 'E268',\n", - " (62, 5): 'E269',\n", - " (62, 6): 'E270',\n", - " (62, 7): 'E271',\n", - " (62, 8): 'E272',\n", - " (62, 9): 'E273',\n", - " (62, 10): 'E274',\n", - " (62, 11): 'E275',\n", - " (64, 1): 'E276',\n", - " (64, 2): 'E277',\n", - " (64, 3): 'E278',\n", - " (64, 4): 'E279',\n", - " (64, 5): 'E280',\n", - " (64, 6): 'E281',\n", - " (64, 7): 'E282',\n", - " (64, 8): 'E283',\n", - " (64, 9): 'E284',\n", - " (64, 10): 'E285',\n", - " (64, 11): 'E286',\n", - " (67, 1): 'E287',\n", - " (67, 2): 'E288',\n", - " (67, 3): 'E289',\n", - " (67, 4): 'E290',\n", - " (67, 5): 'E291',\n", - " (67, 6): 'E292',\n", - " (67, 7): 'E293',\n", - " (67, 8): 'E294',\n", - " (67, 9): 'E295',\n", - " (67, 10): 'E296',\n", - " (67, 11): 'E297',\n", - " (68, 1): 'E298',\n", - " (68, 2): 'E299',\n", - " (68, 3): 'E300',\n", - " (68, 4): 'E301',\n", - " (68, 5): 'E302',\n", - " (68, 6): 'E303',\n", - " (68, 7): 'E304',\n", - " (68, 8): 'E305',\n", - " (68, 9): 'E306',\n", - " (68, 10): 'E307',\n", - " (68, 11): 'E308',\n", - " (70, 1): 'E309',\n", - " (70, 2): 'E310',\n", - " (70, 3): 'E311',\n", - " (70, 4): 'E312',\n", - " (70, 5): 'E313',\n", - " (70, 6): 'E314',\n", - " (70, 7): 'E315',\n", - " (70, 8): 'E316',\n", - " (70, 9): 'E317',\n", - " (70, 10): 'E318',\n", - " (70, 11): 'E319',\n", - " (71, 1): 'E320',\n", - " (71, 2): 'E321',\n", - " (71, 3): 'E322',\n", - " (71, 4): 'E323',\n", - " (71, 5): 'E324',\n", - " (71, 6): 'E325',\n", - " (71, 7): 'E326',\n", - " (71, 8): 'E327',\n", - " (71, 9): 'E328',\n", - " (71, 10): 'E329',\n", - " (71, 11): 'E330',\n", - " (72, 1): 'E331',\n", - " (72, 2): 'E332',\n", - " (72, 3): 'E333',\n", - " (72, 4): 'E334',\n", - " (72, 5): 'E335',\n", - " (72, 6): 'E336',\n", - " (72, 7): 'E337',\n", - " (72, 8): 'E338',\n", - " (72, 9): 'E339',\n", - " (72, 10): 'E340',\n", - " (72, 11): 'E341',\n", - " (73, 1): 'E342',\n", - " (73, 2): 'E343',\n", - " (73, 3): 'E344',\n", - " (73, 4): 'E345',\n", - " (73, 5): 'E346',\n", - " (73, 6): 'E347',\n", - " (73, 7): 'E348',\n", - " (73, 8): 'E349',\n", - " (73, 9): 'E350',\n", - " (73, 10): 'E351',\n", - " (73, 11): 'E352',\n", - " (74, 1): 'E353',\n", - " (74, 2): 'E354',\n", - " (74, 3): 'E355',\n", - " (74, 4): 'E356',\n", - " (74, 5): 'E357',\n", - " (74, 6): 'E358',\n", - " (74, 7): 'E359',\n", - " (74, 8): 'E360',\n", - " (74, 9): 'E361',\n", - " (74, 10): 'E362',\n", - " (74, 11): 'E363',\n", - " (75, 1): 'E364',\n", - " (75, 2): 'E365',\n", - " (75, 3): 'E366',\n", - " (75, 4): 'E367',\n", - " (75, 5): 'E368',\n", - " (75, 6): 'E369',\n", - " (75, 7): 'E370',\n", - " (75, 8): 'E371',\n", - " (75, 9): 'E372',\n", - " (75, 10): 'E373',\n", - " (75, 11): 'E374',\n", - " (76, 1): 'E375',\n", - " (76, 2): 'E376',\n", - " (76, 3): 'E377',\n", - " (76, 4): 'E378',\n", - " (76, 5): 'E379',\n", - " (76, 6): 'E380',\n", - " (76, 7): 'E381',\n", - " (76, 8): 'E382',\n", - " (76, 9): 'E383',\n", - " (76, 10): 'E384',\n", - " (76, 11): 'E385',\n", - " (77, 1): 'E386',\n", - " (77, 2): 'E387',\n", - " (77, 3): 'E388',\n", - " (77, 4): 'E389',\n", - " (77, 5): 'E390',\n", - " (77, 6): 'E391',\n", - " (77, 7): 'E392',\n", - " (77, 8): 'E393',\n", - " (77, 9): 'E394',\n", - " (77, 10): 'E395',\n", - " (77, 11): 'E396',\n", - " (78, 1): 'E397',\n", - " (78, 2): 'E398',\n", - " (78, 3): 'E399',\n", - " (78, 4): 'E400',\n", - " (78, 5): 'E401',\n", - " (78, 6): 'E402',\n", - " (78, 7): 'E403',\n", - " (78, 8): 'E404',\n", - " (78, 9): 'E405',\n", - " (78, 10): 'E406',\n", - " (78, 11): 'E407',\n", - " (80, 1): 'E408',\n", - " (80, 2): 'E409',\n", - " (80, 3): 'E410',\n", - " (80, 4): 'E411',\n", - " (80, 5): 'E412',\n", - " (80, 6): 'E413',\n", - " (80, 7): 'E414',\n", - " (80, 8): 'E415',\n", - " (80, 9): 'E416',\n", - " (80, 10): 'E417',\n", - " (80, 11): 'E418',\n", - " (81, 1): 'E419',\n", - " (81, 2): 'E420',\n", - " (81, 3): 'E421',\n", - " (81, 4): 'E422',\n", - " (81, 5): 'E423',\n", - " (81, 6): 'E424',\n", - " (81, 7): 'E425',\n", - " (81, 8): 'E426',\n", - " (81, 9): 'E427',\n", - " (81, 10): 'E428',\n", - " (81, 11): 'E429',\n", - " (83, 1): 'E430',\n", - " (83, 2): 'E431',\n", - " (83, 3): 'E432',\n", - " (83, 4): 'E433',\n", - " (83, 5): 'E434',\n", - " (83, 6): 'E435',\n", - " (83, 7): 'E436',\n", - " (83, 8): 'E437',\n", - " (83, 9): 'E438',\n", - " (83, 10): 'E439',\n", - " (83, 11): 'E440',\n", - " (84, 1): 'E441',\n", - " (84, 2): 'E442',\n", - " (84, 3): 'E443',\n", - " (84, 4): 'E444',\n", - " (84, 5): 'E445',\n", - " (84, 6): 'E446',\n", - " (84, 7): 'E447',\n", - " (84, 8): 'E448',\n", - " (84, 9): 'E449',\n", - " (84, 10): 'E450',\n", - " (84, 11): 'E451',\n", - " (86, 1): 'E452',\n", - " (86, 2): 'E453',\n", - " (86, 3): 'E454',\n", - " (86, 4): 'E455',\n", - " (86, 5): 'E456',\n", - " (86, 6): 'E457',\n", - " (86, 7): 'E458',\n", - " (86, 8): 'E459',\n", - " (86, 9): 'E460',\n", - " (86, 10): 'E461',\n", - " (86, 11): 'E462',\n", - " (88, 1): 'E463',\n", - " (88, 2): 'E464',\n", - " (88, 3): 'E465',\n", - " (88, 4): 'E466',\n", - " (88, 5): 'E467',\n", - " (88, 6): 'E468',\n", - " (88, 7): 'E469',\n", - " (88, 8): 'E470',\n", - " (88, 9): 'E471',\n", - " (88, 10): 'E472',\n", - " (88, 11): 'E473',\n", - " (89, 1): 'E474',\n", - " (89, 2): 'E475',\n", - " (89, 3): 'E476',\n", - " (89, 4): 'E477',\n", - " (89, 5): 'E478',\n", - " (89, 6): 'E479',\n", - " (89, 7): 'E480',\n", - " (89, 8): 'E481',\n", - " (89, 9): 'E482',\n", - " (89, 10): 'E483',\n", - " (89, 11): 'E484',\n", - " (90, 1): 'E485',\n", - " (90, 2): 'E486',\n", - " (90, 3): 'E487',\n", - " (90, 4): 'E488',\n", - " (90, 5): 'E489',\n", - " (90, 6): 'E490',\n", - " (90, 7): 'E491',\n", - " (90, 8): 'E492',\n", - " (90, 9): 'E493',\n", - " (90, 10): 'E494',\n", - " (90, 11): 'E495',\n", - " (91, 1): 'E496',\n", - " (91, 2): 'E497',\n", - " (91, 3): 'E498',\n", - " (91, 4): 'E499',\n", - " (91, 5): 'E500',\n", - " (91, 6): 'E501',\n", - " (91, 7): 'E502',\n", - " (91, 8): 'E503',\n", - " (91, 9): 'E504',\n", - " (91, 10): 'E505',\n", - " (91, 11): 'E506',\n", - " (92, 1): 'E507',\n", - " (92, 2): 'E508',\n", - " (92, 3): 'E509',\n", - " (92, 4): 'E510',\n", - " (92, 5): 'E511',\n", - " (92, 6): 'E512',\n", - " (92, 7): 'E513',\n", - " (92, 8): 'E514',\n", - " (92, 9): 'E515',\n", - " (92, 10): 'E516',\n", - " (92, 11): 'E517',\n", - " (93, 1): 'E518',\n", - " (93, 2): 'E519',\n", - " (93, 3): 'E520',\n", - " (93, 4): 'E521',\n", - " (93, 5): 'E522',\n", - " (93, 6): 'E523',\n", - " (93, 7): 'E524',\n", - " (93, 8): 'E525',\n", - " (93, 9): 'E526',\n", - " (93, 10): 'E527',\n", - " (93, 11): 'E528',\n", - " (94, 1): 'E529',\n", - " (94, 2): 'E530',\n", - " (94, 3): 'E531',\n", - " (94, 4): 'E532',\n", - " (94, 5): 'E533',\n", - " (94, 6): 'E534',\n", - " (94, 7): 'E535',\n", - " (94, 8): 'E536',\n", - " (94, 9): 'E537',\n", - " (94, 10): 'E538',\n", - " (94, 11): 'E539',\n", - " (95, 1): 'E540',\n", - " (95, 2): 'E541',\n", - " (95, 3): 'E542',\n", - " (95, 4): 'E543',\n", - " (95, 5): 'E544',\n", - " (95, 6): 'E545',\n", - " (95, 7): 'E546',\n", - " (95, 8): 'E547',\n", - " (95, 9): 'E548',\n", - " (95, 10): 'E549',\n", - " (95, 11): 'E550',\n", - " (97, 1): 'E551',\n", - " (97, 2): 'E552',\n", - " (97, 3): 'E553',\n", - " (97, 4): 'E554',\n", - " (97, 5): 'E555',\n", - " (97, 6): 'E556',\n", - " (97, 7): 'E557',\n", - " (97, 8): 'E558',\n", - " (97, 9): 'E559',\n", - " (97, 10): 'E560',\n", - " (97, 11): 'E561',\n", - " (98, 1): 'E562',\n", - " (98, 2): 'E563',\n", - " (98, 3): 'E564',\n", - " (98, 4): 'E565',\n", - " (98, 5): 'E566',\n", - " (98, 6): 'E567',\n", - " (98, 7): 'E568',\n", - " (98, 8): 'E569',\n", - " (98, 9): 'E570',\n", - " (98, 10): 'E571',\n", - " (98, 11): 'E572',\n", - " (100, 1): 'E573',\n", - " (100, 2): 'E574',\n", - " (100, 3): 'E575',\n", - " (100, 4): 'E576',\n", - " (100, 5): 'E577',\n", - " (100, 6): 'E578',\n", - " (100, 7): 'E579',\n", - " (100, 8): 'E580',\n", - " (100, 9): 'E581',\n", - " (100, 10): 'E582',\n", - " (100, 11): 'E583',\n", - " (101, 1): 'E584',\n", - " (101, 2): 'E585',\n", - " (101, 3): 'E586',\n", - " (101, 4): 'E587',\n", - " (101, 5): 'E588',\n", - " (101, 6): 'E589',\n", - " (101, 7): 'E590',\n", - " (101, 8): 'E591',\n", - " (101, 9): 'E592',\n", - " (101, 10): 'E593',\n", - " (101, 11): 'E594',\n", - " (102, 1): 'E595',\n", - " (102, 2): 'E596',\n", - " (102, 3): 'E597',\n", - " (102, 4): 'E598',\n", - " (102, 5): 'E599',\n", - " (102, 6): 'E600',\n", - " (102, 7): 'E601',\n", - " (102, 8): 'E602',\n", - " (102, 9): 'E603',\n", - " (102, 10): 'E604',\n", - " (102, 11): 'E605',\n", - " (103, 1): 'E606',\n", - " (103, 2): 'E607',\n", - " (103, 3): 'E608',\n", - " (103, 4): 'E609',\n", - " (103, 5): 'E610',\n", - " (103, 6): 'E611',\n", - " (103, 7): 'E612',\n", - " (103, 8): 'E613',\n", - " (103, 9): 'E614',\n", - " (103, 10): 'E615',\n", - " (103, 11): 'E616',\n", - " (104, 1): 'E617',\n", - " (104, 2): 'E618',\n", - " (104, 3): 'E619',\n", - " (104, 4): 'E620',\n", - " (104, 5): 'E621',\n", - " (104, 6): 'E622',\n", - " (104, 7): 'E623',\n", - " (104, 8): 'E624',\n", - " (104, 9): 'E625',\n", - " (104, 10): 'E626',\n", - " (104, 11): 'E627',\n", - " (105, 1): 'E628',\n", - " (105, 2): 'E629',\n", - " (105, 3): 'E630',\n", - " (105, 4): 'E631',\n", - " (105, 5): 'E632',\n", - " (105, 6): 'E633',\n", - " (105, 7): 'E634',\n", - " (105, 8): 'E635',\n", - " (105, 9): 'E636',\n", - " (105, 10): 'E637',\n", - " (105, 11): 'E638',\n", - " (106, 1): 'E639',\n", - " (106, 2): 'E640',\n", - " (106, 3): 'E641',\n", - " (106, 4): 'E642',\n", - " (106, 5): 'E643',\n", - " (106, 6): 'E644',\n", - " (106, 7): 'E645',\n", - " (106, 8): 'E646',\n", - " (106, 9): 'E647',\n", - " (106, 10): 'E648',\n", - " (106, 11): 'E649',\n", - " (107, 1): 'E650',\n", - " (107, 2): 'E651',\n", - " (107, 3): 'E652',\n", - " (107, 4): 'E653',\n", - " (107, 5): 'E654',\n", - " (107, 6): 'E655',\n", - " (107, 7): 'E656',\n", - " (107, 8): 'E657',\n", - " (107, 9): 'E658',\n", - " (107, 10): 'E659',\n", - " (107, 11): 'E660',\n", - " (109, 1): 'E661',\n", - " (109, 2): 'E662',\n", - " (109, 3): 'E663',\n", - " (109, 4): 'E664',\n", - " (109, 5): 'E665',\n", - " (109, 6): 'E666',\n", - " (109, 7): 'E667',\n", - " (109, 8): 'E668',\n", - " (109, 9): 'E669',\n", - " (109, 10): 'E670',\n", - " (109, 11): 'E671',\n", - " (110, 1): 'E672',\n", - " (110, 2): 'E673',\n", - " (110, 3): 'E674',\n", - " (110, 4): 'E675',\n", - " (110, 5): 'E676',\n", - " (110, 6): 'E677',\n", - " (110, 7): 'E678',\n", - " (110, 8): 'E679',\n", - " (110, 9): 'E680',\n", - " (110, 10): 'E681',\n", - " (110, 11): 'E682',\n", - " (111, 1): 'E683',\n", - " (111, 2): 'E684',\n", - " (111, 3): 'E685',\n", - " (111, 4): 'E686',\n", - " (111, 5): 'E687',\n", - " (111, 6): 'E688',\n", - " (111, 7): 'E689',\n", - " (111, 8): 'E690',\n", - " (111, 9): 'E691',\n", - " (111, 10): 'E692',\n", - " (111, 11): 'E693',\n", - " (112, 1): 'E694',\n", - " (112, 2): 'E695',\n", - " (112, 3): 'E696',\n", - " (112, 4): 'E697',\n", - " (112, 5): 'E698',\n", - " (112, 6): 'E699',\n", - " (112, 7): 'E700',\n", - " (112, 8): 'E701',\n", - " (112, 9): 'E702',\n", - " (112, 10): 'E703',\n", - " (112, 11): 'E704',\n", - " (113, 1): 'E705',\n", - " (113, 2): 'E706',\n", - " (113, 3): 'E707',\n", - " (113, 4): 'E708',\n", - " (113, 5): 'E709',\n", - " (113, 6): 'E710',\n", - " (113, 7): 'E711',\n", - " (113, 8): 'E712',\n", - " (113, 9): 'E713',\n", - " (113, 10): 'E714',\n", - " (113, 11): 'E715',\n", - " (114, 1): 'E716',\n", - " (114, 2): 'E717',\n", - " (114, 3): 'E718',\n", - " (114, 4): 'E719',\n", - " (114, 5): 'E720',\n", - " (114, 6): 'E721',\n", - " (114, 7): 'E722',\n", - " (114, 8): 'E723',\n", - " (114, 9): 'E724',\n", - " (114, 10): 'E725',\n", - " (114, 11): 'E726',\n", - " (115, 1): 'E727',\n", - " (115, 2): 'E728',\n", - " (115, 3): 'E729',\n", - " (115, 4): 'E730',\n", - " (115, 5): 'E731',\n", - " (115, 6): 'E732',\n", - " (115, 7): 'E733',\n", - " (115, 8): 'E734',\n", - " (115, 9): 'E735',\n", - " (115, 10): 'E736',\n", - " (115, 11): 'E737',\n", - " (116, 1): 'E738',\n", - " (116, 2): 'E739',\n", - " (116, 3): 'E740',\n", - " (116, 4): 'E741',\n", - " (116, 5): 'E742',\n", - " (116, 6): 'E743',\n", - " (116, 7): 'E744',\n", - " (116, 8): 'E745',\n", - " (116, 9): 'E746',\n", - " (116, 10): 'E747',\n", - " (116, 11): 'E748',\n", - " (117, 1): 'E749',\n", - " (117, 2): 'E750',\n", - " (117, 3): 'E751',\n", - " (117, 4): 'E752',\n", - " (117, 5): 'E753',\n", - " (117, 6): 'E754',\n", - " (117, 7): 'E755',\n", - " (117, 8): 'E756',\n", - " (117, 9): 'E757',\n", - " (117, 10): 'E758',\n", - " (117, 11): 'E759',\n", - " (118, 1): 'E760',\n", - " (118, 2): 'E761',\n", - " (118, 3): 'E762',\n", - " (118, 4): 'E763',\n", - " (118, 5): 'E764',\n", - " (118, 6): 'E765',\n", - " (118, 7): 'E766',\n", - " (118, 8): 'E767',\n", - " (118, 9): 'E768',\n", - " (118, 10): 'E769',\n", - " (118, 11): 'E770',\n", - " (119, 1): 'E771',\n", - " (119, 2): 'E772',\n", - " (119, 3): 'E773',\n", - " (119, 4): 'E774',\n", - " (119, 5): 'E775',\n", - " (119, 6): 'E776',\n", - " (119, 7): 'E777',\n", - " (119, 8): 'E778',\n", - " (119, 9): 'E779',\n", - " (119, 10): 'E780',\n", - " (119, 11): 'E781',\n", - " (121, 1): 'E782',\n", - " (121, 2): 'E783',\n", - " (121, 3): 'E784',\n", - " (121, 4): 'E785',\n", - " (121, 5): 'E786',\n", - " (121, 6): 'E787',\n", - " (121, 7): 'E788',\n", - " (121, 8): 'E789',\n", - " (121, 9): 'E790',\n", - " (121, 10): 'E791',\n", - " (121, 11): 'E792',\n", - " (122, 1): 'E793',\n", - " (122, 2): 'E794',\n", - " (122, 3): 'E795',\n", - " (122, 4): 'E796',\n", - " (122, 5): 'E797',\n", - " (122, 6): 'E798',\n", - " (122, 7): 'E799',\n", - " (122, 8): 'E800',\n", - " (122, 9): 'E801',\n", - " (122, 10): 'E802',\n", - " (122, 11): 'E803',\n", - " (123, 1): 'E804',\n", - " (123, 2): 'E805',\n", - " (123, 3): 'E806',\n", - " (123, 4): 'E807',\n", - " (123, 5): 'E808',\n", - " (123, 6): 'E809',\n", - " (123, 7): 'E810',\n", - " (123, 8): 'E811',\n", - " (123, 9): 'E812',\n", - " (123, 10): 'E813',\n", - " (123, 11): 'E814',\n", - " (124, 1): 'E815',\n", - " (124, 2): 'E816',\n", - " (124, 3): 'E817',\n", - " (124, 4): 'E818',\n", - " (124, 5): 'E819',\n", - " (124, 6): 'E820',\n", - " (124, 7): 'E821',\n", - " (124, 8): 'E822',\n", - " (124, 9): 'E823',\n", - " (124, 10): 'E824',\n", - " (124, 11): 'E825',\n", - " (126, 1): 'E826',\n", - " (126, 2): 'E827',\n", - " (126, 3): 'E828',\n", - " (126, 4): 'E829',\n", - " (126, 5): 'E830',\n", - " (126, 6): 'E831',\n", - " (126, 7): 'E832',\n", - " (126, 8): 'E833',\n", - " (126, 9): 'E834',\n", - " (126, 10): 'E835',\n", - " (126, 11): 'E836',\n", - " (128, 1): 'E837',\n", - " (128, 2): 'E838',\n", - " (128, 3): 'E839',\n", - " (128, 4): 'E840',\n", - " (128, 5): 'E841',\n", - " (128, 6): 'E842',\n", - " (128, 7): 'E843',\n", - " (128, 8): 'E844',\n", - " (128, 9): 'E845',\n", - " (128, 10): 'E846',\n", - " (128, 11): 'E847',\n", - " (129, 1): 'E848',\n", - " (129, 2): 'E849',\n", - " (129, 3): 'E850',\n", - " (129, 4): 'E851',\n", - " (129, 5): 'E852',\n", - " (129, 6): 'E853',\n", - " (129, 7): 'E854',\n", - " (129, 8): 'E855',\n", - " (129, 9): 'E856',\n", - " (129, 10): 'E857',\n", - " (129, 11): 'E858',\n", - " (130, 1): 'E859',\n", - " (130, 2): 'E860',\n", - " (130, 3): 'E861',\n", - " (130, 4): 'E862',\n", - " (130, 5): 'E863',\n", - " (130, 6): 'E864',\n", - " (130, 7): 'E865',\n", - " (130, 8): 'E866',\n", - " (130, 9): 'E867',\n", - " (130, 10): 'E868',\n", - " (130, 11): 'E869',\n", - " (131, 1): 'E870',\n", - " (131, 2): 'E871',\n", - " (131, 3): 'E872',\n", - " (131, 4): 'E873',\n", - " (131, 5): 'E874',\n", - " (131, 6): 'E875',\n", - " (131, 7): 'E876',\n", - " (131, 8): 'E877',\n", - " (131, 9): 'E878',\n", - " (131, 10): 'E879',\n", - " (131, 11): 'E880',\n", - " (132, 1): 'E881',\n", - " (132, 2): 'E882',\n", - " (132, 3): 'E883',\n", - " (132, 4): 'E884',\n", - " (132, 5): 'E885',\n", - " (132, 6): 'E886',\n", - " (132, 7): 'E887',\n", - " (132, 8): 'E888',\n", - " (132, 9): 'E889',\n", - " (132, 10): 'E890',\n", - " (132, 11): 'E891',\n", - " (134, 1): 'E892',\n", - " (134, 2): 'E893',\n", - " (134, 3): 'E894',\n", - " (134, 4): 'E895',\n", - " (134, 5): 'E896',\n", - " (134, 6): 'E897',\n", - " (134, 7): 'E898',\n", - " (134, 8): 'E899',\n", - " (134, 9): 'E900',\n", - " (134, 10): 'E901',\n", - " (134, 11): 'E902',\n", - " (137, 1): 'E903',\n", - " (137, 2): 'E904',\n", - " (137, 3): 'E905',\n", - " (137, 4): 'E906',\n", - " (137, 5): 'E907',\n", - " (137, 6): 'E908',\n", - " (137, 7): 'E909',\n", - " (137, 8): 'E910',\n", - " (137, 9): 'E911',\n", - " (137, 10): 'E912',\n", - " (137, 11): 'E913'}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "count = 1\n", - "tsMap = dict() #map from (store, brand) to \n", - "for i in store_list: \n", - " for j in brand_list: \n", - " tsMap[(i, j)] = 'E' + str(count)\n", - " count += 1\n", - "tsMap" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "yx.insert(loc=0, column='SalesID', value=[float('nan')] * len(yx)) " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDstorebrandweeklogmoveconstantprice1price2price3price4price5price6price7price8price9price10price11dealfeatprofit
0NaN21409.01869510.0604690.0604970.0420310.0295310.0495310.0530210.0389060.0414060.0289060.0248440.03898410.037.992326
1NaN21468.72323110.0604690.0603120.0451560.0467190.0495310.0478130.0457810.0279690.0429690.0420310.03898400.030.126667
2NaN21478.25322810.0604690.0603120.0451560.0467190.0373440.0530210.0457810.0414060.0481250.0326560.03898400.030.000000
3NaN21488.98719710.0604690.0603120.0498440.0373440.0495310.0530210.0457810.0414060.0423440.0326560.03898400.029.950000
4NaN21509.09335710.0604690.0603120.0435940.0310940.0495310.0530210.0466480.0414060.0423440.0326560.03820300.029.920000
5NaN21518.87738210.0604690.0603120.0435940.0467190.0495310.0530210.0464560.0357810.0423440.0295310.03820300.029.920000
6NaN21529.29468210.0514060.0603120.0435940.0467190.0495310.0530210.0479690.0357810.0310940.0295310.03898410.027.125471
7NaN21538.95467410.0514060.0603120.0498440.0467190.0342190.0530210.0479690.0357810.0310940.0295310.03898410.027.125041
8NaN21549.04923210.0514060.0603120.0498440.0373440.0495310.0530210.0479690.0382810.0481250.0279690.03507810.027.082481
9NaN21578.61323010.0514060.0603120.0482810.0467190.0310940.0530210.0310940.0414060.0423440.0420310.03898410.027.061163
10NaN21588.68067210.0556250.0478130.0467190.0467190.0465740.0530210.0479690.0420310.0310940.0193750.03898410.029.521087
11NaN21599.03408010.0556250.0603120.0467190.0310940.0495310.0530210.0479690.0389060.0310940.0248440.03898410.031.299771
12NaN21608.69148310.0556250.0603120.0467190.0467190.0310940.0467710.0479690.0389060.0310940.0248440.03898400.031.325914
13NaN21618.83171210.0556250.0603120.0467190.0310940.0495310.0467710.0479690.0420310.0481250.0201560.03820310.031.419907
14NaN21629.12869610.0604690.0603120.0467190.0467190.0310940.0530210.0479690.0420310.0435940.0154690.03820300.033.386667
15NaN21639.40590710.0467190.0603120.0467190.0357810.0310940.0446870.0404690.0420310.0435940.0248440.03820310.019.730000
16NaN21649.44715010.0467190.0561460.0467190.0357810.0495310.0446870.0404690.0310940.0435940.0389060.03820310.022.040909
17NaN21658.78385610.0560940.0561460.0420310.0437020.0310940.0512750.0373440.0310940.0435940.0420310.03117200.035.353137
18NaN21668.72323110.0560940.0415630.0420310.0404690.0310940.0514710.0373440.0420310.0310940.0217190.03117200.035.217500
19NaN21679.95797610.0373440.0415630.0498440.0310940.0310940.0446870.0404690.0420310.0310940.0420310.03117200.025.086667
20NaN21689.42674110.0373440.0561460.0498440.0264060.0310940.0446870.0404690.0420310.0310940.0420310.02335910.017.070052
21NaN21699.15609510.0560940.0561460.0295310.0404690.0310940.0446870.0310940.0390620.0310940.0420310.02335910.043.958514
22NaN21709.79367310.0404690.0561460.0498440.0404690.0404690.0446870.0404690.0390620.0389060.0154690.03507810.035.017143
23NaN21719.14931610.0404690.0561460.0498440.0264060.0404690.0415630.0404690.0420310.0310940.0420310.02726610.031.038367
24NaN21728.74385110.0560940.0373960.0498440.0264060.0310940.0415630.0404690.0357810.0310940.0420310.02726600.050.155714
25NaN21738.84101410.0560940.0373960.0498440.0404690.0404690.0415630.0404690.0357810.0310940.0232810.02726600.048.598889
26NaN21749.72722810.0389060.0373960.0420310.0404690.0389060.0431250.0404690.0420310.0310940.0232810.03507810.031.650000
27NaN21758.74385110.0560940.0561460.0420310.0232810.0389060.0431250.0404690.0420310.0310940.0420310.02726600.051.318980
28NaN21768.97916510.0560940.0561460.0498440.0232810.0389060.0431250.0310940.0342190.0310940.0420310.02726600.051.020565
29NaN21778.72323110.0560940.0561460.0498440.0404690.0310940.0415630.0404690.0342190.0389060.0170310.03507800.051.144375
...............................................................
106109NaN137111319.63115410.0279690.0519790.0490800.0398200.0310940.0483950.0375000.0389060.0232810.0221870.02570310.017.170000
106110NaN137111329.70406110.0305040.0519790.0435940.0339270.0331670.0457290.0310940.0389060.0253130.0248440.02632811.018.630000
106111NaN137111338.99516510.0430560.0519790.0455420.0310940.0372050.0465790.0334700.0379690.0201560.0256250.02960910.025.350000
106112NaN137111348.91247310.0390620.0493010.0495880.0323000.0310940.0509370.0420310.0357810.0220310.0310940.02960910.025.320000
106113NaN137111359.90188610.0404730.0457290.0469570.0452230.0334930.0509370.0339410.0357810.0264060.0229690.02335911.05.350000
106114NaN137111368.74385110.0498440.0474120.0476560.0465540.0435940.0509370.0310940.0357810.0268750.0201560.03242200.032.000000
106115NaN137111378.91247310.0427850.0519790.0476560.0406210.0326560.0381250.0333530.0368750.0373440.0210940.03210900.031.720000
106116NaN137111388.72323110.0373440.0389580.0476560.0357810.0435940.0509370.0420310.0389060.0373440.0310940.03242200.033.590000
106117NaN137111399.05672310.0498440.0519790.0451560.0478130.0435940.0509370.0310940.0348440.0373440.0314060.03117200.030.620000
106118NaN1371114010.03941610.0498440.0519790.0452390.0478130.0435940.0509370.0310940.0310940.0373440.0326560.02960911.031.420000
106119NaN137111419.50599110.0498440.0519790.0467190.0467250.0326560.0381250.0420310.0389060.0373440.0264060.02960911.039.520000
106120NaN137111428.94637510.0498440.0519790.0451560.0435940.0439110.0509370.0420310.0389060.0310940.0262500.03007810.040.770000
106121NaN137111439.16951810.0389060.0519790.0451560.0445740.0451560.0509370.0420310.0389060.0362500.0271870.03148400.043.420000
106122NaN137111449.12869610.0352180.0519790.0457030.0478130.0451560.0481250.0420310.0389060.0346880.0326560.03039111.041.380000
106123NaN137111458.94637510.0310940.0519790.0467190.0478130.0451560.0446870.0420310.0392190.0342190.0318750.03179700.043.980000
106124NaN137111469.01091310.0488990.0467710.0452620.0310940.0398390.0463190.0420310.0404690.0346880.0309370.03117200.037.510000
106125NaN137111478.94637510.0417820.0486460.0420310.0322570.0312050.0509370.0420310.0404690.0335940.0271870.03117200.038.790000
106126NaN137111488.80327410.0492700.0519790.0427350.0295310.0371800.0480530.0420310.0404690.0326560.0206250.03117200.039.720000
106127NaN137111498.89508210.0496230.0519790.0457810.0478130.0451560.0457290.0420310.0404690.0326560.0234380.03117200.039.240000
106128NaN137111508.34853810.0498440.0415630.0435940.0478130.0357810.0509370.0420310.0404690.0326560.0264060.03117200.037.540000
106129NaN137111518.43554910.0495310.0514530.0460170.0478130.0448440.0506250.0416790.0370310.0326560.0232810.03085900.036.830000
106130NaN137111528.84101410.0482810.0498960.0451560.0404690.0439060.0496880.0404690.0326560.0357810.0310940.02960911.034.160000
106131NaN137111538.72323110.0498440.0519790.0467190.0348270.0310940.0496880.0420310.0381250.0373440.0314060.03117200.037.460000
106132NaN137111548.70217810.0435940.0503690.0455100.0310940.0300330.0499220.0420310.0310940.0373440.0181250.03007800.035.190000
106133NaN137111558.78385610.0432270.0483330.0434370.0310940.0264060.0484470.0407810.0310940.0323440.0204690.02835900.031.260000
106134NaN137111569.38463010.0389060.0483330.0434370.0316650.0288110.0435420.0376560.0310940.0300000.0312500.02804710.030.500000
106135NaN137111579.15609510.0415870.0483330.0434370.0443480.0310940.0435420.0376560.0368750.0300000.0303120.02804710.030.500000
106136NaN137111589.14249010.0485400.0483330.0434370.0329140.0441260.0409290.0376560.0310940.0248440.0248440.02835910.032.360000
106137NaN137111598.61323010.0435940.0483330.0434370.0279690.0404950.0363540.0376560.0310940.0270310.0232810.02898400.035.330000
106138NaN137111608.96290410.0450630.0415630.0434370.0279690.0342190.0382160.0376560.0323440.0300000.0273440.02898400.035.440000
\n", - "

106139 rows × 20 columns

\n", - "
" - ], - "text/plain": [ - " SalesID store brand week logmove constant price1 price2 \\\n", - "0 NaN 2 1 40 9.018695 1 0.060469 0.060497 \n", - "1 NaN 2 1 46 8.723231 1 0.060469 0.060312 \n", - "2 NaN 2 1 47 8.253228 1 0.060469 0.060312 \n", - "3 NaN 2 1 48 8.987197 1 0.060469 0.060312 \n", - "4 NaN 2 1 50 9.093357 1 0.060469 0.060312 \n", - "5 NaN 2 1 51 8.877382 1 0.060469 0.060312 \n", - "6 NaN 2 1 52 9.294682 1 0.051406 0.060312 \n", - "7 NaN 2 1 53 8.954674 1 0.051406 0.060312 \n", - "8 NaN 2 1 54 9.049232 1 0.051406 0.060312 \n", - "9 NaN 2 1 57 8.613230 1 0.051406 0.060312 \n", - "10 NaN 2 1 58 8.680672 1 0.055625 0.047813 \n", - "11 NaN 2 1 59 9.034080 1 0.055625 0.060312 \n", - "12 NaN 2 1 60 8.691483 1 0.055625 0.060312 \n", - "13 NaN 2 1 61 8.831712 1 0.055625 0.060312 \n", - "14 NaN 2 1 62 9.128696 1 0.060469 0.060312 \n", - "15 NaN 2 1 63 9.405907 1 0.046719 0.060312 \n", - "16 NaN 2 1 64 9.447150 1 0.046719 0.056146 \n", - "17 NaN 2 1 65 8.783856 1 0.056094 0.056146 \n", - "18 NaN 2 1 66 8.723231 1 0.056094 0.041563 \n", - "19 NaN 2 1 67 9.957976 1 0.037344 0.041563 \n", - "20 NaN 2 1 68 9.426741 1 0.037344 0.056146 \n", - "21 NaN 2 1 69 9.156095 1 0.056094 0.056146 \n", - "22 NaN 2 1 70 9.793673 1 0.040469 0.056146 \n", - "23 NaN 2 1 71 9.149316 1 0.040469 0.056146 \n", - "24 NaN 2 1 72 8.743851 1 0.056094 0.037396 \n", - "25 NaN 2 1 73 8.841014 1 0.056094 0.037396 \n", - "26 NaN 2 1 74 9.727228 1 0.038906 0.037396 \n", - "27 NaN 2 1 75 8.743851 1 0.056094 0.056146 \n", - "28 NaN 2 1 76 8.979165 1 0.056094 0.056146 \n", - "29 NaN 2 1 77 8.723231 1 0.056094 0.056146 \n", - "... ... ... ... ... ... ... ... ... \n", - "106109 NaN 137 11 131 9.631154 1 0.027969 0.051979 \n", - "106110 NaN 137 11 132 9.704061 1 0.030504 0.051979 \n", - "106111 NaN 137 11 133 8.995165 1 0.043056 0.051979 \n", - "106112 NaN 137 11 134 8.912473 1 0.039062 0.049301 \n", - "106113 NaN 137 11 135 9.901886 1 0.040473 0.045729 \n", - "106114 NaN 137 11 136 8.743851 1 0.049844 0.047412 \n", - "106115 NaN 137 11 137 8.912473 1 0.042785 0.051979 \n", - "106116 NaN 137 11 138 8.723231 1 0.037344 0.038958 \n", - "106117 NaN 137 11 139 9.056723 1 0.049844 0.051979 \n", - "106118 NaN 137 11 140 10.039416 1 0.049844 0.051979 \n", - "106119 NaN 137 11 141 9.505991 1 0.049844 0.051979 \n", - "106120 NaN 137 11 142 8.946375 1 0.049844 0.051979 \n", - "106121 NaN 137 11 143 9.169518 1 0.038906 0.051979 \n", - "106122 NaN 137 11 144 9.128696 1 0.035218 0.051979 \n", - "106123 NaN 137 11 145 8.946375 1 0.031094 0.051979 \n", - "106124 NaN 137 11 146 9.010913 1 0.048899 0.046771 \n", - "106125 NaN 137 11 147 8.946375 1 0.041782 0.048646 \n", - "106126 NaN 137 11 148 8.803274 1 0.049270 0.051979 \n", - "106127 NaN 137 11 149 8.895082 1 0.049623 0.051979 \n", - "106128 NaN 137 11 150 8.348538 1 0.049844 0.041563 \n", - "106129 NaN 137 11 151 8.435549 1 0.049531 0.051453 \n", - "106130 NaN 137 11 152 8.841014 1 0.048281 0.049896 \n", - "106131 NaN 137 11 153 8.723231 1 0.049844 0.051979 \n", - "106132 NaN 137 11 154 8.702178 1 0.043594 0.050369 \n", - "106133 NaN 137 11 155 8.783856 1 0.043227 0.048333 \n", - "106134 NaN 137 11 156 9.384630 1 0.038906 0.048333 \n", - "106135 NaN 137 11 157 9.156095 1 0.041587 0.048333 \n", - "106136 NaN 137 11 158 9.142490 1 0.048540 0.048333 \n", - "106137 NaN 137 11 159 8.613230 1 0.043594 0.048333 \n", - "106138 NaN 137 11 160 8.962904 1 0.045063 0.041563 \n", - "\n", - " price3 price4 price5 price6 price7 price8 price9 \\\n", - "0 0.042031 0.029531 0.049531 0.053021 0.038906 0.041406 0.028906 \n", - "1 0.045156 0.046719 0.049531 0.047813 0.045781 0.027969 0.042969 \n", - "2 0.045156 0.046719 0.037344 0.053021 0.045781 0.041406 0.048125 \n", - "3 0.049844 0.037344 0.049531 0.053021 0.045781 0.041406 0.042344 \n", - "4 0.043594 0.031094 0.049531 0.053021 0.046648 0.041406 0.042344 \n", - "5 0.043594 0.046719 0.049531 0.053021 0.046456 0.035781 0.042344 \n", - "6 0.043594 0.046719 0.049531 0.053021 0.047969 0.035781 0.031094 \n", - "7 0.049844 0.046719 0.034219 0.053021 0.047969 0.035781 0.031094 \n", - "8 0.049844 0.037344 0.049531 0.053021 0.047969 0.038281 0.048125 \n", - "9 0.048281 0.046719 0.031094 0.053021 0.031094 0.041406 0.042344 \n", - "10 0.046719 0.046719 0.046574 0.053021 0.047969 0.042031 0.031094 \n", - "11 0.046719 0.031094 0.049531 0.053021 0.047969 0.038906 0.031094 \n", - "12 0.046719 0.046719 0.031094 0.046771 0.047969 0.038906 0.031094 \n", - "13 0.046719 0.031094 0.049531 0.046771 0.047969 0.042031 0.048125 \n", - "14 0.046719 0.046719 0.031094 0.053021 0.047969 0.042031 0.043594 \n", - "15 0.046719 0.035781 0.031094 0.044687 0.040469 0.042031 0.043594 \n", - "16 0.046719 0.035781 0.049531 0.044687 0.040469 0.031094 0.043594 \n", - "17 0.042031 0.043702 0.031094 0.051275 0.037344 0.031094 0.043594 \n", - "18 0.042031 0.040469 0.031094 0.051471 0.037344 0.042031 0.031094 \n", - "19 0.049844 0.031094 0.031094 0.044687 0.040469 0.042031 0.031094 \n", - "20 0.049844 0.026406 0.031094 0.044687 0.040469 0.042031 0.031094 \n", - "21 0.029531 0.040469 0.031094 0.044687 0.031094 0.039062 0.031094 \n", - "22 0.049844 0.040469 0.040469 0.044687 0.040469 0.039062 0.038906 \n", - "23 0.049844 0.026406 0.040469 0.041563 0.040469 0.042031 0.031094 \n", - "24 0.049844 0.026406 0.031094 0.041563 0.040469 0.035781 0.031094 \n", - "25 0.049844 0.040469 0.040469 0.041563 0.040469 0.035781 0.031094 \n", - "26 0.042031 0.040469 0.038906 0.043125 0.040469 0.042031 0.031094 \n", - "27 0.042031 0.023281 0.038906 0.043125 0.040469 0.042031 0.031094 \n", - "28 0.049844 0.023281 0.038906 0.043125 0.031094 0.034219 0.031094 \n", - "29 0.049844 0.040469 0.031094 0.041563 0.040469 0.034219 0.038906 \n", - "... ... ... ... ... ... ... ... \n", - "106109 0.049080 0.039820 0.031094 0.048395 0.037500 0.038906 0.023281 \n", - "106110 0.043594 0.033927 0.033167 0.045729 0.031094 0.038906 0.025313 \n", - "106111 0.045542 0.031094 0.037205 0.046579 0.033470 0.037969 0.020156 \n", - "106112 0.049588 0.032300 0.031094 0.050937 0.042031 0.035781 0.022031 \n", - "106113 0.046957 0.045223 0.033493 0.050937 0.033941 0.035781 0.026406 \n", - "106114 0.047656 0.046554 0.043594 0.050937 0.031094 0.035781 0.026875 \n", - "106115 0.047656 0.040621 0.032656 0.038125 0.033353 0.036875 0.037344 \n", - "106116 0.047656 0.035781 0.043594 0.050937 0.042031 0.038906 0.037344 \n", - "106117 0.045156 0.047813 0.043594 0.050937 0.031094 0.034844 0.037344 \n", - "106118 0.045239 0.047813 0.043594 0.050937 0.031094 0.031094 0.037344 \n", - "106119 0.046719 0.046725 0.032656 0.038125 0.042031 0.038906 0.037344 \n", - "106120 0.045156 0.043594 0.043911 0.050937 0.042031 0.038906 0.031094 \n", - "106121 0.045156 0.044574 0.045156 0.050937 0.042031 0.038906 0.036250 \n", - "106122 0.045703 0.047813 0.045156 0.048125 0.042031 0.038906 0.034688 \n", - "106123 0.046719 0.047813 0.045156 0.044687 0.042031 0.039219 0.034219 \n", - "106124 0.045262 0.031094 0.039839 0.046319 0.042031 0.040469 0.034688 \n", - "106125 0.042031 0.032257 0.031205 0.050937 0.042031 0.040469 0.033594 \n", - "106126 0.042735 0.029531 0.037180 0.048053 0.042031 0.040469 0.032656 \n", - "106127 0.045781 0.047813 0.045156 0.045729 0.042031 0.040469 0.032656 \n", - "106128 0.043594 0.047813 0.035781 0.050937 0.042031 0.040469 0.032656 \n", - "106129 0.046017 0.047813 0.044844 0.050625 0.041679 0.037031 0.032656 \n", - "106130 0.045156 0.040469 0.043906 0.049688 0.040469 0.032656 0.035781 \n", - "106131 0.046719 0.034827 0.031094 0.049688 0.042031 0.038125 0.037344 \n", - "106132 0.045510 0.031094 0.030033 0.049922 0.042031 0.031094 0.037344 \n", - "106133 0.043437 0.031094 0.026406 0.048447 0.040781 0.031094 0.032344 \n", - "106134 0.043437 0.031665 0.028811 0.043542 0.037656 0.031094 0.030000 \n", - "106135 0.043437 0.044348 0.031094 0.043542 0.037656 0.036875 0.030000 \n", - "106136 0.043437 0.032914 0.044126 0.040929 0.037656 0.031094 0.024844 \n", - "106137 0.043437 0.027969 0.040495 0.036354 0.037656 0.031094 0.027031 \n", - "106138 0.043437 0.027969 0.034219 0.038216 0.037656 0.032344 0.030000 \n", - "\n", - " price10 price11 deal feat profit \n", - "0 0.024844 0.038984 1 0.0 37.992326 \n", - "1 0.042031 0.038984 0 0.0 30.126667 \n", - "2 0.032656 0.038984 0 0.0 30.000000 \n", - "3 0.032656 0.038984 0 0.0 29.950000 \n", - "4 0.032656 0.038203 0 0.0 29.920000 \n", - "5 0.029531 0.038203 0 0.0 29.920000 \n", - "6 0.029531 0.038984 1 0.0 27.125471 \n", - "7 0.029531 0.038984 1 0.0 27.125041 \n", - "8 0.027969 0.035078 1 0.0 27.082481 \n", - "9 0.042031 0.038984 1 0.0 27.061163 \n", - "10 0.019375 0.038984 1 0.0 29.521087 \n", - "11 0.024844 0.038984 1 0.0 31.299771 \n", - "12 0.024844 0.038984 0 0.0 31.325914 \n", - "13 0.020156 0.038203 1 0.0 31.419907 \n", - "14 0.015469 0.038203 0 0.0 33.386667 \n", - "15 0.024844 0.038203 1 0.0 19.730000 \n", - "16 0.038906 0.038203 1 0.0 22.040909 \n", - "17 0.042031 0.031172 0 0.0 35.353137 \n", - "18 0.021719 0.031172 0 0.0 35.217500 \n", - "19 0.042031 0.031172 0 0.0 25.086667 \n", - "20 0.042031 0.023359 1 0.0 17.070052 \n", - "21 0.042031 0.023359 1 0.0 43.958514 \n", - "22 0.015469 0.035078 1 0.0 35.017143 \n", - "23 0.042031 0.027266 1 0.0 31.038367 \n", - "24 0.042031 0.027266 0 0.0 50.155714 \n", - "25 0.023281 0.027266 0 0.0 48.598889 \n", - "26 0.023281 0.035078 1 0.0 31.650000 \n", - "27 0.042031 0.027266 0 0.0 51.318980 \n", - "28 0.042031 0.027266 0 0.0 51.020565 \n", - "29 0.017031 0.035078 0 0.0 51.144375 \n", - "... ... ... ... ... ... \n", - "106109 0.022187 0.025703 1 0.0 17.170000 \n", - "106110 0.024844 0.026328 1 1.0 18.630000 \n", - "106111 0.025625 0.029609 1 0.0 25.350000 \n", - "106112 0.031094 0.029609 1 0.0 25.320000 \n", - "106113 0.022969 0.023359 1 1.0 5.350000 \n", - "106114 0.020156 0.032422 0 0.0 32.000000 \n", - "106115 0.021094 0.032109 0 0.0 31.720000 \n", - "106116 0.031094 0.032422 0 0.0 33.590000 \n", - "106117 0.031406 0.031172 0 0.0 30.620000 \n", - "106118 0.032656 0.029609 1 1.0 31.420000 \n", - "106119 0.026406 0.029609 1 1.0 39.520000 \n", - "106120 0.026250 0.030078 1 0.0 40.770000 \n", - "106121 0.027187 0.031484 0 0.0 43.420000 \n", - "106122 0.032656 0.030391 1 1.0 41.380000 \n", - "106123 0.031875 0.031797 0 0.0 43.980000 \n", - "106124 0.030937 0.031172 0 0.0 37.510000 \n", - "106125 0.027187 0.031172 0 0.0 38.790000 \n", - "106126 0.020625 0.031172 0 0.0 39.720000 \n", - "106127 0.023438 0.031172 0 0.0 39.240000 \n", - "106128 0.026406 0.031172 0 0.0 37.540000 \n", - "106129 0.023281 0.030859 0 0.0 36.830000 \n", - "106130 0.031094 0.029609 1 1.0 34.160000 \n", - "106131 0.031406 0.031172 0 0.0 37.460000 \n", - "106132 0.018125 0.030078 0 0.0 35.190000 \n", - "106133 0.020469 0.028359 0 0.0 31.260000 \n", - "106134 0.031250 0.028047 1 0.0 30.500000 \n", - "106135 0.030312 0.028047 1 0.0 30.500000 \n", - "106136 0.024844 0.028359 1 0.0 32.360000 \n", - "106137 0.023281 0.028984 0 0.0 35.330000 \n", - "106138 0.027344 0.028984 0 0.0 35.440000 \n", - "\n", - "[106139 rows x 20 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "yx" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDstorebrandweeklogmoveconstantprice1price2price3price4price5price6price7price8price9price10price11dealfeatprofit
0E121409.01869510.0604690.0604970.0420310.0295310.0495310.0530210.0389060.0414060.0289060.0248440.03898410.037.992326
1E121468.72323110.0604690.0603120.0451560.0467190.0495310.0478130.0457810.0279690.0429690.0420310.03898400.030.126667
2E121478.25322810.0604690.0603120.0451560.0467190.0373440.0530210.0457810.0414060.0481250.0326560.03898400.030.000000
3E121488.98719710.0604690.0603120.0498440.0373440.0495310.0530210.0457810.0414060.0423440.0326560.03898400.029.950000
4E121509.09335710.0604690.0603120.0435940.0310940.0495310.0530210.0466480.0414060.0423440.0326560.03820300.029.920000
5E121518.87738210.0604690.0603120.0435940.0467190.0495310.0530210.0464560.0357810.0423440.0295310.03820300.029.920000
6E121529.29468210.0514060.0603120.0435940.0467190.0495310.0530210.0479690.0357810.0310940.0295310.03898410.027.125471
7E121538.95467410.0514060.0603120.0498440.0467190.0342190.0530210.0479690.0357810.0310940.0295310.03898410.027.125041
8E121549.04923210.0514060.0603120.0498440.0373440.0495310.0530210.0479690.0382810.0481250.0279690.03507810.027.082481
9E121578.61323010.0514060.0603120.0482810.0467190.0310940.0530210.0310940.0414060.0423440.0420310.03898410.027.061163
10E121588.68067210.0556250.0478130.0467190.0467190.0465740.0530210.0479690.0420310.0310940.0193750.03898410.029.521087
11E121599.03408010.0556250.0603120.0467190.0310940.0495310.0530210.0479690.0389060.0310940.0248440.03898410.031.299771
12E121608.69148310.0556250.0603120.0467190.0467190.0310940.0467710.0479690.0389060.0310940.0248440.03898400.031.325914
13E121618.83171210.0556250.0603120.0467190.0310940.0495310.0467710.0479690.0420310.0481250.0201560.03820310.031.419907
14E121629.12869610.0604690.0603120.0467190.0467190.0310940.0530210.0479690.0420310.0435940.0154690.03820300.033.386667
15E121639.40590710.0467190.0603120.0467190.0357810.0310940.0446870.0404690.0420310.0435940.0248440.03820310.019.730000
16E121649.44715010.0467190.0561460.0467190.0357810.0495310.0446870.0404690.0310940.0435940.0389060.03820310.022.040909
17E121658.78385610.0560940.0561460.0420310.0437020.0310940.0512750.0373440.0310940.0435940.0420310.03117200.035.353137
18E121668.72323110.0560940.0415630.0420310.0404690.0310940.0514710.0373440.0420310.0310940.0217190.03117200.035.217500
19E121679.95797610.0373440.0415630.0498440.0310940.0310940.0446870.0404690.0420310.0310940.0420310.03117200.025.086667
20E121689.42674110.0373440.0561460.0498440.0264060.0310940.0446870.0404690.0420310.0310940.0420310.02335910.017.070052
21E121699.15609510.0560940.0561460.0295310.0404690.0310940.0446870.0310940.0390620.0310940.0420310.02335910.043.958514
22E121709.79367310.0404690.0561460.0498440.0404690.0404690.0446870.0404690.0390620.0389060.0154690.03507810.035.017143
23E121719.14931610.0404690.0561460.0498440.0264060.0404690.0415630.0404690.0420310.0310940.0420310.02726610.031.038367
24E121728.74385110.0560940.0373960.0498440.0264060.0310940.0415630.0404690.0357810.0310940.0420310.02726600.050.155714
25E121738.84101410.0560940.0373960.0498440.0404690.0404690.0415630.0404690.0357810.0310940.0232810.02726600.048.598889
26E121749.72722810.0389060.0373960.0420310.0404690.0389060.0431250.0404690.0420310.0310940.0232810.03507810.031.650000
27E121758.74385110.0560940.0561460.0420310.0232810.0389060.0431250.0404690.0420310.0310940.0420310.02726600.051.318980
28E121768.97916510.0560940.0561460.0498440.0232810.0389060.0431250.0310940.0342190.0310940.0420310.02726600.051.020565
29E121778.72323110.0560940.0561460.0498440.0404690.0310940.0415630.0404690.0342190.0389060.0170310.03507800.051.144375
...............................................................
106109E913137111319.63115410.0279690.0519790.0490800.0398200.0310940.0483950.0375000.0389060.0232810.0221870.02570310.017.170000
106110E913137111329.70406110.0305040.0519790.0435940.0339270.0331670.0457290.0310940.0389060.0253130.0248440.02632811.018.630000
106111E913137111338.99516510.0430560.0519790.0455420.0310940.0372050.0465790.0334700.0379690.0201560.0256250.02960910.025.350000
106112E913137111348.91247310.0390620.0493010.0495880.0323000.0310940.0509370.0420310.0357810.0220310.0310940.02960910.025.320000
106113E913137111359.90188610.0404730.0457290.0469570.0452230.0334930.0509370.0339410.0357810.0264060.0229690.02335911.05.350000
106114E913137111368.74385110.0498440.0474120.0476560.0465540.0435940.0509370.0310940.0357810.0268750.0201560.03242200.032.000000
106115E913137111378.91247310.0427850.0519790.0476560.0406210.0326560.0381250.0333530.0368750.0373440.0210940.03210900.031.720000
106116E913137111388.72323110.0373440.0389580.0476560.0357810.0435940.0509370.0420310.0389060.0373440.0310940.03242200.033.590000
106117E913137111399.05672310.0498440.0519790.0451560.0478130.0435940.0509370.0310940.0348440.0373440.0314060.03117200.030.620000
106118E9131371114010.03941610.0498440.0519790.0452390.0478130.0435940.0509370.0310940.0310940.0373440.0326560.02960911.031.420000
106119E913137111419.50599110.0498440.0519790.0467190.0467250.0326560.0381250.0420310.0389060.0373440.0264060.02960911.039.520000
106120E913137111428.94637510.0498440.0519790.0451560.0435940.0439110.0509370.0420310.0389060.0310940.0262500.03007810.040.770000
106121E913137111439.16951810.0389060.0519790.0451560.0445740.0451560.0509370.0420310.0389060.0362500.0271870.03148400.043.420000
106122E913137111449.12869610.0352180.0519790.0457030.0478130.0451560.0481250.0420310.0389060.0346880.0326560.03039111.041.380000
106123E913137111458.94637510.0310940.0519790.0467190.0478130.0451560.0446870.0420310.0392190.0342190.0318750.03179700.043.980000
106124E913137111469.01091310.0488990.0467710.0452620.0310940.0398390.0463190.0420310.0404690.0346880.0309370.03117200.037.510000
106125E913137111478.94637510.0417820.0486460.0420310.0322570.0312050.0509370.0420310.0404690.0335940.0271870.03117200.038.790000
106126E913137111488.80327410.0492700.0519790.0427350.0295310.0371800.0480530.0420310.0404690.0326560.0206250.03117200.039.720000
106127E913137111498.89508210.0496230.0519790.0457810.0478130.0451560.0457290.0420310.0404690.0326560.0234380.03117200.039.240000
106128E913137111508.34853810.0498440.0415630.0435940.0478130.0357810.0509370.0420310.0404690.0326560.0264060.03117200.037.540000
106129E913137111518.43554910.0495310.0514530.0460170.0478130.0448440.0506250.0416790.0370310.0326560.0232810.03085900.036.830000
106130E913137111528.84101410.0482810.0498960.0451560.0404690.0439060.0496880.0404690.0326560.0357810.0310940.02960911.034.160000
106131E913137111538.72323110.0498440.0519790.0467190.0348270.0310940.0496880.0420310.0381250.0373440.0314060.03117200.037.460000
106132E913137111548.70217810.0435940.0503690.0455100.0310940.0300330.0499220.0420310.0310940.0373440.0181250.03007800.035.190000
106133E913137111558.78385610.0432270.0483330.0434370.0310940.0264060.0484470.0407810.0310940.0323440.0204690.02835900.031.260000
106134E913137111569.38463010.0389060.0483330.0434370.0316650.0288110.0435420.0376560.0310940.0300000.0312500.02804710.030.500000
106135E913137111579.15609510.0415870.0483330.0434370.0443480.0310940.0435420.0376560.0368750.0300000.0303120.02804710.030.500000
106136E913137111589.14249010.0485400.0483330.0434370.0329140.0441260.0409290.0376560.0310940.0248440.0248440.02835910.032.360000
106137E913137111598.61323010.0435940.0483330.0434370.0279690.0404950.0363540.0376560.0310940.0270310.0232810.02898400.035.330000
106138E913137111608.96290410.0450630.0415630.0434370.0279690.0342190.0382160.0376560.0323440.0300000.0273440.02898400.035.440000
\n", - "

106139 rows × 20 columns

\n", - "
" - ], - "text/plain": [ - " SalesID store brand week logmove constant price1 price2 \\\n", - "0 E1 2 1 40 9.018695 1 0.060469 0.060497 \n", - "1 E1 2 1 46 8.723231 1 0.060469 0.060312 \n", - "2 E1 2 1 47 8.253228 1 0.060469 0.060312 \n", - "3 E1 2 1 48 8.987197 1 0.060469 0.060312 \n", - "4 E1 2 1 50 9.093357 1 0.060469 0.060312 \n", - "5 E1 2 1 51 8.877382 1 0.060469 0.060312 \n", - "6 E1 2 1 52 9.294682 1 0.051406 0.060312 \n", - "7 E1 2 1 53 8.954674 1 0.051406 0.060312 \n", - "8 E1 2 1 54 9.049232 1 0.051406 0.060312 \n", - "9 E1 2 1 57 8.613230 1 0.051406 0.060312 \n", - "10 E1 2 1 58 8.680672 1 0.055625 0.047813 \n", - "11 E1 2 1 59 9.034080 1 0.055625 0.060312 \n", - "12 E1 2 1 60 8.691483 1 0.055625 0.060312 \n", - "13 E1 2 1 61 8.831712 1 0.055625 0.060312 \n", - "14 E1 2 1 62 9.128696 1 0.060469 0.060312 \n", - "15 E1 2 1 63 9.405907 1 0.046719 0.060312 \n", - "16 E1 2 1 64 9.447150 1 0.046719 0.056146 \n", - "17 E1 2 1 65 8.783856 1 0.056094 0.056146 \n", - "18 E1 2 1 66 8.723231 1 0.056094 0.041563 \n", - "19 E1 2 1 67 9.957976 1 0.037344 0.041563 \n", - "20 E1 2 1 68 9.426741 1 0.037344 0.056146 \n", - "21 E1 2 1 69 9.156095 1 0.056094 0.056146 \n", - "22 E1 2 1 70 9.793673 1 0.040469 0.056146 \n", - "23 E1 2 1 71 9.149316 1 0.040469 0.056146 \n", - "24 E1 2 1 72 8.743851 1 0.056094 0.037396 \n", - "25 E1 2 1 73 8.841014 1 0.056094 0.037396 \n", - "26 E1 2 1 74 9.727228 1 0.038906 0.037396 \n", - "27 E1 2 1 75 8.743851 1 0.056094 0.056146 \n", - "28 E1 2 1 76 8.979165 1 0.056094 0.056146 \n", - "29 E1 2 1 77 8.723231 1 0.056094 0.056146 \n", - "... ... ... ... ... ... ... ... ... \n", - "106109 E913 137 11 131 9.631154 1 0.027969 0.051979 \n", - "106110 E913 137 11 132 9.704061 1 0.030504 0.051979 \n", - "106111 E913 137 11 133 8.995165 1 0.043056 0.051979 \n", - "106112 E913 137 11 134 8.912473 1 0.039062 0.049301 \n", - "106113 E913 137 11 135 9.901886 1 0.040473 0.045729 \n", - "106114 E913 137 11 136 8.743851 1 0.049844 0.047412 \n", - "106115 E913 137 11 137 8.912473 1 0.042785 0.051979 \n", - "106116 E913 137 11 138 8.723231 1 0.037344 0.038958 \n", - "106117 E913 137 11 139 9.056723 1 0.049844 0.051979 \n", - "106118 E913 137 11 140 10.039416 1 0.049844 0.051979 \n", - "106119 E913 137 11 141 9.505991 1 0.049844 0.051979 \n", - "106120 E913 137 11 142 8.946375 1 0.049844 0.051979 \n", - "106121 E913 137 11 143 9.169518 1 0.038906 0.051979 \n", - "106122 E913 137 11 144 9.128696 1 0.035218 0.051979 \n", - "106123 E913 137 11 145 8.946375 1 0.031094 0.051979 \n", - "106124 E913 137 11 146 9.010913 1 0.048899 0.046771 \n", - "106125 E913 137 11 147 8.946375 1 0.041782 0.048646 \n", - "106126 E913 137 11 148 8.803274 1 0.049270 0.051979 \n", - "106127 E913 137 11 149 8.895082 1 0.049623 0.051979 \n", - "106128 E913 137 11 150 8.348538 1 0.049844 0.041563 \n", - "106129 E913 137 11 151 8.435549 1 0.049531 0.051453 \n", - "106130 E913 137 11 152 8.841014 1 0.048281 0.049896 \n", - "106131 E913 137 11 153 8.723231 1 0.049844 0.051979 \n", - "106132 E913 137 11 154 8.702178 1 0.043594 0.050369 \n", - "106133 E913 137 11 155 8.783856 1 0.043227 0.048333 \n", - "106134 E913 137 11 156 9.384630 1 0.038906 0.048333 \n", - "106135 E913 137 11 157 9.156095 1 0.041587 0.048333 \n", - "106136 E913 137 11 158 9.142490 1 0.048540 0.048333 \n", - "106137 E913 137 11 159 8.613230 1 0.043594 0.048333 \n", - "106138 E913 137 11 160 8.962904 1 0.045063 0.041563 \n", - "\n", - " price3 price4 price5 price6 price7 price8 price9 \\\n", - "0 0.042031 0.029531 0.049531 0.053021 0.038906 0.041406 0.028906 \n", - "1 0.045156 0.046719 0.049531 0.047813 0.045781 0.027969 0.042969 \n", - "2 0.045156 0.046719 0.037344 0.053021 0.045781 0.041406 0.048125 \n", - "3 0.049844 0.037344 0.049531 0.053021 0.045781 0.041406 0.042344 \n", - "4 0.043594 0.031094 0.049531 0.053021 0.046648 0.041406 0.042344 \n", - "5 0.043594 0.046719 0.049531 0.053021 0.046456 0.035781 0.042344 \n", - "6 0.043594 0.046719 0.049531 0.053021 0.047969 0.035781 0.031094 \n", - "7 0.049844 0.046719 0.034219 0.053021 0.047969 0.035781 0.031094 \n", - "8 0.049844 0.037344 0.049531 0.053021 0.047969 0.038281 0.048125 \n", - "9 0.048281 0.046719 0.031094 0.053021 0.031094 0.041406 0.042344 \n", - "10 0.046719 0.046719 0.046574 0.053021 0.047969 0.042031 0.031094 \n", - "11 0.046719 0.031094 0.049531 0.053021 0.047969 0.038906 0.031094 \n", - "12 0.046719 0.046719 0.031094 0.046771 0.047969 0.038906 0.031094 \n", - "13 0.046719 0.031094 0.049531 0.046771 0.047969 0.042031 0.048125 \n", - "14 0.046719 0.046719 0.031094 0.053021 0.047969 0.042031 0.043594 \n", - "15 0.046719 0.035781 0.031094 0.044687 0.040469 0.042031 0.043594 \n", - "16 0.046719 0.035781 0.049531 0.044687 0.040469 0.031094 0.043594 \n", - "17 0.042031 0.043702 0.031094 0.051275 0.037344 0.031094 0.043594 \n", - "18 0.042031 0.040469 0.031094 0.051471 0.037344 0.042031 0.031094 \n", - "19 0.049844 0.031094 0.031094 0.044687 0.040469 0.042031 0.031094 \n", - "20 0.049844 0.026406 0.031094 0.044687 0.040469 0.042031 0.031094 \n", - "21 0.029531 0.040469 0.031094 0.044687 0.031094 0.039062 0.031094 \n", - "22 0.049844 0.040469 0.040469 0.044687 0.040469 0.039062 0.038906 \n", - "23 0.049844 0.026406 0.040469 0.041563 0.040469 0.042031 0.031094 \n", - "24 0.049844 0.026406 0.031094 0.041563 0.040469 0.035781 0.031094 \n", - "25 0.049844 0.040469 0.040469 0.041563 0.040469 0.035781 0.031094 \n", - "26 0.042031 0.040469 0.038906 0.043125 0.040469 0.042031 0.031094 \n", - "27 0.042031 0.023281 0.038906 0.043125 0.040469 0.042031 0.031094 \n", - "28 0.049844 0.023281 0.038906 0.043125 0.031094 0.034219 0.031094 \n", - "29 0.049844 0.040469 0.031094 0.041563 0.040469 0.034219 0.038906 \n", - "... ... ... ... ... ... ... ... \n", - "106109 0.049080 0.039820 0.031094 0.048395 0.037500 0.038906 0.023281 \n", - "106110 0.043594 0.033927 0.033167 0.045729 0.031094 0.038906 0.025313 \n", - "106111 0.045542 0.031094 0.037205 0.046579 0.033470 0.037969 0.020156 \n", - "106112 0.049588 0.032300 0.031094 0.050937 0.042031 0.035781 0.022031 \n", - "106113 0.046957 0.045223 0.033493 0.050937 0.033941 0.035781 0.026406 \n", - "106114 0.047656 0.046554 0.043594 0.050937 0.031094 0.035781 0.026875 \n", - "106115 0.047656 0.040621 0.032656 0.038125 0.033353 0.036875 0.037344 \n", - "106116 0.047656 0.035781 0.043594 0.050937 0.042031 0.038906 0.037344 \n", - "106117 0.045156 0.047813 0.043594 0.050937 0.031094 0.034844 0.037344 \n", - "106118 0.045239 0.047813 0.043594 0.050937 0.031094 0.031094 0.037344 \n", - "106119 0.046719 0.046725 0.032656 0.038125 0.042031 0.038906 0.037344 \n", - "106120 0.045156 0.043594 0.043911 0.050937 0.042031 0.038906 0.031094 \n", - "106121 0.045156 0.044574 0.045156 0.050937 0.042031 0.038906 0.036250 \n", - "106122 0.045703 0.047813 0.045156 0.048125 0.042031 0.038906 0.034688 \n", - "106123 0.046719 0.047813 0.045156 0.044687 0.042031 0.039219 0.034219 \n", - "106124 0.045262 0.031094 0.039839 0.046319 0.042031 0.040469 0.034688 \n", - "106125 0.042031 0.032257 0.031205 0.050937 0.042031 0.040469 0.033594 \n", - "106126 0.042735 0.029531 0.037180 0.048053 0.042031 0.040469 0.032656 \n", - "106127 0.045781 0.047813 0.045156 0.045729 0.042031 0.040469 0.032656 \n", - "106128 0.043594 0.047813 0.035781 0.050937 0.042031 0.040469 0.032656 \n", - "106129 0.046017 0.047813 0.044844 0.050625 0.041679 0.037031 0.032656 \n", - "106130 0.045156 0.040469 0.043906 0.049688 0.040469 0.032656 0.035781 \n", - "106131 0.046719 0.034827 0.031094 0.049688 0.042031 0.038125 0.037344 \n", - "106132 0.045510 0.031094 0.030033 0.049922 0.042031 0.031094 0.037344 \n", - "106133 0.043437 0.031094 0.026406 0.048447 0.040781 0.031094 0.032344 \n", - "106134 0.043437 0.031665 0.028811 0.043542 0.037656 0.031094 0.030000 \n", - "106135 0.043437 0.044348 0.031094 0.043542 0.037656 0.036875 0.030000 \n", - "106136 0.043437 0.032914 0.044126 0.040929 0.037656 0.031094 0.024844 \n", - "106137 0.043437 0.027969 0.040495 0.036354 0.037656 0.031094 0.027031 \n", - "106138 0.043437 0.027969 0.034219 0.038216 0.037656 0.032344 0.030000 \n", - "\n", - " price10 price11 deal feat profit \n", - "0 0.024844 0.038984 1 0.0 37.992326 \n", - "1 0.042031 0.038984 0 0.0 30.126667 \n", - "2 0.032656 0.038984 0 0.0 30.000000 \n", - "3 0.032656 0.038984 0 0.0 29.950000 \n", - "4 0.032656 0.038203 0 0.0 29.920000 \n", - "5 0.029531 0.038203 0 0.0 29.920000 \n", - "6 0.029531 0.038984 1 0.0 27.125471 \n", - "7 0.029531 0.038984 1 0.0 27.125041 \n", - "8 0.027969 0.035078 1 0.0 27.082481 \n", - "9 0.042031 0.038984 1 0.0 27.061163 \n", - "10 0.019375 0.038984 1 0.0 29.521087 \n", - "11 0.024844 0.038984 1 0.0 31.299771 \n", - "12 0.024844 0.038984 0 0.0 31.325914 \n", - "13 0.020156 0.038203 1 0.0 31.419907 \n", - "14 0.015469 0.038203 0 0.0 33.386667 \n", - "15 0.024844 0.038203 1 0.0 19.730000 \n", - "16 0.038906 0.038203 1 0.0 22.040909 \n", - "17 0.042031 0.031172 0 0.0 35.353137 \n", - "18 0.021719 0.031172 0 0.0 35.217500 \n", - "19 0.042031 0.031172 0 0.0 25.086667 \n", - "20 0.042031 0.023359 1 0.0 17.070052 \n", - "21 0.042031 0.023359 1 0.0 43.958514 \n", - "22 0.015469 0.035078 1 0.0 35.017143 \n", - "23 0.042031 0.027266 1 0.0 31.038367 \n", - "24 0.042031 0.027266 0 0.0 50.155714 \n", - "25 0.023281 0.027266 0 0.0 48.598889 \n", - "26 0.023281 0.035078 1 0.0 31.650000 \n", - "27 0.042031 0.027266 0 0.0 51.318980 \n", - "28 0.042031 0.027266 0 0.0 51.020565 \n", - "29 0.017031 0.035078 0 0.0 51.144375 \n", - "... ... ... ... ... ... \n", - "106109 0.022187 0.025703 1 0.0 17.170000 \n", - "106110 0.024844 0.026328 1 1.0 18.630000 \n", - "106111 0.025625 0.029609 1 0.0 25.350000 \n", - "106112 0.031094 0.029609 1 0.0 25.320000 \n", - "106113 0.022969 0.023359 1 1.0 5.350000 \n", - "106114 0.020156 0.032422 0 0.0 32.000000 \n", - "106115 0.021094 0.032109 0 0.0 31.720000 \n", - "106116 0.031094 0.032422 0 0.0 33.590000 \n", - "106117 0.031406 0.031172 0 0.0 30.620000 \n", - "106118 0.032656 0.029609 1 1.0 31.420000 \n", - "106119 0.026406 0.029609 1 1.0 39.520000 \n", - "106120 0.026250 0.030078 1 0.0 40.770000 \n", - "106121 0.027187 0.031484 0 0.0 43.420000 \n", - "106122 0.032656 0.030391 1 1.0 41.380000 \n", - "106123 0.031875 0.031797 0 0.0 43.980000 \n", - "106124 0.030937 0.031172 0 0.0 37.510000 \n", - "106125 0.027187 0.031172 0 0.0 38.790000 \n", - "106126 0.020625 0.031172 0 0.0 39.720000 \n", - "106127 0.023438 0.031172 0 0.0 39.240000 \n", - "106128 0.026406 0.031172 0 0.0 37.540000 \n", - "106129 0.023281 0.030859 0 0.0 36.830000 \n", - "106130 0.031094 0.029609 1 1.0 34.160000 \n", - "106131 0.031406 0.031172 0 0.0 37.460000 \n", - "106132 0.018125 0.030078 0 0.0 35.190000 \n", - "106133 0.020469 0.028359 0 0.0 31.260000 \n", - "106134 0.031250 0.028047 1 0.0 30.500000 \n", - "106135 0.030312 0.028047 1 0.0 30.500000 \n", - "106136 0.024844 0.028359 1 0.0 32.360000 \n", - "106137 0.023281 0.028984 0 0.0 35.330000 \n", - "106138 0.027344 0.028984 0 0.0 35.440000 \n", - "\n", - "[106139 rows x 20 columns]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "for i, val in yx.iterrows(): \n", - " idtuple = (int(val['store']), int(val['brand']))\n", - " sales_id = tsMap[idtuple]\n", - " yx.iloc[i, 0] = sales_id\n", - "yx" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "yx.to_csv('../TSPerf/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/data/yxmod.csv', index=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/prototypes/ES_RNN/sales_limited/data/Test/README.md b/prototypes/ES_RNN/sales_limited/data/Test/README.md deleted file mode 100644 index 88e69b4c..00000000 --- a/prototypes/ES_RNN/sales_limited/data/Test/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Please use the testing data stored in blob storage Test under this container -https://tsperfmainstorage.blob.core.windows.net/oj-dataset-es-rnn -You can find storage account tsperfmainstorage in resource group tsperf. diff --git a/prototypes/ES_RNN/sales_limited/data/Train/README.md b/prototypes/ES_RNN/sales_limited/data/Train/README.md deleted file mode 100644 index 3ac69161..00000000 --- a/prototypes/ES_RNN/sales_limited/data/Train/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Please use the training data stored in blob storage Train under this container -https://tsperfmainstorage.blob.core.windows.net/oj-dataset-es-rnn -You can find storage account tsperfmainstorage in resource group tsperf. diff --git a/prototypes/ES_RNN/sales_limited/data/scripts/postprocessing.ipynb b/prototypes/ES_RNN/sales_limited/data/scripts/postprocessing.ipynb deleted file mode 100644 index 57b533d3..00000000 --- a/prototypes/ES_RNN/sales_limited/data/scripts/postprocessing.ipynb +++ /dev/null @@ -1,2413 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
E4135968.125253.515871.68
0E51812678.3008146.4708354.700
1E4743118.3302239.5603371.500
2E8292159.8508251.7106020.870
3E1274245.5903574.1704591.770
4E8754788.8804222.7604738.510
5E202288.5201621.8905536.190
6E3799344.8103296.9102773.750
7E647396.597488.585965.270
8E2831299.7101695.3401247.680
9E213886.7804686.4502570.120
10E138635.9409223.5908574.530
11E405858.056820.7191749.740
12E7232437.0702493.6302598.350
13E9014637.2104571.4204751.360
14E548607.541629.3601888.690
15E4041127.5101145.6901181.000
16E6062573.8102483.7103583.310
17E5855663.4206555.7605356.750
18E3648629.7707168.97012406.200
19E2042934.3102504.0402910.940
20E391259.5401149.8001578.170
21E1654635.6704833.7304960.110
22E7928417.3609672.7809597.400
23E1674801.6106730.2204641.660
24E458338.7707526.04011558.600
25E491573.798577.976634.258
26E1361514.8507505.6202833.020
27E8465455.3407259.1803924.780
28E8062127.4002732.2502382.340
29E261906.183853.387761.814
...............
425E8111929.9001815.9002415.760
426E8171214.7501154.8801160.380
427E16800.7304428.4907108.110
428E1501004.600695.512722.345
429E4663593.5804288.3204900.060
430E5371100.4801143.090949.854
431E33519163.7008386.0008084.830
432E465844.3911009.9601113.040
433E8561272.970972.7041485.080
434E13310677.5007212.02012789.400
435E5431684.6905207.1209896.260
436E11520326.20010822.1009113.580
437E8423541.6103364.0803593.550
438E2721204.080948.7991000.560
439E64256.780453.0121131.170
440E8489242.1206191.9409744.720
441E1644832.3309147.7006240.510
442E2762055.1401783.1402794.530
443E3492779.2602653.1302574.460
444E783273.9902904.0404063.270
445E5967350.29010387.4008234.700
446E8368849.2009973.60012091.300
447E66536502.50013035.60010689.800
448E993646.0203738.9003406.510
449E78615815.0006957.0205522.820
450E251883.3201781.5501477.310
451E8451143.8502465.2103980.030
452E5554954.2703457.4902272.100
453E3311248.40011965.50012936.500
454E4945485.0005762.3805934.550
\n", - "

455 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " E413 5968.12 5253.51 5871.68\n", - "0 E518 12678.300 8146.470 8354.700\n", - "1 E474 3118.330 2239.560 3371.500\n", - "2 E829 2159.850 8251.710 6020.870\n", - "3 E127 4245.590 3574.170 4591.770\n", - "4 E875 4788.880 4222.760 4738.510\n", - "5 E20 2288.520 1621.890 5536.190\n", - "6 E379 9344.810 3296.910 2773.750\n", - "7 E647 396.597 488.585 965.270\n", - "8 E283 1299.710 1695.340 1247.680\n", - "9 E21 3886.780 4686.450 2570.120\n", - "10 E13 8635.940 9223.590 8574.530\n", - "11 E405 858.056 820.719 1749.740\n", - "12 E723 2437.070 2493.630 2598.350\n", - "13 E901 4637.210 4571.420 4751.360\n", - "14 E548 607.541 629.360 1888.690\n", - "15 E404 1127.510 1145.690 1181.000\n", - "16 E606 2573.810 2483.710 3583.310\n", - "17 E585 5663.420 6555.760 5356.750\n", - "18 E364 8629.770 7168.970 12406.200\n", - "19 E204 2934.310 2504.040 2910.940\n", - "20 E39 1259.540 1149.800 1578.170\n", - "21 E165 4635.670 4833.730 4960.110\n", - "22 E792 8417.360 9672.780 9597.400\n", - "23 E167 4801.610 6730.220 4641.660\n", - "24 E45 8338.770 7526.040 11558.600\n", - "25 E491 573.798 577.976 634.258\n", - "26 E136 1514.850 7505.620 2833.020\n", - "27 E846 5455.340 7259.180 3924.780\n", - "28 E806 2127.400 2732.250 2382.340\n", - "29 E261 906.183 853.387 761.814\n", - ".. ... ... ... ...\n", - "425 E811 1929.900 1815.900 2415.760\n", - "426 E817 1214.750 1154.880 1160.380\n", - "427 E1 6800.730 4428.490 7108.110\n", - "428 E150 1004.600 695.512 722.345\n", - "429 E466 3593.580 4288.320 4900.060\n", - "430 E537 1100.480 1143.090 949.854\n", - "431 E335 19163.700 8386.000 8084.830\n", - "432 E465 844.391 1009.960 1113.040\n", - "433 E856 1272.970 972.704 1485.080\n", - "434 E133 10677.500 7212.020 12789.400\n", - "435 E543 1684.690 5207.120 9896.260\n", - "436 E115 20326.200 10822.100 9113.580\n", - "437 E842 3541.610 3364.080 3593.550\n", - "438 E272 1204.080 948.799 1000.560\n", - "439 E64 256.780 453.012 1131.170\n", - "440 E848 9242.120 6191.940 9744.720\n", - "441 E164 4832.330 9147.700 6240.510\n", - "442 E276 2055.140 1783.140 2794.530\n", - "443 E349 2779.260 2653.130 2574.460\n", - "444 E78 3273.990 2904.040 4063.270\n", - "445 E596 7350.290 10387.400 8234.700\n", - "446 E836 8849.200 9973.600 12091.300\n", - "447 E665 36502.500 13035.600 10689.800\n", - "448 E99 3646.020 3738.900 3406.510\n", - "449 E786 15815.000 6957.020 5522.820\n", - "450 E25 1883.320 1781.550 1477.310\n", - "451 E845 1143.850 2465.210 3980.030\n", - "452 E555 4954.270 3457.490 2272.100\n", - "453 E33 11248.400 11965.500 12936.500\n", - "454 E494 5485.000 5762.380 5934.550\n", - "\n", - "[455 rows x 4 columns]" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test = pd.read_csv('./Results/NaiveResults/Quarterly_9_1_0_LB0.csv')\n", - "test" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDBrandstore and brand
0E11.0(2.0, 1.0)
1E22.0(2.0, 2.0)
2E33.0(2.0, 3.0)
3E44.0(2.0, 4.0)
4E55.0(2.0, 5.0)
5E66.0(2.0, 6.0)
6E77.0(2.0, 7.0)
7E88.0(2.0, 8.0)
8E99.0(2.0, 9.0)
9E1010.0(2.0, 10.0)
10E1111.0(2.0, 11.0)
11E121.0(5.0, 1.0)
12E132.0(5.0, 2.0)
13E143.0(5.0, 3.0)
14E154.0(5.0, 4.0)
15E165.0(5.0, 5.0)
16E176.0(5.0, 6.0)
17E187.0(5.0, 7.0)
18E198.0(5.0, 8.0)
19E209.0(5.0, 9.0)
20E2110.0(5.0, 10.0)
21E2211.0(5.0, 11.0)
22E231.0(8.0, 1.0)
23E242.0(8.0, 2.0)
24E253.0(8.0, 3.0)
25E264.0(8.0, 4.0)
26E275.0(8.0, 5.0)
27E286.0(8.0, 6.0)
28E297.0(8.0, 7.0)
29E308.0(8.0, 8.0)
............
883E8844.0(132.0, 4.0)
884E8855.0(132.0, 5.0)
885E8866.0(132.0, 6.0)
886E8877.0(132.0, 7.0)
887E8888.0(132.0, 8.0)
888E8899.0(132.0, 9.0)
889E89010.0(132.0, 10.0)
890E89111.0(132.0, 11.0)
891E8921.0(134.0, 1.0)
892E8932.0(134.0, 2.0)
893E8943.0(134.0, 3.0)
894E8954.0(134.0, 4.0)
895E8965.0(134.0, 5.0)
896E8976.0(134.0, 6.0)
897E8987.0(134.0, 7.0)
898E8998.0(134.0, 8.0)
899E9009.0(134.0, 9.0)
900E90110.0(134.0, 10.0)
901E90211.0(134.0, 11.0)
902E9031.0(137.0, 1.0)
903E9042.0(137.0, 2.0)
904E9053.0(137.0, 3.0)
905E9064.0(137.0, 4.0)
906E9075.0(137.0, 5.0)
907E9086.0(137.0, 6.0)
908E9097.0(137.0, 7.0)
909E9108.0(137.0, 8.0)
910E9119.0(137.0, 9.0)
911E91210.0(137.0, 10.0)
912E91311.0(137.0, 11.0)
\n", - "

913 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " SalesID Brand store and brand\n", - "0 E1 1.0 (2.0, 1.0)\n", - "1 E2 2.0 (2.0, 2.0)\n", - "2 E3 3.0 (2.0, 3.0)\n", - "3 E4 4.0 (2.0, 4.0)\n", - "4 E5 5.0 (2.0, 5.0)\n", - "5 E6 6.0 (2.0, 6.0)\n", - "6 E7 7.0 (2.0, 7.0)\n", - "7 E8 8.0 (2.0, 8.0)\n", - "8 E9 9.0 (2.0, 9.0)\n", - "9 E10 10.0 (2.0, 10.0)\n", - "10 E11 11.0 (2.0, 11.0)\n", - "11 E12 1.0 (5.0, 1.0)\n", - "12 E13 2.0 (5.0, 2.0)\n", - "13 E14 3.0 (5.0, 3.0)\n", - "14 E15 4.0 (5.0, 4.0)\n", - "15 E16 5.0 (5.0, 5.0)\n", - "16 E17 6.0 (5.0, 6.0)\n", - "17 E18 7.0 (5.0, 7.0)\n", - "18 E19 8.0 (5.0, 8.0)\n", - "19 E20 9.0 (5.0, 9.0)\n", - "20 E21 10.0 (5.0, 10.0)\n", - "21 E22 11.0 (5.0, 11.0)\n", - "22 E23 1.0 (8.0, 1.0)\n", - "23 E24 2.0 (8.0, 2.0)\n", - "24 E25 3.0 (8.0, 3.0)\n", - "25 E26 4.0 (8.0, 4.0)\n", - "26 E27 5.0 (8.0, 5.0)\n", - "27 E28 6.0 (8.0, 6.0)\n", - "28 E29 7.0 (8.0, 7.0)\n", - "29 E30 8.0 (8.0, 8.0)\n", - ".. ... ... ...\n", - "883 E884 4.0 (132.0, 4.0)\n", - "884 E885 5.0 (132.0, 5.0)\n", - "885 E886 6.0 (132.0, 6.0)\n", - "886 E887 7.0 (132.0, 7.0)\n", - "887 E888 8.0 (132.0, 8.0)\n", - "888 E889 9.0 (132.0, 9.0)\n", - "889 E890 10.0 (132.0, 10.0)\n", - "890 E891 11.0 (132.0, 11.0)\n", - "891 E892 1.0 (134.0, 1.0)\n", - "892 E893 2.0 (134.0, 2.0)\n", - "893 E894 3.0 (134.0, 3.0)\n", - "894 E895 4.0 (134.0, 4.0)\n", - "895 E896 5.0 (134.0, 5.0)\n", - "896 E897 6.0 (134.0, 6.0)\n", - "897 E898 7.0 (134.0, 7.0)\n", - "898 E899 8.0 (134.0, 8.0)\n", - "899 E900 9.0 (134.0, 9.0)\n", - "900 E901 10.0 (134.0, 10.0)\n", - "901 E902 11.0 (134.0, 11.0)\n", - "902 E903 1.0 (137.0, 1.0)\n", - "903 E904 2.0 (137.0, 2.0)\n", - "904 E905 3.0 (137.0, 3.0)\n", - "905 E906 4.0 (137.0, 4.0)\n", - "906 E907 5.0 (137.0, 5.0)\n", - "907 E908 6.0 (137.0, 6.0)\n", - "908 E909 7.0 (137.0, 7.0)\n", - "909 E910 8.0 (137.0, 8.0)\n", - "910 E911 9.0 (137.0, 9.0)\n", - "911 E912 10.0 (137.0, 10.0)\n", - "912 E913 11.0 (137.0, 11.0)\n", - "\n", - "[913 rows x 3 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "info = pd.read_csv('sales-info.csv')\n", - "info" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
V1V2V3V4
0E51812678.38146.478354.7
1E4743118.332239.563371.5
2E8292159.858251.716020.87
3E1274245.593574.174591.77
4E8754788.884222.764738.51
5E202288.521621.895536.19
6E3799344.813296.912773.75
7E647396.597488.585965.27
8E2831299.711695.341247.68
9E213886.784686.452570.12
10E138635.949223.598574.53
11E405858.056820.7191749.74
12E7232437.072493.632598.35
13E9014637.214571.424751.36
14E548607.541629.361888.69
15E4041127.511145.691181
16E6062573.812483.713583.31
17E5855663.426555.765356.75
18E3648629.777168.9712406.2
19E2042934.312504.042910.94
20E391259.541149.81578.17
21E1654635.674833.734960.11
22E7928417.369672.789597.4
23E1674801.616730.224641.66
24E458338.777526.0411558.6
25E491573.798577.976634.258
26E1361514.857505.622833.02
27E8465455.347259.183924.78
28E8062127.42732.252382.34
29E261906.183853.387761.814
...............
426E8171214.751154.881160.38
427E16800.734428.497108.11
428E1501004.6695.512722.345
429E4663593.584288.324900.06
430E5371100.481143.09949.854
431E33519163.783868084.83
432E465844.3911009.961113.04
433E8561272.97972.7041485.08
434E13310677.57212.0212789.4
435E5431684.695207.129896.26
436E11520326.210822.19113.58
437E8423541.613364.083593.55
438E2721204.08948.7991000.56
439E64256.78453.0121131.17
440E8489242.126191.949744.72
441E1644832.339147.76240.51
442E2762055.141783.142794.53
443E3492779.262653.132574.46
444E783273.992904.044063.27
445E5967350.2910387.48234.7
446E8368849.29973.612091.3
447E66536502.513035.610689.8
448E993646.023738.93406.51
449E786158156957.025522.82
450E251883.321781.551477.31
451E8451143.852465.213980.03
452E5554954.273457.492272.1
453E3311248.411965.512936.5
454E49454855762.385934.55
455E4135968.125253.515871.68
\n", - "

456 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " V1 V2 V3 V4\n", - "0 E518 12678.3 8146.47 8354.7\n", - "1 E474 3118.33 2239.56 3371.5\n", - "2 E829 2159.85 8251.71 6020.87\n", - "3 E127 4245.59 3574.17 4591.77\n", - "4 E875 4788.88 4222.76 4738.51\n", - "5 E20 2288.52 1621.89 5536.19\n", - "6 E379 9344.81 3296.91 2773.75\n", - "7 E647 396.597 488.585 965.27\n", - "8 E283 1299.71 1695.34 1247.68\n", - "9 E21 3886.78 4686.45 2570.12\n", - "10 E13 8635.94 9223.59 8574.53\n", - "11 E405 858.056 820.719 1749.74\n", - "12 E723 2437.07 2493.63 2598.35\n", - "13 E901 4637.21 4571.42 4751.36\n", - "14 E548 607.541 629.36 1888.69\n", - "15 E404 1127.51 1145.69 1181\n", - "16 E606 2573.81 2483.71 3583.31\n", - "17 E585 5663.42 6555.76 5356.75\n", - "18 E364 8629.77 7168.97 12406.2\n", - "19 E204 2934.31 2504.04 2910.94\n", - "20 E39 1259.54 1149.8 1578.17\n", - "21 E165 4635.67 4833.73 4960.11\n", - "22 E792 8417.36 9672.78 9597.4\n", - "23 E167 4801.61 6730.22 4641.66\n", - "24 E45 8338.77 7526.04 11558.6\n", - "25 E491 573.798 577.976 634.258\n", - "26 E136 1514.85 7505.62 2833.02\n", - "27 E846 5455.34 7259.18 3924.78\n", - "28 E806 2127.4 2732.25 2382.34\n", - "29 E261 906.183 853.387 761.814\n", - ".. ... ... ... ...\n", - "426 E817 1214.75 1154.88 1160.38\n", - "427 E1 6800.73 4428.49 7108.11\n", - "428 E150 1004.6 695.512 722.345\n", - "429 E466 3593.58 4288.32 4900.06\n", - "430 E537 1100.48 1143.09 949.854\n", - "431 E335 19163.7 8386 8084.83\n", - "432 E465 844.391 1009.96 1113.04\n", - "433 E856 1272.97 972.704 1485.08\n", - "434 E133 10677.5 7212.02 12789.4\n", - "435 E543 1684.69 5207.12 9896.26\n", - "436 E115 20326.2 10822.1 9113.58\n", - "437 E842 3541.61 3364.08 3593.55\n", - "438 E272 1204.08 948.799 1000.56\n", - "439 E64 256.78 453.012 1131.17\n", - "440 E848 9242.12 6191.94 9744.72\n", - "441 E164 4832.33 9147.7 6240.51\n", - "442 E276 2055.14 1783.14 2794.53\n", - "443 E349 2779.26 2653.13 2574.46\n", - "444 E78 3273.99 2904.04 4063.27\n", - "445 E596 7350.29 10387.4 8234.7\n", - "446 E836 8849.2 9973.6 12091.3\n", - "447 E665 36502.5 13035.6 10689.8\n", - "448 E99 3646.02 3738.9 3406.51\n", - "449 E786 15815 6957.02 5522.82\n", - "450 E25 1883.32 1781.55 1477.31\n", - "451 E845 1143.85 2465.21 3980.03\n", - "452 E555 4954.27 3457.49 2272.1\n", - "453 E33 11248.4 11965.5 12936.5\n", - "454 E494 5485 5762.38 5934.55\n", - "455 E413 5968.12 5253.51 5871.68\n", - "\n", - "[456 rows x 4 columns]" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#adjust headings for outputted forecasts\n", - "def transformer(outframe): \n", - " #add current headers as last column\n", - " last_entry = list(outframe.keys())\n", - " #make a new data frame for last col and append it to input df\n", - " append_frame = pd.DataFrame([last_entry], columns=last_entry)\n", - " updated = outframe.append(append_frame, ignore_index=True)\n", - " \n", - " #rename column headings\n", - " #build map of old column headings to their replacement\n", - " rename_map = dict()\n", - " keys = list(outframe.keys())\n", - " for i in range(len(keys)): \n", - " rename_map[keys[i]] = 'V' + str(i+1)\n", - " rename_map\n", - " \n", - " #modify headers to mirror that of the dataframe\n", - " updated = updated.rename(index=int, columns=rename_map)\n", - " \n", - " return updated\n", - "\n", - "test = transformer(test)\n", - "test" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
roundstorebrandweekweeks aheadprediction
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [round, store, brand, week, weeks ahead, prediction]\n", - "Index: []" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#create true forecast dataframe\n", - "truth = pd.DataFrame(columns=['round', 'store', 'brand', 'week', 'weeks ahead', 'prediction'])\n", - "truth" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "SalesID E1\n", - "Brand 1\n", - "store and brand (2.0, 1.0)\n", - "Name: 0, dtype: object" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "info.iloc[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
roundstorebrandweekweeks aheadprediction
0NaN93.01.0161.01.012678.3
1NaN93.01.0162.02.08146.47
2NaN93.01.0163.03.08354.7
3NaN89.01.0161.01.03118.33
4NaN89.01.0162.02.02239.56
5NaN89.01.0163.03.03371.5
6NaN126.04.0161.01.02159.85
7NaN126.04.0162.02.08251.71
8NaN126.04.0163.03.06020.87
9NaN40.06.0161.01.04245.59
10NaN40.06.0162.02.03574.17
11NaN40.06.0163.03.04591.77
12NaN131.06.0161.01.04788.88
13NaN131.06.0162.02.04222.76
14NaN131.06.0163.03.04738.51
15NaN5.09.0161.01.02288.52
16NaN5.09.0162.02.01621.89
17NaN5.09.0163.03.05536.19
18NaN76.05.0161.01.09344.81
19NaN76.05.0162.02.03296.91
20NaN76.05.0163.03.02773.75
21NaN106.09.0161.01.0396.597
22NaN106.09.0162.02.0488.585
23NaN106.09.0163.03.0965.27
24NaN64.08.0161.01.01299.71
25NaN64.08.0162.02.01695.34
26NaN64.08.0163.03.01247.68
27NaN5.010.0161.01.03886.78
28NaN5.010.0162.02.04686.45
29NaN5.010.0163.03.02570.12
.....................
1338NaN126.011.0161.01.08849.2
1339NaN126.011.0162.02.09973.6
1340NaN126.011.0163.03.012091.3
1341NaN109.05.0161.01.036502.5
1342NaN109.05.0162.02.013035.6
1343NaN109.05.0163.03.010689.8
1344NaN28.011.0161.01.03646.02
1345NaN28.011.0162.02.03738.9
1346NaN28.011.0163.03.03406.51
1347NaN121.05.0161.01.015815
1348NaN121.05.0162.02.06957.02
1349NaN121.05.0163.03.05522.82
1350NaN8.03.0161.01.01883.32
1351NaN8.03.0162.02.01781.55
1352NaN8.03.0163.03.01477.31
1353NaN128.09.0161.01.01143.85
1354NaN128.09.0162.02.02465.21
1355NaN128.09.0163.03.03980.03
1356NaN97.05.0161.01.04954.27
1357NaN97.05.0162.02.03457.49
1358NaN97.05.0163.03.02272.1
1359NaN8.011.0161.01.011248.4
1360NaN8.011.0162.02.011965.5
1361NaN8.011.0163.03.012936.5
1362NaN90.010.0161.01.05485
1363NaN90.010.0162.02.05762.38
1364NaN90.010.0163.03.05934.55
1365NaN80.06.0161.01.05968.12
1366NaN80.06.0162.02.05253.51
1367NaN80.06.0163.03.05871.68
\n", - "

1368 rows × 6 columns

\n", - "
" - ], - "text/plain": [ - " round store brand week weeks ahead prediction\n", - "0 NaN 93.0 1.0 161.0 1.0 12678.3\n", - "1 NaN 93.0 1.0 162.0 2.0 8146.47\n", - "2 NaN 93.0 1.0 163.0 3.0 8354.7\n", - "3 NaN 89.0 1.0 161.0 1.0 3118.33\n", - "4 NaN 89.0 1.0 162.0 2.0 2239.56\n", - "5 NaN 89.0 1.0 163.0 3.0 3371.5\n", - "6 NaN 126.0 4.0 161.0 1.0 2159.85\n", - "7 NaN 126.0 4.0 162.0 2.0 8251.71\n", - "8 NaN 126.0 4.0 163.0 3.0 6020.87\n", - "9 NaN 40.0 6.0 161.0 1.0 4245.59\n", - "10 NaN 40.0 6.0 162.0 2.0 3574.17\n", - "11 NaN 40.0 6.0 163.0 3.0 4591.77\n", - "12 NaN 131.0 6.0 161.0 1.0 4788.88\n", - "13 NaN 131.0 6.0 162.0 2.0 4222.76\n", - "14 NaN 131.0 6.0 163.0 3.0 4738.51\n", - "15 NaN 5.0 9.0 161.0 1.0 2288.52\n", - "16 NaN 5.0 9.0 162.0 2.0 1621.89\n", - "17 NaN 5.0 9.0 163.0 3.0 5536.19\n", - "18 NaN 76.0 5.0 161.0 1.0 9344.81\n", - "19 NaN 76.0 5.0 162.0 2.0 3296.91\n", - "20 NaN 76.0 5.0 163.0 3.0 2773.75\n", - "21 NaN 106.0 9.0 161.0 1.0 396.597\n", - "22 NaN 106.0 9.0 162.0 2.0 488.585\n", - "23 NaN 106.0 9.0 163.0 3.0 965.27\n", - "24 NaN 64.0 8.0 161.0 1.0 1299.71\n", - "25 NaN 64.0 8.0 162.0 2.0 1695.34\n", - "26 NaN 64.0 8.0 163.0 3.0 1247.68\n", - "27 NaN 5.0 10.0 161.0 1.0 3886.78\n", - "28 NaN 5.0 10.0 162.0 2.0 4686.45\n", - "29 NaN 5.0 10.0 163.0 3.0 2570.12\n", - "... ... ... ... ... ... ...\n", - "1338 NaN 126.0 11.0 161.0 1.0 8849.2\n", - "1339 NaN 126.0 11.0 162.0 2.0 9973.6\n", - "1340 NaN 126.0 11.0 163.0 3.0 12091.3\n", - "1341 NaN 109.0 5.0 161.0 1.0 36502.5\n", - "1342 NaN 109.0 5.0 162.0 2.0 13035.6\n", - "1343 NaN 109.0 5.0 163.0 3.0 10689.8\n", - "1344 NaN 28.0 11.0 161.0 1.0 3646.02\n", - "1345 NaN 28.0 11.0 162.0 2.0 3738.9\n", - "1346 NaN 28.0 11.0 163.0 3.0 3406.51\n", - "1347 NaN 121.0 5.0 161.0 1.0 15815\n", - "1348 NaN 121.0 5.0 162.0 2.0 6957.02\n", - "1349 NaN 121.0 5.0 163.0 3.0 5522.82\n", - "1350 NaN 8.0 3.0 161.0 1.0 1883.32\n", - "1351 NaN 8.0 3.0 162.0 2.0 1781.55\n", - "1352 NaN 8.0 3.0 163.0 3.0 1477.31\n", - "1353 NaN 128.0 9.0 161.0 1.0 1143.85\n", - "1354 NaN 128.0 9.0 162.0 2.0 2465.21\n", - "1355 NaN 128.0 9.0 163.0 3.0 3980.03\n", - "1356 NaN 97.0 5.0 161.0 1.0 4954.27\n", - "1357 NaN 97.0 5.0 162.0 2.0 3457.49\n", - "1358 NaN 97.0 5.0 163.0 3.0 2272.1\n", - "1359 NaN 8.0 11.0 161.0 1.0 11248.4\n", - "1360 NaN 8.0 11.0 162.0 2.0 11965.5\n", - "1361 NaN 8.0 11.0 163.0 3.0 12936.5\n", - "1362 NaN 90.0 10.0 161.0 1.0 5485\n", - "1363 NaN 90.0 10.0 162.0 2.0 5762.38\n", - "1364 NaN 90.0 10.0 163.0 3.0 5934.55\n", - "1365 NaN 80.0 6.0 161.0 1.0 5968.12\n", - "1366 NaN 80.0 6.0 162.0 2.0 5253.51\n", - "1367 NaN 80.0 6.0 163.0 3.0 5871.68\n", - "\n", - "[1368 rows x 6 columns]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def truth_creator(df): \n", - " #create new df with appropriate columns\n", - " col_list = ['round', 'store', 'brand', 'week', 'weeks ahead', 'prediction']\n", - " truth = pd.DataFrame(columns=['round', 'store', 'brand', 'week', 'weeks ahead', 'prediction'])\n", - " \n", - " for i, val in test.iterrows(): \n", - " #get code\n", - " entry_code = val['V1']\n", - " \n", - " #row in info df\n", - " info_row_index = int(entry_code[1:]) - 1\n", - " info_row = info.iloc[info_row_index]\n", - " \n", - " #extract brand and store from info dataframe\n", - " brand = info_row['Brand']\n", - " store_and_brand = info_row['store and brand'][1:]\n", - " store = ''\n", - " for i in store_and_brand:\n", - " if i != ',': \n", - " store += i\n", - " else: \n", - " break\n", - " store = int(float(store))\n", - " \n", - " #get week number and number of weeks ahead\n", - " forecasts = ['V2', 'V3', 'V4']\n", - " for x in range(len(forecasts)):\n", - " weeks_ahead = x + 1\n", - " week = 160 + weeks_ahead\n", - " prediction = val[forecasts[x]]\n", - " temp = pd.Series([float('nan'), store, brand, week, weeks_ahead, prediction], index=col_list)\n", - " truth = truth.append(temp, ignore_index=True)\n", - " \n", - " return truth\n", - "\n", - "truth = truth_creator(test)\n", - "truth" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/prototypes/ES_RNN/sales_limited/data/scripts/postprocessing.py b/prototypes/ES_RNN/sales_limited/data/scripts/postprocessing.py deleted file mode 100644 index 82312563..00000000 --- a/prototypes/ES_RNN/sales_limited/data/scripts/postprocessing.py +++ /dev/null @@ -1,82 +0,0 @@ -#script to transform the output of the naive (unmodified) ES-RNN model to the form specified -#in the sales_data readme.md file. - -import numpy as np -import pandas as pd - -#helper function adjust headings for outputted forecasts -def transformer(outframe): - #add current headers as last column - last_entry = list(outframe.keys()) - #make a new data frame for last col and append it to input df - append_frame = pd.DataFrame([last_entry], columns=last_entry) - updated = outframe.append(append_frame, ignore_index=True) - - #rename column headings - #build map of old column headings to their replacement - rename_map = dict() - keys = list(outframe.keys()) - for i in range(len(keys)): - rename_map[keys[i]] = 'V' + str(i+1) - rename_map - - #modify headers to mirror that of the dataframe - updated = updated.rename(index=int, columns=rename_map) - - return updated - -#helper function to format transform output into form desired by forecast evaluator -def truth_creator(df): - #create new df with appropriate columns - col_list = ['round', 'store', 'brand', 'week', 'weeks ahead', 'prediction'] - truth = pd.DataFrame(columns=['round', 'store', 'brand', 'week', 'weeks ahead', 'prediction']) - - for i, val in df.iterrows(): - #get code - entry_code = val['V1'] - - #row in info df - info_row_index = int(entry_code[1:]) - 1 - info_row = info.iloc[info_row_index] - - #extract brand and store from info dataframe - brand = info_row['Brand'] - store_and_brand = info_row['store and brand'][1:] - store = '' - for i in store_and_brand: - if i != ',': - store += i - else: - break - store = int(float(store)) - - #get week number and number of weeks ahead - forecasts = ['V2', 'V3', 'V4'] - for x in range(len(forecasts)): - weeks_ahead = x + 1 - week = 160 + weeks_ahead - prediction = val[forecasts[x]] - temp = pd.Series([float('nan'), store, brand, week, weeks_ahead, prediction], index=col_list) - truth = truth.append(temp, ignore_index=True) - - return truth - -#main -#parse file name from command line -test_files = './test_files.txt' - -#open file and get list of all files to read/transform -f = open(test_files) -info = str(f.getline().strip()) -num_files = int(f.readline().strip()) -filelist = [] -for i in range(num_files): - filelist.append(f.readline()) - - -for filename in filelist: - test = pd.read_csv(filename) - - test = transformer(test) - truth = truth_creator(test) - truth.to_csv(filename[0:len(filename) - 4] + '_modified.csv') diff --git a/prototypes/ES_RNN/sales_limited/data/scripts/preprocessing.ipynb b/prototypes/ES_RNN/sales_limited/data/scripts/preprocessing.ipynb deleted file mode 100644 index a6b6107c..00000000 --- a/prototypes/ES_RNN/sales_limited/data/scripts/preprocessing.ipynb +++ /dev/null @@ -1,10997 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
storebrandweeklogmoveconstantprice1price2price3price4price5price6price7price8price9price10price11dealfeatprofit
021409.01869510.0604690.0604970.0420310.0295310.0495310.0530210.0389060.0414060.0289060.0248440.03898410.037.992326
121468.72323110.0604690.0603120.0451560.0467190.0495310.0478130.0457810.0279690.0429690.0420310.03898400.030.126667
221478.25322810.0604690.0603120.0451560.0467190.0373440.0530210.0457810.0414060.0481250.0326560.03898400.030.000000
321488.98719710.0604690.0603120.0498440.0373440.0495310.0530210.0457810.0414060.0423440.0326560.03898400.029.950000
421509.09335710.0604690.0603120.0435940.0310940.0495310.0530210.0466480.0414060.0423440.0326560.03820300.029.920000
521518.87738210.0604690.0603120.0435940.0467190.0495310.0530210.0464560.0357810.0423440.0295310.03820300.029.920000
621529.29468210.0514060.0603120.0435940.0467190.0495310.0530210.0479690.0357810.0310940.0295310.03898410.027.125471
721538.95467410.0514060.0603120.0498440.0467190.0342190.0530210.0479690.0357810.0310940.0295310.03898410.027.125041
821549.04923210.0514060.0603120.0498440.0373440.0495310.0530210.0479690.0382810.0481250.0279690.03507810.027.082481
921578.61323010.0514060.0603120.0482810.0467190.0310940.0530210.0310940.0414060.0423440.0420310.03898410.027.061163
1021588.68067210.0556250.0478130.0467190.0467190.0465740.0530210.0479690.0420310.0310940.0193750.03898410.029.521087
1121599.03408010.0556250.0603120.0467190.0310940.0495310.0530210.0479690.0389060.0310940.0248440.03898410.031.299771
1221608.69148310.0556250.0603120.0467190.0467190.0310940.0467710.0479690.0389060.0310940.0248440.03898400.031.325914
1321618.83171210.0556250.0603120.0467190.0310940.0495310.0467710.0479690.0420310.0481250.0201560.03820310.031.419907
1421629.12869610.0604690.0603120.0467190.0467190.0310940.0530210.0479690.0420310.0435940.0154690.03820300.033.386667
1521639.40590710.0467190.0603120.0467190.0357810.0310940.0446870.0404690.0420310.0435940.0248440.03820310.019.730000
1621649.44715010.0467190.0561460.0467190.0357810.0495310.0446870.0404690.0310940.0435940.0389060.03820310.022.040909
1721658.78385610.0560940.0561460.0420310.0437020.0310940.0512750.0373440.0310940.0435940.0420310.03117200.035.353137
1821668.72323110.0560940.0415630.0420310.0404690.0310940.0514710.0373440.0420310.0310940.0217190.03117200.035.217500
1921679.95797610.0373440.0415630.0498440.0310940.0310940.0446870.0404690.0420310.0310940.0420310.03117200.025.086667
2021689.42674110.0373440.0561460.0498440.0264060.0310940.0446870.0404690.0420310.0310940.0420310.02335910.017.070052
2121699.15609510.0560940.0561460.0295310.0404690.0310940.0446870.0310940.0390620.0310940.0420310.02335910.043.958514
2221709.79367310.0404690.0561460.0498440.0404690.0404690.0446870.0404690.0390620.0389060.0154690.03507810.035.017143
2321719.14931610.0404690.0561460.0498440.0264060.0404690.0415630.0404690.0420310.0310940.0420310.02726610.031.038367
2421728.74385110.0560940.0373960.0498440.0264060.0310940.0415630.0404690.0357810.0310940.0420310.02726600.050.155714
2521738.84101410.0560940.0373960.0498440.0404690.0404690.0415630.0404690.0357810.0310940.0232810.02726600.048.598889
2621749.72722810.0389060.0373960.0420310.0404690.0389060.0431250.0404690.0420310.0310940.0232810.03507810.031.650000
2721758.74385110.0560940.0561460.0420310.0232810.0389060.0431250.0404690.0420310.0310940.0420310.02726600.051.318980
2821768.97916510.0560940.0561460.0498440.0232810.0389060.0431250.0310940.0342190.0310940.0420310.02726600.051.020565
2921778.72323110.0560940.0561460.0498440.0404690.0310940.0415630.0404690.0342190.0389060.0170310.03507800.051.144375
............................................................
84153137111068.56560210.0428370.0519790.0448440.0264060.0301950.0412500.0342910.0342190.0310940.0248440.02953100.038.220000
84154137111079.10052610.0533230.0519790.0448440.0275620.0287740.0390710.0310940.0328130.0317190.0248440.03039100.039.480000
84155137111088.70217810.0490040.0519790.0310940.0377330.0279690.0363540.0318130.0314060.0382810.0239060.03039100.039.760000
84156137111098.65869310.0479690.0519790.0448440.0356250.0303220.0395700.0373440.0325000.0373440.0232810.03039100.042.590000
84157137111108.80327410.0479690.0500170.0448440.0356250.0264060.0373960.0333570.0325000.0373440.0240630.02765600.039.320000
84158137111119.34066710.0479690.0478130.0404690.0356250.0361330.0373960.0310940.0310940.0323440.0310940.02335911.028.220000
84159137111129.08613710.0479690.0490630.0448440.0356250.0231820.0373960.0316310.0320310.0310940.0287500.02539110.033.290000
84160137111138.82232210.0485940.0519790.0448440.0309370.0366520.0373960.0339850.0342190.0348440.0264060.03039100.038.270000
84161137111149.02641810.0498440.0519790.0448440.0313380.0323500.0381630.0310940.0339060.0310940.0265620.03117200.037.260000
84162137111159.48675910.0310940.0519790.0448440.0344280.0310400.0412500.0310940.0326560.0210940.0310940.02570311.024.800000
84163137111168.70217810.0443530.0519790.0448440.0310940.0310940.0400340.0310940.0331250.0210940.0234380.03156310.038.260000
84164137111178.82232210.0498440.0415630.0448440.0310940.0323360.0373960.0303760.0334380.0256250.0248440.03242200.037.510000
84165137111188.87738210.0498440.0434350.0448440.0283870.0373440.0376370.0297060.0310940.0310940.0248440.02867200.027.650000
84166137111199.51546910.0442700.0519790.0448440.0264060.0347010.0384370.0357920.0310940.0310940.0253130.02335911.07.590000
84167137111209.14249010.0373440.0519790.0448440.0274880.0310940.0384370.0373440.0310940.0310940.0264060.02335910.09.860000
84168137111219.12869610.0365620.0519790.0431250.0222830.0310940.0390310.0382810.0310940.0279690.0164060.02492210.017.990000
84169137111228.68067210.0357810.0519790.0389060.0232810.0329900.0400000.0407810.0310940.0279690.0275000.03242200.032.790000
84170137111238.51559210.0371030.0519790.0428250.0239810.0389060.0400000.0343030.0354690.0373440.0278130.03242200.032.120000
84171137111248.65869310.0496500.0415630.0519700.0389060.0389060.0401040.0310940.0365620.0373440.0242190.03242200.031.970000
84172137111258.54091010.0498440.0415630.0507810.0254320.0398370.0401370.0322920.0326560.0373440.0201560.03101600.029.490000
84173137111268.80327410.0498440.0443680.0507810.0232810.0377390.0384370.0407810.0337500.0373440.0203130.02882811.027.010000
84174137111278.76405310.0310940.0519790.0509790.0236000.0310940.0384370.0410570.0389060.0154690.0164060.02882810.026.880000
84175137111288.76405310.0498440.0519790.0523440.0389060.0310940.0392410.0375870.0389060.0373440.0264060.02953110.027.910000
84176137111298.58970010.0310940.0519790.0523440.0389060.0336860.0449510.0310940.0379690.0256250.0242190.03242200.034.330000
84177137111308.40737810.0279690.0519790.0523440.0389060.0370120.0509370.0333940.0359370.0260940.0217190.03242200.034.330000
84178137111319.63115410.0279690.0519790.0490800.0398200.0310940.0483950.0375000.0389060.0232810.0221870.02570310.017.170000
84179137111329.70406110.0305040.0519790.0435940.0339270.0331670.0457290.0310940.0389060.0253130.0248440.02632811.018.630000
84180137111338.99516510.0430560.0519790.0455420.0310940.0372050.0465790.0334700.0379690.0201560.0256250.02960910.025.350000
84181137111348.91247310.0390620.0493010.0495880.0323000.0310940.0509370.0420310.0357810.0220310.0310940.02960910.025.320000
84182137111359.90188610.0404730.0457290.0469570.0452230.0334930.0509370.0339410.0357810.0264060.0229690.02335911.05.350000
\n", - "

84183 rows × 19 columns

\n", - "
" - ], - "text/plain": [ - " store brand week logmove constant price1 price2 price3 \\\n", - "0 2 1 40 9.018695 1 0.060469 0.060497 0.042031 \n", - "1 2 1 46 8.723231 1 0.060469 0.060312 0.045156 \n", - "2 2 1 47 8.253228 1 0.060469 0.060312 0.045156 \n", - "3 2 1 48 8.987197 1 0.060469 0.060312 0.049844 \n", - "4 2 1 50 9.093357 1 0.060469 0.060312 0.043594 \n", - "5 2 1 51 8.877382 1 0.060469 0.060312 0.043594 \n", - "6 2 1 52 9.294682 1 0.051406 0.060312 0.043594 \n", - "7 2 1 53 8.954674 1 0.051406 0.060312 0.049844 \n", - "8 2 1 54 9.049232 1 0.051406 0.060312 0.049844 \n", - "9 2 1 57 8.613230 1 0.051406 0.060312 0.048281 \n", - "10 2 1 58 8.680672 1 0.055625 0.047813 0.046719 \n", - "11 2 1 59 9.034080 1 0.055625 0.060312 0.046719 \n", - "12 2 1 60 8.691483 1 0.055625 0.060312 0.046719 \n", - "13 2 1 61 8.831712 1 0.055625 0.060312 0.046719 \n", - "14 2 1 62 9.128696 1 0.060469 0.060312 0.046719 \n", - "15 2 1 63 9.405907 1 0.046719 0.060312 0.046719 \n", - "16 2 1 64 9.447150 1 0.046719 0.056146 0.046719 \n", - "17 2 1 65 8.783856 1 0.056094 0.056146 0.042031 \n", - "18 2 1 66 8.723231 1 0.056094 0.041563 0.042031 \n", - "19 2 1 67 9.957976 1 0.037344 0.041563 0.049844 \n", - "20 2 1 68 9.426741 1 0.037344 0.056146 0.049844 \n", - "21 2 1 69 9.156095 1 0.056094 0.056146 0.029531 \n", - "22 2 1 70 9.793673 1 0.040469 0.056146 0.049844 \n", - "23 2 1 71 9.149316 1 0.040469 0.056146 0.049844 \n", - "24 2 1 72 8.743851 1 0.056094 0.037396 0.049844 \n", - "25 2 1 73 8.841014 1 0.056094 0.037396 0.049844 \n", - "26 2 1 74 9.727228 1 0.038906 0.037396 0.042031 \n", - "27 2 1 75 8.743851 1 0.056094 0.056146 0.042031 \n", - "28 2 1 76 8.979165 1 0.056094 0.056146 0.049844 \n", - "29 2 1 77 8.723231 1 0.056094 0.056146 0.049844 \n", - "... ... ... ... ... ... ... ... ... \n", - "84153 137 11 106 8.565602 1 0.042837 0.051979 0.044844 \n", - "84154 137 11 107 9.100526 1 0.053323 0.051979 0.044844 \n", - "84155 137 11 108 8.702178 1 0.049004 0.051979 0.031094 \n", - "84156 137 11 109 8.658693 1 0.047969 0.051979 0.044844 \n", - "84157 137 11 110 8.803274 1 0.047969 0.050017 0.044844 \n", - "84158 137 11 111 9.340667 1 0.047969 0.047813 0.040469 \n", - "84159 137 11 112 9.086137 1 0.047969 0.049063 0.044844 \n", - "84160 137 11 113 8.822322 1 0.048594 0.051979 0.044844 \n", - "84161 137 11 114 9.026418 1 0.049844 0.051979 0.044844 \n", - "84162 137 11 115 9.486759 1 0.031094 0.051979 0.044844 \n", - "84163 137 11 116 8.702178 1 0.044353 0.051979 0.044844 \n", - "84164 137 11 117 8.822322 1 0.049844 0.041563 0.044844 \n", - "84165 137 11 118 8.877382 1 0.049844 0.043435 0.044844 \n", - "84166 137 11 119 9.515469 1 0.044270 0.051979 0.044844 \n", - "84167 137 11 120 9.142490 1 0.037344 0.051979 0.044844 \n", - "84168 137 11 121 9.128696 1 0.036562 0.051979 0.043125 \n", - "84169 137 11 122 8.680672 1 0.035781 0.051979 0.038906 \n", - "84170 137 11 123 8.515592 1 0.037103 0.051979 0.042825 \n", - "84171 137 11 124 8.658693 1 0.049650 0.041563 0.051970 \n", - "84172 137 11 125 8.540910 1 0.049844 0.041563 0.050781 \n", - "84173 137 11 126 8.803274 1 0.049844 0.044368 0.050781 \n", - "84174 137 11 127 8.764053 1 0.031094 0.051979 0.050979 \n", - "84175 137 11 128 8.764053 1 0.049844 0.051979 0.052344 \n", - "84176 137 11 129 8.589700 1 0.031094 0.051979 0.052344 \n", - "84177 137 11 130 8.407378 1 0.027969 0.051979 0.052344 \n", - "84178 137 11 131 9.631154 1 0.027969 0.051979 0.049080 \n", - "84179 137 11 132 9.704061 1 0.030504 0.051979 0.043594 \n", - "84180 137 11 133 8.995165 1 0.043056 0.051979 0.045542 \n", - "84181 137 11 134 8.912473 1 0.039062 0.049301 0.049588 \n", - "84182 137 11 135 9.901886 1 0.040473 0.045729 0.046957 \n", - "\n", - " price4 price5 price6 price7 price8 price9 price10 \\\n", - "0 0.029531 0.049531 0.053021 0.038906 0.041406 0.028906 0.024844 \n", - "1 0.046719 0.049531 0.047813 0.045781 0.027969 0.042969 0.042031 \n", - "2 0.046719 0.037344 0.053021 0.045781 0.041406 0.048125 0.032656 \n", - "3 0.037344 0.049531 0.053021 0.045781 0.041406 0.042344 0.032656 \n", - "4 0.031094 0.049531 0.053021 0.046648 0.041406 0.042344 0.032656 \n", - "5 0.046719 0.049531 0.053021 0.046456 0.035781 0.042344 0.029531 \n", - "6 0.046719 0.049531 0.053021 0.047969 0.035781 0.031094 0.029531 \n", - "7 0.046719 0.034219 0.053021 0.047969 0.035781 0.031094 0.029531 \n", - "8 0.037344 0.049531 0.053021 0.047969 0.038281 0.048125 0.027969 \n", - "9 0.046719 0.031094 0.053021 0.031094 0.041406 0.042344 0.042031 \n", - "10 0.046719 0.046574 0.053021 0.047969 0.042031 0.031094 0.019375 \n", - "11 0.031094 0.049531 0.053021 0.047969 0.038906 0.031094 0.024844 \n", - "12 0.046719 0.031094 0.046771 0.047969 0.038906 0.031094 0.024844 \n", - "13 0.031094 0.049531 0.046771 0.047969 0.042031 0.048125 0.020156 \n", - "14 0.046719 0.031094 0.053021 0.047969 0.042031 0.043594 0.015469 \n", - "15 0.035781 0.031094 0.044687 0.040469 0.042031 0.043594 0.024844 \n", - "16 0.035781 0.049531 0.044687 0.040469 0.031094 0.043594 0.038906 \n", - "17 0.043702 0.031094 0.051275 0.037344 0.031094 0.043594 0.042031 \n", - "18 0.040469 0.031094 0.051471 0.037344 0.042031 0.031094 0.021719 \n", - "19 0.031094 0.031094 0.044687 0.040469 0.042031 0.031094 0.042031 \n", - "20 0.026406 0.031094 0.044687 0.040469 0.042031 0.031094 0.042031 \n", - "21 0.040469 0.031094 0.044687 0.031094 0.039062 0.031094 0.042031 \n", - "22 0.040469 0.040469 0.044687 0.040469 0.039062 0.038906 0.015469 \n", - "23 0.026406 0.040469 0.041563 0.040469 0.042031 0.031094 0.042031 \n", - "24 0.026406 0.031094 0.041563 0.040469 0.035781 0.031094 0.042031 \n", - "25 0.040469 0.040469 0.041563 0.040469 0.035781 0.031094 0.023281 \n", - "26 0.040469 0.038906 0.043125 0.040469 0.042031 0.031094 0.023281 \n", - "27 0.023281 0.038906 0.043125 0.040469 0.042031 0.031094 0.042031 \n", - "28 0.023281 0.038906 0.043125 0.031094 0.034219 0.031094 0.042031 \n", - "29 0.040469 0.031094 0.041563 0.040469 0.034219 0.038906 0.017031 \n", - "... ... ... ... ... ... ... ... \n", - "84153 0.026406 0.030195 0.041250 0.034291 0.034219 0.031094 0.024844 \n", - "84154 0.027562 0.028774 0.039071 0.031094 0.032813 0.031719 0.024844 \n", - "84155 0.037733 0.027969 0.036354 0.031813 0.031406 0.038281 0.023906 \n", - "84156 0.035625 0.030322 0.039570 0.037344 0.032500 0.037344 0.023281 \n", - "84157 0.035625 0.026406 0.037396 0.033357 0.032500 0.037344 0.024063 \n", - "84158 0.035625 0.036133 0.037396 0.031094 0.031094 0.032344 0.031094 \n", - "84159 0.035625 0.023182 0.037396 0.031631 0.032031 0.031094 0.028750 \n", - "84160 0.030937 0.036652 0.037396 0.033985 0.034219 0.034844 0.026406 \n", - "84161 0.031338 0.032350 0.038163 0.031094 0.033906 0.031094 0.026562 \n", - "84162 0.034428 0.031040 0.041250 0.031094 0.032656 0.021094 0.031094 \n", - "84163 0.031094 0.031094 0.040034 0.031094 0.033125 0.021094 0.023438 \n", - "84164 0.031094 0.032336 0.037396 0.030376 0.033438 0.025625 0.024844 \n", - "84165 0.028387 0.037344 0.037637 0.029706 0.031094 0.031094 0.024844 \n", - "84166 0.026406 0.034701 0.038437 0.035792 0.031094 0.031094 0.025313 \n", - "84167 0.027488 0.031094 0.038437 0.037344 0.031094 0.031094 0.026406 \n", - "84168 0.022283 0.031094 0.039031 0.038281 0.031094 0.027969 0.016406 \n", - "84169 0.023281 0.032990 0.040000 0.040781 0.031094 0.027969 0.027500 \n", - "84170 0.023981 0.038906 0.040000 0.034303 0.035469 0.037344 0.027813 \n", - "84171 0.038906 0.038906 0.040104 0.031094 0.036562 0.037344 0.024219 \n", - "84172 0.025432 0.039837 0.040137 0.032292 0.032656 0.037344 0.020156 \n", - "84173 0.023281 0.037739 0.038437 0.040781 0.033750 0.037344 0.020313 \n", - "84174 0.023600 0.031094 0.038437 0.041057 0.038906 0.015469 0.016406 \n", - "84175 0.038906 0.031094 0.039241 0.037587 0.038906 0.037344 0.026406 \n", - "84176 0.038906 0.033686 0.044951 0.031094 0.037969 0.025625 0.024219 \n", - "84177 0.038906 0.037012 0.050937 0.033394 0.035937 0.026094 0.021719 \n", - "84178 0.039820 0.031094 0.048395 0.037500 0.038906 0.023281 0.022187 \n", - "84179 0.033927 0.033167 0.045729 0.031094 0.038906 0.025313 0.024844 \n", - "84180 0.031094 0.037205 0.046579 0.033470 0.037969 0.020156 0.025625 \n", - "84181 0.032300 0.031094 0.050937 0.042031 0.035781 0.022031 0.031094 \n", - "84182 0.045223 0.033493 0.050937 0.033941 0.035781 0.026406 0.022969 \n", - "\n", - " price11 deal feat profit \n", - "0 0.038984 1 0.0 37.992326 \n", - "1 0.038984 0 0.0 30.126667 \n", - "2 0.038984 0 0.0 30.000000 \n", - "3 0.038984 0 0.0 29.950000 \n", - "4 0.038203 0 0.0 29.920000 \n", - "5 0.038203 0 0.0 29.920000 \n", - "6 0.038984 1 0.0 27.125471 \n", - "7 0.038984 1 0.0 27.125041 \n", - "8 0.035078 1 0.0 27.082481 \n", - "9 0.038984 1 0.0 27.061163 \n", - "10 0.038984 1 0.0 29.521087 \n", - "11 0.038984 1 0.0 31.299771 \n", - "12 0.038984 0 0.0 31.325914 \n", - "13 0.038203 1 0.0 31.419907 \n", - "14 0.038203 0 0.0 33.386667 \n", - "15 0.038203 1 0.0 19.730000 \n", - "16 0.038203 1 0.0 22.040909 \n", - "17 0.031172 0 0.0 35.353137 \n", - "18 0.031172 0 0.0 35.217500 \n", - "19 0.031172 0 0.0 25.086667 \n", - "20 0.023359 1 0.0 17.070052 \n", - "21 0.023359 1 0.0 43.958514 \n", - "22 0.035078 1 0.0 35.017143 \n", - "23 0.027266 1 0.0 31.038367 \n", - "24 0.027266 0 0.0 50.155714 \n", - "25 0.027266 0 0.0 48.598889 \n", - "26 0.035078 1 0.0 31.650000 \n", - "27 0.027266 0 0.0 51.318980 \n", - "28 0.027266 0 0.0 51.020565 \n", - "29 0.035078 0 0.0 51.144375 \n", - "... ... ... ... ... \n", - "84153 0.029531 0 0.0 38.220000 \n", - "84154 0.030391 0 0.0 39.480000 \n", - "84155 0.030391 0 0.0 39.760000 \n", - "84156 0.030391 0 0.0 42.590000 \n", - "84157 0.027656 0 0.0 39.320000 \n", - "84158 0.023359 1 1.0 28.220000 \n", - "84159 0.025391 1 0.0 33.290000 \n", - "84160 0.030391 0 0.0 38.270000 \n", - "84161 0.031172 0 0.0 37.260000 \n", - "84162 0.025703 1 1.0 24.800000 \n", - "84163 0.031563 1 0.0 38.260000 \n", - "84164 0.032422 0 0.0 37.510000 \n", - "84165 0.028672 0 0.0 27.650000 \n", - "84166 0.023359 1 1.0 7.590000 \n", - "84167 0.023359 1 0.0 9.860000 \n", - "84168 0.024922 1 0.0 17.990000 \n", - "84169 0.032422 0 0.0 32.790000 \n", - "84170 0.032422 0 0.0 32.120000 \n", - "84171 0.032422 0 0.0 31.970000 \n", - "84172 0.031016 0 0.0 29.490000 \n", - "84173 0.028828 1 1.0 27.010000 \n", - "84174 0.028828 1 0.0 26.880000 \n", - "84175 0.029531 1 0.0 27.910000 \n", - "84176 0.032422 0 0.0 34.330000 \n", - "84177 0.032422 0 0.0 34.330000 \n", - "84178 0.025703 1 0.0 17.170000 \n", - "84179 0.026328 1 1.0 18.630000 \n", - "84180 0.029609 1 0.0 25.350000 \n", - "84181 0.029609 1 0.0 25.320000 \n", - "84182 0.023359 1 1.0 5.350000 \n", - "\n", - "[84183 rows x 19 columns]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "yx = pd.read_csv('./../TSPerf/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/data/train/train_round_2.csv')\n", - "yx" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['store', 'brand', 'week', 'logmove', 'constant', 'price1',\n", - " 'price2', 'price3', 'price4', 'price5', 'price6', 'price7',\n", - " 'price8', 'price9', 'price10', 'price11', 'deal', 'feat', 'profit'],\n", - " dtype=object)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "yx.columns.values" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(40, 135)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#ascertain what weeks are accounted for in known data\n", - "min_week = min(set(yx.iloc[:,2]))\n", - "max_week = max(set(yx.iloc[:,2]))\n", - "min_week, max_week" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of stores: 83\n", - "Number of brands: 11\n" - ] - } - ], - "source": [ - "#number of stores and number of brands\n", - "print(\"Number of stores:\", len(set(yx.iloc[:,0])))\n", - "print(\"Number of brands:\", len(set(yx.iloc[:,1])))" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDBrandstore and brandweek 40week 41week 42week 43week 44week 45week 46...week 126week 127week 128week 129week 130week 131week 132week 133week 134week 135
\n", - "

0 rows × 99 columns

\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [SalesID, Brand, store and brand, week 40, week 41, week 42, week 43, week 44, week 45, week 46, week 47, week 48, week 49, week 50, week 51, week 52, week 53, week 54, week 55, week 56, week 57, week 58, week 59, week 60, week 61, week 62, week 63, week 64, week 65, week 66, week 67, week 68, week 69, week 70, week 71, week 72, week 73, week 74, week 75, week 76, week 77, week 78, week 79, week 80, week 81, week 82, week 83, week 84, week 85, week 86, week 87, week 88, week 89, week 90, week 91, week 92, week 93, week 94, week 95, week 96, week 97, week 98, week 99, week 100, week 101, week 102, week 103, week 104, week 105, week 106, week 107, week 108, week 109, week 110, week 111, week 112, week 113, week 114, week 115, week 116, week 117, week 118, week 119, week 120, week 121, week 122, week 123, week 124, week 125, week 126, week 127, week 128, week 129, week 130, week 131, week 132, week 133, week 134, week 135]\n", - "Index: []\n", - "\n", - "[0 rows x 99 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#generate the new dataframe. Note that week number has index = week# - 39. \n", - "col_list = ['SalesID', 'Brand', 'store and brand'] + ['week ' + str(x) for x in range(min_week, max_week + 1)]\n", - "df = pd.DataFrame([], columns=col_list)\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "store_list = sorted(list(set(yx.iloc[:, 0])))\n", - "brand_list = sorted(list(set(yx.iloc[:, 1])))" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "913\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDBrandstore and brandweek 40week 41week 42week 43week 44week 45week 46...week 126week 127week 128week 129week 130week 131week 132week 133week 134week 135
0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
5NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
6NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
7NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
8NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
9NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
10NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
11NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
12NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
13NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
14NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
15NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
16NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
17NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
18NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
19NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
20NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
21NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
23NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
24NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
25NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
26NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
27NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
28NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
29NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
883NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
884NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
885NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
886NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
887NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
888NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
889NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
890NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
891NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
892NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
893NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
894NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
895NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
896NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
897NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
898NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
899NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
900NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
901NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
902NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
903NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
904NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
905NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
906NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
907NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
908NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
909NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
910NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
911NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
912NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "

913 rows × 99 columns

\n", - "
" - ], - "text/plain": [ - " SalesID Brand store and brand week 40 week 41 week 42 week 43 week 44 \\\n", - "0 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "2 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "3 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "4 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "5 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "6 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "7 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "8 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "9 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "10 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "11 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "12 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "13 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "14 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "15 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "16 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "17 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "18 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "19 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "20 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "21 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "22 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "23 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "24 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "25 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "26 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "27 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "28 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "29 NaN NaN NaN NaN NaN NaN NaN NaN \n", - ".. ... ... ... ... ... ... ... ... \n", - "883 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "884 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "885 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "886 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "887 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "888 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "889 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "890 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "891 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "892 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "893 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "894 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "895 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "896 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "897 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "898 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "899 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "900 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "901 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "902 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "903 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "904 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "905 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "906 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "907 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "908 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "909 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "910 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "911 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "912 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "\n", - " week 45 week 46 ... week 126 week 127 week 128 week 129 week 130 \\\n", - "0 NaN NaN ... NaN NaN NaN NaN NaN \n", - "1 NaN NaN ... NaN NaN NaN NaN NaN \n", - "2 NaN NaN ... NaN NaN NaN NaN NaN \n", - "3 NaN NaN ... NaN NaN NaN NaN NaN \n", - "4 NaN NaN ... NaN NaN NaN NaN NaN \n", - "5 NaN NaN ... NaN NaN NaN NaN NaN \n", - "6 NaN NaN ... NaN NaN NaN NaN NaN \n", - "7 NaN NaN ... NaN NaN NaN NaN NaN \n", - "8 NaN NaN ... NaN NaN NaN NaN NaN \n", - "9 NaN NaN ... NaN NaN NaN NaN NaN \n", - "10 NaN NaN ... NaN NaN NaN NaN NaN \n", - "11 NaN NaN ... NaN NaN NaN NaN NaN \n", - "12 NaN NaN ... NaN NaN NaN NaN NaN \n", - "13 NaN NaN ... NaN NaN NaN NaN NaN \n", - "14 NaN NaN ... NaN NaN NaN NaN NaN \n", - "15 NaN NaN ... NaN NaN NaN NaN NaN \n", - "16 NaN NaN ... NaN NaN NaN NaN NaN \n", - "17 NaN NaN ... NaN NaN NaN NaN NaN \n", - "18 NaN NaN ... NaN NaN NaN NaN NaN \n", - "19 NaN NaN ... NaN NaN NaN NaN NaN \n", - "20 NaN NaN ... NaN NaN NaN NaN NaN \n", - "21 NaN NaN ... NaN NaN NaN NaN NaN \n", - "22 NaN NaN ... NaN NaN NaN NaN NaN \n", - "23 NaN NaN ... NaN NaN NaN NaN NaN \n", - "24 NaN NaN ... NaN NaN NaN NaN NaN \n", - "25 NaN NaN ... NaN NaN NaN NaN NaN \n", - "26 NaN NaN ... NaN NaN NaN NaN NaN \n", - "27 NaN NaN ... NaN NaN NaN NaN NaN \n", - "28 NaN NaN ... NaN NaN NaN NaN NaN \n", - "29 NaN NaN ... NaN NaN NaN NaN NaN \n", - ".. ... ... ... ... ... ... ... ... \n", - "883 NaN NaN ... NaN NaN NaN NaN NaN \n", - "884 NaN NaN ... NaN NaN NaN NaN NaN \n", - "885 NaN NaN ... NaN NaN NaN NaN NaN \n", - "886 NaN NaN ... NaN NaN NaN NaN NaN \n", - "887 NaN NaN ... NaN NaN NaN NaN NaN \n", - "888 NaN NaN ... NaN NaN NaN NaN NaN \n", - "889 NaN NaN ... NaN NaN NaN NaN NaN \n", - "890 NaN NaN ... NaN NaN NaN NaN NaN \n", - "891 NaN NaN ... NaN NaN NaN NaN NaN \n", - "892 NaN NaN ... NaN NaN NaN NaN NaN \n", - "893 NaN NaN ... NaN NaN NaN NaN NaN \n", - "894 NaN NaN ... NaN NaN NaN NaN NaN \n", - "895 NaN NaN ... NaN NaN NaN NaN NaN \n", - "896 NaN NaN ... NaN NaN NaN NaN NaN \n", - "897 NaN NaN ... NaN NaN NaN NaN NaN \n", - "898 NaN NaN ... NaN NaN NaN NaN NaN \n", - "899 NaN NaN ... NaN NaN NaN NaN NaN \n", - "900 NaN NaN ... NaN NaN NaN NaN NaN \n", - "901 NaN NaN ... NaN NaN NaN NaN NaN \n", - "902 NaN NaN ... NaN NaN NaN NaN NaN \n", - "903 NaN NaN ... NaN NaN NaN NaN NaN \n", - "904 NaN NaN ... NaN NaN NaN NaN NaN \n", - "905 NaN NaN ... NaN NaN NaN NaN NaN \n", - "906 NaN NaN ... NaN NaN NaN NaN NaN \n", - "907 NaN NaN ... NaN NaN NaN NaN NaN \n", - "908 NaN NaN ... NaN NaN NaN NaN NaN \n", - "909 NaN NaN ... NaN NaN NaN NaN NaN \n", - "910 NaN NaN ... NaN NaN NaN NaN NaN \n", - "911 NaN NaN ... NaN NaN NaN NaN NaN \n", - "912 NaN NaN ... NaN NaN NaN NaN NaN \n", - "\n", - " week 131 week 132 week 133 week 134 week 135 \n", - "0 NaN NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN NaN \n", - "2 NaN NaN NaN NaN NaN \n", - "3 NaN NaN NaN NaN NaN \n", - "4 NaN NaN NaN NaN NaN \n", - "5 NaN NaN NaN NaN NaN \n", - "6 NaN NaN NaN NaN NaN \n", - "7 NaN NaN NaN NaN NaN \n", - "8 NaN NaN NaN NaN NaN \n", - "9 NaN NaN NaN NaN NaN \n", - "10 NaN NaN NaN NaN NaN \n", - "11 NaN NaN NaN NaN NaN \n", - "12 NaN NaN NaN NaN NaN \n", - "13 NaN NaN NaN NaN NaN \n", - "14 NaN NaN NaN NaN NaN \n", - "15 NaN NaN NaN NaN NaN \n", - "16 NaN NaN NaN NaN NaN \n", - "17 NaN NaN NaN NaN NaN \n", - "18 NaN NaN NaN NaN NaN \n", - "19 NaN NaN NaN NaN NaN \n", - "20 NaN NaN NaN NaN NaN \n", - "21 NaN NaN NaN NaN NaN \n", - "22 NaN NaN NaN NaN NaN \n", - "23 NaN NaN NaN NaN NaN \n", - "24 NaN NaN NaN NaN NaN \n", - "25 NaN NaN NaN NaN NaN \n", - "26 NaN NaN NaN NaN NaN \n", - "27 NaN NaN NaN NaN NaN \n", - "28 NaN NaN NaN NaN NaN \n", - "29 NaN NaN NaN NaN NaN \n", - ".. ... ... ... ... ... \n", - "883 NaN NaN NaN NaN NaN \n", - "884 NaN NaN NaN NaN NaN \n", - "885 NaN NaN NaN NaN NaN \n", - "886 NaN NaN NaN NaN NaN \n", - "887 NaN NaN NaN NaN NaN \n", - "888 NaN NaN NaN NaN NaN \n", - "889 NaN NaN NaN NaN NaN \n", - "890 NaN NaN NaN NaN NaN \n", - "891 NaN NaN NaN NaN NaN \n", - "892 NaN NaN NaN NaN NaN \n", - "893 NaN NaN NaN NaN NaN \n", - "894 NaN NaN NaN NaN NaN \n", - "895 NaN NaN NaN NaN NaN \n", - "896 NaN NaN NaN NaN NaN \n", - "897 NaN NaN NaN NaN NaN \n", - "898 NaN NaN NaN NaN NaN \n", - "899 NaN NaN NaN NaN NaN \n", - "900 NaN NaN NaN NaN NaN \n", - "901 NaN NaN NaN NaN NaN \n", - "902 NaN NaN NaN NaN NaN \n", - "903 NaN NaN NaN NaN NaN \n", - "904 NaN NaN NaN NaN NaN \n", - "905 NaN NaN NaN NaN NaN \n", - "906 NaN NaN NaN NaN NaN \n", - "907 NaN NaN NaN NaN NaN \n", - "908 NaN NaN NaN NaN NaN \n", - "909 NaN NaN NaN NaN NaN \n", - "910 NaN NaN NaN NaN NaN \n", - "911 NaN NaN NaN NaN NaN \n", - "912 NaN NaN NaN NaN NaN \n", - "\n", - "[913 rows x 99 columns]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rows_needed = len(store_list) * len(brand_list)\n", - "print(rows_needed)\n", - "for i in range(rows_needed): \n", - " df2 = pd.Series([float('nan')] * (3 + max_week - min_week + 1), index=col_list)\n", - " df = df.append(df2, ignore_index=True)\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{(2, 1): 0, (2, 2): 1, (2, 3): 2, (2, 4): 3, (2, 5): 4, (2, 6): 5, (2, 7): 6, (2, 8): 7, (2, 9): 8, (2, 10): 9, (2, 11): 10, (5, 1): 11, (5, 2): 12, (5, 3): 13, (5, 4): 14, (5, 5): 15, (5, 6): 16, (5, 7): 17, (5, 8): 18, (5, 9): 19, (5, 10): 20, (5, 11): 21, (8, 1): 22, (8, 2): 23, (8, 3): 24, (8, 4): 25, (8, 5): 26, (8, 6): 27, (8, 7): 28, (8, 8): 29, (8, 9): 30, (8, 10): 31, (8, 11): 32, (9, 1): 33, (9, 2): 34, (9, 3): 35, (9, 4): 36, (9, 5): 37, (9, 6): 38, (9, 7): 39, (9, 8): 40, (9, 9): 41, (9, 10): 42, (9, 11): 43, (12, 1): 44, (12, 2): 45, (12, 3): 46, (12, 4): 47, (12, 5): 48, (12, 6): 49, (12, 7): 50, (12, 8): 51, (12, 9): 52, (12, 10): 53, (12, 11): 54, (14, 1): 55, (14, 2): 56, (14, 3): 57, (14, 4): 58, (14, 5): 59, (14, 6): 60, (14, 7): 61, (14, 8): 62, (14, 9): 63, (14, 10): 64, (14, 11): 65, (18, 1): 66, (18, 2): 67, (18, 3): 68, (18, 4): 69, (18, 5): 70, (18, 6): 71, (18, 7): 72, (18, 8): 73, (18, 9): 74, (18, 10): 75, (18, 11): 76, (21, 1): 77, (21, 2): 78, (21, 3): 79, (21, 4): 80, (21, 5): 81, (21, 6): 82, (21, 7): 83, (21, 8): 84, (21, 9): 85, (21, 10): 86, (21, 11): 87, (28, 1): 88, (28, 2): 89, (28, 3): 90, (28, 4): 91, (28, 5): 92, (28, 6): 93, (28, 7): 94, (28, 8): 95, (28, 9): 96, (28, 10): 97, (28, 11): 98, (32, 1): 99, (32, 2): 100, (32, 3): 101, (32, 4): 102, (32, 5): 103, (32, 6): 104, (32, 7): 105, (32, 8): 106, (32, 9): 107, (32, 10): 108, (32, 11): 109, (33, 1): 110, (33, 2): 111, (33, 3): 112, (33, 4): 113, (33, 5): 114, (33, 6): 115, (33, 7): 116, (33, 8): 117, (33, 9): 118, (33, 10): 119, (33, 11): 120, (40, 1): 121, (40, 2): 122, (40, 3): 123, (40, 4): 124, (40, 5): 125, (40, 6): 126, (40, 7): 127, (40, 8): 128, (40, 9): 129, (40, 10): 130, (40, 11): 131, (44, 1): 132, (44, 2): 133, (44, 3): 134, (44, 4): 135, (44, 5): 136, (44, 6): 137, (44, 7): 138, (44, 8): 139, (44, 9): 140, (44, 10): 141, (44, 11): 142, (45, 1): 143, (45, 2): 144, (45, 3): 145, (45, 4): 146, (45, 5): 147, (45, 6): 148, (45, 7): 149, (45, 8): 150, (45, 9): 151, (45, 10): 152, (45, 11): 153, (47, 1): 154, (47, 2): 155, (47, 3): 156, (47, 4): 157, (47, 5): 158, (47, 6): 159, (47, 7): 160, (47, 8): 161, (47, 9): 162, (47, 10): 163, (47, 11): 164, (48, 1): 165, (48, 2): 166, (48, 3): 167, (48, 4): 168, (48, 5): 169, (48, 6): 170, (48, 7): 171, (48, 8): 172, (48, 9): 173, (48, 10): 174, (48, 11): 175, (49, 1): 176, (49, 2): 177, (49, 3): 178, (49, 4): 179, (49, 5): 180, (49, 6): 181, (49, 7): 182, (49, 8): 183, (49, 9): 184, (49, 10): 185, (49, 11): 186, (50, 1): 187, (50, 2): 188, (50, 3): 189, (50, 4): 190, (50, 5): 191, (50, 6): 192, (50, 7): 193, (50, 8): 194, (50, 9): 195, (50, 10): 196, (50, 11): 197, (51, 1): 198, (51, 2): 199, (51, 3): 200, (51, 4): 201, (51, 5): 202, (51, 6): 203, (51, 7): 204, (51, 8): 205, (51, 9): 206, (51, 10): 207, (51, 11): 208, (52, 1): 209, (52, 2): 210, (52, 3): 211, (52, 4): 212, (52, 5): 213, (52, 6): 214, (52, 7): 215, (52, 8): 216, (52, 9): 217, (52, 10): 218, (52, 11): 219, (53, 1): 220, (53, 2): 221, (53, 3): 222, (53, 4): 223, (53, 5): 224, (53, 6): 225, (53, 7): 226, (53, 8): 227, (53, 9): 228, (53, 10): 229, (53, 11): 230, (54, 1): 231, (54, 2): 232, (54, 3): 233, (54, 4): 234, (54, 5): 235, (54, 6): 236, (54, 7): 237, (54, 8): 238, (54, 9): 239, (54, 10): 240, (54, 11): 241, (56, 1): 242, (56, 2): 243, (56, 3): 244, (56, 4): 245, (56, 5): 246, (56, 6): 247, (56, 7): 248, (56, 8): 249, (56, 9): 250, (56, 10): 251, (56, 11): 252, (59, 1): 253, (59, 2): 254, (59, 3): 255, (59, 4): 256, (59, 5): 257, (59, 6): 258, (59, 7): 259, (59, 8): 260, (59, 9): 261, (59, 10): 262, (59, 11): 263, (62, 1): 264, (62, 2): 265, (62, 3): 266, (62, 4): 267, (62, 5): 268, (62, 6): 269, (62, 7): 270, (62, 8): 271, (62, 9): 272, (62, 10): 273, (62, 11): 274, (64, 1): 275, (64, 2): 276, (64, 3): 277, (64, 4): 278, (64, 5): 279, (64, 6): 280, (64, 7): 281, (64, 8): 282, (64, 9): 283, (64, 10): 284, (64, 11): 285, (67, 1): 286, (67, 2): 287, (67, 3): 288, (67, 4): 289, (67, 5): 290, (67, 6): 291, (67, 7): 292, (67, 8): 293, (67, 9): 294, (67, 10): 295, (67, 11): 296, (68, 1): 297, (68, 2): 298, (68, 3): 299, (68, 4): 300, (68, 5): 301, (68, 6): 302, (68, 7): 303, (68, 8): 304, (68, 9): 305, (68, 10): 306, (68, 11): 307, (70, 1): 308, (70, 2): 309, (70, 3): 310, (70, 4): 311, (70, 5): 312, (70, 6): 313, (70, 7): 314, (70, 8): 315, (70, 9): 316, (70, 10): 317, (70, 11): 318, (71, 1): 319, (71, 2): 320, (71, 3): 321, (71, 4): 322, (71, 5): 323, (71, 6): 324, (71, 7): 325, (71, 8): 326, (71, 9): 327, (71, 10): 328, (71, 11): 329, (72, 1): 330, (72, 2): 331, (72, 3): 332, (72, 4): 333, (72, 5): 334, (72, 6): 335, (72, 7): 336, (72, 8): 337, (72, 9): 338, (72, 10): 339, (72, 11): 340, (73, 1): 341, (73, 2): 342, (73, 3): 343, (73, 4): 344, (73, 5): 345, (73, 6): 346, (73, 7): 347, (73, 8): 348, (73, 9): 349, (73, 10): 350, (73, 11): 351, (74, 1): 352, (74, 2): 353, (74, 3): 354, (74, 4): 355, (74, 5): 356, (74, 6): 357, (74, 7): 358, (74, 8): 359, (74, 9): 360, (74, 10): 361, (74, 11): 362, (75, 1): 363, (75, 2): 364, (75, 3): 365, (75, 4): 366, (75, 5): 367, (75, 6): 368, (75, 7): 369, (75, 8): 370, (75, 9): 371, (75, 10): 372, (75, 11): 373, (76, 1): 374, (76, 2): 375, (76, 3): 376, (76, 4): 377, (76, 5): 378, (76, 6): 379, (76, 7): 380, (76, 8): 381, (76, 9): 382, (76, 10): 383, (76, 11): 384, (77, 1): 385, (77, 2): 386, (77, 3): 387, (77, 4): 388, (77, 5): 389, (77, 6): 390, (77, 7): 391, (77, 8): 392, (77, 9): 393, (77, 10): 394, (77, 11): 395, (78, 1): 396, (78, 2): 397, (78, 3): 398, (78, 4): 399, (78, 5): 400, (78, 6): 401, (78, 7): 402, (78, 8): 403, (78, 9): 404, (78, 10): 405, (78, 11): 406, (80, 1): 407, (80, 2): 408, (80, 3): 409, (80, 4): 410, (80, 5): 411, (80, 6): 412, (80, 7): 413, (80, 8): 414, (80, 9): 415, (80, 10): 416, (80, 11): 417, (81, 1): 418, (81, 2): 419, (81, 3): 420, (81, 4): 421, (81, 5): 422, (81, 6): 423, (81, 7): 424, (81, 8): 425, (81, 9): 426, (81, 10): 427, (81, 11): 428, (83, 1): 429, (83, 2): 430, (83, 3): 431, (83, 4): 432, (83, 5): 433, (83, 6): 434, (83, 7): 435, (83, 8): 436, (83, 9): 437, (83, 10): 438, (83, 11): 439, (84, 1): 440, (84, 2): 441, (84, 3): 442, (84, 4): 443, (84, 5): 444, (84, 6): 445, (84, 7): 446, (84, 8): 447, (84, 9): 448, (84, 10): 449, (84, 11): 450, (86, 1): 451, (86, 2): 452, (86, 3): 453, (86, 4): 454, (86, 5): 455, (86, 6): 456, (86, 7): 457, (86, 8): 458, (86, 9): 459, (86, 10): 460, (86, 11): 461, (88, 1): 462, (88, 2): 463, (88, 3): 464, (88, 4): 465, (88, 5): 466, (88, 6): 467, (88, 7): 468, (88, 8): 469, (88, 9): 470, (88, 10): 471, (88, 11): 472, (89, 1): 473, (89, 2): 474, (89, 3): 475, (89, 4): 476, (89, 5): 477, (89, 6): 478, (89, 7): 479, (89, 8): 480, (89, 9): 481, (89, 10): 482, (89, 11): 483, (90, 1): 484, (90, 2): 485, (90, 3): 486, (90, 4): 487, (90, 5): 488, (90, 6): 489, (90, 7): 490, (90, 8): 491, (90, 9): 492, (90, 10): 493, (90, 11): 494, (91, 1): 495, (91, 2): 496, (91, 3): 497, (91, 4): 498, (91, 5): 499, (91, 6): 500, (91, 7): 501, (91, 8): 502, (91, 9): 503, (91, 10): 504, (91, 11): 505, (92, 1): 506, (92, 2): 507, (92, 3): 508, (92, 4): 509, (92, 5): 510, (92, 6): 511, (92, 7): 512, (92, 8): 513, (92, 9): 514, (92, 10): 515, (92, 11): 516, (93, 1): 517, (93, 2): 518, (93, 3): 519, (93, 4): 520, (93, 5): 521, (93, 6): 522, (93, 7): 523, (93, 8): 524, (93, 9): 525, (93, 10): 526, (93, 11): 527, (94, 1): 528, (94, 2): 529, (94, 3): 530, (94, 4): 531, (94, 5): 532, (94, 6): 533, (94, 7): 534, (94, 8): 535, (94, 9): 536, (94, 10): 537, (94, 11): 538, (95, 1): 539, (95, 2): 540, (95, 3): 541, (95, 4): 542, (95, 5): 543, (95, 6): 544, (95, 7): 545, (95, 8): 546, (95, 9): 547, (95, 10): 548, (95, 11): 549, (97, 1): 550, (97, 2): 551, (97, 3): 552, (97, 4): 553, (97, 5): 554, (97, 6): 555, (97, 7): 556, (97, 8): 557, (97, 9): 558, (97, 10): 559, (97, 11): 560, (98, 1): 561, (98, 2): 562, (98, 3): 563, (98, 4): 564, (98, 5): 565, (98, 6): 566, (98, 7): 567, (98, 8): 568, (98, 9): 569, (98, 10): 570, (98, 11): 571, (100, 1): 572, (100, 2): 573, (100, 3): 574, (100, 4): 575, (100, 5): 576, (100, 6): 577, (100, 7): 578, (100, 8): 579, (100, 9): 580, (100, 10): 581, (100, 11): 582, (101, 1): 583, (101, 2): 584, (101, 3): 585, (101, 4): 586, (101, 5): 587, (101, 6): 588, (101, 7): 589, (101, 8): 590, (101, 9): 591, (101, 10): 592, (101, 11): 593, (102, 1): 594, (102, 2): 595, (102, 3): 596, (102, 4): 597, (102, 5): 598, (102, 6): 599, (102, 7): 600, (102, 8): 601, (102, 9): 602, (102, 10): 603, (102, 11): 604, (103, 1): 605, (103, 2): 606, (103, 3): 607, (103, 4): 608, (103, 5): 609, (103, 6): 610, (103, 7): 611, (103, 8): 612, (103, 9): 613, (103, 10): 614, (103, 11): 615, (104, 1): 616, (104, 2): 617, (104, 3): 618, (104, 4): 619, (104, 5): 620, (104, 6): 621, (104, 7): 622, (104, 8): 623, (104, 9): 624, (104, 10): 625, (104, 11): 626, (105, 1): 627, (105, 2): 628, (105, 3): 629, (105, 4): 630, (105, 5): 631, (105, 6): 632, (105, 7): 633, (105, 8): 634, (105, 9): 635, (105, 10): 636, (105, 11): 637, (106, 1): 638, (106, 2): 639, (106, 3): 640, (106, 4): 641, (106, 5): 642, (106, 6): 643, (106, 7): 644, (106, 8): 645, (106, 9): 646, (106, 10): 647, (106, 11): 648, (107, 1): 649, (107, 2): 650, (107, 3): 651, (107, 4): 652, (107, 5): 653, (107, 6): 654, (107, 7): 655, (107, 8): 656, (107, 9): 657, (107, 10): 658, (107, 11): 659, (109, 1): 660, (109, 2): 661, (109, 3): 662, (109, 4): 663, (109, 5): 664, (109, 6): 665, (109, 7): 666, (109, 8): 667, (109, 9): 668, (109, 10): 669, (109, 11): 670, (110, 1): 671, (110, 2): 672, (110, 3): 673, (110, 4): 674, (110, 5): 675, (110, 6): 676, (110, 7): 677, (110, 8): 678, (110, 9): 679, (110, 10): 680, (110, 11): 681, (111, 1): 682, (111, 2): 683, (111, 3): 684, (111, 4): 685, (111, 5): 686, (111, 6): 687, (111, 7): 688, (111, 8): 689, (111, 9): 690, (111, 10): 691, (111, 11): 692, (112, 1): 693, (112, 2): 694, (112, 3): 695, (112, 4): 696, (112, 5): 697, (112, 6): 698, (112, 7): 699, (112, 8): 700, (112, 9): 701, (112, 10): 702, (112, 11): 703, (113, 1): 704, (113, 2): 705, (113, 3): 706, (113, 4): 707, (113, 5): 708, (113, 6): 709, (113, 7): 710, (113, 8): 711, (113, 9): 712, (113, 10): 713, (113, 11): 714, (114, 1): 715, (114, 2): 716, (114, 3): 717, (114, 4): 718, (114, 5): 719, (114, 6): 720, (114, 7): 721, (114, 8): 722, (114, 9): 723, (114, 10): 724, (114, 11): 725, (115, 1): 726, (115, 2): 727, (115, 3): 728, (115, 4): 729, (115, 5): 730, (115, 6): 731, (115, 7): 732, (115, 8): 733, (115, 9): 734, (115, 10): 735, (115, 11): 736, (116, 1): 737, (116, 2): 738, (116, 3): 739, (116, 4): 740, (116, 5): 741, (116, 6): 742, (116, 7): 743, (116, 8): 744, (116, 9): 745, (116, 10): 746, (116, 11): 747, (117, 1): 748, (117, 2): 749, (117, 3): 750, (117, 4): 751, (117, 5): 752, (117, 6): 753, (117, 7): 754, (117, 8): 755, (117, 9): 756, (117, 10): 757, (117, 11): 758, (118, 1): 759, (118, 2): 760, (118, 3): 761, (118, 4): 762, (118, 5): 763, (118, 6): 764, (118, 7): 765, (118, 8): 766, (118, 9): 767, (118, 10): 768, (118, 11): 769, (119, 1): 770, (119, 2): 771, (119, 3): 772, (119, 4): 773, (119, 5): 774, (119, 6): 775, (119, 7): 776, (119, 8): 777, (119, 9): 778, (119, 10): 779, (119, 11): 780, (121, 1): 781, (121, 2): 782, (121, 3): 783, (121, 4): 784, (121, 5): 785, (121, 6): 786, (121, 7): 787, (121, 8): 788, (121, 9): 789, (121, 10): 790, (121, 11): 791, (122, 1): 792, (122, 2): 793, (122, 3): 794, (122, 4): 795, (122, 5): 796, (122, 6): 797, (122, 7): 798, (122, 8): 799, (122, 9): 800, (122, 10): 801, (122, 11): 802, (123, 1): 803, (123, 2): 804, (123, 3): 805, (123, 4): 806, (123, 5): 807, (123, 6): 808, (123, 7): 809, (123, 8): 810, (123, 9): 811, (123, 10): 812, (123, 11): 813, (124, 1): 814, (124, 2): 815, (124, 3): 816, (124, 4): 817, (124, 5): 818, (124, 6): 819, (124, 7): 820, (124, 8): 821, (124, 9): 822, (124, 10): 823, (124, 11): 824, (126, 1): 825, (126, 2): 826, (126, 3): 827, (126, 4): 828, (126, 5): 829, (126, 6): 830, (126, 7): 831, (126, 8): 832, (126, 9): 833, (126, 10): 834, (126, 11): 835, (128, 1): 836, (128, 2): 837, (128, 3): 838, (128, 4): 839, (128, 5): 840, (128, 6): 841, (128, 7): 842, (128, 8): 843, (128, 9): 844, (128, 10): 845, (128, 11): 846, (129, 1): 847, (129, 2): 848, (129, 3): 849, (129, 4): 850, (129, 5): 851, (129, 6): 852, (129, 7): 853, (129, 8): 854, (129, 9): 855, (129, 10): 856, (129, 11): 857, (130, 1): 858, (130, 2): 859, (130, 3): 860, (130, 4): 861, (130, 5): 862, (130, 6): 863, (130, 7): 864, (130, 8): 865, (130, 9): 866, (130, 10): 867, (130, 11): 868, (131, 1): 869, (131, 2): 870, (131, 3): 871, (131, 4): 872, (131, 5): 873, (131, 6): 874, (131, 7): 875, (131, 8): 876, (131, 9): 877, (131, 10): 878, (131, 11): 879, (132, 1): 880, (132, 2): 881, (132, 3): 882, (132, 4): 883, (132, 5): 884, (132, 6): 885, (132, 7): 886, (132, 8): 887, (132, 9): 888, (132, 10): 889, (132, 11): 890, (134, 1): 891, (134, 2): 892, (134, 3): 893, (134, 4): 894, (134, 5): 895, (134, 6): 896, (134, 7): 897, (134, 8): 898, (134, 9): 899, (134, 10): 900, (134, 11): 901, (137, 1): 902, (137, 2): 903, (137, 3): 904, (137, 4): 905, (137, 5): 906, (137, 6): 907, (137, 7): 908, (137, 8): 909, (137, 9): 910, (137, 10): 911, (137, 11): 912}\n" - ] - } - ], - "source": [ - "count = 0\n", - "tsMap = dict() #map from (store, brand) to \n", - "for i in store_list: \n", - " for j in brand_list: \n", - " tsMap[(i, j)] = count\n", - " count += 1\n", - "print(tsMap)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "import math\n", - "for i, val in yx.iterrows(): \n", - " store_brand_pair = (val['store'], val['brand'])\n", - " df_index = tsMap[store_brand_pair]\n", - " df['Brand'][df_index] = val['brand']\n", - " df['store and brand'][df_index] = store_brand_pair\n", - " week_col = 'week ' + str(int(val['week']))\n", - " df[week_col][df_index] = math.exp(val[3]) #math.exp(logmove) = number of units sold" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "for i, val in df.iterrows(): \n", - " df['SalesID'][i] = 'E' + str(i+1)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDBrandstore and brandweek 40week 41week 42week 43week 44week 45week 46...week 126week 127week 128week 129week 130week 131week 132week 133week 134week 135
0E11(2.0, 1.0)8256NaNNaNNaNNaNNaN6144...672020224505643584257283180820736151682809612416
1E22(2.0, 2.0)6240NaNNaNNaNNaNNaN7104...854460481718456647296528068167008499211424
2E33(2.0, 3.0)3328NaNNaNNaNNaNNaN3200...140819841344960147214724032281615362432
3E44(2.0, 4.0)28096NaNNaNNaNNaNNaN6464...5702488965376294433921984492814585664002176
4E55(2.0, 5.0)4480NaNNaNNaNNaNNaN4672...588862087225611520582419392953653121452812416
5E66(2.0, 6.0)3648NaNNaNNaNNaNNaN5088...4992307234563072230417282208278414401056
6E77(2.0, 7.0)3968NaNNaNNaNNaNNaN3776...1600115216644608230424323008281614723264
7E88(2.0, 8.0)1792NaNNaNNaNNaNNaN8128...832832768108876889683283214721472
8E99(2.0, 9.0)2496NaNNaNNaNNaNNaN1024...3201134723841280140812801088876819202560
9E1010(2.0, 10.0)10560NaNNaNNaNNaNNaN8000...9984480011776115845126414976307841248032648768
10E1111(2.0, 11.0)3328NaNNaNNaNNaNNaN2432...320035843072294424321395226884352512014592
11E121(5.0, 1.0)5888NaN697665284928NaN5312...563233600537654272336002444822784190081580814144
12E132(5.0, 2.0)7968NaN691271047776NaN8160...1084864322563257608832787276806912691210464
13E143(5.0, 3.0)6848NaN332832643968NaN14208...2048217616641472185617283584262421764096
14E154(5.0, 4.0)105280NaN4966425602496NaN3968...6470449281536140823041536563215212826882304
15E165(5.0, 5.0)4224NaN4352492831168NaN10048...74888320999046976998432832812864643680012928
16E176(5.0, 6.0)3168NaN480044164896NaN4608...6624566447045088384033604704393623043552
17E187(5.0, 7.0)2368NaN2560327042368NaN2688...1408147219843584275216003584294416003520
18E198(5.0, 8.0)2816NaN300825601856NaN24768...204812809601600185614721728147221762368
19E209(5.0, 9.0)3392NaN25612864NaN128...5121271684224164483456275226241356824325504
20E2110(5.0, 10.0)1792NaN249629441024NaN4224...1664013444608126724864013248292484608313613184
21E2211(5.0, 11.0)3584NaN486448644096NaN4096...5504576062724992614414464130565888780832128
22E231(8.0, 1.0)88967296103686976646481927936...1049639040448061760153605497634368107522009616192
23E242(8.0, 2.0)6816806480645856710459526048...89285184296645856681667207776691259526144
24E253(8.0, 3.0)9088153616001600108823044352...243213441472134419209601728160014083072
25E264(8.0, 4.0)7590478089139269125696314248768...12038417920512066568576422481283399681004817024
26E275(8.0, 5.0)6080519684928531239424556814592...5184716821606415040118402547216384204803468822400
27E286(8.0, 6.0)4320518452803744268834563936...6816796845127392585655684800355243204608
28E297(8.0, 7.0)42243776460848384537656325184...1920313622407936569623043776281616643904
29E308(8.0, 8.0)47366912556853765056659248320...2880256031363648428832643520339247366720
..................................................................
883E8844(132.0, 4.0)13305633927225647364160268165504...71360135044288582458883584716825836869123776
884E8855(132.0, 5.0)403248896524858244108849929152...82569728198144748893442502413888101123168014464
885E8866(132.0, 6.0)3744355234562496403235523360...8448806471048064662460486912489663367008
886E8877(132.0, 7.0)42244224454431168409637765504...3264236827526592627243527488377632645312
887E8888(132.0, 8.0)19842496294424322688460836160...153619208321408256017921856166432002752
888E8899(132.0, 9.0)85761088128512108821121408...23681532802048217635843584294415360435221184
889E89010(132.0, 10.0)9600396858247808499260805760...31296619521824036672979202720065152174081228817216
890E89111(132.0, 11.0)4992729685768064652872966016...17280145921664017024143363264027520167681830437248
891E8921(134.0, 1.0)NaNNaNNaNNaNNaNNaNNaN...339213760224034176339277441382485761593610112
892E8932(134.0, 2.0)NaNNaNNaNNaNNaNNaNNaN...55684992210244992691256642976470438406240
893E8943(134.0, 3.0)NaNNaNNaNNaNNaNNaNNaN...16008961152832128010881216121612162240
894E8954(134.0, 4.0)NaNNaNNaNNaNNaNNaNNaN...5478483202112140827521216275212185635841216
895E8965(134.0, 5.0)NaNNaNNaNNaNNaNNaNNaN...29443712780163392672017984123521600081285568
896E8976(134.0, 6.0)NaNNaNNaNNaNNaNNaNNaN...4608518434564416297621123648240025922688
897E8987(134.0, 7.0)NaNNaNNaNNaNNaNNaNNaN...172812167684224249616001920185612161856
898E8998(134.0, 8.0)NaNNaNNaNNaNNaNNaNNaN...320512512256704320768320768704
899E9009(134.0, 9.0)NaNNaNNaNNaNNaNNaNNaN...320398727041600198419207681017633285888
900E90110(134.0, 10.0)NaNNaNNaNNaNNaNNaNNaN...46082675275523776446721062419072550444168768
901E90211(134.0, 11.0)NaNNaNNaNNaNNaNNaNNaN...85768576857693449472289281382490881190432640
902E9031(137.0, 1.0)NaNNaNNaNNaNNaNNaNNaN...187529996815872130624108480103936402563539210086469056
903E9042(137.0, 2.0)NaNNaNNaNNaNNaNNaNNaN...24096128644579210464120961324817472132481075223520
904E9053(137.0, 3.0)NaNNaNNaNNaNNaNNaNNaN...3072217624961216185619207360473634564544
905E9064(137.0, 4.0)NaNNaNNaNNaNNaNNaNNaN...98688281602240160024321216992018086460162816
906E9075(137.0, 5.0)NaNNaNNaNNaNNaNNaNNaN...10112173441543041932812672298242406491523552019904
907E9086(137.0, 6.0)NaNNaNNaNNaNNaNNaNNaN...8736614467206048393646084800537640324032
908E9097(137.0, 7.0)NaNNaNNaNNaNNaNNaNNaN...3264352036488640454430726144460826245248
909E9108(137.0, 8.0)NaNNaNNaNNaNNaNNaNNaN...1088115264083212809601088121612161600
910E9119(137.0, 9.0)NaNNaNNaNNaNNaNNaNNaN...320465282569601152166421761228816645760
911E91210(137.0, 10.0)NaNNaNNaNNaNNaNNaNNaN...268804268823616268166374433024450562252888328832
912E91311(137.0, 11.0)NaNNaNNaNNaNNaNNaNNaN...6656640064005376448015232163848064742419968
\n", - "

913 rows × 99 columns

\n", - "
" - ], - "text/plain": [ - " SalesID Brand store and brand week 40 week 41 week 42 week 43 week 44 \\\n", - "0 E1 1 (2.0, 1.0) 8256 NaN NaN NaN NaN \n", - "1 E2 2 (2.0, 2.0) 6240 NaN NaN NaN NaN \n", - "2 E3 3 (2.0, 3.0) 3328 NaN NaN NaN NaN \n", - "3 E4 4 (2.0, 4.0) 28096 NaN NaN NaN NaN \n", - "4 E5 5 (2.0, 5.0) 4480 NaN NaN NaN NaN \n", - "5 E6 6 (2.0, 6.0) 3648 NaN NaN NaN NaN \n", - "6 E7 7 (2.0, 7.0) 3968 NaN NaN NaN NaN \n", - "7 E8 8 (2.0, 8.0) 1792 NaN NaN NaN NaN \n", - "8 E9 9 (2.0, 9.0) 2496 NaN NaN NaN NaN \n", - "9 E10 10 (2.0, 10.0) 10560 NaN NaN NaN NaN \n", - "10 E11 11 (2.0, 11.0) 3328 NaN NaN NaN NaN \n", - "11 E12 1 (5.0, 1.0) 5888 NaN 6976 6528 4928 \n", - "12 E13 2 (5.0, 2.0) 7968 NaN 6912 7104 7776 \n", - "13 E14 3 (5.0, 3.0) 6848 NaN 3328 3264 3968 \n", - "14 E15 4 (5.0, 4.0) 105280 NaN 49664 2560 2496 \n", - "15 E16 5 (5.0, 5.0) 4224 NaN 4352 4928 31168 \n", - "16 E17 6 (5.0, 6.0) 3168 NaN 4800 4416 4896 \n", - "17 E18 7 (5.0, 7.0) 2368 NaN 2560 32704 2368 \n", - "18 E19 8 (5.0, 8.0) 2816 NaN 3008 2560 1856 \n", - "19 E20 9 (5.0, 9.0) 3392 NaN 256 128 64 \n", - "20 E21 10 (5.0, 10.0) 1792 NaN 2496 2944 1024 \n", - "21 E22 11 (5.0, 11.0) 3584 NaN 4864 4864 4096 \n", - "22 E23 1 (8.0, 1.0) 8896 7296 10368 6976 6464 \n", - "23 E24 2 (8.0, 2.0) 6816 8064 8064 5856 7104 \n", - "24 E25 3 (8.0, 3.0) 9088 1536 1600 1600 1088 \n", - "25 E26 4 (8.0, 4.0) 75904 7808 91392 6912 5696 \n", - "26 E27 5 (8.0, 5.0) 6080 51968 4928 5312 39424 \n", - "27 E28 6 (8.0, 6.0) 4320 5184 5280 3744 2688 \n", - "28 E29 7 (8.0, 7.0) 4224 3776 4608 48384 5376 \n", - "29 E30 8 (8.0, 8.0) 4736 6912 5568 5376 5056 \n", - ".. ... ... ... ... ... ... ... ... \n", - "883 E884 4 (132.0, 4.0) 133056 3392 72256 4736 4160 \n", - "884 E885 5 (132.0, 5.0) 4032 48896 5248 5824 41088 \n", - "885 E886 6 (132.0, 6.0) 3744 3552 3456 2496 4032 \n", - "886 E887 7 (132.0, 7.0) 4224 4224 4544 31168 4096 \n", - "887 E888 8 (132.0, 8.0) 1984 2496 2944 2432 2688 \n", - "888 E889 9 (132.0, 9.0) 8576 1088 128 512 1088 \n", - "889 E890 10 (132.0, 10.0) 9600 3968 5824 7808 4992 \n", - "890 E891 11 (132.0, 11.0) 4992 7296 8576 8064 6528 \n", - "891 E892 1 (134.0, 1.0) NaN NaN NaN NaN NaN \n", - "892 E893 2 (134.0, 2.0) NaN NaN NaN NaN NaN \n", - "893 E894 3 (134.0, 3.0) NaN NaN NaN NaN NaN \n", - "894 E895 4 (134.0, 4.0) NaN NaN NaN NaN NaN \n", - "895 E896 5 (134.0, 5.0) NaN NaN NaN NaN NaN \n", - "896 E897 6 (134.0, 6.0) NaN NaN NaN NaN NaN \n", - "897 E898 7 (134.0, 7.0) NaN NaN NaN NaN NaN \n", - "898 E899 8 (134.0, 8.0) NaN NaN NaN NaN NaN \n", - "899 E900 9 (134.0, 9.0) NaN NaN NaN NaN NaN \n", - "900 E901 10 (134.0, 10.0) NaN NaN NaN NaN NaN \n", - "901 E902 11 (134.0, 11.0) NaN NaN NaN NaN NaN \n", - "902 E903 1 (137.0, 1.0) NaN NaN NaN NaN NaN \n", - "903 E904 2 (137.0, 2.0) NaN NaN NaN NaN NaN \n", - "904 E905 3 (137.0, 3.0) NaN NaN NaN NaN NaN \n", - "905 E906 4 (137.0, 4.0) NaN NaN NaN NaN NaN \n", - "906 E907 5 (137.0, 5.0) NaN NaN NaN NaN NaN \n", - "907 E908 6 (137.0, 6.0) NaN NaN NaN NaN NaN \n", - "908 E909 7 (137.0, 7.0) NaN NaN NaN NaN NaN \n", - "909 E910 8 (137.0, 8.0) NaN NaN NaN NaN NaN \n", - "910 E911 9 (137.0, 9.0) NaN NaN NaN NaN NaN \n", - "911 E912 10 (137.0, 10.0) NaN NaN NaN NaN NaN \n", - "912 E913 11 (137.0, 11.0) NaN NaN NaN NaN NaN \n", - "\n", - " week 45 week 46 ... week 126 week 127 week 128 week 129 week 130 \\\n", - "0 NaN 6144 ... 6720 20224 5056 43584 25728 \n", - "1 NaN 7104 ... 8544 6048 17184 5664 7296 \n", - "2 NaN 3200 ... 1408 1984 1344 960 1472 \n", - "3 NaN 6464 ... 57024 8896 5376 2944 3392 \n", - "4 NaN 4672 ... 5888 6208 72256 11520 5824 \n", - "5 NaN 5088 ... 4992 3072 3456 3072 2304 \n", - "6 NaN 3776 ... 1600 1152 1664 4608 2304 \n", - "7 NaN 8128 ... 832 832 768 1088 768 \n", - "8 NaN 1024 ... 320 113472 384 1280 1408 \n", - "9 NaN 8000 ... 9984 4800 11776 11584 51264 \n", - "10 NaN 2432 ... 3200 3584 3072 2944 2432 \n", - "11 NaN 5312 ... 5632 33600 5376 54272 33600 \n", - "12 NaN 8160 ... 10848 6432 25632 5760 8832 \n", - "13 NaN 14208 ... 2048 2176 1664 1472 1856 \n", - "14 NaN 3968 ... 64704 4928 1536 1408 2304 \n", - "15 NaN 10048 ... 7488 8320 99904 6976 9984 \n", - "16 NaN 4608 ... 6624 5664 4704 5088 3840 \n", - "17 NaN 2688 ... 1408 1472 1984 3584 2752 \n", - "18 NaN 24768 ... 2048 1280 960 1600 1856 \n", - "19 NaN 128 ... 512 127168 4224 16448 3456 \n", - "20 NaN 4224 ... 16640 1344 4608 12672 48640 \n", - "21 NaN 4096 ... 5504 5760 6272 4992 6144 \n", - "22 8192 7936 ... 10496 39040 4480 61760 15360 \n", - "23 5952 6048 ... 8928 5184 29664 5856 6816 \n", - "24 2304 4352 ... 2432 1344 1472 1344 1920 \n", - "25 31424 8768 ... 120384 17920 5120 6656 8576 \n", - "26 5568 14592 ... 5184 7168 216064 15040 11840 \n", - "27 3456 3936 ... 6816 7968 4512 7392 5856 \n", - "28 5632 5184 ... 1920 3136 2240 7936 5696 \n", - "29 6592 48320 ... 2880 2560 3136 3648 4288 \n", - ".. ... ... ... ... ... ... ... ... \n", - "883 26816 5504 ... 71360 13504 4288 5824 5888 \n", - "884 4992 9152 ... 8256 9728 198144 7488 9344 \n", - "885 3552 3360 ... 8448 8064 7104 8064 6624 \n", - "886 3776 5504 ... 3264 2368 2752 6592 6272 \n", - "887 4608 36160 ... 1536 1920 832 1408 2560 \n", - "888 2112 1408 ... 2368 153280 2048 2176 3584 \n", - "889 6080 5760 ... 31296 61952 18240 36672 97920 \n", - "890 7296 6016 ... 17280 14592 16640 17024 14336 \n", - "891 NaN NaN ... 3392 13760 2240 34176 3392 \n", - "892 NaN NaN ... 5568 4992 21024 4992 6912 \n", - "893 NaN NaN ... 1600 896 1152 832 1280 \n", - "894 NaN NaN ... 54784 8320 2112 1408 2752 \n", - "895 NaN NaN ... 2944 3712 78016 3392 6720 \n", - "896 NaN NaN ... 4608 5184 3456 4416 2976 \n", - "897 NaN NaN ... 1728 1216 768 4224 2496 \n", - "898 NaN NaN ... 320 512 512 256 704 \n", - "899 NaN NaN ... 320 39872 704 1600 1984 \n", - "900 NaN NaN ... 4608 26752 7552 3776 44672 \n", - "901 NaN NaN ... 8576 8576 8576 9344 9472 \n", - "902 NaN NaN ... 18752 99968 15872 130624 108480 \n", - "903 NaN NaN ... 24096 12864 45792 10464 12096 \n", - "904 NaN NaN ... 3072 2176 2496 1216 1856 \n", - "905 NaN NaN ... 98688 28160 2240 1600 2432 \n", - "906 NaN NaN ... 10112 17344 154304 19328 12672 \n", - "907 NaN NaN ... 8736 6144 6720 6048 3936 \n", - "908 NaN NaN ... 3264 3520 3648 8640 4544 \n", - "909 NaN NaN ... 1088 1152 640 832 1280 \n", - "910 NaN NaN ... 320 46528 256 960 1152 \n", - "911 NaN NaN ... 26880 42688 23616 26816 63744 \n", - "912 NaN NaN ... 6656 6400 6400 5376 4480 \n", - "\n", - " week 131 week 132 week 133 week 134 week 135 \n", - "0 31808 20736 15168 28096 12416 \n", - "1 5280 6816 7008 4992 11424 \n", - "2 1472 4032 2816 1536 2432 \n", - "3 1984 4928 145856 6400 2176 \n", - "4 19392 9536 5312 14528 12416 \n", - "5 1728 2208 2784 1440 1056 \n", - "6 2432 3008 2816 1472 3264 \n", - "7 896 832 832 1472 1472 \n", - "8 1280 1088 8768 1920 2560 \n", - "9 14976 30784 12480 3264 8768 \n", - "10 13952 2688 4352 5120 14592 \n", - "11 24448 22784 19008 15808 14144 \n", - "12 7872 7680 6912 6912 10464 \n", - "13 1728 3584 2624 2176 4096 \n", - "14 1536 5632 152128 2688 2304 \n", - "15 32832 8128 6464 36800 12928 \n", - "16 3360 4704 3936 2304 3552 \n", - "17 1600 3584 2944 1600 3520 \n", - "18 1472 1728 1472 2176 2368 \n", - "19 2752 2624 13568 2432 5504 \n", - "20 13248 29248 4608 3136 13184 \n", - "21 14464 13056 5888 7808 32128 \n", - "22 54976 34368 10752 20096 16192 \n", - "23 6720 7776 6912 5952 6144 \n", - "24 960 1728 1600 1408 3072 \n", - "25 4224 8128 339968 10048 17024 \n", - "26 25472 16384 20480 34688 22400 \n", - "27 5568 4800 3552 4320 4608 \n", - "28 2304 3776 2816 1664 3904 \n", - "29 3264 3520 3392 4736 6720 \n", - ".. ... ... ... ... ... \n", - "883 3584 7168 258368 6912 3776 \n", - "884 25024 13888 10112 31680 14464 \n", - "885 6048 6912 4896 6336 7008 \n", - "886 4352 7488 3776 3264 5312 \n", - "887 1792 1856 1664 3200 2752 \n", - "888 3584 2944 15360 4352 21184 \n", - "889 27200 65152 17408 12288 17216 \n", - "890 32640 27520 16768 18304 37248 \n", - "891 7744 13824 8576 15936 10112 \n", - "892 5664 2976 4704 3840 6240 \n", - "893 1088 1216 1216 1216 2240 \n", - "894 1216 2752 121856 3584 1216 \n", - "895 17984 12352 16000 8128 5568 \n", - "896 2112 3648 2400 2592 2688 \n", - "897 1600 1920 1856 1216 1856 \n", - "898 320 768 320 768 704 \n", - "899 1920 768 10176 3328 5888 \n", - "900 10624 19072 5504 4416 8768 \n", - "901 28928 13824 9088 11904 32640 \n", - "902 103936 40256 35392 100864 69056 \n", - "903 13248 17472 13248 10752 23520 \n", - "904 1920 7360 4736 3456 4544 \n", - "905 1216 9920 180864 6016 2816 \n", - "906 29824 24064 9152 35520 19904 \n", - "907 4608 4800 5376 4032 4032 \n", - "908 3072 6144 4608 2624 5248 \n", - "909 960 1088 1216 1216 1600 \n", - "910 1664 2176 12288 1664 5760 \n", - "911 33024 45056 22528 8832 8832 \n", - "912 15232 16384 8064 7424 19968 \n", - "\n", - "[913 rows x 99 columns]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDweek 40week 41week 42week 43week 44week 45week 46week 47week 48...week 126week 127week 128week 129week 130week 131week 132week 133week 134week 135
0E18256NaNNaNNaNNaNNaN614438408000...672020224505643584257283180820736151682809612416
1E26240NaNNaNNaNNaNNaN710464325376...854460481718456647296528068167008499211424
2E33328NaNNaNNaNNaNNaN320035842048...140819841344960147214724032281615362432
3E428096NaNNaNNaNNaNNaN6464684838528...5702488965376294433921984492814585664002176
4E54480NaNNaNNaNNaNNaN4672201602688...588862087225611520582419392953653121452812416
5E63648NaNNaNNaNNaNNaN508833601824...4992307234563072230417282208278414401056
6E73968NaNNaNNaNNaNNaN377616641216...1600115216644608230424323008281614723264
7E81792NaNNaNNaNNaNNaN812820481856...832832768108876889683283214721472
8E92496NaNNaNNaNNaNNaN1024384320...3201134723841280140812801088876819202560
9E1010560NaNNaNNaNNaNNaN800068482880...9984480011776115845126414976307841248032648768
10E113328NaNNaNNaNNaNNaN243215362688...320035843072294424321395226884352512014592
11E125888NaN697665284928NaN531251207936...563233600537654272336002444822784190081580814144
12E137968NaN691271047776NaN816064326912...1084864322563257608832787276806912691210464
13E146848NaN332832643968NaN1420856962112...2048217616641472185617283584262421764096
14E15105280NaN4966425602496NaN3968384044992...6470449281536140823041536563215212826882304
15E164224NaN4352492831168NaN10048217604544...74888320999046976998432832812864643680012928
16E173168NaN480044164896NaN460848963552...6624566447045088384033604704393623043552
17E182368NaN2560327042368NaN268823042752...1408147219843584275216003584294416003520
18E192816NaN300825601856NaN2476825602688...204812809601600185614721728147221762368
19E203392NaN25612864NaN128192256...5121271684224164483456275226241356824325504
20E211792NaN249629441024NaN422445441728...1664013444608126724864013248292484608313613184
21E223584NaN486448644096NaN409635843072...5504576062724992614414464130565888780832128
22E238896729610368697664648192793666568256...1049639040448061760153605497634368107522009616192
23E24681680648064585671045952604859525952...89285184296645856681667207776691259526144
24E25908815361600160010882304435222402112...243213441472134419209601728160014083072
25E267590478089139269125696314248768844848832...12038417920512066568576422481283399681004817024
26E276080519684928531239424556814592222085760...5184716821606415040118402547216384204803468822400
27E28432051845280374426883456393640324032...6816796845127392585655684800355243204608
28E294224377646084838453765632518451844928...1920313622407936569623043776281616643904
29E304736691255685376505665924832080645056...2880256031363648428832643520339247366720
..................................................................
883E884133056339272256473641602681655041356839424...71360135044288582458883584716825836869123776
884E885403248896524858244108849929152207364160...82569728198144748893442502413888101123168014464
885E886374435523456249640323552336055683360...8448806471048064662460486912489663367008
886E8874224422445443116840963776550451202368...3264236827526592627243527488377632645312
887E8881984249629442432268846083616024961600...153619208321408256017921856166432002752
888E889857610881285121088211214081024960...23681532802048217635843584294415360435221184
889E8909600396858247808499260805760111364160...31296619521824036672979202720065152174081228817216
890E891499272968576806465287296601675525504...17280145921664017024143363264027520167681830437248
891E892NaNNaNNaNNaNNaNNaNNaNNaNNaN...339213760224034176339277441382485761593610112
892E893NaNNaNNaNNaNNaNNaNNaNNaNNaN...55684992210244992691256642976470438406240
893E894NaNNaNNaNNaNNaNNaNNaNNaNNaN...16008961152832128010881216121612162240
894E895NaNNaNNaNNaNNaNNaNNaNNaNNaN...5478483202112140827521216275212185635841216
895E896NaNNaNNaNNaNNaNNaNNaNNaNNaN...29443712780163392672017984123521600081285568
896E897NaNNaNNaNNaNNaNNaNNaNNaNNaN...4608518434564416297621123648240025922688
897E898NaNNaNNaNNaNNaNNaNNaNNaNNaN...172812167684224249616001920185612161856
898E899NaNNaNNaNNaNNaNNaNNaNNaNNaN...320512512256704320768320768704
899E900NaNNaNNaNNaNNaNNaNNaNNaNNaN...320398727041600198419207681017633285888
900E901NaNNaNNaNNaNNaNNaNNaNNaNNaN...46082675275523776446721062419072550444168768
901E902NaNNaNNaNNaNNaNNaNNaNNaNNaN...85768576857693449472289281382490881190432640
902E903NaNNaNNaNNaNNaNNaNNaNNaNNaN...187529996815872130624108480103936402563539210086469056
903E904NaNNaNNaNNaNNaNNaNNaNNaNNaN...24096128644579210464120961324817472132481075223520
904E905NaNNaNNaNNaNNaNNaNNaNNaNNaN...3072217624961216185619207360473634564544
905E906NaNNaNNaNNaNNaNNaNNaNNaNNaN...98688281602240160024321216992018086460162816
906E907NaNNaNNaNNaNNaNNaNNaNNaNNaN...10112173441543041932812672298242406491523552019904
907E908NaNNaNNaNNaNNaNNaNNaNNaNNaN...8736614467206048393646084800537640324032
908E909NaNNaNNaNNaNNaNNaNNaNNaNNaN...3264352036488640454430726144460826245248
909E910NaNNaNNaNNaNNaNNaNNaNNaNNaN...1088115264083212809601088121612161600
910E911NaNNaNNaNNaNNaNNaNNaNNaNNaN...320465282569601152166421761228816645760
911E912NaNNaNNaNNaNNaNNaNNaNNaNNaN...268804268823616268166374433024450562252888328832
912E913NaNNaNNaNNaNNaNNaNNaNNaNNaN...6656640064005376448015232163848064742419968
\n", - "

913 rows × 97 columns

\n", - "
" - ], - "text/plain": [ - " SalesID week 40 week 41 week 42 week 43 week 44 week 45 week 46 week 47 \\\n", - "0 E1 8256 NaN NaN NaN NaN NaN 6144 3840 \n", - "1 E2 6240 NaN NaN NaN NaN NaN 7104 6432 \n", - "2 E3 3328 NaN NaN NaN NaN NaN 3200 3584 \n", - "3 E4 28096 NaN NaN NaN NaN NaN 6464 6848 \n", - "4 E5 4480 NaN NaN NaN NaN NaN 4672 20160 \n", - "5 E6 3648 NaN NaN NaN NaN NaN 5088 3360 \n", - "6 E7 3968 NaN NaN NaN NaN NaN 3776 1664 \n", - "7 E8 1792 NaN NaN NaN NaN NaN 8128 2048 \n", - "8 E9 2496 NaN NaN NaN NaN NaN 1024 384 \n", - "9 E10 10560 NaN NaN NaN NaN NaN 8000 6848 \n", - "10 E11 3328 NaN NaN NaN NaN NaN 2432 1536 \n", - "11 E12 5888 NaN 6976 6528 4928 NaN 5312 5120 \n", - "12 E13 7968 NaN 6912 7104 7776 NaN 8160 6432 \n", - "13 E14 6848 NaN 3328 3264 3968 NaN 14208 5696 \n", - "14 E15 105280 NaN 49664 2560 2496 NaN 3968 3840 \n", - "15 E16 4224 NaN 4352 4928 31168 NaN 10048 21760 \n", - "16 E17 3168 NaN 4800 4416 4896 NaN 4608 4896 \n", - "17 E18 2368 NaN 2560 32704 2368 NaN 2688 2304 \n", - "18 E19 2816 NaN 3008 2560 1856 NaN 24768 2560 \n", - "19 E20 3392 NaN 256 128 64 NaN 128 192 \n", - "20 E21 1792 NaN 2496 2944 1024 NaN 4224 4544 \n", - "21 E22 3584 NaN 4864 4864 4096 NaN 4096 3584 \n", - "22 E23 8896 7296 10368 6976 6464 8192 7936 6656 \n", - "23 E24 6816 8064 8064 5856 7104 5952 6048 5952 \n", - "24 E25 9088 1536 1600 1600 1088 2304 4352 2240 \n", - "25 E26 75904 7808 91392 6912 5696 31424 8768 8448 \n", - "26 E27 6080 51968 4928 5312 39424 5568 14592 22208 \n", - "27 E28 4320 5184 5280 3744 2688 3456 3936 4032 \n", - "28 E29 4224 3776 4608 48384 5376 5632 5184 5184 \n", - "29 E30 4736 6912 5568 5376 5056 6592 48320 8064 \n", - ".. ... ... ... ... ... ... ... ... ... \n", - "883 E884 133056 3392 72256 4736 4160 26816 5504 13568 \n", - "884 E885 4032 48896 5248 5824 41088 4992 9152 20736 \n", - "885 E886 3744 3552 3456 2496 4032 3552 3360 5568 \n", - "886 E887 4224 4224 4544 31168 4096 3776 5504 5120 \n", - "887 E888 1984 2496 2944 2432 2688 4608 36160 2496 \n", - "888 E889 8576 1088 128 512 1088 2112 1408 1024 \n", - "889 E890 9600 3968 5824 7808 4992 6080 5760 11136 \n", - "890 E891 4992 7296 8576 8064 6528 7296 6016 7552 \n", - "891 E892 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "892 E893 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "893 E894 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "894 E895 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "895 E896 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "896 E897 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "897 E898 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "898 E899 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "899 E900 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "900 E901 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "901 E902 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "902 E903 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "903 E904 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "904 E905 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "905 E906 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "906 E907 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "907 E908 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "908 E909 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "909 E910 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "910 E911 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "911 E912 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "912 E913 NaN NaN NaN NaN NaN NaN NaN NaN \n", - "\n", - " week 48 ... week 126 week 127 week 128 week 129 week 130 week 131 \\\n", - "0 8000 ... 6720 20224 5056 43584 25728 31808 \n", - "1 5376 ... 8544 6048 17184 5664 7296 5280 \n", - "2 2048 ... 1408 1984 1344 960 1472 1472 \n", - "3 38528 ... 57024 8896 5376 2944 3392 1984 \n", - "4 2688 ... 5888 6208 72256 11520 5824 19392 \n", - "5 1824 ... 4992 3072 3456 3072 2304 1728 \n", - "6 1216 ... 1600 1152 1664 4608 2304 2432 \n", - "7 1856 ... 832 832 768 1088 768 896 \n", - "8 320 ... 320 113472 384 1280 1408 1280 \n", - "9 2880 ... 9984 4800 11776 11584 51264 14976 \n", - "10 2688 ... 3200 3584 3072 2944 2432 13952 \n", - "11 7936 ... 5632 33600 5376 54272 33600 24448 \n", - "12 6912 ... 10848 6432 25632 5760 8832 7872 \n", - "13 2112 ... 2048 2176 1664 1472 1856 1728 \n", - "14 44992 ... 64704 4928 1536 1408 2304 1536 \n", - "15 4544 ... 7488 8320 99904 6976 9984 32832 \n", - "16 3552 ... 6624 5664 4704 5088 3840 3360 \n", - "17 2752 ... 1408 1472 1984 3584 2752 1600 \n", - "18 2688 ... 2048 1280 960 1600 1856 1472 \n", - "19 256 ... 512 127168 4224 16448 3456 2752 \n", - "20 1728 ... 16640 1344 4608 12672 48640 13248 \n", - "21 3072 ... 5504 5760 6272 4992 6144 14464 \n", - "22 8256 ... 10496 39040 4480 61760 15360 54976 \n", - "23 5952 ... 8928 5184 29664 5856 6816 6720 \n", - "24 2112 ... 2432 1344 1472 1344 1920 960 \n", - "25 48832 ... 120384 17920 5120 6656 8576 4224 \n", - "26 5760 ... 5184 7168 216064 15040 11840 25472 \n", - "27 4032 ... 6816 7968 4512 7392 5856 5568 \n", - "28 4928 ... 1920 3136 2240 7936 5696 2304 \n", - "29 5056 ... 2880 2560 3136 3648 4288 3264 \n", - ".. ... ... ... ... ... ... ... ... \n", - "883 39424 ... 71360 13504 4288 5824 5888 3584 \n", - "884 4160 ... 8256 9728 198144 7488 9344 25024 \n", - "885 3360 ... 8448 8064 7104 8064 6624 6048 \n", - "886 2368 ... 3264 2368 2752 6592 6272 4352 \n", - "887 1600 ... 1536 1920 832 1408 2560 1792 \n", - "888 960 ... 2368 153280 2048 2176 3584 3584 \n", - "889 4160 ... 31296 61952 18240 36672 97920 27200 \n", - "890 5504 ... 17280 14592 16640 17024 14336 32640 \n", - "891 NaN ... 3392 13760 2240 34176 3392 7744 \n", - "892 NaN ... 5568 4992 21024 4992 6912 5664 \n", - "893 NaN ... 1600 896 1152 832 1280 1088 \n", - "894 NaN ... 54784 8320 2112 1408 2752 1216 \n", - "895 NaN ... 2944 3712 78016 3392 6720 17984 \n", - "896 NaN ... 4608 5184 3456 4416 2976 2112 \n", - "897 NaN ... 1728 1216 768 4224 2496 1600 \n", - "898 NaN ... 320 512 512 256 704 320 \n", - "899 NaN ... 320 39872 704 1600 1984 1920 \n", - "900 NaN ... 4608 26752 7552 3776 44672 10624 \n", - "901 NaN ... 8576 8576 8576 9344 9472 28928 \n", - "902 NaN ... 18752 99968 15872 130624 108480 103936 \n", - "903 NaN ... 24096 12864 45792 10464 12096 13248 \n", - "904 NaN ... 3072 2176 2496 1216 1856 1920 \n", - "905 NaN ... 98688 28160 2240 1600 2432 1216 \n", - "906 NaN ... 10112 17344 154304 19328 12672 29824 \n", - "907 NaN ... 8736 6144 6720 6048 3936 4608 \n", - "908 NaN ... 3264 3520 3648 8640 4544 3072 \n", - "909 NaN ... 1088 1152 640 832 1280 960 \n", - "910 NaN ... 320 46528 256 960 1152 1664 \n", - "911 NaN ... 26880 42688 23616 26816 63744 33024 \n", - "912 NaN ... 6656 6400 6400 5376 4480 15232 \n", - "\n", - " week 132 week 133 week 134 week 135 \n", - "0 20736 15168 28096 12416 \n", - "1 6816 7008 4992 11424 \n", - "2 4032 2816 1536 2432 \n", - "3 4928 145856 6400 2176 \n", - "4 9536 5312 14528 12416 \n", - "5 2208 2784 1440 1056 \n", - "6 3008 2816 1472 3264 \n", - "7 832 832 1472 1472 \n", - "8 1088 8768 1920 2560 \n", - "9 30784 12480 3264 8768 \n", - "10 2688 4352 5120 14592 \n", - "11 22784 19008 15808 14144 \n", - "12 7680 6912 6912 10464 \n", - "13 3584 2624 2176 4096 \n", - "14 5632 152128 2688 2304 \n", - "15 8128 6464 36800 12928 \n", - "16 4704 3936 2304 3552 \n", - "17 3584 2944 1600 3520 \n", - "18 1728 1472 2176 2368 \n", - "19 2624 13568 2432 5504 \n", - "20 29248 4608 3136 13184 \n", - "21 13056 5888 7808 32128 \n", - "22 34368 10752 20096 16192 \n", - "23 7776 6912 5952 6144 \n", - "24 1728 1600 1408 3072 \n", - "25 8128 339968 10048 17024 \n", - "26 16384 20480 34688 22400 \n", - "27 4800 3552 4320 4608 \n", - "28 3776 2816 1664 3904 \n", - "29 3520 3392 4736 6720 \n", - ".. ... ... ... ... \n", - "883 7168 258368 6912 3776 \n", - "884 13888 10112 31680 14464 \n", - "885 6912 4896 6336 7008 \n", - "886 7488 3776 3264 5312 \n", - "887 1856 1664 3200 2752 \n", - "888 2944 15360 4352 21184 \n", - "889 65152 17408 12288 17216 \n", - "890 27520 16768 18304 37248 \n", - "891 13824 8576 15936 10112 \n", - "892 2976 4704 3840 6240 \n", - "893 1216 1216 1216 2240 \n", - "894 2752 121856 3584 1216 \n", - "895 12352 16000 8128 5568 \n", - "896 3648 2400 2592 2688 \n", - "897 1920 1856 1216 1856 \n", - "898 768 320 768 704 \n", - "899 768 10176 3328 5888 \n", - "900 19072 5504 4416 8768 \n", - "901 13824 9088 11904 32640 \n", - "902 40256 35392 100864 69056 \n", - "903 17472 13248 10752 23520 \n", - "904 7360 4736 3456 4544 \n", - "905 9920 180864 6016 2816 \n", - "906 24064 9152 35520 19904 \n", - "907 4800 5376 4032 4032 \n", - "908 6144 4608 2624 5248 \n", - "909 1088 1216 1216 1600 \n", - "910 2176 12288 1664 5760 \n", - "911 45056 22528 8832 8832 \n", - "912 16384 8064 7424 19968 \n", - "\n", - "[913 rows x 97 columns]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#time_series\n", - "dftimeseries = df[['SalesID'] + ['week ' + str(x) for x in range(min_week, max_week + 1)]]\n", - "dftimeseries" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDBrandstore and brand
0E11(2.0, 1.0)
1E22(2.0, 2.0)
2E33(2.0, 3.0)
3E44(2.0, 4.0)
4E55(2.0, 5.0)
5E66(2.0, 6.0)
6E77(2.0, 7.0)
7E88(2.0, 8.0)
8E99(2.0, 9.0)
9E1010(2.0, 10.0)
10E1111(2.0, 11.0)
11E121(5.0, 1.0)
12E132(5.0, 2.0)
13E143(5.0, 3.0)
14E154(5.0, 4.0)
15E165(5.0, 5.0)
16E176(5.0, 6.0)
17E187(5.0, 7.0)
18E198(5.0, 8.0)
19E209(5.0, 9.0)
20E2110(5.0, 10.0)
21E2211(5.0, 11.0)
22E231(8.0, 1.0)
23E242(8.0, 2.0)
24E253(8.0, 3.0)
25E264(8.0, 4.0)
26E275(8.0, 5.0)
27E286(8.0, 6.0)
28E297(8.0, 7.0)
29E308(8.0, 8.0)
............
883E8844(132.0, 4.0)
884E8855(132.0, 5.0)
885E8866(132.0, 6.0)
886E8877(132.0, 7.0)
887E8888(132.0, 8.0)
888E8899(132.0, 9.0)
889E89010(132.0, 10.0)
890E89111(132.0, 11.0)
891E8921(134.0, 1.0)
892E8932(134.0, 2.0)
893E8943(134.0, 3.0)
894E8954(134.0, 4.0)
895E8965(134.0, 5.0)
896E8976(134.0, 6.0)
897E8987(134.0, 7.0)
898E8998(134.0, 8.0)
899E9009(134.0, 9.0)
900E90110(134.0, 10.0)
901E90211(134.0, 11.0)
902E9031(137.0, 1.0)
903E9042(137.0, 2.0)
904E9053(137.0, 3.0)
905E9064(137.0, 4.0)
906E9075(137.0, 5.0)
907E9086(137.0, 6.0)
908E9097(137.0, 7.0)
909E9108(137.0, 8.0)
910E9119(137.0, 9.0)
911E91210(137.0, 10.0)
912E91311(137.0, 11.0)
\n", - "

913 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " SalesID Brand store and brand\n", - "0 E1 1 (2.0, 1.0)\n", - "1 E2 2 (2.0, 2.0)\n", - "2 E3 3 (2.0, 3.0)\n", - "3 E4 4 (2.0, 4.0)\n", - "4 E5 5 (2.0, 5.0)\n", - "5 E6 6 (2.0, 6.0)\n", - "6 E7 7 (2.0, 7.0)\n", - "7 E8 8 (2.0, 8.0)\n", - "8 E9 9 (2.0, 9.0)\n", - "9 E10 10 (2.0, 10.0)\n", - "10 E11 11 (2.0, 11.0)\n", - "11 E12 1 (5.0, 1.0)\n", - "12 E13 2 (5.0, 2.0)\n", - "13 E14 3 (5.0, 3.0)\n", - "14 E15 4 (5.0, 4.0)\n", - "15 E16 5 (5.0, 5.0)\n", - "16 E17 6 (5.0, 6.0)\n", - "17 E18 7 (5.0, 7.0)\n", - "18 E19 8 (5.0, 8.0)\n", - "19 E20 9 (5.0, 9.0)\n", - "20 E21 10 (5.0, 10.0)\n", - "21 E22 11 (5.0, 11.0)\n", - "22 E23 1 (8.0, 1.0)\n", - "23 E24 2 (8.0, 2.0)\n", - "24 E25 3 (8.0, 3.0)\n", - "25 E26 4 (8.0, 4.0)\n", - "26 E27 5 (8.0, 5.0)\n", - "27 E28 6 (8.0, 6.0)\n", - "28 E29 7 (8.0, 7.0)\n", - "29 E30 8 (8.0, 8.0)\n", - ".. ... ... ...\n", - "883 E884 4 (132.0, 4.0)\n", - "884 E885 5 (132.0, 5.0)\n", - "885 E886 6 (132.0, 6.0)\n", - "886 E887 7 (132.0, 7.0)\n", - "887 E888 8 (132.0, 8.0)\n", - "888 E889 9 (132.0, 9.0)\n", - "889 E890 10 (132.0, 10.0)\n", - "890 E891 11 (132.0, 11.0)\n", - "891 E892 1 (134.0, 1.0)\n", - "892 E893 2 (134.0, 2.0)\n", - "893 E894 3 (134.0, 3.0)\n", - "894 E895 4 (134.0, 4.0)\n", - "895 E896 5 (134.0, 5.0)\n", - "896 E897 6 (134.0, 6.0)\n", - "897 E898 7 (134.0, 7.0)\n", - "898 E899 8 (134.0, 8.0)\n", - "899 E900 9 (134.0, 9.0)\n", - "900 E901 10 (134.0, 10.0)\n", - "901 E902 11 (134.0, 11.0)\n", - "902 E903 1 (137.0, 1.0)\n", - "903 E904 2 (137.0, 2.0)\n", - "904 E905 3 (137.0, 3.0)\n", - "905 E906 4 (137.0, 4.0)\n", - "906 E907 5 (137.0, 5.0)\n", - "907 E908 6 (137.0, 6.0)\n", - "908 E909 7 (137.0, 7.0)\n", - "909 E910 8 (137.0, 8.0)\n", - "910 E911 9 (137.0, 9.0)\n", - "911 E912 10 (137.0, 10.0)\n", - "912 E913 11 (137.0, 11.0)\n", - "\n", - "[913 rows x 3 columns]" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#sales info\n", - "dfinfo = df[['SalesID', 'Brand', 'store and brand']]\n", - "dfinfo" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "#save csv's\n", - "dftimeseries.to_csv('time_series.csv', index=False)\n", - "dfinfo.to_csv('sales-info.csv', index=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDweek 40week 41week 42week 43week 44week 45week 46week 47week 48...week 126week 127week 128week 129week 130week 131week 132week 133week 134week 135
0E1825661446144614461446144614438408000...672020224505643584257283180820736151682809612416
1E2624071047104710471047104710464325376...854460481718456647296528068167008499211424
2E3332832003200320032003200320035842048...140819841344960147214724032281615362432
3E428096646464646464646464646464684838528...5702488965376294433921984492814585664002176
4E54480467246724672467246724672201602688...588862087225611520582419392953653121452812416
5E6364850885088508850885088508833601824...4992307234563072230417282208278414401056
6E7396837763776377637763776377616641216...1600115216644608230424323008281614723264
7E8179281288128812881288128812820481856...832832768108876889683283214721472
8E92496102410241024102410241024384320...3201134723841280140812801088876819202560
9E101056080008000800080008000800068482880...9984480011776115845126414976307841248032648768
10E11332824322432243224322432243215362688...320035843072294424321395226884352512014592
11E12588869766976652849285312531251207936...563233600537654272336002444822784190081580814144
12E13796869126912710477768160816064326912...1084864322563257608832787276806912691210464
13E1468483328332832643968142081420856962112...2048217616641472185617283584262421764096
14E1510528049664496642560249639683968384044992...6470449281536140823041536563215212826882304
15E164224435243524928311681004810048217604544...74888320999046976998432832812864643680012928
16E17316848004800441648964608460848963552...6624566447045088384033604704393623043552
17E182368256025603270423682688268823042752...1408147219843584275216003584294416003520
18E1928163008300825601856247682476825602688...204812809601600185614721728147221762368
19E20339225625612864128128192256...5121271684224164483456275226241356824325504
20E21179224962496294410244224422445441728...1664013444608126724864013248292484608313613184
21E22358448644864486440964096409635843072...5504576062724992614414464130565888780832128
22E238896729610368697664648192793666568256...1049639040448061760153605497634368107522009616192
23E24681680648064585671045952604859525952...89285184296645856681667207776691259526144
24E25908815361600160010882304435222402112...243213441472134419209601728160014083072
25E267590478089139269125696314248768844848832...12038417920512066568576422481283399681004817024
26E276080519684928531239424556814592222085760...5184716821606415040118402547216384204803468822400
27E28432051845280374426883456393640324032...6816796845127392585655684800355243204608
28E294224377646084838453765632518451844928...1920313622407936569623043776281616643904
29E304736691255685376505665924832080645056...2880256031363648428832643520339247366720
..................................................................
883E884133056339272256473641602681655041356839424...71360135044288582458883584716825836869123776
884E885403248896524858244108849929152207364160...82569728198144748893442502413888101123168014464
885E886374435523456249640323552336055683360...8448806471048064662460486912489663367008
886E8874224422445443116840963776550451202368...3264236827526592627243527488377632645312
887E8881984249629442432268846083616024961600...153619208321408256017921856166432002752
888E889857610881285121088211214081024960...23681532802048217635843584294415360435221184
889E8909600396858247808499260805760111364160...31296619521824036672979202720065152174081228817216
890E891499272968576806465287296601675525504...17280145921664017024143363264027520167681830437248
891E892870487048704870487048704870487048704...339213760224034176339277441382485761593610112
892E893652865286528652865286528652865286528...55684992210244992691256642976470438406240
893E894384384384384384384384384384...16008961152832128010881216121612162240
894E895787278727872787278727872787278727872...5478483202112140827521216275212185635841216
895E896736073607360736073607360736073607360...29443712780163392672017984123521600081285568
896E897220822082208220822082208220822082208...4608518434564416297621123648240025922688
897E898153615361536153615361536153615361536...172812167684224249616001920185612161856
898E899102410241024102410241024102410241024...320512512256704320768320768704
899E900217621762176217621762176217621762176...320398727041600198419207681017633285888
900E901704704704704704704704704704...46082675275523776446721062419072550444168768
901E902176641766417664176641766417664176641766417664...85768576857693449472289281382490881190432640
902E903213762137621376213762137621376213762137621376...187529996815872130624108480103936402563539210086469056
903E904150721507215072150721507215072150721507215072...24096128644579210464120961324817472132481075223520
904E905480048004800480048004800480048004800...3072217624961216185619207360473634564544
905E906697669766976697669766976697669766976...98688281602240160024321216992018086460162816
906E907522245222452224522245222452224522245222452224...10112173441543041932812672298242406491523552019904
907E908518451845184518451845184518451845184...8736614467206048393646084800537640324032
908E909364836483648364836483648364836483648...3264352036488640454430726144460826245248
909E910204820482048204820482048204820482048...1088115264083212809601088121612161600
910E911115211521152115211521152115211521152...320465282569601152166421761228816645760
911E912477444774447744477444774447744477444774447744...268804268823616268166374433024450562252888328832
912E913588858885888588858885888588858885888...6656640064005376448015232163848064742419968
\n", - "

913 rows × 97 columns

\n", - "
" - ], - "text/plain": [ - " SalesID week 40 week 41 week 42 week 43 week 44 week 45 week 46 week 47 \\\n", - "0 E1 8256 6144 6144 6144 6144 6144 6144 3840 \n", - "1 E2 6240 7104 7104 7104 7104 7104 7104 6432 \n", - "2 E3 3328 3200 3200 3200 3200 3200 3200 3584 \n", - "3 E4 28096 6464 6464 6464 6464 6464 6464 6848 \n", - "4 E5 4480 4672 4672 4672 4672 4672 4672 20160 \n", - "5 E6 3648 5088 5088 5088 5088 5088 5088 3360 \n", - "6 E7 3968 3776 3776 3776 3776 3776 3776 1664 \n", - "7 E8 1792 8128 8128 8128 8128 8128 8128 2048 \n", - "8 E9 2496 1024 1024 1024 1024 1024 1024 384 \n", - "9 E10 10560 8000 8000 8000 8000 8000 8000 6848 \n", - "10 E11 3328 2432 2432 2432 2432 2432 2432 1536 \n", - "11 E12 5888 6976 6976 6528 4928 5312 5312 5120 \n", - "12 E13 7968 6912 6912 7104 7776 8160 8160 6432 \n", - "13 E14 6848 3328 3328 3264 3968 14208 14208 5696 \n", - "14 E15 105280 49664 49664 2560 2496 3968 3968 3840 \n", - "15 E16 4224 4352 4352 4928 31168 10048 10048 21760 \n", - "16 E17 3168 4800 4800 4416 4896 4608 4608 4896 \n", - "17 E18 2368 2560 2560 32704 2368 2688 2688 2304 \n", - "18 E19 2816 3008 3008 2560 1856 24768 24768 2560 \n", - "19 E20 3392 256 256 128 64 128 128 192 \n", - "20 E21 1792 2496 2496 2944 1024 4224 4224 4544 \n", - "21 E22 3584 4864 4864 4864 4096 4096 4096 3584 \n", - "22 E23 8896 7296 10368 6976 6464 8192 7936 6656 \n", - "23 E24 6816 8064 8064 5856 7104 5952 6048 5952 \n", - "24 E25 9088 1536 1600 1600 1088 2304 4352 2240 \n", - "25 E26 75904 7808 91392 6912 5696 31424 8768 8448 \n", - "26 E27 6080 51968 4928 5312 39424 5568 14592 22208 \n", - "27 E28 4320 5184 5280 3744 2688 3456 3936 4032 \n", - "28 E29 4224 3776 4608 48384 5376 5632 5184 5184 \n", - "29 E30 4736 6912 5568 5376 5056 6592 48320 8064 \n", - ".. ... ... ... ... ... ... ... ... ... \n", - "883 E884 133056 3392 72256 4736 4160 26816 5504 13568 \n", - "884 E885 4032 48896 5248 5824 41088 4992 9152 20736 \n", - "885 E886 3744 3552 3456 2496 4032 3552 3360 5568 \n", - "886 E887 4224 4224 4544 31168 4096 3776 5504 5120 \n", - "887 E888 1984 2496 2944 2432 2688 4608 36160 2496 \n", - "888 E889 8576 1088 128 512 1088 2112 1408 1024 \n", - "889 E890 9600 3968 5824 7808 4992 6080 5760 11136 \n", - "890 E891 4992 7296 8576 8064 6528 7296 6016 7552 \n", - "891 E892 8704 8704 8704 8704 8704 8704 8704 8704 \n", - "892 E893 6528 6528 6528 6528 6528 6528 6528 6528 \n", - "893 E894 384 384 384 384 384 384 384 384 \n", - "894 E895 7872 7872 7872 7872 7872 7872 7872 7872 \n", - "895 E896 7360 7360 7360 7360 7360 7360 7360 7360 \n", - "896 E897 2208 2208 2208 2208 2208 2208 2208 2208 \n", - "897 E898 1536 1536 1536 1536 1536 1536 1536 1536 \n", - "898 E899 1024 1024 1024 1024 1024 1024 1024 1024 \n", - "899 E900 2176 2176 2176 2176 2176 2176 2176 2176 \n", - "900 E901 704 704 704 704 704 704 704 704 \n", - "901 E902 17664 17664 17664 17664 17664 17664 17664 17664 \n", - "902 E903 21376 21376 21376 21376 21376 21376 21376 21376 \n", - "903 E904 15072 15072 15072 15072 15072 15072 15072 15072 \n", - "904 E905 4800 4800 4800 4800 4800 4800 4800 4800 \n", - "905 E906 6976 6976 6976 6976 6976 6976 6976 6976 \n", - "906 E907 52224 52224 52224 52224 52224 52224 52224 52224 \n", - "907 E908 5184 5184 5184 5184 5184 5184 5184 5184 \n", - "908 E909 3648 3648 3648 3648 3648 3648 3648 3648 \n", - "909 E910 2048 2048 2048 2048 2048 2048 2048 2048 \n", - "910 E911 1152 1152 1152 1152 1152 1152 1152 1152 \n", - "911 E912 47744 47744 47744 47744 47744 47744 47744 47744 \n", - "912 E913 5888 5888 5888 5888 5888 5888 5888 5888 \n", - "\n", - " week 48 ... week 126 week 127 week 128 week 129 week 130 week 131 \\\n", - "0 8000 ... 6720 20224 5056 43584 25728 31808 \n", - "1 5376 ... 8544 6048 17184 5664 7296 5280 \n", - "2 2048 ... 1408 1984 1344 960 1472 1472 \n", - "3 38528 ... 57024 8896 5376 2944 3392 1984 \n", - "4 2688 ... 5888 6208 72256 11520 5824 19392 \n", - "5 1824 ... 4992 3072 3456 3072 2304 1728 \n", - "6 1216 ... 1600 1152 1664 4608 2304 2432 \n", - "7 1856 ... 832 832 768 1088 768 896 \n", - "8 320 ... 320 113472 384 1280 1408 1280 \n", - "9 2880 ... 9984 4800 11776 11584 51264 14976 \n", - "10 2688 ... 3200 3584 3072 2944 2432 13952 \n", - "11 7936 ... 5632 33600 5376 54272 33600 24448 \n", - "12 6912 ... 10848 6432 25632 5760 8832 7872 \n", - "13 2112 ... 2048 2176 1664 1472 1856 1728 \n", - "14 44992 ... 64704 4928 1536 1408 2304 1536 \n", - "15 4544 ... 7488 8320 99904 6976 9984 32832 \n", - "16 3552 ... 6624 5664 4704 5088 3840 3360 \n", - "17 2752 ... 1408 1472 1984 3584 2752 1600 \n", - "18 2688 ... 2048 1280 960 1600 1856 1472 \n", - "19 256 ... 512 127168 4224 16448 3456 2752 \n", - "20 1728 ... 16640 1344 4608 12672 48640 13248 \n", - "21 3072 ... 5504 5760 6272 4992 6144 14464 \n", - "22 8256 ... 10496 39040 4480 61760 15360 54976 \n", - "23 5952 ... 8928 5184 29664 5856 6816 6720 \n", - "24 2112 ... 2432 1344 1472 1344 1920 960 \n", - "25 48832 ... 120384 17920 5120 6656 8576 4224 \n", - "26 5760 ... 5184 7168 216064 15040 11840 25472 \n", - "27 4032 ... 6816 7968 4512 7392 5856 5568 \n", - "28 4928 ... 1920 3136 2240 7936 5696 2304 \n", - "29 5056 ... 2880 2560 3136 3648 4288 3264 \n", - ".. ... ... ... ... ... ... ... ... \n", - "883 39424 ... 71360 13504 4288 5824 5888 3584 \n", - "884 4160 ... 8256 9728 198144 7488 9344 25024 \n", - "885 3360 ... 8448 8064 7104 8064 6624 6048 \n", - "886 2368 ... 3264 2368 2752 6592 6272 4352 \n", - "887 1600 ... 1536 1920 832 1408 2560 1792 \n", - "888 960 ... 2368 153280 2048 2176 3584 3584 \n", - "889 4160 ... 31296 61952 18240 36672 97920 27200 \n", - "890 5504 ... 17280 14592 16640 17024 14336 32640 \n", - "891 8704 ... 3392 13760 2240 34176 3392 7744 \n", - "892 6528 ... 5568 4992 21024 4992 6912 5664 \n", - "893 384 ... 1600 896 1152 832 1280 1088 \n", - "894 7872 ... 54784 8320 2112 1408 2752 1216 \n", - "895 7360 ... 2944 3712 78016 3392 6720 17984 \n", - "896 2208 ... 4608 5184 3456 4416 2976 2112 \n", - "897 1536 ... 1728 1216 768 4224 2496 1600 \n", - "898 1024 ... 320 512 512 256 704 320 \n", - "899 2176 ... 320 39872 704 1600 1984 1920 \n", - "900 704 ... 4608 26752 7552 3776 44672 10624 \n", - "901 17664 ... 8576 8576 8576 9344 9472 28928 \n", - "902 21376 ... 18752 99968 15872 130624 108480 103936 \n", - "903 15072 ... 24096 12864 45792 10464 12096 13248 \n", - "904 4800 ... 3072 2176 2496 1216 1856 1920 \n", - "905 6976 ... 98688 28160 2240 1600 2432 1216 \n", - "906 52224 ... 10112 17344 154304 19328 12672 29824 \n", - "907 5184 ... 8736 6144 6720 6048 3936 4608 \n", - "908 3648 ... 3264 3520 3648 8640 4544 3072 \n", - "909 2048 ... 1088 1152 640 832 1280 960 \n", - "910 1152 ... 320 46528 256 960 1152 1664 \n", - "911 47744 ... 26880 42688 23616 26816 63744 33024 \n", - "912 5888 ... 6656 6400 6400 5376 4480 15232 \n", - "\n", - " week 132 week 133 week 134 week 135 \n", - "0 20736 15168 28096 12416 \n", - "1 6816 7008 4992 11424 \n", - "2 4032 2816 1536 2432 \n", - "3 4928 145856 6400 2176 \n", - "4 9536 5312 14528 12416 \n", - "5 2208 2784 1440 1056 \n", - "6 3008 2816 1472 3264 \n", - "7 832 832 1472 1472 \n", - "8 1088 8768 1920 2560 \n", - "9 30784 12480 3264 8768 \n", - "10 2688 4352 5120 14592 \n", - "11 22784 19008 15808 14144 \n", - "12 7680 6912 6912 10464 \n", - "13 3584 2624 2176 4096 \n", - "14 5632 152128 2688 2304 \n", - "15 8128 6464 36800 12928 \n", - "16 4704 3936 2304 3552 \n", - "17 3584 2944 1600 3520 \n", - "18 1728 1472 2176 2368 \n", - "19 2624 13568 2432 5504 \n", - "20 29248 4608 3136 13184 \n", - "21 13056 5888 7808 32128 \n", - "22 34368 10752 20096 16192 \n", - "23 7776 6912 5952 6144 \n", - "24 1728 1600 1408 3072 \n", - "25 8128 339968 10048 17024 \n", - "26 16384 20480 34688 22400 \n", - "27 4800 3552 4320 4608 \n", - "28 3776 2816 1664 3904 \n", - "29 3520 3392 4736 6720 \n", - ".. ... ... ... ... \n", - "883 7168 258368 6912 3776 \n", - "884 13888 10112 31680 14464 \n", - "885 6912 4896 6336 7008 \n", - "886 7488 3776 3264 5312 \n", - "887 1856 1664 3200 2752 \n", - "888 2944 15360 4352 21184 \n", - "889 65152 17408 12288 17216 \n", - "890 27520 16768 18304 37248 \n", - "891 13824 8576 15936 10112 \n", - "892 2976 4704 3840 6240 \n", - "893 1216 1216 1216 2240 \n", - "894 2752 121856 3584 1216 \n", - "895 12352 16000 8128 5568 \n", - "896 3648 2400 2592 2688 \n", - "897 1920 1856 1216 1856 \n", - "898 768 320 768 704 \n", - "899 768 10176 3328 5888 \n", - "900 19072 5504 4416 8768 \n", - "901 13824 9088 11904 32640 \n", - "902 40256 35392 100864 69056 \n", - "903 17472 13248 10752 23520 \n", - "904 7360 4736 3456 4544 \n", - "905 9920 180864 6016 2816 \n", - "906 24064 9152 35520 19904 \n", - "907 4800 5376 4032 4032 \n", - "908 6144 4608 2624 5248 \n", - "909 1088 1216 1216 1600 \n", - "910 2176 12288 1664 5760 \n", - "911 45056 22528 8832 8832 \n", - "912 16384 8064 7424 19968 \n", - "\n", - "[913 rows x 97 columns]" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#data fill algo\n", - "for i, val in dftimeseries.iterrows():\n", - " #begin by attempting to forward fill (i.e. use past values to fill in future NaNs)\n", - " for wk in range(min_week, max_week + 1): \n", - " current_week = wk\n", - " while pd.isnull(dftimeseries['week ' + str(wk)][i]): \n", - " if current_week > min_week: \n", - " current_week -= 1\n", - " dftimeseries['week ' + str(wk)][int(i)] = dftimeseries['week ' + str(current_week)][int(i)]\n", - " else: \n", - " break\n", - " \n", - "dftimeseries" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SalesIDweek 40week 41week 42week 43week 44week 45week 46week 47week 48...week 126week 127week 128week 129week 130week 131week 132week 133week 134week 135
0E1825661446144614461446144614438408000...672020224505643584257283180820736151682809612416
1E2624071047104710471047104710464325376...854460481718456647296528068167008499211424
2E3332832003200320032003200320035842048...140819841344960147214724032281615362432
3E428096646464646464646464646464684838528...5702488965376294433921984492814585664002176
4E54480467246724672467246724672201602688...588862087225611520582419392953653121452812416
5E6364850885088508850885088508833601824...4992307234563072230417282208278414401056
6E7396837763776377637763776377616641216...1600115216644608230424323008281614723264
7E8179281288128812881288128812820481856...832832768108876889683283214721472
8E92496102410241024102410241024384320...3201134723841280140812801088876819202560
9E101056080008000800080008000800068482880...9984480011776115845126414976307841248032648768
10E11332824322432243224322432243215362688...320035843072294424321395226884352512014592
11E12588869766976652849285312531251207936...563233600537654272336002444822784190081580814144
12E13796869126912710477768160816064326912...1084864322563257608832787276806912691210464
13E1468483328332832643968142081420856962112...2048217616641472185617283584262421764096
14E1510528049664496642560249639683968384044992...6470449281536140823041536563215212826882304
15E164224435243524928311681004810048217604544...74888320999046976998432832812864643680012928
16E17316848004800441648964608460848963552...6624566447045088384033604704393623043552
17E182368256025603270423682688268823042752...1408147219843584275216003584294416003520
18E1928163008300825601856247682476825602688...204812809601600185614721728147221762368
19E20339225625612864128128192256...5121271684224164483456275226241356824325504
20E21179224962496294410244224422445441728...1664013444608126724864013248292484608313613184
21E22358448644864486440964096409635843072...5504576062724992614414464130565888780832128
22E238896729610368697664648192793666568256...1049639040448061760153605497634368107522009616192
23E24681680648064585671045952604859525952...89285184296645856681667207776691259526144
24E25908815361600160010882304435222402112...243213441472134419209601728160014083072
25E267590478089139269125696314248768844848832...12038417920512066568576422481283399681004817024
26E276080519684928531239424556814592222085760...5184716821606415040118402547216384204803468822400
27E28432051845280374426883456393640324032...6816796845127392585655684800355243204608
28E294224377646084838453765632518451844928...1920313622407936569623043776281616643904
29E304736691255685376505665924832080645056...2880256031363648428832643520339247366720
..................................................................
883E884133056339272256473641602681655041356839424...71360135044288582458883584716825836869123776
884E885403248896524858244108849929152207364160...82569728198144748893442502413888101123168014464
885E886374435523456249640323552336055683360...8448806471048064662460486912489663367008
886E8874224422445443116840963776550451202368...3264236827526592627243527488377632645312
887E8881984249629442432268846083616024961600...153619208321408256017921856166432002752
888E889857610881285121088211214081024960...23681532802048217635843584294415360435221184
889E8909600396858247808499260805760111364160...31296619521824036672979202720065152174081228817216
890E891499272968576806465287296601675525504...17280145921664017024143363264027520167681830437248
891E892870487048704870487048704870487048704...339213760224034176339277441382485761593610112
892E893652865286528652865286528652865286528...55684992210244992691256642976470438406240
893E894384384384384384384384384384...16008961152832128010881216121612162240
894E895787278727872787278727872787278727872...5478483202112140827521216275212185635841216
895E896736073607360736073607360736073607360...29443712780163392672017984123521600081285568
896E897220822082208220822082208220822082208...4608518434564416297621123648240025922688
897E898153615361536153615361536153615361536...172812167684224249616001920185612161856
898E899102410241024102410241024102410241024...320512512256704320768320768704
899E900217621762176217621762176217621762176...320398727041600198419207681017633285888
900E901704704704704704704704704704...46082675275523776446721062419072550444168768
901E902176641766417664176641766417664176641766417664...85768576857693449472289281382490881190432640
902E903213762137621376213762137621376213762137621376...187529996815872130624108480103936402563539210086469056
903E904150721507215072150721507215072150721507215072...24096128644579210464120961324817472132481075223520
904E905480048004800480048004800480048004800...3072217624961216185619207360473634564544
905E906697669766976697669766976697669766976...98688281602240160024321216992018086460162816
906E907522245222452224522245222452224522245222452224...10112173441543041932812672298242406491523552019904
907E908518451845184518451845184518451845184...8736614467206048393646084800537640324032
908E909364836483648364836483648364836483648...3264352036488640454430726144460826245248
909E910204820482048204820482048204820482048...1088115264083212809601088121612161600
910E911115211521152115211521152115211521152...320465282569601152166421761228816645760
911E912477444774447744477444774447744477444774447744...268804268823616268166374433024450562252888328832
912E913588858885888588858885888588858885888...6656640064005376448015232163848064742419968
\n", - "

913 rows × 97 columns

\n", - "
" - ], - "text/plain": [ - " SalesID week 40 week 41 week 42 week 43 week 44 week 45 week 46 week 47 \\\n", - "0 E1 8256 6144 6144 6144 6144 6144 6144 3840 \n", - "1 E2 6240 7104 7104 7104 7104 7104 7104 6432 \n", - "2 E3 3328 3200 3200 3200 3200 3200 3200 3584 \n", - "3 E4 28096 6464 6464 6464 6464 6464 6464 6848 \n", - "4 E5 4480 4672 4672 4672 4672 4672 4672 20160 \n", - "5 E6 3648 5088 5088 5088 5088 5088 5088 3360 \n", - "6 E7 3968 3776 3776 3776 3776 3776 3776 1664 \n", - "7 E8 1792 8128 8128 8128 8128 8128 8128 2048 \n", - "8 E9 2496 1024 1024 1024 1024 1024 1024 384 \n", - "9 E10 10560 8000 8000 8000 8000 8000 8000 6848 \n", - "10 E11 3328 2432 2432 2432 2432 2432 2432 1536 \n", - "11 E12 5888 6976 6976 6528 4928 5312 5312 5120 \n", - "12 E13 7968 6912 6912 7104 7776 8160 8160 6432 \n", - "13 E14 6848 3328 3328 3264 3968 14208 14208 5696 \n", - "14 E15 105280 49664 49664 2560 2496 3968 3968 3840 \n", - "15 E16 4224 4352 4352 4928 31168 10048 10048 21760 \n", - "16 E17 3168 4800 4800 4416 4896 4608 4608 4896 \n", - "17 E18 2368 2560 2560 32704 2368 2688 2688 2304 \n", - "18 E19 2816 3008 3008 2560 1856 24768 24768 2560 \n", - "19 E20 3392 256 256 128 64 128 128 192 \n", - "20 E21 1792 2496 2496 2944 1024 4224 4224 4544 \n", - "21 E22 3584 4864 4864 4864 4096 4096 4096 3584 \n", - "22 E23 8896 7296 10368 6976 6464 8192 7936 6656 \n", - "23 E24 6816 8064 8064 5856 7104 5952 6048 5952 \n", - "24 E25 9088 1536 1600 1600 1088 2304 4352 2240 \n", - "25 E26 75904 7808 91392 6912 5696 31424 8768 8448 \n", - "26 E27 6080 51968 4928 5312 39424 5568 14592 22208 \n", - "27 E28 4320 5184 5280 3744 2688 3456 3936 4032 \n", - "28 E29 4224 3776 4608 48384 5376 5632 5184 5184 \n", - "29 E30 4736 6912 5568 5376 5056 6592 48320 8064 \n", - ".. ... ... ... ... ... ... ... ... ... \n", - "883 E884 133056 3392 72256 4736 4160 26816 5504 13568 \n", - "884 E885 4032 48896 5248 5824 41088 4992 9152 20736 \n", - "885 E886 3744 3552 3456 2496 4032 3552 3360 5568 \n", - "886 E887 4224 4224 4544 31168 4096 3776 5504 5120 \n", - "887 E888 1984 2496 2944 2432 2688 4608 36160 2496 \n", - "888 E889 8576 1088 128 512 1088 2112 1408 1024 \n", - "889 E890 9600 3968 5824 7808 4992 6080 5760 11136 \n", - "890 E891 4992 7296 8576 8064 6528 7296 6016 7552 \n", - "891 E892 8704 8704 8704 8704 8704 8704 8704 8704 \n", - "892 E893 6528 6528 6528 6528 6528 6528 6528 6528 \n", - "893 E894 384 384 384 384 384 384 384 384 \n", - "894 E895 7872 7872 7872 7872 7872 7872 7872 7872 \n", - "895 E896 7360 7360 7360 7360 7360 7360 7360 7360 \n", - "896 E897 2208 2208 2208 2208 2208 2208 2208 2208 \n", - "897 E898 1536 1536 1536 1536 1536 1536 1536 1536 \n", - "898 E899 1024 1024 1024 1024 1024 1024 1024 1024 \n", - "899 E900 2176 2176 2176 2176 2176 2176 2176 2176 \n", - "900 E901 704 704 704 704 704 704 704 704 \n", - "901 E902 17664 17664 17664 17664 17664 17664 17664 17664 \n", - "902 E903 21376 21376 21376 21376 21376 21376 21376 21376 \n", - "903 E904 15072 15072 15072 15072 15072 15072 15072 15072 \n", - "904 E905 4800 4800 4800 4800 4800 4800 4800 4800 \n", - "905 E906 6976 6976 6976 6976 6976 6976 6976 6976 \n", - "906 E907 52224 52224 52224 52224 52224 52224 52224 52224 \n", - "907 E908 5184 5184 5184 5184 5184 5184 5184 5184 \n", - "908 E909 3648 3648 3648 3648 3648 3648 3648 3648 \n", - "909 E910 2048 2048 2048 2048 2048 2048 2048 2048 \n", - "910 E911 1152 1152 1152 1152 1152 1152 1152 1152 \n", - "911 E912 47744 47744 47744 47744 47744 47744 47744 47744 \n", - "912 E913 5888 5888 5888 5888 5888 5888 5888 5888 \n", - "\n", - " week 48 ... week 126 week 127 week 128 week 129 week 130 week 131 \\\n", - "0 8000 ... 6720 20224 5056 43584 25728 31808 \n", - "1 5376 ... 8544 6048 17184 5664 7296 5280 \n", - "2 2048 ... 1408 1984 1344 960 1472 1472 \n", - "3 38528 ... 57024 8896 5376 2944 3392 1984 \n", - "4 2688 ... 5888 6208 72256 11520 5824 19392 \n", - "5 1824 ... 4992 3072 3456 3072 2304 1728 \n", - "6 1216 ... 1600 1152 1664 4608 2304 2432 \n", - "7 1856 ... 832 832 768 1088 768 896 \n", - "8 320 ... 320 113472 384 1280 1408 1280 \n", - "9 2880 ... 9984 4800 11776 11584 51264 14976 \n", - "10 2688 ... 3200 3584 3072 2944 2432 13952 \n", - "11 7936 ... 5632 33600 5376 54272 33600 24448 \n", - "12 6912 ... 10848 6432 25632 5760 8832 7872 \n", - "13 2112 ... 2048 2176 1664 1472 1856 1728 \n", - "14 44992 ... 64704 4928 1536 1408 2304 1536 \n", - "15 4544 ... 7488 8320 99904 6976 9984 32832 \n", - "16 3552 ... 6624 5664 4704 5088 3840 3360 \n", - "17 2752 ... 1408 1472 1984 3584 2752 1600 \n", - "18 2688 ... 2048 1280 960 1600 1856 1472 \n", - "19 256 ... 512 127168 4224 16448 3456 2752 \n", - "20 1728 ... 16640 1344 4608 12672 48640 13248 \n", - "21 3072 ... 5504 5760 6272 4992 6144 14464 \n", - "22 8256 ... 10496 39040 4480 61760 15360 54976 \n", - "23 5952 ... 8928 5184 29664 5856 6816 6720 \n", - "24 2112 ... 2432 1344 1472 1344 1920 960 \n", - "25 48832 ... 120384 17920 5120 6656 8576 4224 \n", - "26 5760 ... 5184 7168 216064 15040 11840 25472 \n", - "27 4032 ... 6816 7968 4512 7392 5856 5568 \n", - "28 4928 ... 1920 3136 2240 7936 5696 2304 \n", - "29 5056 ... 2880 2560 3136 3648 4288 3264 \n", - ".. ... ... ... ... ... ... ... ... \n", - "883 39424 ... 71360 13504 4288 5824 5888 3584 \n", - "884 4160 ... 8256 9728 198144 7488 9344 25024 \n", - "885 3360 ... 8448 8064 7104 8064 6624 6048 \n", - "886 2368 ... 3264 2368 2752 6592 6272 4352 \n", - "887 1600 ... 1536 1920 832 1408 2560 1792 \n", - "888 960 ... 2368 153280 2048 2176 3584 3584 \n", - "889 4160 ... 31296 61952 18240 36672 97920 27200 \n", - "890 5504 ... 17280 14592 16640 17024 14336 32640 \n", - "891 8704 ... 3392 13760 2240 34176 3392 7744 \n", - "892 6528 ... 5568 4992 21024 4992 6912 5664 \n", - "893 384 ... 1600 896 1152 832 1280 1088 \n", - "894 7872 ... 54784 8320 2112 1408 2752 1216 \n", - "895 7360 ... 2944 3712 78016 3392 6720 17984 \n", - "896 2208 ... 4608 5184 3456 4416 2976 2112 \n", - "897 1536 ... 1728 1216 768 4224 2496 1600 \n", - "898 1024 ... 320 512 512 256 704 320 \n", - "899 2176 ... 320 39872 704 1600 1984 1920 \n", - "900 704 ... 4608 26752 7552 3776 44672 10624 \n", - "901 17664 ... 8576 8576 8576 9344 9472 28928 \n", - "902 21376 ... 18752 99968 15872 130624 108480 103936 \n", - "903 15072 ... 24096 12864 45792 10464 12096 13248 \n", - "904 4800 ... 3072 2176 2496 1216 1856 1920 \n", - "905 6976 ... 98688 28160 2240 1600 2432 1216 \n", - "906 52224 ... 10112 17344 154304 19328 12672 29824 \n", - "907 5184 ... 8736 6144 6720 6048 3936 4608 \n", - "908 3648 ... 3264 3520 3648 8640 4544 3072 \n", - "909 2048 ... 1088 1152 640 832 1280 960 \n", - "910 1152 ... 320 46528 256 960 1152 1664 \n", - "911 47744 ... 26880 42688 23616 26816 63744 33024 \n", - "912 5888 ... 6656 6400 6400 5376 4480 15232 \n", - "\n", - " week 132 week 133 week 134 week 135 \n", - "0 20736 15168 28096 12416 \n", - "1 6816 7008 4992 11424 \n", - "2 4032 2816 1536 2432 \n", - "3 4928 145856 6400 2176 \n", - "4 9536 5312 14528 12416 \n", - "5 2208 2784 1440 1056 \n", - "6 3008 2816 1472 3264 \n", - "7 832 832 1472 1472 \n", - "8 1088 8768 1920 2560 \n", - "9 30784 12480 3264 8768 \n", - "10 2688 4352 5120 14592 \n", - "11 22784 19008 15808 14144 \n", - "12 7680 6912 6912 10464 \n", - "13 3584 2624 2176 4096 \n", - "14 5632 152128 2688 2304 \n", - "15 8128 6464 36800 12928 \n", - "16 4704 3936 2304 3552 \n", - "17 3584 2944 1600 3520 \n", - "18 1728 1472 2176 2368 \n", - "19 2624 13568 2432 5504 \n", - "20 29248 4608 3136 13184 \n", - "21 13056 5888 7808 32128 \n", - "22 34368 10752 20096 16192 \n", - "23 7776 6912 5952 6144 \n", - "24 1728 1600 1408 3072 \n", - "25 8128 339968 10048 17024 \n", - "26 16384 20480 34688 22400 \n", - "27 4800 3552 4320 4608 \n", - "28 3776 2816 1664 3904 \n", - "29 3520 3392 4736 6720 \n", - ".. ... ... ... ... \n", - "883 7168 258368 6912 3776 \n", - "884 13888 10112 31680 14464 \n", - "885 6912 4896 6336 7008 \n", - "886 7488 3776 3264 5312 \n", - "887 1856 1664 3200 2752 \n", - "888 2944 15360 4352 21184 \n", - "889 65152 17408 12288 17216 \n", - "890 27520 16768 18304 37248 \n", - "891 13824 8576 15936 10112 \n", - "892 2976 4704 3840 6240 \n", - "893 1216 1216 1216 2240 \n", - "894 2752 121856 3584 1216 \n", - "895 12352 16000 8128 5568 \n", - "896 3648 2400 2592 2688 \n", - "897 1920 1856 1216 1856 \n", - "898 768 320 768 704 \n", - "899 768 10176 3328 5888 \n", - "900 19072 5504 4416 8768 \n", - "901 13824 9088 11904 32640 \n", - "902 40256 35392 100864 69056 \n", - "903 17472 13248 10752 23520 \n", - "904 7360 4736 3456 4544 \n", - "905 9920 180864 6016 2816 \n", - "906 24064 9152 35520 19904 \n", - "907 4800 5376 4032 4032 \n", - "908 6144 4608 2624 5248 \n", - "909 1088 1216 1216 1600 \n", - "910 2176 12288 1664 5760 \n", - "911 45056 22528 8832 8832 \n", - "912 16384 8064 7424 19968 \n", - "\n", - "[913 rows x 97 columns]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#back fill (i.e. use future values to fill in previous NaNs)\n", - "for i, val in dftimeseries.iterrows():\n", - " for wk in range(max_week, min_week - 1, -1): \n", - " current_week = wk\n", - " while pd.isnull(dftimeseries['week ' + str(wk)][i]): \n", - " if current_week < max_week: \n", - " current_week += 1\n", - " dftimeseries['week ' + str(wk)][int(i)] = dftimeseries['week ' + str(current_week)][int(i)]\n", - " else: \n", - " break\n", - " \n", - "dftimeseries" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "dftimeseries.to_csv('time_series.csv', index=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/prototypes/ES_RNN/sales_limited/data/scripts/preprocessing.py b/prototypes/ES_RNN/sales_limited/data/scripts/preprocessing.py deleted file mode 100644 index 6eaa0166..00000000 --- a/prototypes/ES_RNN/sales_limited/data/scripts/preprocessing.py +++ /dev/null @@ -1,108 +0,0 @@ -#script to transform retail sales data to a format similar to the data provided for the -#M4 competition. This data will be fed naively into slawek's winning ES-RNN model. - -import pandas as pd -import numpy as np -import math - -#parse file name from command line -training_files = './training-files.txt' - -#open file and get list of all files to read/transform -f = open(training_files) -# info = str(f.getline().strip()) -num_files = int(f.readline().strip()) -filelist = [] -for i in range(num_files): - filelist.append(f.readline().strip()) - -print(filelist) -for filename in filelist: - #extract round number - round_num = '' - numset = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'} - for i in range(len(filename) - 1, -1, -1): #assumes that round number is the only number occurring in filename - if filename[i] in numset: - round_num = filename[i] + round_num - if filename[i] == '/': #done traversing true name of current file - break - round_num = int(round_num) - print('Starting round #' + str(round_num)) - - #open file - yx = pd.read_csv(filename) - - #ascertain what range of weeks the file covers - min_week = min(set(yx.iloc[:,2])) - max_week = max(set(yx.iloc[:,2])) - - #create a new dataframe to store the processed data - col_list = ['SalesID', 'Brand', 'store and brand'] + ['week ' + str(x) for x in range(min_week, max_week + 1)] - df = pd.DataFrame([], columns=col_list) - - store_list = sorted(list(set(yx.iloc[:, 0]))) - brand_list = sorted(list(set(yx.iloc[:, 1]))) - - rows_needed = len(store_list) * len(brand_list) - - for i in range(rows_needed): - df2 = pd.Series([float('nan')] * (3 + max_week - min_week + 1), index=col_list) - df = df.append(df2, ignore_index=True) - - count = 0 - tsMap = dict() #map from (store, brand) to index in df - for i in store_list: - for j in brand_list: - tsMap[(i, j)] = count - count += 1 - - print('creating dataframe...') - #iterate through rows of current file and populate new file - for i, val in yx.iterrows(): - store_brand_pair = (val['store'], val['brand']) - df_index = tsMap[store_brand_pair] - df['Brand'][df_index] = val['brand'] - df['store and brand'][df_index] = store_brand_pair - week_col = 'week ' + str(int(val['week'])) - df[week_col][df_index] = math.exp(val[3]) #math.exp(logmove) = number of units sold - - for i, val in df.iterrows(): - df['SalesID'][i] = 'E' + str(i+1) - - print('dataframe successfully created') - #separate between time-series and information - dftimeseries = df[['SalesID'] + ['week ' + str(x) for x in range(min_week, max_week + 1)]] - dfinfo = df[['SalesID', 'Brand', 'store and brand']] - - print('replacing nan values') - #forward and backward fill data in timeseries dataframe - #data fill algo - for i, val in dftimeseries.iterrows(): - #begin by attempting to forward fill (i.e. use past values to fill in future NaNs) - for wk in range(min_week, max_week + 1): - current_week = wk - while pd.isnull(dftimeseries['week ' + str(wk)][i]): - if current_week > min_week: - current_week -= 1 - dftimeseries['week ' + str(wk)][int(i)] = dftimeseries['week ' + str(current_week)][int(i)] - else: - break - print('forward fill done!') - #back fill (i.e. use future values to fill in previous NaNs) - for i, val in dftimeseries.iterrows(): - for wk in range(max_week, min_week - 1, -1): - current_week = wk - while pd.isnull(dftimeseries['week ' + str(wk)][i]): - if current_week < max_week: - current_week += 1 - dftimeseries['week ' + str(wk)][int(i)] = dftimeseries['week ' + str(current_week)][int(i)] - else: - break - - #save csvs - print('saving csv files...') - dftimeseries.to_csv('./../Train/ts_train_round_' + str(round_num) + '.csv', index=False) - # dfinfo.to_csv('sales-info.csv', index=False) #we need only create the info csv for the whole dataset - print('Done with round ' + str(round_num) + '!----------------------------------------') - -f.close() \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/data/scripts/training-files.txt b/prototypes/ES_RNN/sales_limited/data/scripts/training-files.txt deleted file mode 100644 index f81ca217..00000000 --- a/prototypes/ES_RNN/sales_limited/data/scripts/training-files.txt +++ /dev/null @@ -1,13 +0,0 @@ -12 -../data/train/train_round_1.csv -../data/train/train_round_2.csv -../data/train/train_round_3.csv -../data/train/train_round_4.csv -../data/train/train_round_5.csv -../data/train/train_round_6.csv -../data/train/train_round_7.csv -../data/train/train_round_8.csv -../data/train/train_round_9.csv -../data/train/train_round_10.csv -../data/train/train_round_11.csv -../data/train/train_round_12.csv \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/ES_RNN_SlawekSmyl.pdf b/prototypes/ES_RNN/sales_limited/github/ES_RNN_SlawekSmyl.pdf deleted file mode 100644 index 9ab07327..00000000 Binary files a/prototypes/ES_RNN/sales_limited/github/ES_RNN_SlawekSmyl.pdf and /dev/null differ diff --git a/prototypes/ES_RNN/sales_limited/github/R/merge.R b/prototypes/ES_RNN/sales_limited/github/R/merge.R deleted file mode 100644 index ffc34eca..00000000 --- a/prototypes/ES_RNN/sales_limited/github/R/merge.R +++ /dev/null @@ -1,143 +0,0 @@ -# Merging outputs, per category, M4 competition, for point forecasts, so for ES_RNN and ES_RNN_E -# Author: Slawek Smyl, Mar-May 2018 - - -#The c++ executables write to one (occasinally two, sorry :-), so in such case move files to one dir before continuing) directories. -#(One logical run of several instances of the same program will produce a number files, e.g. outputs with different ibig value) -#This script merges, averages values, and writes them down to the same directory - FOREC_DIR -############################################################################### - -#directory that should include all *-train.csv files, as well as M4-info.csv -DATA_DIR="F:/progs/data/M4DataSet/" -m4Info_df=read.csv(paste0(DATA_DIR,"M4-info.csv")) -options(stringsAsFactors =FALSE) - -#directory with all the output files produced by the c++ code we want to merge -FOREC_DIR='F:\\progs\\data\\M4\\Quarterly2018-05-31_09_30' #do not end with separator - -LBACK=1 #shoud be as in the c++ code, LBACK>0 means backtesting -SP="Quarterly" -#SP="Yearly" -#SP="Daily" -#SP="Hourly" - -#//----------------PARAMS ---------- comment/uncomment following 3 variables -#for ES_RNN_E, so for all except Monthly and Quarterly runs: -#NUM_OF_SEEDS=1 -#NUM_OF_CHUNKS=1 -#IBIGS= - -#for ES_RNN (do for Monthly and Quarterly): -NUM_OF_CHUNKS=2 #same as NUM_OF_CHUNKS constant the the c++ cource code, changing it is not recommended. -NUM_OF_SEEDS=3 #It is equal to the number of seeds in the startup script, (or number of teams of worker processes) -# so number_of_concurrent_executables==number_of_lines_in_the_running script/NUM_OF_CHUNKS, and number_of_chunks -#E.g if using following script for ES_RNN: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -# we have here three seeds: 10,20,30, and two chunks: 1,2. (The pairs of workes have IBIG offsets of 0,5,10) -IBIGS=3 #number of complete runs by each executables, so if programs are not interrupted, this should be equal to the constant BIG_LOOP in the c++ code, by default 3. - - -m4_df=read.csv(paste0(DATA_DIR,SP,"-train.csv")) - -sMAPE<-function(forec,actual) { - mean(abs(forec-actual)/(abs(forec)+abs(actual)))*200 -} -errorFunc=sMAPE - - -spInfo_df=m4Info_df[m4Info_df$SP==SP,] -ids=spInfo_df$M4id -horizon=spInfo_df[1,"Horizon"] - -#VARIABLE + "_" + to_string(seedForChunks) + "_" + to_string(chunkNo) + "_" + to_string(ibigDb)+"_LB"+ to_string(LBACK)+ ".csv"; -inputFiles=list.files(path = FOREC_DIR, pattern = paste0(SP,".*LB",LBACK), full.names = T) -if (length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS) { - stop("length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS") -} - - -comp_df=NULL -fil=inputFiles[1] -for (fil in inputFiles) { - print(fil) - c_df=read.csv(fil, header=F) - comp_df=rbind(comp_df,c_df) -} -names(comp_df)[1]='id' - -forecSeries=sort(unique(comp_df$id)) -if (length(forecSeries)!=length(ids) && LBACK==0) { - stop(paste0("Expected number of cases:",length(ids)," but got:",length(forecSeries))) -} - -SIZE_OF_CHUNK=1000 -out_df=NULL; ou_df=NULL -fSeries=forecSeries[1] -for (fSeries in forecSeries) { - oneSeriesForecs_df=comp_df[comp_df$id==fSeries,] - o1=colMeans(oneSeriesForecs_df[,2:ncol(oneSeriesForecs_df)]) - o_df=data.frame(id=fSeries, as.list(o1), stringsAsFactors =F) - ou_df=rbind(ou_df, o_df) - if (nrow(ou_df)>=SIZE_OF_CHUNK) { - out_df=rbind(out_df,ou_df) - ou_df=NULL - print(nrow(out_df)) - } -} -out_df=rbind(out_df,ou_df) -print(nrow(out_df)) -out_df=out_df[order(as.integer(substring(out_df$id, 2))),] - -#FOREC_DIR="e:\\temp" -outPath=paste0(FOREC_DIR,'\\',SP,"Forec.csv") -write.csv(out_df,file=outPath,row.names = F) - -################ Main work done, now just diagnostics calculations and plots - -#display a sample of forecasts and, if LBACK>0, actuals -MAX_NUM_OF_POINTS_TO_SHOW=200 -for (i in 1:100) { - irand=sample(1:length(forecSeries),1) - fSeries=forecSeries[irand] - forec=as.numeric(out_df[out_df$id==fSeries,2:ncol(out_df)]) - actual=as.numeric(m4_df[m4_df$V1==fSeries,2:ncol(m4_df)]) - actual=actual[!is.na(actual)] - if (length(actual)>MAX_NUM_OF_POINTS_TO_SHOW) { - actual=actual[(length(actual)-MAX_NUM_OF_POINTS_TO_SHOW):length(actual)] - } - if (LBACK==0) { - plot(c(actual,forec), col=c(rep(1,length(actual)),rep(2,length(forec))), main=fSeries) - } else { - ymin=min(actual,forec) - ymax=max(actual,forec) - plot(1:length(actual),actual, main=fSeries, ylim=c(ymin,ymax)) - lines((length(actual)-length(forec)+1):length(actual), forec, col=2, type='p') - } - - Sys.sleep(5) -} - - -#calc error metrics -if (LBACK>0) { - summErrors=0 - fSeries=forecSeries[1] - i=1 - for (fSeries in forecSeries) { - if (i%%1000==0) - cat(".") - forec=as.numeric(out_df[out_df$id==fSeries,2:ncol(out_df)]) - actual=as.numeric(m4_df[m4_df$V1==fSeries,2:ncol(m4_df)]) - actual=actual[!is.na(actual)] - actual=actual[(length(actual)-LBACK*horizon+1):(length(actual)-(LBACK-1)*horizon)] - summErrors=summErrors+errorFunc(forec,actual) - i=i+1 - } - print(".") - print(paste0("avg error:",round(summErrors/length(forecSeries),2))) -} diff --git a/prototypes/ES_RNN/sales_limited/github/R/merge_PI.R b/prototypes/ES_RNN/sales_limited/github/R/merge_PI.R deleted file mode 100644 index f99a641f..00000000 --- a/prototypes/ES_RNN/sales_limited/github/R/merge_PI.R +++ /dev/null @@ -1,210 +0,0 @@ -# Merging outputs, per category, M4 competition, for Prediction Intervals , so for ES_RNN_PI and ES_RNN_E_PI -# Author: Slawek Smyl, Mar-May 2018 - - -#The c++ executables write to one (occasinally two, sorry :-), so in such case move files to one dir before continuing) directories. -#(One logical run of several instances of the same program will produce a number files, e.g. outputs with different ibig value) -#This script merges, averages values, and writes them down to the same directory - FOREC_DIR -############################################################################### - -#directory that should include all *-train.csv files, as well as M4-info.csv -DATA_DIR="F:/progs/data/M4DataSet/" -m4Info_df=read.csv(paste0(DATA_DIR,"M4-info.csv")) -options(stringsAsFactors =FALSE) -memory.limit(10000) - -#directory with all the output files produced by the c++ code we want to merge -FOREC_DIR='F:\\progs\\data\\M4\\Hourlygood' #do not end with separator - -LBACK=1 #shoud be as in the c++ code, LBACK>0 means backtesting -#SP="Quarterly" -#SP="Yearly" -#SP="Daily" -SP="Hourly" -m4_df=read.csv(paste0(DATA_DIR,SP,"-train.csv")) - - -#//----------------PARAMS ---------- comment/uncomment following 3 variables -#for ES_RNN_E_PI, so for all except Monthly and Quarterly runs: -NUM_OF_SEEDS=1 -NUM_OF_CHUNKS=1 -#IBIGS=/2 -IBIGS=6 - -#for ES_RNN_PI (do for Monthly and Quarterly): -#NUM_OF_CHUNKS=2 #same as NUM_OF_CHUNKS constant the the c++ cource code, changing it is not recommended. -#NUM_OF_SEEDS=3 #It is equal to the number of seeds in the startup script, (or number of teams of worker processes) -# so number_of_concurrent_executables==number_of_lines_in_the_running script/NUM_OF_CHUNKS, and number_of_chunks -#E.g if using following script for ES_RNN: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -# we have here three seeds: 10,20,30, and two chunks: 1,2. (The pairs of workes have IBIG offsets of 0,5,10) -#IBIGS=3 #number of complete runs by each executables, so if programs are not interrupted, this should be equal to the constant BIG_LOOP in the c++ code, by default 3. - -ALPHA = 0.05; -ALPHA_MULTIP = 2 / ALPHA; - -MSIS<-function(forecL,forecH,actual) { - sumDiffs=0 - for (i in 1:(length(actual)-seasonality)) { - sumDiffs=sumDiffs+abs(actual[i+seasonality]-actual[i]) - } - avgAbsDiff=sumDiffs/(length(actual)-seasonality) - - actual=actual[(length(actual)-LBACK*horizon+1):(length(actual)-(LBACK-1)*horizon)] - - msis=sum(forecH-forecL)+sum(pmax(0,forecL-actual))*ALPHA_MULTIP+sum(pmax(0,actual-forecH))*ALPHA_MULTIP - msis/horizon/avgAbsDiff -} -errorFunc=MSIS - -spInfo_df=m4Info_df[m4Info_df$SP==SP,] -ids=spInfo_df$M4id -horizon=spInfo_df[1,"Horizon"] -seasonality=spInfo_df[1,"Frequency"] - - -#lower -#VARIABLE + "_" + to_string(seedForChunks) + "_" + to_string(chunkNo) + "_" + to_string(ibigDb)+"_LB"+ to_string(LBACK)+ ".csv"; -inputFiles=list.files(path = FOREC_DIR, pattern = paste0(SP,".*LLB",LBACK), full.names = T) -if (length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS) { - stop("length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS") -} - -comp_df=NULL -fil=inputFiles[1] -for (fil in inputFiles) { - print(fil) - c_df=read.csv(fil, header=F) - comp_df=rbind(comp_df,c_df) -} -names(comp_df)[1]='id' - -forecSeries=sort(unique(comp_df$id)) -if (length(forecSeries)!=length(ids) && LBACK==0) { - stop(paste0("Expected number of cases:",length(ids)," but got:",length(forecSeries))) -} - -SIZE_OF_CHUNK=1000 -out_df=NULL; ou_df=NULL -fSeries=forecSeries[1] -for (fSeries in forecSeries) { - oneSeriesForecs_df=comp_df[comp_df$id==fSeries,] - o1=colMeans(oneSeriesForecs_df[,2:ncol(oneSeriesForecs_df)]) - o_df=data.frame(id=fSeries, as.list(o1), stringsAsFactors =F) - ou_df=rbind(ou_df, o_df) - if (nrow(ou_df)>=SIZE_OF_CHUNK) { - out_df=rbind(out_df,ou_df) - ou_df=NULL - print(nrow(out_df)) - } -} -out_df=rbind(out_df,ou_df) -print(nrow(out_df)) -out_df=out_df[order(as.integer(substring(out_df$id, 2))),] - -outPath=paste0(FOREC_DIR,'\\',SP,"ForecL.csv") -write.csv(out_df,file=outPath,row.names = F) - -lower_df=out_df - -##################################### -#higher -inputFiles=list.files(path = FOREC_DIR, pattern = paste0(SP,".*HLB",LBACK), full.names = T) -if (length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS) { - stop("length(inputFiles)!=NUM_OF_SEEDS*NUM_OF_CHUNKS*IBIGS") -} - -comp_df=NULL -fil=inputFiles[1] -for (fil in inputFiles) { - print(fil) - c_df=read.csv(fil, header=F) - comp_df=rbind(comp_df,c_df) -} -names(comp_df)[1]='id' - -forecSeries=sort(unique(comp_df$id)) -if (length(forecSeries)!=length(ids) && LBACK==0) { - print(paste0("Warning. Expected number of cases:",length(ids)," but got:",length(forecSeries))) -} - -SIZE_OF_CHUNK=1000 -out_df=NULL; ou_df=NULL -fSeries=forecSeries[1] -for (fSeries in forecSeries) { - oneSeriesForecs_df=comp_df[comp_df$id==fSeries,] - o1=colMeans(oneSeriesForecs_df[,2:ncol(oneSeriesForecs_df)]) - o_df=data.frame(id=fSeries, as.list(o1), stringsAsFactors =F) - ou_df=rbind(ou_df, o_df) - if (nrow(ou_df)>=SIZE_OF_CHUNK) { - out_df=rbind(out_df,ou_df) - ou_df=NULL - print(nrow(out_df)) - } -} -out_df=rbind(out_df,ou_df) -print(nrow(out_df)) -out_df=out_df[order(as.integer(substring(out_df$id, 2))),] - -outPath=paste0(FOREC_DIR,'\\',SP,"ForecH.csv") -write.csv(out_df,file=outPath,row.names = F) - -higher_df=out_df - - -################ Main work done, now just diagnostics calculations and plots - -#display a sample of forecasts and, if LBACK>0, actuals -MAX_NUM_OF_POINTS_TO_SHOW=200 -i=1 -for (i in 1:100) { - irand=sample(1:length(forecSeries),1) - fSeries=forecSeries[irand] - forecL=as.numeric(lower_df[lower_df$id==fSeries,2:ncol(lower_df)]) - forecH=as.numeric(higher_df[higher_df$id==fSeries,2:ncol(higher_df)]) - actual=as.numeric(m4_df[m4_df$V1==fSeries,2:ncol(m4_df)]) - actual=actual[!is.na(actual)] - if (length(actual)>MAX_NUM_OF_POINTS_TO_SHOW) { - actual=actual[(length(actual)-MAX_NUM_OF_POINTS_TO_SHOW):length(actual)] - } - if (LBACK==0) { - plot(c(actual,forecH), col=c(rep(1,length(actual)),rep(2,length(forecH))), main=fSeries) - lines(c(actual,forecL), col=c(rep(1,length(actual)),rep(3,length(forecL))), type='p') - } else { - ymin=min(actual,forecL) - ymax=max(actual,forecH) - plot(1:length(actual),actual, main=fSeries, ylim=c(ymin,ymax)) - lines((length(actual)-length(forecH)+1):length(actual), forecH, col=2, type='p') - lines((length(actual)-length(forecL)+1):length(actual), forecL, col=3, type='p') - } - - Sys.sleep(5) -} - - - -#calc error metric: MSIS -if (LBACK>0) { - summErrors=0 - fSeries=forecSeries[1] - i=1 - for (fSeries in forecSeries) { - if (i%%1000==0) - cat(".") - forecL=as.numeric(lower_df[lower_df$id==fSeries,2:ncol(lower_df)]) - forecH=as.numeric(higher_df[higher_df$id==fSeries,2:ncol(higher_df)]) - actual=as.numeric(m4_df[m4_df$V1==fSeries,2:ncol(m4_df)]) - actual=actual[!is.na(actual)] - summErrors=summErrors+errorFunc(forecL, forecH, actual) - i=i+1 - } - print(".") - print(paste0("avg error:",round(summErrors/length(forecSeries),2))) -} - - diff --git a/prototypes/ES_RNN/sales_limited/github/R/readme.txt b/prototypes/ES_RNN/sales_limited/github/R/readme.txt deleted file mode 100644 index 3244c6da..00000000 --- a/prototypes/ES_RNN/sales_limited/github/R/readme.txt +++ /dev/null @@ -1,8 +0,0 @@ -When the c++ workers run, they output results (forecasts) to a directory or two. -(Sorry occasionally two directories are filled, in such case first "manually" put all the output files to a single dir) -These scripts merge them into one file and save it, show a sample of graphs, and if this is backtesting run (LBACK>0), calculate some accuracy metrics. - -Both scripts needs to be updated with your input, output dirs, and other params, see inside, there are a lot of comments there. - -merge.R is meant to be used for point forecst runs, so for ES_RNN and ES_RNN_E programs. -mergePI.R - for Prediction Interval runs, so for ES_RNN_PI and ES_RNN_E_PI programs. diff --git a/prototypes/ES_RNN/sales_limited/github/c++/ES_RNN b/prototypes/ES_RNN/sales_limited/github/c++/ES_RNN deleted file mode 100644 index cd88f2f6..00000000 Binary files a/prototypes/ES_RNN/sales_limited/github/c++/ES_RNN and /dev/null differ diff --git a/prototypes/ES_RNN/sales_limited/github/c++/ES_RNN.cc b/prototypes/ES_RNN/sales_limited/github/c++/ES_RNN.cc deleted file mode 100644 index 280b5a7c..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/ES_RNN.cc +++ /dev/null @@ -1,1244 +0,0 @@ -/*ES-RNN: ES-RNN Exponential Smoothing Recurrent Neural Network hybrid. Point forecast. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. -It is meant to be used for Monthly and Quarterly series of M4 competition, becasue the DE (Diversified Ensemble) version is too slow. -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -It has to be invoked in pair of executables, passing at least two integers: seedForChunks, chunkNo -so e.g. create a script with following lines on Windows -start 10 1 -start 10 2 -Modern computers have at more then 2 cores, so e.g. on 6-core machine create and run the following script with 3 pairs of workers: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -seedForChunks have to be the same withion one pair, chunk numbers have to be 1 and 2. -We have added here the third parameter: ibigOffset. The straddle should be equal or bigger than BIG_LOOP. -Each pair goes through BIG_LOOP (by default 3, change in code below if you want) of model fitting and prediction, -so 2 pairs, as above, will produce 6 forecasts to be ensembled later, in R. -By increasing number of pairs, e.g. to 6 on 12-core computer, one can reduce BIG_LOOP to 1, so reduce execution time, and still have 6 forecasts - -a decent number to ensemble (in a separate R script). - -There are three blocks of parameters below, one active (starting with //PARAMS--------------) and two inactive. -The active block is setup as in the final run of forecasting quarterly series. Similarly Monthly block. -The Daily block is more of a demo, allowing to run quickly forecast for Daily series, although with slightly worse performance (use another program ES_RNN_E.cc for it). It was not used for the final submission. -So, you need comment/uncomment to have one block of interest active. - - -*/ - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - - -// string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs //windows file paths corresponding ot slawek's local machine -string DATA_DIR="/home/deegup/sales_data/Train/"; //use with linux -// string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -string OUTPUT_DIR="/home/deegup/sales_data/output/"; -string TIME_DIR = "/home/deegup/sales_data/time" - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Quarterly"; -const string run = "50/45 (1,2),(4,8), LR=0.001/{10,1e-4f}, EPOCHS=15, LVP=80 40*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 45; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE. - -vector> dilations={{1,2},{4,8}};//Each vector represents one chunk of Dilateed LSTMS, connected in standard resnNet fashion -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM //so for Quarterly series, we do not use either the more advanced residual connections nor attention. -const bool ADD_NL_LAYER=false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -const float INITIAL_LEARNING_RATE = 0.001f; -const map LEARNING_RATES = { { 10,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 8; -const unsigned int STATE_HSIZE = 40; - -const int SEASONALITY = 4; -const unsigned int INPUT_SIZE = 4; -const int INPUT_SIZE_I= INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 3; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; -const int MIN_INP_SEQ_LEN = 0; -const float LEVEL_VARIABILITY_PENALTY = 80; //Multiplier for L" penalty against wigglines of level vector. Important. -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - - - -/* -string VARIABLE = "Monthly"; -const string run = "50/49 Res (1,3,6,12), LR=5e-4 {12,1e-4f}, EPOCHS=10, 20*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -#define USE_RESIDUAL_LSTM //so for Monthly we use only one block, so no standard resNet shortcuts, but instead but of the special residual shortcuts, after https://arxiv.org/abs/1701.03360. -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -vector> dilations={{1,3,6,12}};//so for Monthly we use only one block, so no standard resNet shortcut -const float INITIAL_LEARNING_RATE = 5e-4; -const map LEARNING_RATES = { { 12,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 10; -const unsigned int STATE_HSIZE = 50; - -const float LEVEL_VARIABILITY_PENALTY = 50; //Multiplier for L" penalty against wigglines of level vector. - -const int SEASONALITY = 12; -const unsigned int OUTPUT_SIZE = 18; -const unsigned int INPUT_SIZE = 12; -const int INPUT_SIZE_I= INPUT_SIZE; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years -*/ - - -/* -string VARIABLE = "Daily"; -const string run = "50/49 NL LRMult=1.5, 3/5 (1,7,28) LR=3e-4 {9,1e-4f} EPOCHS=15, LVP=100 HSIZE=40 20w"; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = true; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,7,28 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 9,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1.5; -const int NUM_OF_TRAIN_EPOCHS = 15; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const int INPUT_SIZE_I = INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 14; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to max of last 20 years -*/ - -Expression squash(Expression& x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} - -string INPUT_PATH = DATA_DIR + "time_series_nonan.csv"; -string INFO_INPUT_PATH = DATA_DIR + "sales-info.csv"; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 40; -#else - const int MAX_NUM_OF_SERIES = -1; //use all series -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 11;//in data provided -const int BIG_LOOP = 3; -const int NUM_OF_CHUNKS = 2; -const float EPS=1e-6; -const int AVERAGING_LEVEL=5; -const bool USE_MEDIAN = false; -const int MIDDLE_POS_FOR_AVG = 2; //if using medians - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=20; -const float C_STATE_PENALTY = 0; - -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN=true; -const float TAU = PERCENTILE / 100.; -const float TRAINING_TAU = TRAINING_PERCENTILE / 100.; -const unsigned ATTENTION_HSIZE=STATE_HSIZE; - -const bool USE_AUTO_LEARNING_RATE=false; -//if USE_AUTO_LEARNING_RATE, and only if LBACK>0 -const float MIN_LEARNING_RATE = 0.0001f; -const float LR_RATIO = sqrt(10); -const float LR_TOLERANCE_MULTIP = 1.005; -const int L3_PERIOD = 2; -const int MIN_EPOCHS_BEFORE_CHANGING_LRATE = 2; - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0,0,0,0,0,0 }; //construct one-hot vector indicating which categories are used - if (category == "1.0") - categories[0] = 1; - else if (category == "2.0") - categories[1] = 1; - else if (category == "3.0") - categories[2] = 1; - else if (category == "4.0") - categories[3] = 1; - else if (category == "5.0") - categories[4] = 1; - else if (category == "6.0") - categories[5] = 1; - else if (category == "7.0") - categories[6] = 1; - else if (category == "8.0") - categories[7] = 1; - else if (category == "9.0") - categories[8] = 1; - else if (category == "10.0") - categories[9] = 1; - else if (category == "11.0") - categories[10] = 1; - else { - cerr << "unknown brand..."; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { //takes in parameters from line stream (seedsForChunks, chunkNum) - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE_I) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE_I; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE_I; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE_I); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) { //chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; -}; - -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - vector levels; - vector seasons; -}; - - -Expression pinBallLoss(const Expression& out_ex, const Expression& actuals_ex) {//used by Dynet, learning loss function - vector losses; - for (unsigned int indx = 0; indx as_scalar(forec.value())) - losses.push_back((actual - forec)*TRAINING_TAU); - else - losses.push_back((actual - forec)*(TRAINING_TAU - 1)); - } - return sum(losses) / OUTPUT_SIZE * 2; -} - - -//weighted quantile Loss, used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect) { //Looks like a swalek thing (not standard) - float sumf = 0; float suma=0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*TAU; - else - sumf = sumf + (actual - forec)*(TAU - 1); - } - return sumf / suma * 200; -} - -//used just for diagnostics, if LBACK>0 and PERCENTILE==50 -float sMAPE(vector& out_vect, vector& actuals_vect) { - float sumf = 0; - for (unsigned int indx = 0; indx& out_vect, vector& actuals_vect) { //use sMAPE or wQuant loss - if (PERCENTILE==50) - return sMAPE(out_vect, actuals_vect); - else - return wQuantLoss(out_vect, actuals_vect); -} - -int main(int argc, char** argv) { - clock_t start, end - start = clock(); - - dynet::initialize(argc, argv); - - int seedForChunks = 10; //Yes it runs, without any params, but it will work only on 1/NUM_OF_CHUNKS of all cases. The system is expected to run in NUM_OF_CHUNKS multiples. - int chunkNo = 1; - int ibigOffset = 0; - if (argc >= 3) { - seedForChunks = atoi(argv[1]); - chunkNo = atoi(argv[2]); - } - if (argc >= 4) - ibigOffset = atoi(argv[3]); - - if (chunkNo > NUM_OF_CHUNKS) { - cerr << "chunkNo > NUM_OF_CHUNKS"; - exit(-1); - } - else if (chunkNo <= 0) { - cerr << "chunkNo <= 0"; - exit(-1); - } - - cout<0) - std::cout<< " ibigOffset:"<< ibigOffset; //if continuing prematurely stopped run - if (LBACK>0) - std::cout<<" lback:"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)run.c_str(), 0, &nullTerminatedStringOfRun)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE_I+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister) - mt19937 rngForChunks(seedForChunks); - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 48/2=24k, for monthly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); //take in lines - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //std::cout << "header" << endl; - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - allSeries_map[series] = m4Obj; - } - if (MAX_NUM_OF_SERIES>0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - //std::cout << "Got line---------" << endl; - } - - int series_len=(int)series_vect.size(); - int chunkSize= series_len/NUM_OF_CHUNKS; - std::cout << "num of series:" << series_vect.size() <<" size of chunk:"<< chunkSize< uniOnSeries(0, chunkSize -1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>> testResults_map((int)chunkSize*1.5); - set diagSeries; - - - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - ParameterCollection pc; - ParameterCollection perSeriesPC; - - float learning_rate= INITIAL_LEARNING_RATE; //SET UP TRAINER OBJECT - AdamTrainer trainer(pc, learning_rate, 0.9, 0.999, EPS); - trainer.clip_threshold = GRADIENT_CLIPPING; - AdamTrainer perSeriesTrainer(perSeriesPC, learning_rate*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainer.clip_threshold = GRADIENT_CLIPPING; - - #if defined USE_RESIDUAL_LSTM //MODEL CODE - vector rNNStack; - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(AttentiveDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, ATTENTION_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(DilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il oneChunk_vect(start,end); - if (PRINT_DIAGN) { - for (int k = 0; k<10; k++) //diag - cout << oneChunk_vect[k] << " "; - cout << endl; - } - if (chunkNo == NUM_OF_CHUNKS) - cout<<"last chunk size:"<< oneChunk_vect.size()< additionalParams_map((int)oneChunk_vect.size()*1.5); //per series - unordered_map*> historyOfAdditionalParams_map((int)oneChunk_vect.size()*1.5); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) {//setup - string series = *iter; - AdditionalParams addParams; - addParams.levSm = perSeriesPC.add_parameters({ 1 }, 0.5); //level smoothing - addParams.sSm = perSeriesPC.add_parameters({ 1 }, 0.5); //seasonality smoothing - for (int isea = 0; isea(); - } - - //BEGIN TRAINING (iterate through num_epochs) - for (int iEpoch=0; iEpoch testLosses; //test losses of all series in this epoch - vector testAvgLosses; //test avg (over last few epochs) losses of all series in this epoch - vector trainingLosses; //training losses of all series in one epoch - vector forecLosses; vector levVarLosses; vector stateLosses; - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&iEpoch, 0, NULL)); - #endif - - for (auto iter = oneChunk_vect.begin() ; iter != oneChunk_vect.end(); ++iter) { - string series=*iter; - auto m4Obj = allSeries_map[series]; - - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); - #endif - - ComputationGraph cg; //SET UP COMPUTATION GRAPH and load model's layers into it - for (int il=0; il season_exVect;//vector, because we do not know how long the series is - for (int iseas=0; iseas seas==1 - season_exVect.push_back(seas);//Expression is a simple struct, without any storage management, so the auto copy constructor works OK. - } - season_exVect.push_back(season_exVect[0]); - - vector logDiffOfLevels_vect; - vector levels_exVect; - Expression lev=cdiv(input(cg, m4Obj.vals[0]), season_exVect[0]); - levels_exVect.push_back(lev); - for (int i=1; i 0) { - vector levelVarLoss_v; //calculate loss from each level during- - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx=season_exVect.size()-SEASONALITY; - for (int i=0;i<(OUTPUT_SIZE_I-SEASONALITY);i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx+i]); - } - vector losses; - for (int i=INPUT_SIZE_I-1; i<(m4Obj.n- OUTPUT_SIZE_I); i++) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() +i+1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex=input(cg,{INPUT_SIZE},input_vect); - Expression input1_ex=cdiv(input0_ex,inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]); - joinedInput_ex.emplace_back(noise(squash(input1_ex), NOISE_STD)); //normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - //MAKE RESNET STYLE EXPRESSION - //std::cout << "generating resnet-style expression..." << endl; - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex=concatenate(outputSeasonality_exVect); - - first = m4Obj.vals.begin() +i+1; - pastLast = m4Obj.vals.begin() +i+1+OUTPUT_SIZE_I; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels0_ex=input(cg,{OUTPUT_SIZE},labels_vect); - Expression labels1_ex=cdiv(labels0_ex,outputSeasonality_ex); //deseasonalization - labels1_ex= cdiv(labels1_ex, levels_exVect[i]);//normalization - Expression labels_ex=squash(labels1_ex); - - Expression loss_ex=pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE_I+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - } - - //std::cout << "Will begin computing frorecast loss" << endl; - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; it maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax = it; - layerOfMax = il; - chunkOfMax = irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - cout << " min season=" << minSeason << endl; - cout << " min level=" << minLevel << endl; - cout << " max abs:" << maxAbs << " at time:" << timeOfMax << " at layer:" << layerOfMax << " and chunk:" << chunkOfMax << endl; - - //diagSeries.insert(series); - pc.reset_gradient(); - perSeriesPC.reset_gradient(); - } - - //saving per-series values for diagnostics purposes - AdditionalParamsF &histAdditionalParams= historyOfAdditionalParams_map[series]->at(iEpoch); - histAdditionalParams.levSm=as_scalar(levSm_ex.value()); - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea=0; isea::const_iterator firstE = season_exVect.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex = concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression input1_ex = cdiv(input0_ex, inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]);//normalization - joinedInput_ex.emplace_back(squash(input1_ex)); - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - std::cout << endl; - std::cout << "Trying rnn_exp" << endl; - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - Expression out_ex; - if (ADD_NL_LAYER) { - out_ex=MLPW_ex*rnn_ex+MLPB_ex; - out_ex = adapterW_ex*tanh(out_ex)+adapterB_ex; - } else - out_ex=adapterW_ex*rnn_ex+adapterB_ex; - - out_ex = cmult(expand(out_ex), outputSeasonality_ex)*levels_exVect[i];//back to original scale - vector out_vect = as_vector(out_ex.value()); - - if (LBACK > 0) { - float qLoss = errorFunc(out_vect, m4Obj.testVals); - testLosses.push_back(qLoss); - } - - //std::cout << "out_vect: " << to_string(out_vect) << endl; - - testResults_map[series][iEpoch%AVERAGING_LEVEL] = out_vect; - if (iEpoch >= AVERAGING_LEVEL) { - if (USE_MEDIAN) { - if (testResults_map[series][AVERAGING_LEVEL].size() == 0) - testResults_map[series][AVERAGING_LEVEL] = out_vect; //just to initialized, to make space. The values will be overwritten - for (int iii = 0; iii < OUTPUT_SIZE_I; iii++) { - vector temp_vect2; - for (int ii = 0; ii firstForec = testResults_map[series][0]; - testResults_map[series][AVERAGING_LEVEL] = firstForec; - std::cout << firstForec.size() << endl; - for (int ii = 1; ii nextForec = testResults_map[series][ii]; - for (int iii = 0; iii 0) { - float qLoss = errorFunc(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals); - testAvgLosses.push_back(qLoss); - - #if defined USE_ODBC //save - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&forecastLoss, 0, NULL)); - - for (int io = 0; io < OUTPUT_SIZE_I; io++) { - int ipos=OFFSET_TO_FIRST_ACTUAL + 1 + 2*io; - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&m4Obj.testVals[io], 0, NULL)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos+1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&testResults_map[series][AVERAGING_LEVEL][io], 0, NULL)); - } - if (MAX_NUM_OF_SERIES<0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLExecute(hInsertStmt)); - #endif - } - } //time to average - }//last anchor point of the series - }//through TEST loop - }//through series - - if (iEpoch % FREQ_OF_TEST == 0) { - float averageTrainingLoss = accumulate(trainingLosses.begin(), trainingLosses.end(), 0.0) / trainingLosses.size(); - - cout << ibig << " " << iEpoch << " loss:" << averageTrainingLoss * 100; - if (LEVEL_VARIABILITY_PENALTY > 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forecast loss:" << averageForecLoss*100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - - float averageTestLoss=0; - if (LBACK > 0) { - float averageTestLoss = accumulate(testLosses.begin(), testLosses.end(), 0.0) / testLosses.size(); - cout<<" Test loss:" << averageTestLoss; - if (iEpoch >= AVERAGING_LEVEL) { - float averageTestAvgLoss = accumulate(testAvgLosses.begin(), testAvgLosses.end(), 0.0) / testAvgLosses.size();//of this epoch - cout << " avgLoss:" << averageTestAvgLoss; - } - if (USE_AUTO_LEARNING_RATE) - perfValid_vect.push_back(averageTestLoss); - } - cout << endl; - } - - if (USE_AUTO_LEARNING_RATE) { - bool changeL2Rate = false; - if (iEpoch >= 2) { - if (iEpoch < L3_PERIOD) - changeL2Rate = perfValid_vect[perfValid_vect.size() - 2] MIN_LEARNING_RATE && (iEpoch - epochOfLastChangeOfLRate) >= MIN_EPOCHS_BEFORE_CHANGING_LRATE) { - learning_rate /= LR_RATIO; - cout << "decreasing LR to:" << learning_rate << endl; - epochOfLastChangeOfLRate = iEpoch; - trainer.learning_rate = learning_rate; - } - } - #if defined USE_ODBC - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLEndTran( - SQL_HANDLE_DBC, - hDbc, - SQL_COMMIT)); - #endif - }//through epochs - - if (PRINT_DIAGN) {//some diagnostic info - set diagSeries; - for (int i = 0; i<1; i++) {//add a few normal ones - int irand = uniOnSeries(rng); - diagSeries.insert(oneChunk_vect[irand]); - } - for (auto series : diagSeries) { - cout << endl << series << endl; - array* historyOfAdditionalParams_ptrToArr = historyOfAdditionalParams_map[series]; - cout << "lSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levSm << " "; - cout << endl; - cout << "sSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).sSm << " "; - cout << endl; - cout << "seasons:" << endl; - for (int isea = 0; iseaat(iEpoch).initSeasonality[isea] << " "; - cout << endl; - } - cout << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levels.size()>0) { - cout << "levels:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).levels.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).levels[iv] << ", "; - cout << endl; - cout << "seas:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).seasons.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).seasons[iv] << ", "; - cout << endl; - } - } - } - } - - //save the forecast to outputFile - ofstream outputFile; - outputFile.open(outputPath); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) { - string series = *iter; - outputFile<< series; - for (int io=0; io 0 -start 10 -start 20 -start 30 -on 4-core computer. -In this setup, learning and fitting would be repeated 4*3 times, probably unnecessarily too many, 6-8 independent runs should be enough for a good ensemble. -Therefore if running on say 8 core machine , one can extend the above script to 8 concurrent executions and reduce BIG_LOOP to 1. -(Creating final forecasts is done in a supplied R script) - -There are four blocks of parameters below, one active (starting with //PARAMS--------------) and three inactive. -These blocks are as they were during the final forecasting run. You need comment/uncomment to have one block of interest active. -*/ - - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -//#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - -string DATA_DIR = "\\home\\deegup\\M4\\Dataset\\Train\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "\\home\\deegup\\M4\\output\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- - -string VARIABLE = "Hourly"; -const string run0 = "(1,4)(24,168) LR=0.01, {25,3e-3f} EPOCHS=37, LVP=10, CSP=0"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 2;//0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 24; -const int SEASONALITY2 = 168; -vector> dilations = { { 1,4 },{ 24, 168 } }; - -const float INITIAL_LEARNING_RATE = 0.01f; -const map LEARNING_RATES = { { 20,1e-3f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 37; - -float LEVEL_VARIABILITY_PENALTY = 10; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 24; -const unsigned int OUTPUT_SIZE = 48; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 53 * SEASONALITY2 + MIN_SERIES_LENGTH; //==all -const int TOPN = 4; - - -/* -string VARIABLE = "Weekly"; -const string run0 = "Att 4/5 (1,52) LR=1e-3 {15,3e-4f} EPOCHS=31, LVP=100 6y"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 52; -const int SEASONALITY2 = 0; -vector> dilations = { { 1, 52 } }; - -const float INITIAL_LEARNING_RATE = 1e-3; -const map LEARNING_RATES = { { 15,3e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 31; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 10; -const unsigned int OUTPUT_SIZE = 13; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#81 380 935 1023 1604 2598 -const int MAX_SERIES_LENGTH = 6 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* - -string VARIABLE = "Daily"; -const string run0 = "4/5 (1,3)(7,14) LR=3e-4 {13,1e-4f} EPOCHS=21, LVP=100 13w"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER=false; - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,3 },{ 7, 14 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 13,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 21; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const unsigned int OUTPUT_SIZE = 14; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //##93 323 2940 2357 4197 9919 -const int MAX_SERIES_LENGTH = 13 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* -string VARIABLE = "Yearly"; -const string run0 = "Att NL 4/5 (1,6) LR=1e-4 {17,3e-5}{22,1e-5} EPOCHS=29, 60*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = true; - -const int SEASONALITY_NUM = 0; //0 means no seasonality -const int SEASONALITY = 1; //for no seasonality, set it to 1, important -const int SEASONALITY2 = 0; -vector> dilations = { { 1,6 } }; - -const float INITIAL_LEARNING_RATE = 1e-4; -const map LEARNING_RATES = { { 17,3e-5 },{ 22,1e-5 } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 29; - -float LEVEL_VARIABILITY_PENALTY = 0; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 30; - -const unsigned int INPUT_SIZE = 4; -const unsigned int OUTPUT_SIZE = 6; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#13.00 20.00 29.00 31.32 40.00 835.00 -const int MAX_SERIES_LENGTH = 60 + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; - -const int BIG_LOOP = 3; -const int NUM_OF_NETS = 5; -const unsigned ATTENTION_HSIZE = STATE_HSIZE; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 20; -#else - const int MAX_NUM_OF_SERIES = -1; -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6; -const int AVERAGING_LEVEL = 5; -const float EPS=1e-6; - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=50; -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN = false; - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - - -Expression squash(Expression& x) { - return log(x); -} -float squash(float x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} -float expand(float x) { - return exp(x); -} - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - float meanAbsSeasDiff; - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - - meanAbsSeasDiff = 0; - float sumf = 0; - for (int ip = SEASONALITY; ip0) - meanAbsSeasDiff = sumf / (vals.size() - SEASONALITY); - - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - -#if defined USE_ODBC -void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); -#endif - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; - Parameter sSm2; - array initSeasonality2; -}; -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - float sSm2; - array initSeasonality2; - vector levels; - vector seasons; - vector seasons2; -}; - - -array perfToRanking (array perf_arr) { - array index; - - for (int itop=0; itop losses; - for (unsigned int indx = 0; indx as_scalar(forecH.value())) - loss = loss + (actual - forecH)*ALPHA_MULTIP; - losses.push_back(loss); - } - return sum(losses) / OUTPUT_SIZE; -} - -// weighted quantile Loss -float wQuantLoss(vector& out_vect, vector& actuals_vect, float tau, int offset) {//used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 - float sumf = 0; float suma = 0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*tau; - else - sumf = sumf + (actual - forec)*(tau - 1); - } - return sumf / suma * 200; -} - -float errorFunc(vector& out_vect, vector& actuals_vect, float meanAbsSeasDiff) { - float sumf=0; - for (unsigned int indx = 0; indx forecH) - loss = loss + (actualf - forecH)*ALPHA_MULTIP; - sumf+=loss; - } - return sumf / (OUTPUT_SIZE*meanAbsSeasDiff); -} - - - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int ibigOffset = 0; - if (argc == 2) - ibigOffset = atoi(argv[1]); - - cout< 0) { - cout<<"Warning. LEVEL_VARIABILITY_PENALTY has to be equal zero if SEASONALITY_NUM==0"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 24k for yearly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - if (m4Obj.meanAbsSeasDiff==0) { - cout<<"Warning, flat series:"<0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - cout << "num of series:" << series_vect.size() << endl; - - unsigned int series_len=(unsigned int)series_vect.size(); - uniform_int_distribution uniOnSeries(0,series_len-1); // closed interval [a, b] - uniform_int_distribution uniOnNets(0,NUM_OF_NETS-1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>> testResults_map((int)series_len*1.5);//per series, etc... - unordered_map> finalResults_map((int)series_len*1.5);//per series - set diagSeries; - - unordered_map> netRanking_map; - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - //create nets - array paramsCollection_arr;//per net - array perSeriesParamsCollection_arr;//per net - array trainers_arr; - array perSeriesTrainers_arr; - - - #if defined USE_RESIDUAL_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #elif defined USE_ATTENTIVE_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #else - array, NUM_OF_NETS> rnnStack_arr; - #endif - - array MLPW_parArr; - array MLPB_parArr; - array adapterW_parArr; - array adapterB_parArr; - - //this is not a history, this is the real stuff - unordered_map* > additionalParams_mapOfArr((int)series_len*1.5); //per series, per net - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - additionalParams_mapOfArr[series]=new array(); - } - - for (int inet=0; inetclip_threshold = GRADIENT_CLIPPING; - perSeriesTrainers_arr[inet]=new AdamTrainer (perSeriesPC, INITIAL_LEARNING_RATE*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainers_arr[inet]->clip_threshold = GRADIENT_CLIPPING; - - auto& rNNStack=rnnStack_arr[inet]; - #if defined USE_RESIDUAL_LSTM - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il* additionalParams_arr=additionalParams_mapOfArr[series]; - additionalParams_arr->at(inet).levSm=perSeriesPC.add_parameters({1}, 0.5);//per series, per net - if (SEASONALITY_NUM > 0) { - additionalParams_arr->at(inet).sSm = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - if (SEASONALITY_NUM > 1) { - additionalParams_arr->at(inet).sSm2 = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality2[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - } - }//seting up, through nets - - //history of params. Series->[NUM_OF_NETS,NUM_OF_TRAIN_EPOCHS] - unordered_map, NUM_OF_NETS>*> historyOfAdditionalParams_map((int)series_len*1.5); - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - historyOfAdditionalParams_map[series]=new array, NUM_OF_NETS>(); - } - - //first assignment. Yes, we are using vector , so the very first time the duplicates are possible. But a set can't be sorted - array, NUM_OF_NETS> seriesAssignment;//every net has an array - for (int j=0; j> netPerf_map; - for (int inet=0; inetlearning_rate = LEARNING_RATES.at(iEpoch); - if (inet==0) - cout << "changing LR to:" << trainer->learning_rate << endl; - perSeriesTrainer->learning_rate = LEARNING_RATES.at(iEpoch)*PER_SERIES_LR_MULTIP; - } - - auto& rNNStack=rnnStack_arr[inet]; - Parameter& MLPW_par = MLPW_parArr[inet]; - Parameter& MLPB_par = MLPB_parArr[inet]; - Parameter& adapterW_par=adapterW_parArr[inet]; - Parameter& adapterB_par=adapterB_parArr[inet]; - - vector oneNetAssignments=seriesAssignment[inet]; - random_shuffle (oneNetAssignments.begin(), oneNetAssignments.end()); - - vector epochLosses; - vector forecLosses; vector levVarLosses; vector stateLosses; - for (auto iter = oneNetAssignments.begin() ; iter != oneNetAssignments.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - - ComputationGraph cg; - for (int il=0; ilat(inet); - array& historyOfAdditionalParams_arr=historyOfAdditionalParams_map[series]->at(inet); - - Expression MLPW_ex,MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex= parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea logDiffOfLevels_vect; - vector levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - Expression levelVarLoss_ex; - if (LEVEL_VARIABILITY_PENALTY > 0) { - vector levelVarLoss_v; - for (int i = 1; i losses;//losses of steps through single time series - for (int i=INPUT_SIZE-1; i<(m4Obj.n- OUTPUT_SIZE); i++) { - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - - first = m4Obj.vals.begin() + i + 1; - pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - firstE = season_exVect.begin() + i + 1; - pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - - firstE = season2_exVect.begin() + i + 1; - pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - }//through points of a series - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; itupdate();//update shared weights - perSeriesTrainer->update();//update params of this series only - } catch (exception& e) {//it may happen occasionally. I believe it is due to not robust enough implementation of squashing functions in Dynet. When abs(x)>35 NAs appear. - //so the code below is trying to produce some diagnostics, hopefully useful when setting LEVEL_VARIABILITY_PENALTY and C_STATE_PENALTY. - cerr<<"cought exception while doing "< maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax=it; - layerOfMax=il; - chunkOfMax= irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - if (SEASONALITY_NUM > 0) - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - if (SEASONALITY_NUM > 1) - cout << "sSm2:" << as_scalar(sSm2_ex.value()) << endl; - cout << "max abs:" << maxAbs <<" at time:"<< timeOfMax<<" at layer:"<< layerOfMax<<" and chunk:"<< chunkOfMax< 0) { - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea = 0; isea 1) { - histAdditionalParams.sSm2 = as_scalar(sSm2_ex.value()); - for (int isea=0; isea 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forec loss:" << averageForecLoss * 100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - cout<at(inet); - Expression MLPW_ex, MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex = parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; i0 then this is shortened, so it always contains data awe have right to access - Expression newLevel_ex = m4Obj.vals[i] * cdiv(levSm_ex, season_exVect[i]) + (1 - levSm_ex)*levels_exVect[i - 1]; - levels_exVect.push_back(newLevel_ex); - - Expression newSeason_ex = m4Obj.vals[i] * cdiv(sSm_ex, newLevel_ex) + (1 - sSm_ex)*season_exVect[i]; - season_exVect.push_back(newSeason_ex); - } - - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - - Expression inputSeasonality_ex; Expression inputSeasonality2_ex; - Expression outputSeasonality_ex; Expression outputSeasonality2_ex; - vector losses;//losses of steps through single time series - Expression out_ex;//we declare it here, bcause the last one will be the forecast - for (int i=INPUT_SIZE-1; i::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il::const_iterator first = m4Obj.vals.begin() + i + 1; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE;//checking if enough elements is in the vecor was done a few pe - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - //Expression loss_ex = pinBallLoss(out_ex, labels_ex); - Expression loss_ex = MSIS(out_ex, labels_ex); - if (i>=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); //training area losses - } - - if (i==(m4Obj.n-1)) {//validation loss - out_ex=expand(out_ex)*levels_exVect[i];//back to original scale - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios=0; ios 1 ) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios = 0; ios, AVERAGING_LEVEL+1>, NUM_OF_NETS>, BIG_LOOP>> testResults_map((int)series_len*1.5);//per series, big loop, etc... - //No epoch here, because this will just reflect the current (latest) situation - the last few epochs - vector out_vect=as_vector(out_ex.value()); - testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]=out_vect; - if (iEpoch>=AVERAGING_LEVEL && iEpoch % FREQ_OF_TEST==0) { - vector firstForec=testResults_map[series][inet][0]; - testResults_map[series][inet][AVERAGING_LEVEL]=firstForec; - for (int ii=1; ii nextForec=testResults_map[series][inet][ii]; - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - testResults_map[series][inet][AVERAGING_LEVEL][iii]+=nextForec[iii]; - } - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - testResults_map[series][inet][AVERAGING_LEVEL][iii]/=AVERAGING_LEVEL; - } //time to average - }//through series - } //through nets - - if (iEpoch>0 && iEpoch % FREQ_OF_TEST==0) { - //now that we have saved outputs of all nets on all series, let's calc how best and topn combinations performed during current epoch. - vector bestEpochLosses; - vector bestEpochAvgLosses; - vector topnEpochLosses; - vector topnEpochAvgLosses; - vector bestEpochLossesL; - vector bestEpochAvgLossesL; - vector topnEpochLossesL; - vector topnEpochAvgLossesL; - vector bestEpochLossesH; - vector bestEpochAvgLossesH; - vector topnEpochLossesH; - vector topnEpochAvgLossesH; - - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); -#endif - - float avgLoss; - vector avgLatest; - vector avgAvg; - - for (int itop=0; itop 0) { - float qLoss = errorFunc(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - bestEpochLosses.push_back(qLoss); - - qLoss=wQuantLoss(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - bestEpochLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - bestEpochLossesH.push_back(qLoss); - } - avgLatest=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]; //used later for calculating topn loss - - if (iEpoch>=AVERAGING_LEVEL) { - if (LBACK > 0) { - float qLoss = errorFunc(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - bestEpochAvgLosses.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - bestEpochAvgLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - bestEpochAvgLossesH.push_back(qLoss); - } - avgAvg=testResults_map[series][inet][AVERAGING_LEVEL]; - } - } else { - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) { - avgLatest[iii]+=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL][iii];//calculate current topn - if (iEpoch>=AVERAGING_LEVEL) - avgAvg[iii]+=testResults_map[series][inet][AVERAGING_LEVEL][iii]; - } - } - }//through topn - - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - avgLatest[iii]/=TOPN; - - if (LBACK > 0) { - float qLoss = errorFunc(avgLatest, m4Obj.testVals, m4Obj.meanAbsSeasDiff); - topnEpochLosses.push_back(qLoss); - - qLoss = wQuantLoss(avgLatest, m4Obj.testVals, TAUL, 0); - topnEpochLossesL.push_back(qLoss); - - qLoss = wQuantLoss(avgLatest, m4Obj.testVals, TAUH, OUTPUT_SIZE); - topnEpochLossesH.push_back(qLoss); - } - - if (iEpoch>=AVERAGING_LEVEL) { - for (int iii = 0; iii<2*OUTPUT_SIZE; iii++) - avgAvg[iii] /= TOPN; - - finalResults_map[series] = avgAvg; - - if (LBACK > 0) { -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&avgLoss, 0, NULL)); - - for (int iv=0; iv<2; iv++) { - if (iv==0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runL.c_str(), 0, &nullTerminatedStringOfRun)) - else - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runH.c_str(), 0, &nullTerminatedStringOfRun)); - - for (int iii=0; iii 0) { - float bestEpochLoss=accumulate( bestEpochLosses.begin(), bestEpochLosses.end(), 0.0)/bestEpochLosses.size(); - float topnEpochLoss=accumulate( topnEpochLosses.begin(), topnEpochLosses.end(), 0.0)/topnEpochLosses.size(); - float bestEpochLossL = accumulate(bestEpochLossesL.begin(), bestEpochLossesL.end(), 0.0) / bestEpochLossesL.size(); - float topnEpochLossL = accumulate(topnEpochLossesL.begin(), topnEpochLossesL.end(), 0.0) / topnEpochLossesL.size(); - float bestEpochLossH = accumulate(bestEpochLossesH.begin(), bestEpochLossesH.end(), 0.0) / bestEpochLossesH.size(); - float topnEpochLossH = accumulate(topnEpochLossesH.begin(), topnEpochLossesH.end(), 0.0) / topnEpochLossesH.size(); - cout<=AVERAGING_LEVEL) { - float bestEpochAvgLoss=accumulate( bestEpochAvgLosses.begin(), bestEpochAvgLosses.end(), 0.0)/bestEpochAvgLosses.size(); - float topnEpochAvgLoss=accumulate( topnEpochAvgLosses.begin(), topnEpochAvgLosses.end(), 0.0)/topnEpochAvgLosses.size(); - float bestEpochAvgLossL = accumulate(bestEpochAvgLossesL.begin(), bestEpochAvgLossesL.end(), 0.0) / bestEpochAvgLossesL.size(); - float topnEpochAvgLossL = accumulate(topnEpochAvgLossesL.begin(), topnEpochAvgLossesL.end(), 0.0) / topnEpochAvgLossesL.size(); - float bestEpochAvgLossH = accumulate(bestEpochAvgLossesH.begin(), bestEpochAvgLossesH.end(), 0.0) / bestEpochAvgLossesH.size(); - float topnEpochAvgLossH = accumulate(topnEpochAvgLossesH.begin(), topnEpochAvgLossesH.end(), 0.0) / topnEpochAvgLossesH.size(); - cout<<" bestAvg:"<> netRanking_map - netRanking_map[series]=perfToRanking(netPerf_map[series]); - - for (int itop=0; itop diagSeries; - for (int i=0; i<1; i++) {//add a few normal ones - int irand=uniOnSeries(rng); - diagSeries.insert(series_vect[irand]); - } - for(auto series : diagSeries) { - cout<at(inet); - for (int iEpoch=0; iEpoch 0 ) { - cout<<"sSm:"<at(inet); - for (int iEpoch=0; iEpoch 1 ) { - cout<<"sSm2:"<at(inet); - for (int iEpoch=0; iEpochat(inet); - for (int iEpoch = 0; iEpoch0) { - cout << "levels:" << iEpoch<<" "; - for (int iv = 0; iv 0 ) { - cout << "seasons:" << iEpoch<<" "; - for (int iv = 0; iv 1 ) { - cout << "seasons2:" << iEpoch<<" "; - for (int iv = 0; iv 10 1 -start 10 2 -Modern computers have at more then 2 cores, so e.g. on 6-core machine create and run the following script with 3 pairs of workers: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -seedForChunks have to be the same withion one pair, chunk numbers have to be 1 and 2. -We have added here the third parameter: ibigOffset. The straddle should be equal or bigger than BIG_LOOP. -Each pair goes through BIG_LOOP (by default 3, change in code below if you want) of model fitting and prediction, -so 2 pairs, as above, will produce 6 forecasts to be ensembled later, in R. -By increasing number of pairs, e.g. to 6 on 12-core computer, one can reduce BIG_LOOP to 1, so reduce execution time, and still have 6 forecasts - -a decent number to ensemble (in a separate, supplied R script). - -There are three blocks of parameters below, one active (starting with //PARAMS--------------) and two inactive. -The active block is setup as in the final run of forecasting quarterly series. Similarly Monthly block. -The Daily block is more of a demo, allowing to run quickly forecast for Daily series, although with slightly worse performance (use another program ES_RNN_E.cc for it). It was not used for the final submission. -So, you need comment/uncomment to have one block of interest active. - - -*/ - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - - -string DATA_DIR = "\\home\\deegup\\M4\\Dataset\\Train\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "\\home\\deegup\\M4\\output\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Quarterly"; -const string run0 = "(1,2),(4,8), LR=1e-3/{7,3e-4f},{11,1e-4f}, EPOCHS=16, LVP=200 40*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -vector> dilations = { { 1,2 },{ 4,8 } };//Each vector represents one chunk of Dilateed LSTMS, connected in resnNet fashion -const float INITIAL_LEARNING_RATE = 1e-3f; -//else -const map LEARNING_RATES = { { 7,3e-4f },{ 11,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -const int NUM_OF_TRAIN_EPOCHS = 16; -const unsigned int STATE_HSIZE = 40; - -const int SEASONALITY = 4; -const unsigned int INPUT_SIZE = 4; -const int INPUT_SIZE_I = INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 8; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I + MIN_INP_SEQ_LEN + 2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - -const float LEVEL_VARIABILITY_PENALTY = 200; //Multiplier for L" penalty against wigglines of level vector. - - -/* -string VARIABLE = "Monthly"; -const string run0 = "Res(1,3,6,12), LR=1e-3 {8,3e-4f},{13,1e-4f}, EPOCHS=14, LVP=50, 20*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -vector> dilations = { { 1,3,6,12 } };//Each vector represents one chunk of Dilateed LSTMS, connected in resnNet fashion^M -const float INITIAL_LEARNING_RATE = 1e-3f; -const map LEARNING_RATES = { { 8,3e-4f },{ 13,1e-4f } }; //at which epoch we set them up to what^M -const float PER_SERIES_LR_MULTIP = 1; - -const int NUM_OF_TRAIN_EPOCHS = 14; -const unsigned int STATE_HSIZE = 50; - -const float LEVEL_VARIABILITY_PENALTY = 50; //Multiplier for L" penalty against wigglines of level vector. - -const int SEASONALITY = 12; -const unsigned int OUTPUT_SIZE = 18; -const unsigned int INPUT_SIZE = 12; -const int INPUT_SIZE_I = INPUT_SIZE; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I + MIN_INP_SEQ_LEN + 2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; -*/ - -Expression squash(Expression& x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 40; -#else - const int MAX_NUM_OF_SERIES = -1; //use all series -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6;//in data provided -const int BIG_LOOP = 3; -const int NUM_OF_CHUNKS = 2; -const float EPS=1e-6; -const int AVERAGING_LEVEL=5; -const bool USE_MEDIAN = false; -const int MIDDLE_POS_FOR_AVG = 2; //if using medians - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=20; -const float C_STATE_PENALTY = 0; - -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN=true; -const unsigned ATTENTION_HSIZE=STATE_HSIZE; - -const bool USE_AUTO_LEARNING_RATE=false; -//if USE_AUTO_LEARNING_RATE, and only if LBACK>0 -const float MIN_LEARNING_RATE = 0.0001f; -const float LR_RATIO = sqrt(10); -const float LR_TOLERANCE_MULTIP = 1.005; -const int L3_PERIOD = 2; -const int MIN_EPOCHS_BEFORE_CHANGING_LRATE = 2; - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - float meanAbsSeasDiff; - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - - meanAbsSeasDiff = 0; - float sumf = 0; - for (int ip = SEASONALITY; ip0) - meanAbsSeasDiff = sumf / (vals.size() - SEASONALITY); - - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE_I) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE_I; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE_I; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE_I); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; -}; - -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - vector levels; - vector seasons; -}; - -//loss function -Expression MSIS(const Expression& out_ex, const Expression& actuals_ex) { - vector losses; - for (unsigned int indx = 0; indx as_scalar(forecH.value())) - loss = loss + (actual - forecH)*ALPHA_MULTIP; - losses.push_back(loss); - } - Expression ret = sum(losses) / OUTPUT_SIZE; - #if defined _DEBUG - float retf = as_scalar(ret.value()); - if (retf>100) { - vector out_vect = as_vector(out_ex.value()); - vector actuals_vect = as_vector(actuals_ex.value()); - for (int i = 0; i0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect, float tau, int offset) {//used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 - float sumf = 0; float suma = 0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*tau; - else - sumf = sumf + (actual - forec)*(tau - 1); - } - return sumf / suma * 200; -} - -//MSIS operating on floats, used for validation -float errorFunc(vector& out_vect, vector& actuals_vect, float meanAbsSeasDiff) { - float sumf=0; - for (unsigned int indx = 0; indx forecH) - loss = loss + (actualf - forecH)*ALPHA_MULTIP; - sumf+=loss; - } - return sumf / (OUTPUT_SIZE*meanAbsSeasDiff); -} - - - - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int seedForChunks = 10; //Yes it runs, without any params, but it will work only on 1/NUM_OF_CHUNKS of all cases. The system is expected to run in NUM_OF_CHUNKS multiples. - int chunkNo = 1; - int ibigOffset = 0; - if (argc >= 3) { - seedForChunks = atoi(argv[1]); - chunkNo = atoi(argv[2]); - } - if (argc >= 4) - ibigOffset = atoi(argv[3]); - - if (chunkNo > NUM_OF_CHUNKS) { - cerr << "chunkNo > NUM_OF_CHUNKS"; - exit(-1); - } - else if (chunkNo <= 0) { - cerr << "chunkNo <= 0"; - exit(-1); - } - - cout<0) - std::cout<< " ibigOffset:"<< ibigOffset; //if continuing prematurely stopped run - if (LBACK>0) - std::cout<<" lback:"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE_I+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister) - mt19937 rngForChunks(seedForChunks); - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 48/2=24k, for monthly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - if (m4Obj.meanAbsSeasDiff==0) { - cout<<"Warning, flat series:"<0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - - int series_len=(int)series_vect.size(); - int chunkSize= series_len/NUM_OF_CHUNKS; - std::cout << "num of series:" << series_vect.size() <<" size of chunk:"<< chunkSize< uniOnSeries(0, chunkSize -1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>> testResults_map((int)chunkSize*1.5); - set diagSeries; - - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - ParameterCollection pc; - ParameterCollection perSeriesPC; - - float learning_rate= INITIAL_LEARNING_RATE; - AdamTrainer trainer(pc, learning_rate, 0.9, 0.999, EPS); - trainer.clip_threshold = GRADIENT_CLIPPING; - AdamTrainer perSeriesTrainer(perSeriesPC, learning_rate*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainer.clip_threshold = GRADIENT_CLIPPING; - - #if defined USE_RESIDUAL_LSTM - vector rNNStack; - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(AttentiveDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, ATTENTION_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(DilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il oneChunk_vect(start,end); - if (PRINT_DIAGN) { - for (int k = 0; k<10; k++) //diag - cout << oneChunk_vect[k] << " "; - cout << endl; - } - if (chunkNo == NUM_OF_CHUNKS) - cout<<"last chunk size:"<< oneChunk_vect.size()< additionalParams_map((int)oneChunk_vect.size()*1.5); //per series - unordered_map*> historyOfAdditionalParams_map((int)oneChunk_vect.size()*1.5); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) {//setup - string series = *iter; - AdditionalParams addParams; - addParams.levSm = perSeriesPC.add_parameters({ 1 }, 0.5); //level smoothing - addParams.sSm = perSeriesPC.add_parameters({ 1 }, 0.5); //seasonality smoothing - for (int isea = 0; isea(); - } - - for (int iEpoch=0; iEpoch testLosses; //test losses of all series in this epoch - vector testAvgLosses; //test avg (over last few epochs) losses of all series in this epoch - vector testLossesL; //lower quantile loss - vector testAvgLossesL; //lower quantile loss - vector testLossesH; //higher quantile loss - vector testAvgLossesH; //higher quantile loss - vector trainingLosses; //training losses of all series in one epoch - vector forecLosses; vector levVarLosses; vector stateLosses; - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&iEpoch, 0, NULL)); - #endif - - for (auto iter = oneChunk_vect.begin() ; iter != oneChunk_vect.end(); ++iter) { - string series=*iter; - auto m4Obj = allSeries_map[series]; - - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); - #endif - - ComputationGraph cg; - for (int il=0; il season_exVect;//vector, because we do not know how long the series is - for (int iseas=0; iseas seas==1 - season_exVect.push_back(seas);//Expression is a simple struct, without any storage management, so the auto copy constructor works OK. - } - season_exVect.push_back(season_exVect[0]); - - vector logDiffOfLevels_vect; - vector levels_exVect; - Expression lev=cdiv(input(cg, m4Obj.vals[0]), season_exVect[0]); - levels_exVect.push_back(lev); - for (int i=1; i 0) { - vector levelVarLoss_v; - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx=season_exVect.size()-SEASONALITY; - for (int i=0;i<(OUTPUT_SIZE_I-SEASONALITY);i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx+i]); - } - vector losses; - for (int i=INPUT_SIZE_I-1; i<(m4Obj.n- OUTPUT_SIZE_I); i++) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() +i+1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex=input(cg,{INPUT_SIZE},input_vect); - Expression input1_ex=cdiv(input0_ex,inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]); - joinedInput_ex.emplace_back(noise(squash(input1_ex), NOISE_STD)); //normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex=concatenate(outputSeasonality_exVect); - - first = m4Obj.vals.begin() +i+1; - pastLast = m4Obj.vals.begin() +i+1+OUTPUT_SIZE_I; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels0_ex=input(cg,{OUTPUT_SIZE},labels_vect); - Expression labels1_ex=cdiv(labels0_ex,outputSeasonality_ex); //deseasonalization - labels1_ex= cdiv(labels1_ex, levels_exVect[i]);//normalization - Expression labels_ex=squash(labels1_ex); - - Expression loss_ex=MSIS(out_ex, labels_ex);//although out_ex has doubled size, labels_ex have normal size. NB, we do not have duplicated labels during training. - //Expression loss_ex=pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE_I+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - } - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; it maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax = it; - layerOfMax = il; - chunkOfMax = irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - cout << " min season=" << minSeason << endl; - cout << " min level=" << minLevel << endl; - cout << " max abs:" << maxAbs << " at time:" << timeOfMax << " at layer:" << layerOfMax << " and chunk:" << chunkOfMax << endl; - - //diagSeries.insert(series); - pc.reset_gradient(); - perSeriesPC.reset_gradient(); - } - - //saving per-series values for diagnostics purposes - AdditionalParamsF &histAdditionalParams= historyOfAdditionalParams_map[series]->at(iEpoch); - histAdditionalParams.levSm=as_scalar(levSm_ex.value()); - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea=0; isea::const_iterator firstE = season_exVect.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex = concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression input1_ex = cdiv(input0_ex, inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]);//normalization - joinedInput_ex.emplace_back(squash(input1_ex)); - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios=0; ios out_vect = as_vector(out_ex.value()); - - if (LBACK > 0) { - float qLoss = errorFunc(out_vect, m4Obj.testVals, m4Obj.meanAbsSeasDiff); - testLosses.push_back(qLoss); - - qLoss = wQuantLoss(out_vect, m4Obj.testVals, TAUL, 0); - testLossesL.push_back(qLoss); - - qLoss = wQuantLoss(out_vect, m4Obj.testVals, TAUH, OUTPUT_SIZE); - testLossesH.push_back(qLoss); - } - - testResults_map[series][iEpoch%AVERAGING_LEVEL] = out_vect; - if (iEpoch >= AVERAGING_LEVEL) { - if (USE_MEDIAN) { - if (testResults_map[series][AVERAGING_LEVEL].size() == 0) - testResults_map[series][AVERAGING_LEVEL] = out_vect; //just to initialized, to make space. The values will be overwritten - for (int iii = 0; iii < OUTPUT_SIZE_I*2; iii++) { - vector temp_vect2; - for (int ii = 0; ii firstForec = testResults_map[series][0]; - testResults_map[series][AVERAGING_LEVEL] = firstForec; - for (int ii = 1; ii nextForec = testResults_map[series][ii]; - for (int iii = 0; iii 0) { - float qLoss = errorFunc(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - testAvgLosses.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - testAvgLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - testAvgLossesH.push_back(qLoss); - - #if defined USE_ODBC //save - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&forecastLoss, 0, NULL)); - - for (int iv = 0; iv<2; iv++) { - if (iv == 0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runL.c_str(), 0, &nullTerminatedStringOfRun)) - else - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runH.c_str(), 0, &nullTerminatedStringOfRun)); - - for (int io = 0; io < OUTPUT_SIZE_I; io++) { - int ipos=OFFSET_TO_FIRST_ACTUAL + 1 + 2*io; - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&m4Obj.testVals[io], 0, NULL)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos+1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&testResults_map[series][AVERAGING_LEVEL][io + iv*OUTPUT_SIZE_I], 0, NULL)); - } - if (MAX_NUM_OF_SERIES<0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLExecute(hInsertStmt)); - } - #endif - } //lback>0 - } //time to average - }//last anchor point of the series - }//through TEST loop - }//through series - - - if (iEpoch % FREQ_OF_TEST == 0) { - float averageTrainingLoss = accumulate(trainingLosses.begin(), trainingLosses.end(), 0.0) / trainingLosses.size(); - - cout << ibig << " " << iEpoch << " loss:" << averageTrainingLoss * 100; - if (LEVEL_VARIABILITY_PENALTY > 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forecast loss:" << averageForecLoss*100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - - float averageTestLoss=0; - if (LBACK > 0) { - float averageTestLoss = accumulate(testLosses.begin(), testLosses.end(), 0.0) / testLosses.size(); - float averageTestLossL = accumulate(testLossesL.begin(), testLossesL.end(), 0.0) / testLossesL.size(); - float averageTestLossH = accumulate(testLossesH.begin(), testLossesH.end(), 0.0) / testLossesH.size(); - cout<<" Test loss:" << averageTestLoss<<" L:"<< averageTestLossL<<" H:"<< averageTestLossH; - if (iEpoch >= AVERAGING_LEVEL) { - float averageTestAvgLoss = accumulate(testAvgLosses.begin(), testAvgLosses.end(), 0.0) / testAvgLosses.size();//of this epoch - float averageTestAvgLossL = accumulate(testAvgLossesL.begin(), testAvgLossesL.end(), 0.0) / testAvgLossesL.size();//of this epoch - float averageTestAvgLossH = accumulate(testAvgLossesH.begin(), testAvgLossesH.end(), 0.0) / testAvgLossesH.size();//of this epoch - cout << " avgLoss:" << averageTestAvgLoss<<" L:"<< averageTestAvgLossL<<" H:"<< averageTestAvgLossH<= 2) { - if (iEpoch < L3_PERIOD) - changeL2Rate = perfValid_vect[perfValid_vect.size() - 2] MIN_LEARNING_RATE && (iEpoch - epochOfLastChangeOfLRate) >= MIN_EPOCHS_BEFORE_CHANGING_LRATE) { - learning_rate /= LR_RATIO; - cout << "decreasing LR to:" << learning_rate << endl; - epochOfLastChangeOfLRate = iEpoch; - trainer.learning_rate = learning_rate; - } - } - #if defined USE_ODBC - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLEndTran( - SQL_HANDLE_DBC, - hDbc, - SQL_COMMIT)); - #endif - }//through epochs - - if (PRINT_DIAGN) {//some diagnostic info - set diagSeries; - for (int i = 0; i<1; i++) {//add a few normal ones - int irand = uniOnSeries(rng); - diagSeries.insert(oneChunk_vect[irand]); - } - for (auto series : diagSeries) { - cout << endl << series << endl; - array* historyOfAdditionalParams_ptrToArr = historyOfAdditionalParams_map[series]; - cout << "lSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levSm << " "; - cout << endl; - cout << "sSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).sSm << " "; - cout << endl; - cout << "seasons:" << endl; - for (int isea = 0; iseaat(iEpoch).initSeasonality[isea] << " "; - cout << endl; - } - cout << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levels.size()>0) { - cout << "levels:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).levels.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).levels[iv] << ", "; - cout << endl; - cout << "seas:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).seasons.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).seasons[iv] << ", "; - cout << endl; - } - } - } - } - - //save the forecast to outputFile - ofstream outputFile; - outputFile.open(outputPathL); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) { - string series = *iter; - outputFile<< series; - for (int io=0; io 10 1 -start 10 2 -Modern computers have at more then 2 cores, so e.g. on 6-core machine create and run the following script with 3 pairs of workers: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -seedForChunks have to be the same withion one pair, chunk numbers have to be 1 and 2. -We have added here the third parameter: ibigOffset. The straddle should be equal or bigger than BIG_LOOP. -Each pair goes through BIG_LOOP (by default 3, change in code below if you want) of model fitting and prediction, -so 2 pairs, as above, will produce 6 forecasts to be ensembled later, in R. -By increasing number of pairs, e.g. to 6 on 12-core computer, one can reduce BIG_LOOP to 1, so reduce execution time, and still have 6 forecasts - -a decent number to ensemble (in a separate R script). - -There are three blocks of parameters below, one active (starting with //PARAMS--------------) and two inactive. -The active block is setup as in the final run of forecasting quarterly series. Similarly Monthly block. -The Daily block is more of a demo, allowing to run quickly forecast for Daily series, although with slightly worse performance (use another program ES_RNN_E.cc for it). It was not used for the final submission. -So, you need comment/uncomment to have one block of interest active. - - -*/ - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - - -// string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs //windows file paths corresponding ot slawek's local machine -string DATA_DIR="/home/deegup/sales_data/Train/"; //use with linux -// string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -string OUTPUT_DIR="/home/deegup/sales_data/output/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Quarterly"; -const string run = "50/45 (1,2),(4,8), LR=0.001/{10,1e-4f}, EPOCHS=15, LVP=80 40*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 45; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE. - -vector> dilations={{1,2},{4,8}};//Each vector represents one chunk of Dilateed LSTMS, connected in standard resnNet fashion -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM //so for Quarterly series, we do not use either the more advanced residual connections nor attention. -const bool ADD_NL_LAYER=false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -const float INITIAL_LEARNING_RATE = 0.001f; -const map LEARNING_RATES = { { 10,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 8; -const unsigned int STATE_HSIZE = 40; - -const int SEASONALITY = 4; -const unsigned int INPUT_SIZE = 4; -const int INPUT_SIZE_I= INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 3; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; -const int MIN_INP_SEQ_LEN = 0; -const float LEVEL_VARIABILITY_PENALTY = 80; //Multiplier for L" penalty against wigglines of level vector. Important. -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - - - -/* -string VARIABLE = "Monthly"; -const string run = "50/49 Res (1,3,6,12), LR=5e-4 {12,1e-4f}, EPOCHS=10, 20*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -#define USE_RESIDUAL_LSTM //so for Monthly we use only one block, so no standard resNet shortcuts, but instead but of the special residual shortcuts, after https://arxiv.org/abs/1701.03360. -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -vector> dilations={{1,3,6,12}};//so for Monthly we use only one block, so no standard resNet shortcut -const float INITIAL_LEARNING_RATE = 5e-4; -const map LEARNING_RATES = { { 12,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 10; -const unsigned int STATE_HSIZE = 50; - -const float LEVEL_VARIABILITY_PENALTY = 50; //Multiplier for L" penalty against wigglines of level vector. - -const int SEASONALITY = 12; -const unsigned int OUTPUT_SIZE = 18; -const unsigned int INPUT_SIZE = 12; -const int INPUT_SIZE_I= INPUT_SIZE; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years -*/ - - -/* -string VARIABLE = "Daily"; -const string run = "50/49 NL LRMult=1.5, 3/5 (1,7,28) LR=3e-4 {9,1e-4f} EPOCHS=15, LVP=100 HSIZE=40 20w"; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = true; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,7,28 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 9,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1.5; -const int NUM_OF_TRAIN_EPOCHS = 15; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const int INPUT_SIZE_I = INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 14; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to max of last 20 years -*/ - -Expression squash(Expression& x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} - -string INPUT_PATH = DATA_DIR + "time_series_nonan.csv"; -string INFO_INPUT_PATH = DATA_DIR + "sales-info.csv"; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 40; -#else - const int MAX_NUM_OF_SERIES = -1; //use all series -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 11;//in data provided -const int BIG_LOOP = 3; -const int NUM_OF_CHUNKS = 2; -const float EPS=1e-6; -const int AVERAGING_LEVEL=5; -const bool USE_MEDIAN = false; -const int MIDDLE_POS_FOR_AVG = 2; //if using medians - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=20; -const float C_STATE_PENALTY = 0; - -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN=true; -const float TAU = PERCENTILE / 100.; -const float TRAINING_TAU = TRAINING_PERCENTILE / 100.; -const unsigned ATTENTION_HSIZE=STATE_HSIZE; - -const bool USE_AUTO_LEARNING_RATE=false; -//if USE_AUTO_LEARNING_RATE, and only if LBACK>0 -const float MIN_LEARNING_RATE = 0.0001f; -const float LR_RATIO = sqrt(10); -const float LR_TOLERANCE_MULTIP = 1.005; -const int L3_PERIOD = 2; -const int MIN_EPOCHS_BEFORE_CHANGING_LRATE = 2; - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0,0,0,0,0,0 }; //construct one-hot vector indicating which categories are used - std::cout << "current category: " << category << endl; - if (category == "1.0") - categories[0] = 1; - else if (category == "2.0") - categories[1] = 1; - else if (category == "3.0") - categories[2] = 1; - else if (category == "4.0") - categories[3] = 1; - else if (category == "5.0") - categories[4] = 1; - else if (category == "6.0") - categories[5] = 1; - else if (category == "7.0") - categories[6] = 1; - else if (category == "8.0") - categories[7] = 1; - else if (category == "9.0") - categories[8] = 1; - else if (category == "10.0") - categories[9] = 1; - else if (category == "11.0") - categories[10] = 1; - else { - cerr << "unknown brand..."; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { //takes in parameters from line stream (seedsForChunks, chunkNum) - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE_I) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE_I; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE_I; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE_I); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) { //chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; -}; - -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - vector levels; - vector seasons; -}; - - -Expression pinBallLoss(const Expression& out_ex, const Expression& actuals_ex) {//used by Dynet, learning loss function - vector losses; - for (unsigned int indx = 0; indx as_scalar(forec.value())) - losses.push_back((actual - forec)*TRAINING_TAU); - else - losses.push_back((actual - forec)*(TRAINING_TAU - 1)); - } - return sum(losses) / OUTPUT_SIZE * 2; -} - - -//weighted quantile Loss, used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect) { //Looks like a swalek thing (not standard) - float sumf = 0; float suma=0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*TAU; - else - sumf = sumf + (actual - forec)*(TAU - 1); - } - return sumf / suma * 200; -} - -//used just for diagnostics, if LBACK>0 and PERCENTILE==50 -float sMAPE(vector& out_vect, vector& actuals_vect) { - float sumf = 0; - for (unsigned int indx = 0; indx& out_vect, vector& actuals_vect) { //use sMAPE or wQuant loss - if (PERCENTILE==50) - return sMAPE(out_vect, actuals_vect); - else - return wQuantLoss(out_vect, actuals_vect); -} - -int main(int argc, char** argv) { - std::cout << "here" << endl; - dynet::initialize(argc, argv); - - int seedForChunks = 10; //Yes it runs, without any params, but it will work only on 1/NUM_OF_CHUNKS of all cases. The system is expected to run in NUM_OF_CHUNKS multiples. - int chunkNo = 1; - int ibigOffset = 0; - if (argc >= 3) { - seedForChunks = atoi(argv[1]); - chunkNo = atoi(argv[2]); - } - if (argc >= 4) - ibigOffset = atoi(argv[3]); - - if (chunkNo > NUM_OF_CHUNKS) { - cerr << "chunkNo > NUM_OF_CHUNKS"; - exit(-1); - } - else if (chunkNo <= 0) { - cerr << "chunkNo <= 0"; - exit(-1); - } - - cout<0) - std::cout<< " ibigOffset:"<< ibigOffset; //if continuing prematurely stopped run - if (LBACK>0) - std::cout<<" lback:"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)run.c_str(), 0, &nullTerminatedStringOfRun)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE_I+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - std::cout << "HERE2" << endl; - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister) - mt19937 rngForChunks(seedForChunks); - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 48/2=24k, for monthly series - unordered_map seriesCategories_map(120000);//100k series - - std::cout << "INFO INPUT PATH: " << string(INFO_INPUT_PATH) << endl; - ifstream infoFile(INFO_INPUT_PATH); //take in lines - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //std::cout << "header" << endl; - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - allSeries_map[series] = m4Obj; - } - if (MAX_NUM_OF_SERIES>0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - //std::cout << "Got line---------" << endl; - } - - int series_len=(int)series_vect.size(); - int chunkSize= series_len/NUM_OF_CHUNKS; - std::cout << "num of series:" << series_vect.size() <<" size of chunk:"<< chunkSize< uniOnSeries(0, chunkSize -1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>> testResults_map((int)chunkSize*1.5); - set diagSeries; - - std::cout << "RIGHT BEFORE BIG LOOP" << endl; - - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - ParameterCollection pc; - ParameterCollection perSeriesPC; - - float learning_rate= INITIAL_LEARNING_RATE; //SET UP TRAINER OBJECT - AdamTrainer trainer(pc, learning_rate, 0.9, 0.999, EPS); - trainer.clip_threshold = GRADIENT_CLIPPING; - AdamTrainer perSeriesTrainer(perSeriesPC, learning_rate*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainer.clip_threshold = GRADIENT_CLIPPING; - - #if defined USE_RESIDUAL_LSTM //MODEL CODE - vector rNNStack; - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(AttentiveDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, ATTENTION_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(DilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il oneChunk_vect(start,end); - if (PRINT_DIAGN) { - for (int k = 0; k<10; k++) //diag - cout << oneChunk_vect[k] << " "; - cout << endl; - } - if (chunkNo == NUM_OF_CHUNKS) - cout<<"last chunk size:"<< oneChunk_vect.size()< additionalParams_map((int)oneChunk_vect.size()*1.5); //per series - unordered_map*> historyOfAdditionalParams_map((int)oneChunk_vect.size()*1.5); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) {//setup - string series = *iter; - AdditionalParams addParams; - addParams.levSm = perSeriesPC.add_parameters({ 1 }, 0.5); //level smoothing - addParams.sSm = perSeriesPC.add_parameters({ 1 }, 0.5); //seasonality smoothing - for (int isea = 0; isea(); - } - - std::cout << "num train epochs: " << NUM_OF_TRAIN_EPOCHS << endl; - //BEGIN TRAINING (iterate through num_epochs) - for (int iEpoch=0; iEpoch testLosses; //test losses of all series in this epoch - vector testAvgLosses; //test avg (over last few epochs) losses of all series in this epoch - vector trainingLosses; //training losses of all series in one epoch - vector forecLosses; vector levVarLosses; vector stateLosses; - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&iEpoch, 0, NULL)); - #endif - - std::cout << "entering one chunk iteration" << endl; - - for (auto iter = oneChunk_vect.begin() ; iter != oneChunk_vect.end(); ++iter) { - string series=*iter; - auto m4Obj = allSeries_map[series]; - - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); - #endif - - ComputationGraph cg; //SET UP COMPUTATION GRAPH and load model's layers into it - for (int il=0; il season_exVect;//vector, because we do not know how long the series is - for (int iseas=0; iseas seas==1 - season_exVect.push_back(seas);//Expression is a simple struct, without any storage management, so the auto copy constructor works OK. - } - season_exVect.push_back(season_exVect[0]); - - vector logDiffOfLevels_vect; - vector levels_exVect; - Expression lev=cdiv(input(cg, m4Obj.vals[0]), season_exVect[0]); - levels_exVect.push_back(lev); - for (int i=1; i 0) { - vector levelVarLoss_v; //calculate loss from each level during- - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx=season_exVect.size()-SEASONALITY; - for (int i=0;i<(OUTPUT_SIZE_I-SEASONALITY);i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx+i]); - } - vector losses; - for (int i=INPUT_SIZE_I-1; i<(m4Obj.n- OUTPUT_SIZE_I); i++) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() +i+1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex=input(cg,{INPUT_SIZE},input_vect); - Expression input1_ex=cdiv(input0_ex,inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]); - joinedInput_ex.emplace_back(noise(squash(input1_ex), NOISE_STD)); //normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - //MAKE RESNET STYLE EXPRESSION - //std::cout << "generating resnet-style expression..." << endl; - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex=concatenate(outputSeasonality_exVect); - - first = m4Obj.vals.begin() +i+1; - pastLast = m4Obj.vals.begin() +i+1+OUTPUT_SIZE_I; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels0_ex=input(cg,{OUTPUT_SIZE},labels_vect); - Expression labels1_ex=cdiv(labels0_ex,outputSeasonality_ex); //deseasonalization - labels1_ex= cdiv(labels1_ex, levels_exVect[i]);//normalization - Expression labels_ex=squash(labels1_ex); - - Expression loss_ex=pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE_I+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - } - - std::cout << "In epoch: " << iEpoch << endl; - //std::cout << "Will begin computing frorecast loss" << endl; - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; it maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax = it; - layerOfMax = il; - chunkOfMax = irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - cout << " min season=" << minSeason << endl; - cout << " min level=" << minLevel << endl; - cout << " max abs:" << maxAbs << " at time:" << timeOfMax << " at layer:" << layerOfMax << " and chunk:" << chunkOfMax << endl; - - //diagSeries.insert(series); - pc.reset_gradient(); - perSeriesPC.reset_gradient(); - } - - std::cout << "saving per-series values for diagnostic purposes" << endl; - //saving per-series values for diagnostics purposes - AdditionalParamsF &histAdditionalParams= historyOfAdditionalParams_map[series]->at(iEpoch); - histAdditionalParams.levSm=as_scalar(levSm_ex.value()); - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea=0; isea::const_iterator firstE = season_exVect.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex = concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression input1_ex = cdiv(input0_ex, inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]);//normalization - joinedInput_ex.emplace_back(squash(input1_ex)); - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - std::cout << endl; - std::cout << "Trying rnn_exp" << endl; - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - Expression out_ex; - if (ADD_NL_LAYER) { - out_ex=MLPW_ex*rnn_ex+MLPB_ex; - out_ex = adapterW_ex*tanh(out_ex)+adapterB_ex; - } else - out_ex=adapterW_ex*rnn_ex+adapterB_ex; - - out_ex = cmult(expand(out_ex), outputSeasonality_ex)*levels_exVect[i];//back to original scale - vector out_vect = as_vector(out_ex.value()); - std::cout << "out vect size: " << out_vect.size() << endl; - - if (LBACK > 0) { - float qLoss = errorFunc(out_vect, m4Obj.testVals); - testLosses.push_back(qLoss); - } - - //std::cout << "out_vect: " << to_string(out_vect) << endl; - - testResults_map[series][iEpoch%AVERAGING_LEVEL] = out_vect; - std::cout << "HERE5 iEpoch" << iEpoch << endl; - if (iEpoch >= AVERAGING_LEVEL) { - std::cout << "HERE6" << endl; - if (USE_MEDIAN) { - std::cout << "HERE7" << endl; - if (testResults_map[series][AVERAGING_LEVEL].size() == 0) - testResults_map[series][AVERAGING_LEVEL] = out_vect; //just to initialized, to make space. The values will be overwritten - std::cout << "VECTOR INITIALIZED" << endl; - for (int iii = 0; iii < OUTPUT_SIZE_I; iii++) { - vector temp_vect2; - for (int ii = 0; ii firstForec = testResults_map[series][0]; - testResults_map[series][AVERAGING_LEVEL] = firstForec; - std::cout << "HELLO" << endl; - std::cout << firstForec.size() << endl; - for (int ii = 1; ii nextForec = testResults_map[series][ii]; - for (int iii = 0; iii 0) { - float qLoss = errorFunc(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals); - testAvgLosses.push_back(qLoss); - - #if defined USE_ODBC //save - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&forecastLoss, 0, NULL)); - - for (int io = 0; io < OUTPUT_SIZE_I; io++) { - int ipos=OFFSET_TO_FIRST_ACTUAL + 1 + 2*io; - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&m4Obj.testVals[io], 0, NULL)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos+1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&testResults_map[series][AVERAGING_LEVEL][io], 0, NULL)); - } - if (MAX_NUM_OF_SERIES<0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLExecute(hInsertStmt)); - #endif - } - } //time to average - std::cout << "average found" << endl; - }//last anchor point of the series - std::cout << "last anchor point found" << endl; - }//through TEST loop - std::cout << "done with TEST loop" << endl; - }//through series - std::cout << "done with series" << endl; - - std::cout << "-------------FINISHED LOOP----------------"; - if (iEpoch % FREQ_OF_TEST == 0) { - float averageTrainingLoss = accumulate(trainingLosses.begin(), trainingLosses.end(), 0.0) / trainingLosses.size(); - - cout << ibig << " " << iEpoch << " loss:" << averageTrainingLoss * 100; - if (LEVEL_VARIABILITY_PENALTY > 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forecast loss:" << averageForecLoss*100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - - float averageTestLoss=0; - if (LBACK > 0) { - float averageTestLoss = accumulate(testLosses.begin(), testLosses.end(), 0.0) / testLosses.size(); - cout<<" Test loss:" << averageTestLoss; - if (iEpoch >= AVERAGING_LEVEL) { - float averageTestAvgLoss = accumulate(testAvgLosses.begin(), testAvgLosses.end(), 0.0) / testAvgLosses.size();//of this epoch - cout << " avgLoss:" << averageTestAvgLoss; - } - if (USE_AUTO_LEARNING_RATE) - perfValid_vect.push_back(averageTestLoss); - } - cout << endl; - } - - if (USE_AUTO_LEARNING_RATE) { - bool changeL2Rate = false; - if (iEpoch >= 2) { - if (iEpoch < L3_PERIOD) - changeL2Rate = perfValid_vect[perfValid_vect.size() - 2] MIN_LEARNING_RATE && (iEpoch - epochOfLastChangeOfLRate) >= MIN_EPOCHS_BEFORE_CHANGING_LRATE) { - learning_rate /= LR_RATIO; - cout << "decreasing LR to:" << learning_rate << endl; - epochOfLastChangeOfLRate = iEpoch; - trainer.learning_rate = learning_rate; - } - } - #if defined USE_ODBC - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLEndTran( - SQL_HANDLE_DBC, - hDbc, - SQL_COMMIT)); - #endif - }//through epochs - - if (PRINT_DIAGN) {//some diagnostic info - set diagSeries; - for (int i = 0; i<1; i++) {//add a few normal ones - int irand = uniOnSeries(rng); - diagSeries.insert(oneChunk_vect[irand]); - } - for (auto series : diagSeries) { - cout << endl << series << endl; - array* historyOfAdditionalParams_ptrToArr = historyOfAdditionalParams_map[series]; - cout << "lSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levSm << " "; - cout << endl; - cout << "sSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).sSm << " "; - cout << endl; - cout << "seasons:" << endl; - for (int isea = 0; iseaat(iEpoch).initSeasonality[isea] << " "; - cout << endl; - } - cout << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levels.size()>0) { - cout << "levels:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).levels.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).levels[iv] << ", "; - cout << endl; - cout << "seas:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).seasons.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).seasons[iv] << ", "; - cout << endl; - } - } - } - } - - std::cout << "starting forecast save" << endl; - //save the forecast to outputFile - ofstream outputFile; - outputFile.open(outputPath); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) { - string series = *iter; - outputFile<< series; - for (int io=0; io, AVERAGING_LEVEL+1>> element : testResults_map) { - std::cout << element.first << " size: " << element.second.size() << endl; - std::cout << element.second[0].size() << endl; - std::cout << element.second[1].size() << endl; - std::cout << element.second[2].size() << endl; - std::cout << element.second[3].size() << endl; - std::cout << element.second[4].size() << endl; - std::cout << element.second[5].size() << endl; - } - outputFile << ", "<< testResults_map[series][AVERAGING_LEVEL][io]; - } - outputFile< -#include -#include -#include - -#if defined DEBUG - #define _DEBUG -#endif - -using namespace std; - -namespace dynet { - - // ResidualDilatedLSTMBuilder based on Vanilla LSTM - enum { _X2I, _H2I, _BI, _X2F, _H2F, _BF, _X2O, _H2O, _BO, _X2G, _H2G, _BG }; - enum { LN_GH, LN_BH, LN_GX, LN_BX, LN_GC, LN_BC }; - - ResidualDilatedLSTMBuilder::ResidualDilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), ln_lstm(false), forget_bias(1.f), dropout_masks_valid(false) { } - - ResidualDilatedLSTMBuilder::ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm, float forget_bias) : dilations(dilations), layers(unsigned(dilations.size())), - input_dim(input_dim), hid(hidden_dim), ln_lstm(ln_lstm), forget_bias(forget_bias), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("ResidualDilated-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_x2i = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_h2i = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - //Parameter p_c2i = model.add_parameters({hidden_dim, hidden_dim}); - Parameter p_bi = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_x2i, p_h2i, /*p_c2i,*/ p_bi }; - params.push_back(ps); - - if (ln_lstm) { - Parameter p_gh = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(1.f)); - Parameter p_bh = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - Parameter p_gx = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(1.f)); - Parameter p_bx = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - Parameter p_gc = model.add_parameters({ hidden_dim }, ParameterInitConst(1.f)); - Parameter p_bc = model.add_parameters({ hidden_dim }, ParameterInitConst(0.f)); - vector ln_ps = { p_gh, p_bh, p_gx, p_bx, p_gc, p_bc }; - ln_params.push_back(ln_ps); - } - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void ResidualDilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - if (ln_lstm)ln_param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); } - param_vars.push_back(vars); - if (ln_lstm) { - auto& ln_p = ln_params[i]; - vector ln_vars; - for (unsigned j = 0; j < ln_p.size(); ++j) { ln_vars.push_back(update ? parameter(cg, ln_p[j]) : const_parameter(cg, ln_p[j])); } - ln_param_vars.push_back(ln_vars); - } - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void ResidualDilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "ResidualDilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } - else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void ResidualDilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & ResidualDilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression ResidualDilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "ResidualDilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = h.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression ResidualDilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "ResidualDilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = c.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression ResidualDilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset = dilations[i] - 1; - const vector& vars = param_vars[i]; - - Expression i_h_tm1, i_c_tm1; - bool has_prev_state = (prev >= 0 || has_initial_state); - if (prev < dilation_offset) { - if (has_initial_state) { - // intial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } - else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } - else { - i_h_tm1 = h[prev - dilation_offset][i]; - i_c_tm1 = c[prev - dilation_offset][i]; - } - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - if (dropout_rate > 0.f) { - in = cmult(in, masks[i][0]); - } - if (has_prev_state && dropout_rate_h > 0.f) - i_h_tm1 = cmult(i_h_tm1, masks[i][1]); - // input - Expression tmp; - Expression i_ait; - Expression i_aft; - Expression i_aot; - Expression i_agt; - if (ln_lstm) { - const vector& ln_vars = ln_param_vars[i]; - if (has_prev_state) - tmp = vars[_BI] + layer_norm(vars[_X2I] * in, ln_vars[LN_GX], ln_vars[LN_BX]) + layer_norm(vars[_H2I] * i_h_tm1, ln_vars[LN_GH], ln_vars[LN_BH]); - else - tmp = vars[_BI] + layer_norm(vars[_X2I] * in, ln_vars[LN_GX], ln_vars[LN_BX]); - } - else { - if (has_prev_state) - tmp = affine_transform({ vars[_BI], vars[_X2I], in, vars[_H2I], i_h_tm1 }); - else - tmp = affine_transform({ vars[_BI], vars[_X2I], in }); - } - i_ait = pick_range(tmp, 0, hid); - i_aft = pick_range(tmp, hid, hid * 2); - i_aot = pick_range(tmp, hid * 2, hid * 3); - i_agt = pick_range(tmp, hid * 3, hid * 4); - Expression i_it = logistic(i_ait); - if (forget_bias != 0.0) - tmp = logistic(i_aft + forget_bias); - else - tmp = logistic(i_aft); - - Expression i_ft = tmp; - Expression i_ot = logistic(i_aot); - Expression i_gt = tanh(i_agt); - - ct[i] = has_prev_state ? (cmult(i_ft, i_c_tm1) + cmult(i_it, i_gt)) : cmult(i_it, i_gt); - if (ln_lstm) { - const vector& ln_vars = ln_param_vars[i]; - if (i==0) - in = ht[i] = cmult(i_ot, tanh(layer_norm(ct[i], ln_vars[LN_GC], ln_vars[LN_BC]))); - else - in = ht[i] = cmult(i_ot, in+tanh(layer_norm(ct[i], ln_vars[LN_GC], ln_vars[LN_BC]))); - } - else { - if (i==0) - in = ht[i] = cmult(i_ot, tanh(ct[i])); - else - in = ht[i] = cmult(i_ot, in+tanh(ct[i])); - } - } - return ht.back(); - } - - void ResidualDilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const ResidualDilatedLSTMBuilder & rnn_lstm = (const ResidualDilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy ResidualDilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - for (size_t i = 0; i < ln_params.size(); ++i) - for (size_t j = 0; j < ln_params[i].size(); ++j) - ln_params[i][j] = rnn_lstm.ln_params[i][j]; - } - - void ResidualDilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void ResidualDilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void ResidualDilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - - - - //enum { _X2I, _H2I, _BI, _X2F, _H2F, _BF, _X2O, _H2O, _BO, _X2G, _H2G, _BG }; - enum { _X2I_, _H2I_, _BI_, _XA1, _HA1, _SA1, _BA1, _A2, _B2 }; - - -//*************************** - - - - AttentiveDilatedLSTMBuilder::AttentiveDilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), weightnoise_std(0), dropout_masks_valid(false) { } - - AttentiveDilatedLSTMBuilder::AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model) - : max_dilations(max_dilations), layers(unsigned(max_dilations.size())), - input_dim(input_dim), hid(hidden_dim), attention_dim(attention_dim), weightnoise_std(0), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("compact-vanilla-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_Wx = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_Wh = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - Parameter p_b = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - Parameter p_Wxa1 = local_model.add_parameters({ attention_dim, layer_input_dim }); - Parameter p_Wha1 = local_model.add_parameters({ attention_dim, hidden_dim }); - Parameter p_Wsa1 = local_model.add_parameters({ attention_dim, hidden_dim }); - Parameter p_ba1 = local_model.add_parameters({ attention_dim }, ParameterInitConst(0.f)); - - Parameter p_Wa2 = local_model.add_parameters({ max_dilations[i], attention_dim }); - Parameter p_ba2 = local_model.add_parameters({ max_dilations[i] }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_Wx, p_Wh, p_b, p_Wxa1, p_Wha1, p_Wsa1, p_ba1, p_Wa2, p_ba2 }; - params.push_back(ps); - - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void AttentiveDilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { - vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); - } - param_vars.push_back(vars); - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void AttentiveDilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "AttentiveDilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } - else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void AttentiveDilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & AttentiveDilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression AttentiveDilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "AttentiveDilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = unsigned(h.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression AttentiveDilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "AttentiveDilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = unsigned(c.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression AttentiveDilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset= max_dilations[i]-1; - const vector& vars = param_vars[i]; - Expression i_h_tm1, i_c_tm1; - if (prev < dilation_offset) { - if (has_initial_state) { - // initial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } - else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } - else { - if (dilation_offset>0) { - //enum { _X2I, _H2I, _BI, _XA1, _HA1, _SA1, _BA1, _A2, _B2 }; - Expression weights_ex=vars[_XA1]*in+ vars[_HA1]*h[prev][i]+ vars[_SA1]*c[prev][i]+ vars[_BA1]; - weights_ex=tanh(weights_ex); - weights_ex=vars[_A2]* weights_ex+ vars[_B2]; - weights_ex =softmax(weights_ex); - #if defined _DEBUG - vector weights=as_vector(weights_ex.value()); - #endif - - unsigned indx=0; - Expression w_ex = pick(weights_ex, indx); - Expression avg_h= cmult(h[prev][i], w_ex); - for (indx=1; indx <= dilation_offset; indx++) {//dilation_offset==max_dilations[i]-1, so together with indx==0, we cover max_dilations[i] steps - w_ex = pick(weights_ex, indx); - avg_h = avg_h+cmult(h[prev- indx][i], w_ex); - } - i_h_tm1 = avg_h; - } else { - i_h_tm1 = h[prev- dilation_offset][i]; - } - i_c_tm1 = c[prev- dilation_offset][i]; - } - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - Expression gates_t = vanilla_lstm_gates_dropout({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], masks[i][0], masks[i][1], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - else { - Expression gates_t = vanilla_lstm_gates({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - } - return ht.back(); - } - - void AttentiveDilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const AttentiveDilatedLSTMBuilder & rnn_lstm = (const AttentiveDilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy AttentiveDilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - } - - void AttentiveDilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void AttentiveDilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void AttentiveDilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - void AttentiveDilatedLSTMBuilder::set_weightnoise(float std) { - DYNET_ARG_CHECK(std >= 0.f, "weight noise must have standard deviation >=0"); - weightnoise_std = std; - } - - //*/ - - DilatedLSTMBuilder::DilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), weightnoise_std(0), dropout_masks_valid(false) { } - - DilatedLSTMBuilder::DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model) - : dilations(dilations), layers(unsigned(dilations.size())), - input_dim(input_dim), hid(hidden_dim), weightnoise_std(0), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("compact-vanilla-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_Wx = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_Wh = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - Parameter p_b = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_Wx, p_Wh, p_b }; - params.push_back(ps); - - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void DilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); } - param_vars.push_back(vars); - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void DilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "DilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void DilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & DilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression DilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "DilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = unsigned(h.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression DilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "DilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = unsigned(c.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression DilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset = dilations[i] - 1; - const vector& vars = param_vars[i]; - Expression i_h_tm1, i_c_tm1; - if (prev < dilation_offset) { - if (has_initial_state) { - // initial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } else { // t > 0 - i_h_tm1 = h[prev - dilation_offset][i]; - i_c_tm1 = c[prev - dilation_offset][i]; - } - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - Expression gates_t = vanilla_lstm_gates_dropout({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], masks[i][0], masks[i][1], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } else { - Expression gates_t = vanilla_lstm_gates({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - } - return ht.back(); - } - - void DilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const DilatedLSTMBuilder & rnn_lstm = (const DilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy DilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - } - - void DilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void DilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void DilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - void DilatedLSTMBuilder::set_weightnoise(float std) { - DYNET_ARG_CHECK(std >= 0.f, "weight noise must have standard deviation >=0"); - weightnoise_std = std; - } - -} // namespace dynet diff --git a/prototypes/ES_RNN/sales_limited/github/c++/slstm.h b/prototypes/ES_RNN/sales_limited/github/c++/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M4.sln b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M4.sln deleted file mode 100644 index bb0f246f..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M4.sln +++ /dev/null @@ -1,58 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "M41", "M41\M41.vcxproj", "{928301A0-F01A-48F6-A499-851B3CE8BD4E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "M42", "M42\M42.vcxproj", "{A16B5466-E680-43F6-A884-A4A01EB78E50}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "M43", "M43\M43.vcxproj", "{BE951571-3F3A-4048-BAA3-0C05F38CFF42}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "M44", "M44\M44.vcxproj", "{7A192E0C-8F58-4D65-998E-3A7010AB5F87}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - RelWithDebug|x64 = RelWithDebug|x64 - RelWithDebug|x86 = RelWithDebug|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.Debug|x64.ActiveCfg = Debug|x64 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.Debug|x64.Build.0 = Debug|x64 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.Debug|x86.ActiveCfg = Debug|Win32 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.Debug|x86.Build.0 = Debug|Win32 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.RelWithDebug|x64.ActiveCfg = RelWithDebug|x64 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.RelWithDebug|x64.Build.0 = RelWithDebug|x64 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.RelWithDebug|x86.ActiveCfg = RelWithDebug|Win32 - {928301A0-F01A-48F6-A499-851B3CE8BD4E}.RelWithDebug|x86.Build.0 = RelWithDebug|Win32 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.Debug|x64.ActiveCfg = Debug|x64 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.Debug|x64.Build.0 = Debug|x64 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.Debug|x86.ActiveCfg = Debug|Win32 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.Debug|x86.Build.0 = Debug|Win32 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.RelWithDebug|x64.ActiveCfg = RelWithDebug|x64 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.RelWithDebug|x64.Build.0 = RelWithDebug|x64 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.RelWithDebug|x86.ActiveCfg = RelWithDebug|Win32 - {A16B5466-E680-43F6-A884-A4A01EB78E50}.RelWithDebug|x86.Build.0 = RelWithDebug|Win32 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.Debug|x64.ActiveCfg = Debug|x64 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.Debug|x64.Build.0 = Debug|x64 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.Debug|x86.ActiveCfg = Debug|Win32 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.Debug|x86.Build.0 = Debug|Win32 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.RelWithDebug|x64.ActiveCfg = RelWithDebug|x64 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.RelWithDebug|x64.Build.0 = RelWithDebug|x64 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.RelWithDebug|x86.ActiveCfg = RelWithDebug|Win32 - {BE951571-3F3A-4048-BAA3-0C05F38CFF42}.RelWithDebug|x86.Build.0 = RelWithDebug|Win32 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.Debug|x64.ActiveCfg = Debug|x64 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.Debug|x64.Build.0 = Debug|x64 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.Debug|x86.ActiveCfg = Debug|Win32 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.Debug|x86.Build.0 = Debug|Win32 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.RelWithDebug|x64.ActiveCfg = RelWithDebug|x64 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.RelWithDebug|x64.Build.0 = RelWithDebug|x64 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.RelWithDebug|x86.ActiveCfg = RelWithDebug|Win32 - {7A192E0C-8F58-4D65-998E-3A7010AB5F87}.RelWithDebug|x86.Build.0 = RelWithDebug|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/ES_RNN.cc b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/ES_RNN.cc deleted file mode 100644 index de503796..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/ES_RNN.cc +++ /dev/null @@ -1,1194 +0,0 @@ -/*ES-RNN: ES-RNN Exponential Smoothing Recurrent Neural Network hybrid. Point forecast. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. -It is meant to be used for Monthly and Quarterly series of M4 competition, becasue the DE (Diversified Ensemble) version is too slow. -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -It has to be invoked in pair of executables, passing at least two integers: seedForChunks, chunkNo -so e.g. create a script with following lines on Windows -start 10 1 -start 10 2 -Modern computers have at more then 2 cores, so e.g. on 6-core machine create and run the following script with 3 pairs of workers: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -seedForChunks have to be the same withion one pair, chunk numbers have to be 1 and 2. -We have added here the third parameter: ibigOffset. The straddle should be equal or bigger than BIG_LOOP. -Each pair goes through BIG_LOOP (by default 3, change in code below if you want) of model fitting and prediction, -so 2 pairs, as above, will produce 6 forecasts to be ensembled later, in R. -By increasing number of pairs, e.g. to 6 on 12-core computer, one can reduce BIG_LOOP to 1, so reduce execution time, and still have 6 forecasts - -a decent number to ensemble (in a separate R script). - -There are three blocks of parameters below, one active (starting with //PARAMS--------------) and two inactive. -The active block is setup as in the final run of forecasting quarterly series. Similarly Monthly block. -The Daily block is more of a demo, allowing to run quickly forecast for Daily series, although with slightly worse performance (use another program ES_RNN_E.cc for it). It was not used for the final submission. -So, you need comment/uncomment to have one block of interest active. - - -*/ - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Quarterly"; -const string run = "50/45 (1,2),(4,8), LR=0.001/{10,1e-4f}, EPOCHS=15, LVP=80 40*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 45; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE. - -vector> dilations={{1,2},{4,8}};//Each vector represents one chunk of Dilateed LSTMS, connected in standard resnNet fashion -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM //so for Quarterly series, we do not use either the more advanced residual connections nor attention. -const bool ADD_NL_LAYER=false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -const float INITIAL_LEARNING_RATE = 0.001f; -const map LEARNING_RATES = { { 10,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 15; -const unsigned int STATE_HSIZE = 40; - -const int SEASONALITY = 4; -const unsigned int INPUT_SIZE = 4; -const int INPUT_SIZE_I= INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 8; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; -const int MIN_INP_SEQ_LEN = 0; -const float LEVEL_VARIABILITY_PENALTY = 80; //Multiplier for L" penalty against wigglines of level vector. Important. -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - - - -/* -string VARIABLE = "Monthly"; -const string run = "50/49 Res (1,3,6,12), LR=5e-4 {12,1e-4f}, EPOCHS=10, 20*"; -const float PERCENTILE = 50; //we always use Pinball loss, although on normalized values. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -#define USE_RESIDUAL_LSTM //so for Monthly we use only one block, so no standard resNet shortcuts, but instead but of the special residual shortcuts, after https://arxiv.org/abs/1701.03360. -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -vector> dilations={{1,3,6,12}};//so for Monthly we use only one block, so no standard resNet shortcut -const float INITIAL_LEARNING_RATE = 5e-4; -const map LEARNING_RATES = { { 12,1e-4f } }; //at which epoch we set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const int NUM_OF_TRAIN_EPOCHS = 10; -const unsigned int STATE_HSIZE = 50; - -const float LEVEL_VARIABILITY_PENALTY = 50; //Multiplier for L" penalty against wigglines of level vector. - -const int SEASONALITY = 12; -const unsigned int OUTPUT_SIZE = 18; -const unsigned int INPUT_SIZE = 12; -const int INPUT_SIZE_I= INPUT_SIZE; -const int OUTPUT_SIZE_I= OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I+ MIN_INP_SEQ_LEN+2; -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years -*/ - - -/* -string VARIABLE = "Daily"; -const string run = "50/49 NL LRMult=1.5, 3/5 (1,7,28) LR=3e-4 {9,1e-4f} EPOCHS=15, LVP=100 HSIZE=40 20w"; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = true; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,7,28 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 9,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1.5; -const int NUM_OF_TRAIN_EPOCHS = 15; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const int INPUT_SIZE_I = INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 14; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 20 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to max of last 20 years -*/ - -Expression squash(Expression& x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 40; -#else - const int MAX_NUM_OF_SERIES = -1; //use all series -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6;//in data provided -const int BIG_LOOP = 3; -const int NUM_OF_CHUNKS = 2; -const float EPS=1e-6; -const int AVERAGING_LEVEL=5; -const bool USE_MEDIAN = false; -const int MIDDLE_POS_FOR_AVG = 2; //if using medians - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=20; -const float C_STATE_PENALTY = 0; - -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN=true; -const float TAU = PERCENTILE / 100.; -const float TRAINING_TAU = TRAINING_PERCENTILE / 100.; -const unsigned ATTENTION_HSIZE=STATE_HSIZE; - -const bool USE_AUTO_LEARNING_RATE=false; -//if USE_AUTO_LEARNING_RATE, and only if LBACK>0 -const float MIN_LEARNING_RATE = 0.0001f; -const float LR_RATIO = sqrt(10); -const float LR_TOLERANCE_MULTIP = 1.005; -const int L3_PERIOD = 2; -const int MIN_EPOCHS_BEFORE_CHANGING_LRATE = 2; - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE_I) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE_I; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE_I; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE_I); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) { //chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; -}; - -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - vector levels; - vector seasons; -}; - - -Expression pinBallLoss(const Expression& out_ex, const Expression& actuals_ex) {//used by Dynet, learning loss function - vector losses; - for (unsigned int indx = 0; indx as_scalar(forec.value())) - losses.push_back((actual - forec)*TRAINING_TAU); - else - losses.push_back((actual - forec)*(TRAINING_TAU - 1)); - } - return sum(losses) / OUTPUT_SIZE * 2; -} - - -//weighted quantile Loss, used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect) { - float sumf = 0; float suma=0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*TAU; - else - sumf = sumf + (actual - forec)*(TAU - 1); - } - return sumf / suma * 200; -} - -//used just for diagnostics, if LBACK>0 and PERCENTILE==50 -float sMAPE(vector& out_vect, vector& actuals_vect) { - float sumf = 0; - for (unsigned int indx = 0; indx& out_vect, vector& actuals_vect) { - if (PERCENTILE==50) - return sMAPE(out_vect, actuals_vect); - else - return wQuantLoss(out_vect, actuals_vect); -} - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int seedForChunks = 10; //Yes it runs, without any params, but it will work only on 1/NUM_OF_CHUNKS of all cases. The system is expected to run in NUM_OF_CHUNKS multiples. - int chunkNo = 1; - int ibigOffset = 0; - if (argc >= 3) { - seedForChunks = atoi(argv[1]); - chunkNo = atoi(argv[2]); - } - if (argc >= 4) - ibigOffset = atoi(argv[3]); - - if (chunkNo > NUM_OF_CHUNKS) { - cerr << "chunkNo > NUM_OF_CHUNKS"; - exit(-1); - } - else if (chunkNo <= 0) { - cerr << "chunkNo <= 0"; - exit(-1); - } - - cout<0) - std::cout<< " ibigOffset:"<< ibigOffset; //if continuing prematurely stopped run - if (LBACK>0) - std::cout<<" lback:"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)run.c_str(), 0, &nullTerminatedStringOfRun)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE_I+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister) - mt19937 rngForChunks(seedForChunks); - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 48/2=24k, for monthly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - allSeries_map[series] = m4Obj; - } - if (MAX_NUM_OF_SERIES>0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - - int series_len=(int)series_vect.size(); - int chunkSize= series_len/NUM_OF_CHUNKS; - std::cout << "num of series:" << series_vect.size() <<" size of chunk:"<< chunkSize< uniOnSeries(0, chunkSize -1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>> testResults_map((int)chunkSize*1.5); - set diagSeries; - - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - ParameterCollection pc; - ParameterCollection perSeriesPC; - - float learning_rate= INITIAL_LEARNING_RATE; - AdamTrainer trainer(pc, learning_rate, 0.9, 0.999, EPS); - trainer.clip_threshold = GRADIENT_CLIPPING; - AdamTrainer perSeriesTrainer(perSeriesPC, learning_rate*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainer.clip_threshold = GRADIENT_CLIPPING; - - #if defined USE_RESIDUAL_LSTM - vector rNNStack; - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(AttentiveDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, ATTENTION_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(DilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il oneChunk_vect(start,end); - if (PRINT_DIAGN) { - for (int k = 0; k<10; k++) //diag - cout << oneChunk_vect[k] << " "; - cout << endl; - } - if (chunkNo == NUM_OF_CHUNKS) - cout<<"last chunk size:"<< oneChunk_vect.size()< additionalParams_map((int)oneChunk_vect.size()*1.5); //per series - unordered_map*> historyOfAdditionalParams_map((int)oneChunk_vect.size()*1.5); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) {//setup - string series = *iter; - AdditionalParams addParams; - addParams.levSm = perSeriesPC.add_parameters({ 1 }, 0.5); //level smoothing - addParams.sSm = perSeriesPC.add_parameters({ 1 }, 0.5); //seasonality smoothing - for (int isea = 0; isea(); - } - - for (int iEpoch=0; iEpoch testLosses; //test losses of all series in this epoch - vector testAvgLosses; //test avg (over last few epochs) losses of all series in this epoch - vector trainingLosses; //training losses of all series in one epoch - vector forecLosses; vector levVarLosses; vector stateLosses; - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&iEpoch, 0, NULL)); - #endif - - for (auto iter = oneChunk_vect.begin() ; iter != oneChunk_vect.end(); ++iter) { - string series=*iter; - auto m4Obj = allSeries_map[series]; - - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); - #endif - - ComputationGraph cg; - for (int il=0; il season_exVect;//vector, because we do not know how long the series is - for (int iseas=0; iseas seas==1 - season_exVect.push_back(seas);//Expression is a simple struct, without any storage management, so the auto copy constructor works OK. - } - season_exVect.push_back(season_exVect[0]); - - vector logDiffOfLevels_vect; - vector levels_exVect; - Expression lev=cdiv(input(cg, m4Obj.vals[0]), season_exVect[0]); - levels_exVect.push_back(lev); - for (int i=1; i 0) { - vector levelVarLoss_v; - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx=season_exVect.size()-SEASONALITY; - for (int i=0;i<(OUTPUT_SIZE_I-SEASONALITY);i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx+i]); - } - vector losses; - for (int i=INPUT_SIZE_I-1; i<(m4Obj.n- OUTPUT_SIZE_I); i++) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() +i+1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex=input(cg,{INPUT_SIZE},input_vect); - Expression input1_ex=cdiv(input0_ex,inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]); - joinedInput_ex.emplace_back(noise(squash(input1_ex), NOISE_STD)); //normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex=concatenate(outputSeasonality_exVect); - - first = m4Obj.vals.begin() +i+1; - pastLast = m4Obj.vals.begin() +i+1+OUTPUT_SIZE_I; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels0_ex=input(cg,{OUTPUT_SIZE},labels_vect); - Expression labels1_ex=cdiv(labels0_ex,outputSeasonality_ex); //deseasonalization - labels1_ex= cdiv(labels1_ex, levels_exVect[i]);//normalization - Expression labels_ex=squash(labels1_ex); - - Expression loss_ex=pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE_I+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - } - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; it maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax = it; - layerOfMax = il; - chunkOfMax = irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - cout << " min season=" << minSeason << endl; - cout << " min level=" << minLevel << endl; - cout << " max abs:" << maxAbs << " at time:" << timeOfMax << " at layer:" << layerOfMax << " and chunk:" << chunkOfMax << endl; - - //diagSeries.insert(series); - pc.reset_gradient(); - perSeriesPC.reset_gradient(); - } - - //saving per-series values for diagnostics purposes - AdditionalParamsF &histAdditionalParams= historyOfAdditionalParams_map[series]->at(iEpoch); - histAdditionalParams.levSm=as_scalar(levSm_ex.value()); - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea=0; isea::const_iterator firstE = season_exVect.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex = concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression input1_ex = cdiv(input0_ex, inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]);//normalization - joinedInput_ex.emplace_back(squash(input1_ex)); - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - Expression out_ex; - if (ADD_NL_LAYER) { - out_ex=MLPW_ex*rnn_ex+MLPB_ex; - out_ex = adapterW_ex*tanh(out_ex)+adapterB_ex; - } else - out_ex=adapterW_ex*rnn_ex+adapterB_ex; - - out_ex = cmult(expand(out_ex), outputSeasonality_ex)*levels_exVect[i];//back to original scale - vector out_vect = as_vector(out_ex.value()); - - if (LBACK > 0) { - float qLoss = errorFunc(out_vect, m4Obj.testVals); - testLosses.push_back(qLoss); - } - - testResults_map[series][iEpoch%AVERAGING_LEVEL] = out_vect; - if (iEpoch >= AVERAGING_LEVEL) { - if (USE_MEDIAN) { - if (testResults_map[series][AVERAGING_LEVEL].size() == 0) - testResults_map[series][AVERAGING_LEVEL] = out_vect; //just to initialized, to make space. The values will be overwritten - for (int iii = 0; iii < OUTPUT_SIZE_I; iii++) { - vector temp_vect2; - for (int ii = 0; ii firstForec = testResults_map[series][0]; - testResults_map[series][AVERAGING_LEVEL] = firstForec; - for (int ii = 1; ii nextForec = testResults_map[series][ii]; - for (int iii = 0; iii 0) { - float qLoss = errorFunc(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals); - testAvgLosses.push_back(qLoss); - - #if defined USE_ODBC //save - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&forecastLoss, 0, NULL)); - - for (int io = 0; io < OUTPUT_SIZE_I; io++) { - int ipos=OFFSET_TO_FIRST_ACTUAL + 1 + 2*io; - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&m4Obj.testVals[io], 0, NULL)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos+1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&testResults_map[series][AVERAGING_LEVEL][io], 0, NULL)); - } - if (MAX_NUM_OF_SERIES<0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLExecute(hInsertStmt)); - #endif - } - } //time to average - }//last anchor point of the series - }//through TEST loop - }//through series - - - if (iEpoch % FREQ_OF_TEST == 0) { - float averageTrainingLoss = accumulate(trainingLosses.begin(), trainingLosses.end(), 0.0) / trainingLosses.size(); - - cout << ibig << " " << iEpoch << " loss:" << averageTrainingLoss * 100; - if (LEVEL_VARIABILITY_PENALTY > 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forecast loss:" << averageForecLoss*100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - - float averageTestLoss=0; - if (LBACK > 0) { - float averageTestLoss = accumulate(testLosses.begin(), testLosses.end(), 0.0) / testLosses.size(); - cout<<" Test loss:" << averageTestLoss; - if (iEpoch >= AVERAGING_LEVEL) { - float averageTestAvgLoss = accumulate(testAvgLosses.begin(), testAvgLosses.end(), 0.0) / testAvgLosses.size();//of this epoch - cout << " avgLoss:" << averageTestAvgLoss; - } - if (USE_AUTO_LEARNING_RATE) - perfValid_vect.push_back(averageTestLoss); - } - cout << endl; - } - - if (USE_AUTO_LEARNING_RATE) { - bool changeL2Rate = false; - if (iEpoch >= 2) { - if (iEpoch < L3_PERIOD) - changeL2Rate = perfValid_vect[perfValid_vect.size() - 2] MIN_LEARNING_RATE && (iEpoch - epochOfLastChangeOfLRate) >= MIN_EPOCHS_BEFORE_CHANGING_LRATE) { - learning_rate /= LR_RATIO; - cout << "decreasing LR to:" << learning_rate << endl; - epochOfLastChangeOfLRate = iEpoch; - trainer.learning_rate = learning_rate; - } - } - #if defined USE_ODBC - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLEndTran( - SQL_HANDLE_DBC, - hDbc, - SQL_COMMIT)); - #endif - }//through epochs - - if (PRINT_DIAGN) {//some diagnostic info - set diagSeries; - for (int i = 0; i<1; i++) {//add a few normal ones - int irand = uniOnSeries(rng); - diagSeries.insert(oneChunk_vect[irand]); - } - for (auto series : diagSeries) { - cout << endl << series << endl; - array* historyOfAdditionalParams_ptrToArr = historyOfAdditionalParams_map[series]; - cout << "lSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levSm << " "; - cout << endl; - cout << "sSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).sSm << " "; - cout << endl; - cout << "seasons:" << endl; - for (int isea = 0; iseaat(iEpoch).initSeasonality[isea] << " "; - cout << endl; - } - cout << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levels.size()>0) { - cout << "levels:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).levels.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).levels[iv] << ", "; - cout << endl; - cout << "seas:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).seasons.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).seasons[iv] << ", "; - cout << endl; - } - } - } - } - - //save the forecast to outputFile - ofstream outputFile; - outputFile.open(outputPath); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) { - string series = *iter; - outputFile<< series; - for (int io=0; io - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - RelWithDebug - Win32 - - - RelWithDebug - x64 - - - - - - - - - - - {928301A0-F01A-48F6-A499-851B3CE8BD4E} - Win32Proj - M41 - 8.1 - - - - Application - true - v140 - Unicode - - - Application - true - v140 - Unicode - - - Application - false - v140 - true - Unicode - - - Application - true - v140 - Unicode - Sequential - - - Application - true - v140 - Unicode - Sequential - - - Application - false - v140 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - false - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - NotUsing - Level1 - Disabled - WIN32;_WINDOWS;EIGEN_USE_MKL_ALL;EIGEN_FAST_MATH;NOMINMAX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - - - Console - true - E:\progs2\dynet\buildMKL\dynet\Debug - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - NotUsing - Level1 - MaxSpeed - WIN32;_WINDOWS;EIGEN_FAST_MATH;EIGEN_USE_MKL_ALL;NOMINMAX;NDEBUG_;CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - AnySuitable - true - Speed - AdvancedVectorExtensions - Default - MultiThreadedDLL - ProgramDatabase - true - false - - - Console - true - E:\progs2\dynet\buildMKL\dynet\RelWithDebInfo - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/M41.vcxproj.user b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/M41.vcxproj.user deleted file mode 100644 index 0129efb1..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/M41.vcxproj.user +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - WindowsLocalDebugger - - - - - WindowsLocalDebugger - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/slstm.cpp b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/slstm.cpp deleted file mode 100644 index ca53a03b..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/slstm.cpp +++ /dev/null @@ -1,729 +0,0 @@ -/* -My implementation of dilated LSTMs, based on Dynet LSTM builders -- DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) -- ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 -- AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#include "slstm.h" -#include "dynet/lstm.h" -#include "dynet/param-init.h" - -#include -#include -#include -#include - -#if defined DEBUG - #define _DEBUG -#endif - -using namespace std; - -namespace dynet { - - // ResidualDilatedLSTMBuilder based on Vanilla LSTM - enum { _X2I, _H2I, _BI, _X2F, _H2F, _BF, _X2O, _H2O, _BO, _X2G, _H2G, _BG }; - enum { LN_GH, LN_BH, LN_GX, LN_BX, LN_GC, LN_BC }; - - ResidualDilatedLSTMBuilder::ResidualDilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), ln_lstm(false), forget_bias(1.f), dropout_masks_valid(false) { } - - ResidualDilatedLSTMBuilder::ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm, float forget_bias) : dilations(dilations), layers(unsigned(dilations.size())), - input_dim(input_dim), hid(hidden_dim), ln_lstm(ln_lstm), forget_bias(forget_bias), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("ResidualDilated-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_x2i = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_h2i = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - //Parameter p_c2i = model.add_parameters({hidden_dim, hidden_dim}); - Parameter p_bi = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_x2i, p_h2i, /*p_c2i,*/ p_bi }; - params.push_back(ps); - - if (ln_lstm) { - Parameter p_gh = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(1.f)); - Parameter p_bh = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - Parameter p_gx = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(1.f)); - Parameter p_bx = model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - Parameter p_gc = model.add_parameters({ hidden_dim }, ParameterInitConst(1.f)); - Parameter p_bc = model.add_parameters({ hidden_dim }, ParameterInitConst(0.f)); - vector ln_ps = { p_gh, p_bh, p_gx, p_bx, p_gc, p_bc }; - ln_params.push_back(ln_ps); - } - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void ResidualDilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - if (ln_lstm)ln_param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); } - param_vars.push_back(vars); - if (ln_lstm) { - auto& ln_p = ln_params[i]; - vector ln_vars; - for (unsigned j = 0; j < ln_p.size(); ++j) { ln_vars.push_back(update ? parameter(cg, ln_p[j]) : const_parameter(cg, ln_p[j])); } - ln_param_vars.push_back(ln_vars); - } - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void ResidualDilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "ResidualDilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } - else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void ResidualDilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & ResidualDilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression ResidualDilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "ResidualDilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = h.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression ResidualDilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "ResidualDilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = c.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression ResidualDilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset = dilations[i] - 1; - const vector& vars = param_vars[i]; - - Expression i_h_tm1, i_c_tm1; - bool has_prev_state = (prev >= 0 || has_initial_state); - if (prev < dilation_offset) { - if (has_initial_state) { - // intial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } - else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } - else { - i_h_tm1 = h[prev - dilation_offset][i]; - i_c_tm1 = c[prev - dilation_offset][i]; - } - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - if (dropout_rate > 0.f) { - in = cmult(in, masks[i][0]); - } - if (has_prev_state && dropout_rate_h > 0.f) - i_h_tm1 = cmult(i_h_tm1, masks[i][1]); - // input - Expression tmp; - Expression i_ait; - Expression i_aft; - Expression i_aot; - Expression i_agt; - if (ln_lstm) { - const vector& ln_vars = ln_param_vars[i]; - if (has_prev_state) - tmp = vars[_BI] + layer_norm(vars[_X2I] * in, ln_vars[LN_GX], ln_vars[LN_BX]) + layer_norm(vars[_H2I] * i_h_tm1, ln_vars[LN_GH], ln_vars[LN_BH]); - else - tmp = vars[_BI] + layer_norm(vars[_X2I] * in, ln_vars[LN_GX], ln_vars[LN_BX]); - } - else { - if (has_prev_state) - tmp = affine_transform({ vars[_BI], vars[_X2I], in, vars[_H2I], i_h_tm1 }); - else - tmp = affine_transform({ vars[_BI], vars[_X2I], in }); - } - i_ait = pick_range(tmp, 0, hid); - i_aft = pick_range(tmp, hid, hid * 2); - i_aot = pick_range(tmp, hid * 2, hid * 3); - i_agt = pick_range(tmp, hid * 3, hid * 4); - Expression i_it = logistic(i_ait); - if (forget_bias != 0.0) - tmp = logistic(i_aft + forget_bias); - else - tmp = logistic(i_aft); - - Expression i_ft = tmp; - Expression i_ot = logistic(i_aot); - Expression i_gt = tanh(i_agt); - - ct[i] = has_prev_state ? (cmult(i_ft, i_c_tm1) + cmult(i_it, i_gt)) : cmult(i_it, i_gt); - if (ln_lstm) { - const vector& ln_vars = ln_param_vars[i]; - if (i==0) - in = ht[i] = cmult(i_ot, tanh(layer_norm(ct[i], ln_vars[LN_GC], ln_vars[LN_BC]))); - else - in = ht[i] = cmult(i_ot, in+tanh(layer_norm(ct[i], ln_vars[LN_GC], ln_vars[LN_BC]))); - } - else { - if (i==0) - in = ht[i] = cmult(i_ot, tanh(ct[i])); - else - in = ht[i] = cmult(i_ot, in+tanh(ct[i])); - } - } - return ht.back(); - } - - void ResidualDilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const ResidualDilatedLSTMBuilder & rnn_lstm = (const ResidualDilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy ResidualDilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - for (size_t i = 0; i < ln_params.size(); ++i) - for (size_t j = 0; j < ln_params[i].size(); ++j) - ln_params[i][j] = rnn_lstm.ln_params[i][j]; - } - - void ResidualDilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void ResidualDilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void ResidualDilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - - - - //enum { _X2I, _H2I, _BI, _X2F, _H2F, _BF, _X2O, _H2O, _BO, _X2G, _H2G, _BG }; - enum { _X2I_, _H2I_, _BI_, _XA1, _HA1, _SA1, _BA1, _A2, _B2 }; - - -//*************************** - - - - AttentiveDilatedLSTMBuilder::AttentiveDilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), weightnoise_std(0), dropout_masks_valid(false) { } - - AttentiveDilatedLSTMBuilder::AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model) - : max_dilations(max_dilations), layers(unsigned(max_dilations.size())), - input_dim(input_dim), hid(hidden_dim), attention_dim(attention_dim), weightnoise_std(0), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("compact-vanilla-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_Wx = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_Wh = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - Parameter p_b = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - Parameter p_Wxa1 = local_model.add_parameters({ attention_dim, layer_input_dim }); - Parameter p_Wha1 = local_model.add_parameters({ attention_dim, hidden_dim }); - Parameter p_Wsa1 = local_model.add_parameters({ attention_dim, hidden_dim }); - Parameter p_ba1 = local_model.add_parameters({ attention_dim }, ParameterInitConst(0.f)); - - Parameter p_Wa2 = local_model.add_parameters({ max_dilations[i], attention_dim }); - Parameter p_ba2 = local_model.add_parameters({ max_dilations[i] }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_Wx, p_Wh, p_b, p_Wxa1, p_Wha1, p_Wsa1, p_ba1, p_Wa2, p_ba2 }; - params.push_back(ps); - - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void AttentiveDilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { - vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); - } - param_vars.push_back(vars); - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void AttentiveDilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "AttentiveDilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } - else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void AttentiveDilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & AttentiveDilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression AttentiveDilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "AttentiveDilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = unsigned(h.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression AttentiveDilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "AttentiveDilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = unsigned(c.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression AttentiveDilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset= max_dilations[i]-1; - const vector& vars = param_vars[i]; - Expression i_h_tm1, i_c_tm1; - if (prev < dilation_offset) { - if (has_initial_state) { - // initial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } - else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } - else { - if (dilation_offset>0) { - //enum { _X2I, _H2I, _BI, _XA1, _HA1, _SA1, _BA1, _A2, _B2 }; - Expression weights_ex=vars[_XA1]*in+ vars[_HA1]*h[prev][i]+ vars[_SA1]*c[prev][i]+ vars[_BA1]; - weights_ex=tanh(weights_ex); - weights_ex=vars[_A2]* weights_ex+ vars[_B2]; - weights_ex =softmax(weights_ex); - #if defined _DEBUG - vector weights=as_vector(weights_ex.value()); - #endif - - unsigned indx=0; - Expression w_ex = pick(weights_ex, indx); - Expression avg_h= cmult(h[prev][i], w_ex); - for (indx=1; indx <= dilation_offset; indx++) {//dilation_offset==max_dilations[i]-1, so together with indx==0, we cover max_dilations[i] steps - w_ex = pick(weights_ex, indx); - avg_h = avg_h+cmult(h[prev- indx][i], w_ex); - } - i_h_tm1 = avg_h; - } else { - i_h_tm1 = h[prev- dilation_offset][i]; - } - i_c_tm1 = c[prev- dilation_offset][i]; - } - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - Expression gates_t = vanilla_lstm_gates_dropout({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], masks[i][0], masks[i][1], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - else { - Expression gates_t = vanilla_lstm_gates({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - } - return ht.back(); - } - - void AttentiveDilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const AttentiveDilatedLSTMBuilder & rnn_lstm = (const AttentiveDilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy AttentiveDilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - } - - void AttentiveDilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void AttentiveDilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void AttentiveDilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - void AttentiveDilatedLSTMBuilder::set_weightnoise(float std) { - DYNET_ARG_CHECK(std >= 0.f, "weight noise must have standard deviation >=0"); - weightnoise_std = std; - } - - //*/ - - DilatedLSTMBuilder::DilatedLSTMBuilder() : has_initial_state(false), layers(0), input_dim(0), hid(0), dropout_rate_h(0), weightnoise_std(0), dropout_masks_valid(false) { } - - DilatedLSTMBuilder::DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model) - : dilations(dilations), layers(unsigned(dilations.size())), - input_dim(input_dim), hid(hidden_dim), weightnoise_std(0), dropout_masks_valid(false) { - unsigned layer_input_dim = input_dim; - local_model = model.add_subcollection("compact-vanilla-lstm-builder"); - for (unsigned i = 0; i < layers; ++i) { - // i - Parameter p_Wx = local_model.add_parameters({ hidden_dim * 4, layer_input_dim }); - Parameter p_Wh = local_model.add_parameters({ hidden_dim * 4, hidden_dim }); - Parameter p_b = local_model.add_parameters({ hidden_dim * 4 }, ParameterInitConst(0.f)); - - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = { p_Wx, p_Wh, p_b }; - params.push_back(ps); - - } // layers - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - - void DilatedLSTMBuilder::new_graph_impl(ComputationGraph& cg, bool update) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - vector vars; - for (unsigned j = 0; j < p.size(); ++j) { vars.push_back(update ? parameter(cg, p[j]) : const_parameter(cg, p[j])); } - param_vars.push_back(vars); - } - - _cg = &cg; - } - // layout: 0..layers = c - // layers+1..2*layers = h - void DilatedLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - - if (hinit.size() > 0) { - DYNET_ARG_CHECK(layers * 2 == hinit.size(), - "DilatedLSTMBuilder must be initialized with 2 times as many expressions as layers " - "(hidden state, and cell for each layer). However, for " << layers << " layers, " << - hinit.size() << " expressions were passed in"); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } else { - has_initial_state = false; - } - - dropout_masks_valid = false; - } - - void DilatedLSTMBuilder::set_dropout_masks(unsigned batch_size) { - masks.clear(); - for (unsigned i = 0; i < layers; ++i) { - std::vector masks_i; - unsigned idim = (i == 0) ? input_dim : hid; - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - float retention_rate = 1.f - dropout_rate; - float retention_rate_h = 1.f - dropout_rate_h; - float scale = 1.f / retention_rate; - float scale_h = 1.f / retention_rate_h; - // in - masks_i.push_back(random_bernoulli(*_cg, Dim({ idim }, batch_size), retention_rate, scale)); - // h - masks_i.push_back(random_bernoulli(*_cg, Dim({ hid }, batch_size), retention_rate_h, scale_h)); - masks.push_back(masks_i); - } - } - dropout_masks_valid = true; - } - - ParameterCollection & DilatedLSTMBuilder::get_parameter_collection() { - return local_model; - } - - // TODO - Make this correct - // Copied c from the previous step (otherwise c.size()< h.size()) - // Also is creating a new step something we want? - // wouldn't overwriting the current one be better? - Expression DilatedLSTMBuilder::set_h_impl(int prev, const vector& h_new) { - DYNET_ARG_CHECK(h_new.empty() || h_new.size() == layers, - "DilatedLSTMBuilder::set_h expects as many inputs as layers, but got " << - h_new.size() << " inputs for " << layers << " layers"); - const unsigned t = unsigned(h.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - // Current implementation : s_new is either {new_c[0],...,new_c[n]} - // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} - Expression DilatedLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - DYNET_ARG_CHECK(s_new.size() == layers || s_new.size() == 2 * layers, - "DilatedLSTMBuilder::set_s expects either as many inputs or twice as many inputs as layers, but got " << s_new.size() << " inputs for " << layers << " layers"); - bool only_c = s_new.size() == layers; - const unsigned t = unsigned(c.size()); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); - } - - Expression DilatedLSTMBuilder::add_input_impl(int prev, const Expression& x) { - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - Expression in = x; - if ((dropout_rate > 0.f || dropout_rate_h > 0.f) && !dropout_masks_valid) set_dropout_masks(x.dim().bd); - for (unsigned i = 0; i < layers; ++i) { - int dilation_offset = dilations[i] - 1; - const vector& vars = param_vars[i]; - Expression i_h_tm1, i_c_tm1; - if (prev < dilation_offset) { - if (has_initial_state) { - // initial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } else { - i_h_tm1 = zeros(*_cg, Dim({ vars[_BI].dim()[0] / 4 }, x.dim().bd)); - i_c_tm1 = i_h_tm1; - } - } else { // t > 0 - i_h_tm1 = h[prev - dilation_offset][i]; - i_c_tm1 = c[prev - dilation_offset][i]; - } - if (dropout_rate > 0.f || dropout_rate_h > 0.f) { - // apply dropout according to https://arxiv.org/abs/1512.05287 (tied weights) - Expression gates_t = vanilla_lstm_gates_dropout({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], masks[i][0], masks[i][1], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } else { - Expression gates_t = vanilla_lstm_gates({ in }, i_h_tm1, vars[_X2I], vars[_H2I], vars[_BI], weightnoise_std); - ct[i] = vanilla_lstm_c(i_c_tm1, gates_t); - in = ht[i] = vanilla_lstm_h(ct[i], gates_t); - } - } - return ht.back(); - } - - void DilatedLSTMBuilder::copy(const RNNBuilder & rnn) { - const DilatedLSTMBuilder & rnn_lstm = (const DilatedLSTMBuilder&)rnn; - DYNET_ARG_CHECK(params.size() == rnn_lstm.params.size(), - "Attempt to copy DilatedLSTMBuilder with different number of parameters " - "(" << params.size() << " != " << rnn_lstm.params.size() << ")"); - for (size_t i = 0; i < params.size(); ++i) - for (size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; - } - - void DilatedLSTMBuilder::set_dropout(float d) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d; - } - - void DilatedLSTMBuilder::set_dropout(float d, float d_h) { - DYNET_ARG_CHECK(d >= 0.f && d <= 1.f && d_h >= 0.f && d_h <= 1.f, - "dropout rate must be a probability (>=0 and <=1)"); - dropout_rate = d; - dropout_rate_h = d_h; - } - - void DilatedLSTMBuilder::disable_dropout() { - dropout_rate = 0.f; - dropout_rate_h = 0.f; - } - void DilatedLSTMBuilder::set_weightnoise(float std) { - DYNET_ARG_CHECK(std >= 0.f, "weight noise must have standard deviation >=0"); - weightnoise_std = std; - } - -} // namespace dynet diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/slstm.h b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M41/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/ES_RNN_PI.cc b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/ES_RNN_PI.cc deleted file mode 100644 index d422584f..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/ES_RNN_PI.cc +++ /dev/null @@ -1,1247 +0,0 @@ -/*ES-RNN: ES-RNN Exponential Smoothing Recurrent Neural Network hybrid. Prediction intervals. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. -It is meant to be used for Monthly and Quarterly series of M4 competition, becasue the DE (Diversified Ensemble) version is too slow. -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -It has to be invoked in pair of executables, passing at least two integers: seedForChunks, chunkNo -so e.g. create a script with following lines on Windows -start 10 1 -start 10 2 -Modern computers have at more then 2 cores, so e.g. on 6-core machine create and run the following script with 3 pairs of workers: -# start 10 1 0 -# start 10 2 0 -# start 20 1 5 -# start 20 2 5 -# start 30 1 10 -# start 30 2 10 -seedForChunks have to be the same withion one pair, chunk numbers have to be 1 and 2. -We have added here the third parameter: ibigOffset. The straddle should be equal or bigger than BIG_LOOP. -Each pair goes through BIG_LOOP (by default 3, change in code below if you want) of model fitting and prediction, -so 2 pairs, as above, will produce 6 forecasts to be ensembled later, in R. -By increasing number of pairs, e.g. to 6 on 12-core computer, one can reduce BIG_LOOP to 1, so reduce execution time, and still have 6 forecasts - -a decent number to ensemble (in a separate, supplied R script). - -There are three blocks of parameters below, one active (starting with //PARAMS--------------) and two inactive. -The active block is setup as in the final run of forecasting quarterly series. Similarly Monthly block. -The Daily block is more of a demo, allowing to run quickly forecast for Daily series, although with slightly worse performance (use another program ES_RNN_E.cc for it). It was not used for the final submission. -So, you need comment/uncomment to have one block of interest active. - - -*/ - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Quarterly"; -const string run0 = "(1,2),(4,8), LR=1e-3/{7,3e-4f},{11,1e-4f}, EPOCHS=16, LVP=200 40*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -vector> dilations = { { 1,2 },{ 4,8 } };//Each vector represents one chunk of Dilateed LSTMS, connected in resnNet fashion -const float INITIAL_LEARNING_RATE = 1e-3f; -//else -const map LEARNING_RATES = { { 7,3e-4f },{ 11,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; //multiplier for per-series parameters' learning rate. - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; //whether to insert a tanh() layer between the RNN stack and the linear adaptor (output) layer - -const int NUM_OF_TRAIN_EPOCHS = 16; -const unsigned int STATE_HSIZE = 40; - -const int SEASONALITY = 4; -const unsigned int INPUT_SIZE = 4; -const int INPUT_SIZE_I = INPUT_SIZE; -const unsigned int OUTPUT_SIZE = 8; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I + MIN_INP_SEQ_LEN + 2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - -const float LEVEL_VARIABILITY_PENALTY = 200; //Multiplier for L" penalty against wigglines of level vector. - - -/* -string VARIABLE = "Monthly"; -const string run0 = "Res(1,3,6,12), LR=1e-3 {8,3e-4f},{13,1e-4f}, EPOCHS=14, LVP=50, 20*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -vector> dilations = { { 1,3,6,12 } };//Each vector represents one chunk of Dilateed LSTMS, connected in resnNet fashion^M -const float INITIAL_LEARNING_RATE = 1e-3f; -const map LEARNING_RATES = { { 8,3e-4f },{ 13,1e-4f } }; //at which epoch we set them up to what^M -const float PER_SERIES_LR_MULTIP = 1; - -const int NUM_OF_TRAIN_EPOCHS = 14; -const unsigned int STATE_HSIZE = 50; - -const float LEVEL_VARIABILITY_PENALTY = 50; //Multiplier for L" penalty against wigglines of level vector. - -const int SEASONALITY = 12; -const unsigned int OUTPUT_SIZE = 18; -const unsigned int INPUT_SIZE = 12; -const int INPUT_SIZE_I = INPUT_SIZE; -const int OUTPUT_SIZE_I = OUTPUT_SIZE; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = INPUT_SIZE_I + OUTPUT_SIZE_I + MIN_INP_SEQ_LEN + 2; -const int MAX_SERIES_LENGTH = 40 * SEASONALITY + MIN_SERIES_LENGTH; //we are chopping longer series, to last, max e.g. 40 years - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; -*/ - -Expression squash(Expression& x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 40; -#else - const int MAX_NUM_OF_SERIES = -1; //use all series -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6;//in data provided -const int BIG_LOOP = 3; -const int NUM_OF_CHUNKS = 2; -const float EPS=1e-6; -const int AVERAGING_LEVEL=5; -const bool USE_MEDIAN = false; -const int MIDDLE_POS_FOR_AVG = 2; //if using medians - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=20; -const float C_STATE_PENALTY = 0; - -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN=true; -const unsigned ATTENTION_HSIZE=STATE_HSIZE; - -const bool USE_AUTO_LEARNING_RATE=false; -//if USE_AUTO_LEARNING_RATE, and only if LBACK>0 -const float MIN_LEARNING_RATE = 0.0001f; -const float LR_RATIO = sqrt(10); -const float LR_TOLERANCE_MULTIP = 1.005; -const int L3_PERIOD = 2; -const int MIN_EPOCHS_BEFORE_CHANGING_LRATE = 2; - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - float meanAbsSeasDiff; - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - - meanAbsSeasDiff = 0; - float sumf = 0; - for (int ip = SEASONALITY; ip0) - meanAbsSeasDiff = sumf / (vals.size() - SEASONALITY); - - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE_I) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE_I; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE_I; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE_I); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; -}; - -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - vector levels; - vector seasons; -}; - -//loss function -Expression MSIS(const Expression& out_ex, const Expression& actuals_ex) { - vector losses; - for (unsigned int indx = 0; indx as_scalar(forecH.value())) - loss = loss + (actual - forecH)*ALPHA_MULTIP; - losses.push_back(loss); - } - Expression ret = sum(losses) / OUTPUT_SIZE; - #if defined _DEBUG - float retf = as_scalar(ret.value()); - if (retf>100) { - vector out_vect = as_vector(out_ex.value()); - vector actuals_vect = as_vector(actuals_ex.value()); - for (int i = 0; i0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect, float tau, int offset) {//used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 - float sumf = 0; float suma = 0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*tau; - else - sumf = sumf + (actual - forec)*(tau - 1); - } - return sumf / suma * 200; -} - -//MSIS operating on floats, used for validation -float errorFunc(vector& out_vect, vector& actuals_vect, float meanAbsSeasDiff) { - float sumf=0; - for (unsigned int indx = 0; indx forecH) - loss = loss + (actualf - forecH)*ALPHA_MULTIP; - sumf+=loss; - } - return sumf / (OUTPUT_SIZE*meanAbsSeasDiff); -} - - - - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int seedForChunks = 10; //Yes it runs, without any params, but it will work only on 1/NUM_OF_CHUNKS of all cases. The system is expected to run in NUM_OF_CHUNKS multiples. - int chunkNo = 1; - int ibigOffset = 0; - if (argc >= 3) { - seedForChunks = atoi(argv[1]); - chunkNo = atoi(argv[2]); - } - if (argc >= 4) - ibigOffset = atoi(argv[3]); - - if (chunkNo > NUM_OF_CHUNKS) { - cerr << "chunkNo > NUM_OF_CHUNKS"; - exit(-1); - } - else if (chunkNo <= 0) { - cerr << "chunkNo <= 0"; - exit(-1); - } - - cout<0) - std::cout<< " ibigOffset:"<< ibigOffset; //if continuing prematurely stopped run - if (LBACK>0) - std::cout<<" lback:"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE_I; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE_I+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister) - mt19937 rngForChunks(seedForChunks); - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 48/2=24k, for monthly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - if (m4Obj.meanAbsSeasDiff==0) { - cout<<"Warning, flat series:"<0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - - int series_len=(int)series_vect.size(); - int chunkSize= series_len/NUM_OF_CHUNKS; - std::cout << "num of series:" << series_vect.size() <<" size of chunk:"<< chunkSize< uniOnSeries(0, chunkSize -1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>> testResults_map((int)chunkSize*1.5); - set diagSeries; - - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - ParameterCollection pc; - ParameterCollection perSeriesPC; - - float learning_rate= INITIAL_LEARNING_RATE; - AdamTrainer trainer(pc, learning_rate, 0.9, 0.999, EPS); - trainer.clip_threshold = GRADIENT_CLIPPING; - AdamTrainer perSeriesTrainer(perSeriesPC, learning_rate*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainer.clip_threshold = GRADIENT_CLIPPING; - - #if defined USE_RESIDUAL_LSTM - vector rNNStack; - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(AttentiveDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, ATTENTION_HSIZE, pc)); - for (int il = 1; il rNNStack; - rNNStack.emplace_back(DilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il oneChunk_vect(start,end); - if (PRINT_DIAGN) { - for (int k = 0; k<10; k++) //diag - cout << oneChunk_vect[k] << " "; - cout << endl; - } - if (chunkNo == NUM_OF_CHUNKS) - cout<<"last chunk size:"<< oneChunk_vect.size()< additionalParams_map((int)oneChunk_vect.size()*1.5); //per series - unordered_map*> historyOfAdditionalParams_map((int)oneChunk_vect.size()*1.5); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) {//setup - string series = *iter; - AdditionalParams addParams; - addParams.levSm = perSeriesPC.add_parameters({ 1 }, 0.5); //level smoothing - addParams.sSm = perSeriesPC.add_parameters({ 1 }, 0.5); //seasonality smoothing - for (int isea = 0; isea(); - } - - for (int iEpoch=0; iEpoch testLosses; //test losses of all series in this epoch - vector testAvgLosses; //test avg (over last few epochs) losses of all series in this epoch - vector testLossesL; //lower quantile loss - vector testAvgLossesL; //lower quantile loss - vector testLossesH; //higher quantile loss - vector testAvgLossesH; //higher quantile loss - vector trainingLosses; //training losses of all series in one epoch - vector forecLosses; vector levVarLosses; vector stateLosses; - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 5, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&iEpoch, 0, NULL)); - #endif - - for (auto iter = oneChunk_vect.begin() ; iter != oneChunk_vect.end(); ++iter) { - string series=*iter; - auto m4Obj = allSeries_map[series]; - - #if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); - #endif - - ComputationGraph cg; - for (int il=0; il season_exVect;//vector, because we do not know how long the series is - for (int iseas=0; iseas seas==1 - season_exVect.push_back(seas);//Expression is a simple struct, without any storage management, so the auto copy constructor works OK. - } - season_exVect.push_back(season_exVect[0]); - - vector logDiffOfLevels_vect; - vector levels_exVect; - Expression lev=cdiv(input(cg, m4Obj.vals[0]), season_exVect[0]); - levels_exVect.push_back(lev); - for (int i=1; i 0) { - vector levelVarLoss_v; - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx=season_exVect.size()-SEASONALITY; - for (int i=0;i<(OUTPUT_SIZE_I-SEASONALITY);i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx+i]); - } - vector losses; - for (int i=INPUT_SIZE_I-1; i<(m4Obj.n- OUTPUT_SIZE_I); i++) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() +i+1-INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() +i+1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex=input(cg,{INPUT_SIZE},input_vect); - Expression input1_ex=cdiv(input0_ex,inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]); - joinedInput_ex.emplace_back(noise(squash(input1_ex), NOISE_STD)); //normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality_ex=concatenate(outputSeasonality_exVect); - - first = m4Obj.vals.begin() +i+1; - pastLast = m4Obj.vals.begin() +i+1+OUTPUT_SIZE_I; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels0_ex=input(cg,{OUTPUT_SIZE},labels_vect); - Expression labels1_ex=cdiv(labels0_ex,outputSeasonality_ex); //deseasonalization - labels1_ex= cdiv(labels1_ex, levels_exVect[i]);//normalization - Expression labels_ex=squash(labels1_ex); - - Expression loss_ex=MSIS(out_ex, labels_ex);//although out_ex has doubled size, labels_ex have normal size. NB, we do not have duplicated labels during training. - //Expression loss_ex=pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE_I+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - } - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; it maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax = it; - layerOfMax = il; - chunkOfMax = irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - cout << " min season=" << minSeason << endl; - cout << " min level=" << minLevel << endl; - cout << " max abs:" << maxAbs << " at time:" << timeOfMax << " at layer:" << layerOfMax << " and chunk:" << chunkOfMax << endl; - - //diagSeries.insert(series); - pc.reset_gradient(); - perSeriesPC.reset_gradient(); - } - - //saving per-series values for diagnostics purposes - AdditionalParamsF &histAdditionalParams= historyOfAdditionalParams_map[series]->at(iEpoch); - histAdditionalParams.levSm=as_scalar(levSm_ex.value()); - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea=0; isea::const_iterator firstE = season_exVect.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - Expression inputSeasonality_ex = concatenate(inputSeasonality_exVect); - - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE_I; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input0_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression input1_ex = cdiv(input0_ex, inputSeasonality_ex); //deseasonalization - vector joinedInput_ex; - input1_ex= cdiv(input1_ex, levels_exVect[i]);//normalization - joinedInput_ex.emplace_back(squash(input1_ex)); - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios=0; ios out_vect = as_vector(out_ex.value()); - - if (LBACK > 0) { - float qLoss = errorFunc(out_vect, m4Obj.testVals, m4Obj.meanAbsSeasDiff); - testLosses.push_back(qLoss); - - qLoss = wQuantLoss(out_vect, m4Obj.testVals, TAUL, 0); - testLossesL.push_back(qLoss); - - qLoss = wQuantLoss(out_vect, m4Obj.testVals, TAUH, OUTPUT_SIZE); - testLossesH.push_back(qLoss); - } - - testResults_map[series][iEpoch%AVERAGING_LEVEL] = out_vect; - if (iEpoch >= AVERAGING_LEVEL) { - if (USE_MEDIAN) { - if (testResults_map[series][AVERAGING_LEVEL].size() == 0) - testResults_map[series][AVERAGING_LEVEL] = out_vect; //just to initialized, to make space. The values will be overwritten - for (int iii = 0; iii < OUTPUT_SIZE_I*2; iii++) { - vector temp_vect2; - for (int ii = 0; ii firstForec = testResults_map[series][0]; - testResults_map[series][AVERAGING_LEVEL] = firstForec; - for (int ii = 1; ii nextForec = testResults_map[series][ii]; - for (int iii = 0; iii 0) { - float qLoss = errorFunc(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - testAvgLosses.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - testAvgLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - testAvgLossesH.push_back(qLoss); - - #if defined USE_ODBC //save - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE_I + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&forecastLoss, 0, NULL)); - - for (int iv = 0; iv<2; iv++) { - if (iv == 0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runL.c_str(), 0, &nullTerminatedStringOfRun)) - else - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runH.c_str(), 0, &nullTerminatedStringOfRun)); - - for (int io = 0; io < OUTPUT_SIZE_I; io++) { - int ipos=OFFSET_TO_FIRST_ACTUAL + 1 + 2*io; - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&m4Obj.testVals[io], 0, NULL)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, ipos+1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&testResults_map[series][AVERAGING_LEVEL][io + iv*OUTPUT_SIZE_I], 0, NULL)); - } - if (MAX_NUM_OF_SERIES<0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLExecute(hInsertStmt)); - } - #endif - } //lback>0 - } //time to average - }//last anchor point of the series - }//through TEST loop - }//through series - - - if (iEpoch % FREQ_OF_TEST == 0) { - float averageTrainingLoss = accumulate(trainingLosses.begin(), trainingLosses.end(), 0.0) / trainingLosses.size(); - - cout << ibig << " " << iEpoch << " loss:" << averageTrainingLoss * 100; - if (LEVEL_VARIABILITY_PENALTY > 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forecast loss:" << averageForecLoss*100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - - float averageTestLoss=0; - if (LBACK > 0) { - float averageTestLoss = accumulate(testLosses.begin(), testLosses.end(), 0.0) / testLosses.size(); - float averageTestLossL = accumulate(testLossesL.begin(), testLossesL.end(), 0.0) / testLossesL.size(); - float averageTestLossH = accumulate(testLossesH.begin(), testLossesH.end(), 0.0) / testLossesH.size(); - cout<<" Test loss:" << averageTestLoss<<" L:"<< averageTestLossL<<" H:"<< averageTestLossH; - if (iEpoch >= AVERAGING_LEVEL) { - float averageTestAvgLoss = accumulate(testAvgLosses.begin(), testAvgLosses.end(), 0.0) / testAvgLosses.size();//of this epoch - float averageTestAvgLossL = accumulate(testAvgLossesL.begin(), testAvgLossesL.end(), 0.0) / testAvgLossesL.size();//of this epoch - float averageTestAvgLossH = accumulate(testAvgLossesH.begin(), testAvgLossesH.end(), 0.0) / testAvgLossesH.size();//of this epoch - cout << " avgLoss:" << averageTestAvgLoss<<" L:"<< averageTestAvgLossL<<" H:"<< averageTestAvgLossH<= 2) { - if (iEpoch < L3_PERIOD) - changeL2Rate = perfValid_vect[perfValid_vect.size() - 2] MIN_LEARNING_RATE && (iEpoch - epochOfLastChangeOfLRate) >= MIN_EPOCHS_BEFORE_CHANGING_LRATE) { - learning_rate /= LR_RATIO; - cout << "decreasing LR to:" << learning_rate << endl; - epochOfLastChangeOfLRate = iEpoch; - trainer.learning_rate = learning_rate; - } - } - #if defined USE_ODBC - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLEndTran( - SQL_HANDLE_DBC, - hDbc, - SQL_COMMIT)); - #endif - }//through epochs - - if (PRINT_DIAGN) {//some diagnostic info - set diagSeries; - for (int i = 0; i<1; i++) {//add a few normal ones - int irand = uniOnSeries(rng); - diagSeries.insert(oneChunk_vect[irand]); - } - for (auto series : diagSeries) { - cout << endl << series << endl; - array* historyOfAdditionalParams_ptrToArr = historyOfAdditionalParams_map[series]; - cout << "lSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levSm << " "; - cout << endl; - cout << "sSm:" << endl; - for (int iEpoch = 0; iEpochat(iEpoch).sSm << " "; - cout << endl; - cout << "seasons:" << endl; - for (int isea = 0; iseaat(iEpoch).initSeasonality[isea] << " "; - cout << endl; - } - cout << endl; - for (int iEpoch = 0; iEpochat(iEpoch).levels.size()>0) { - cout << "levels:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).levels.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).levels[iv] << ", "; - cout << endl; - cout << "seas:" << iEpoch << " "; - for (int iv = 0; ivat(iEpoch).seasons.size(); iv++) - cout << historyOfAdditionalParams_ptrToArr->at(iEpoch).seasons[iv] << ", "; - cout << endl; - } - } - } - } - - //save the forecast to outputFile - ofstream outputFile; - outputFile.open(outputPathL); - for (auto iter = oneChunk_vect.begin(); iter != oneChunk_vect.end(); ++iter) { - string series = *iter; - outputFile<< series; - for (int io=0; io - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - RelWithDebug - Win32 - - - RelWithDebug - x64 - - - - - - - - - - - {A16B5466-E680-43F6-A884-A4A01EB78E50} - Win32Proj - M42 - 8.1 - - - - Application - true - v140 - Unicode - - - Application - true - v140 - Unicode - - - Application - false - v140 - true - Unicode - - - Application - true - v140 - Unicode - Sequential - - - Application - true - v140 - Unicode - Sequential - - - Application - false - v140 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - false - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - NotUsing - Level1 - Disabled - WIN32;_WINDOWS;EIGEN_USE_MKL_ALL;EIGEN_FAST_MATH;NOMINMAX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - - - Console - true - E:\progs2\dynet\buildMKL\dynet\Debug - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - NotUsing - Level1 - MaxSpeed - WIN32;_WINDOWS;EIGEN_FAST_MATH;EIGEN_USE_MKL_ALL;NOMINMAX;NDEBUG_;CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - AnySuitable - true - Speed - AdvancedVectorExtensions - Default - MultiThreadedDLL - ProgramDatabase - true - false - - - Console - true - E:\progs2\dynet\buildMKL\dynet\RelWithDebInfo - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/M42.vcxproj.filters b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/M42.vcxproj.filters deleted file mode 100644 index d090dffe..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/M42.vcxproj.filters +++ /dev/null @@ -1,30 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - - - Header Files - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/M42.vcxproj.user b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/M42.vcxproj.user deleted file mode 100644 index 6fb136bf..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/M42.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/slstm.h b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M42/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/ES_RNN_E.cc b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/ES_RNN_E.cc deleted file mode 100644 index 5e39c33d..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/ES_RNN_E.cc +++ /dev/null @@ -1,1666 +0,0 @@ -/*ES-RNN-E: Exponential Smoothing Recurrent Neural Network hybrid, Ensemble of specialists. Point forecast. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. Non-seasonal, single, or double seasonal. -It is meant to be used for all types of series from M4 competition, except Monthly and Quarterly (for performance reasons - it is slower). -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -In contradistinction to ES-RNN, each executable uses all series, but in a similar manner repeating the whole learning process BIG_LOOP times (by default 3). -Invocation should pass BIG_LOOP offset -so e.g. create a script with following lines on Windows -start 0 -start 10 -start 20 -start 30 -on 4-core computer. -In this setup, learning and fitting would be repeated 4*3 times, probably unnecessarily too many, 6-8 independent runs should be enough for a good ensemble. -Therefore if running on say 8 core machine , one can extend the above script to 8 concurrent executions and reduce BIG_LOOP to 1. -(Creating final forecasts is done in a supplied R script) - -There are four blocks of parameters below, one active (starting with //PARAMS--------------) and three inactive. -These blocks are as they were during the final forecasting run. You need comment/uncomment to have one block of interest active. -*/ - - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -//#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- -string VARIABLE = "Hourly"; -const string run = "50/49 Att 4/5 1,4)(24,168) LR=0.01,{7,5e-3f},{18,1e-3f},{22,3e-4f} EPOCHS=27, LVP=10, CSP=1"; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const float PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 2;//0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 24; -const int SEASONALITY2 = 168; -vector> dilations = { { 1,4 },{ 24, 168 } }; - -const float INITIAL_LEARNING_RATE = 0.01f; -const map LEARNING_RATES = { { 7,5e-3f },{ 18,1e-3f },{ 22,3e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 27; - -float LEVEL_VARIABILITY_PENALTY = 10; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 1; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 24; -const unsigned int OUTPUT_SIZE = 48; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 53 * SEASONALITY2 + MIN_SERIES_LENGTH; //==all -const int TOPN = 4; - - -/* -string VARIABLE = "Weekly"; -const string run = "50/47 Att 3/5 (1,52) LR=1e-3 {11,3e-4f}, {17,1e-4f} EPOCHS=23, LVP=100 6y"; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 47; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 0; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 52; -const int SEASONALITY2 = 0; -vector> dilations = { { 1, 52 } }; - -const float INITIAL_LEARNING_RATE = 1e-3; -const map LEARNING_RATES = { { 11,3e-4f },{ 17,1e-4f } }; //at which epoch we manually set them up to what -const int NUM_OF_TRAIN_EPOCHS = 23; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; -const float PER_SERIES_LR_MULTIP = 1; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 10; -const unsigned int OUTPUT_SIZE = 13; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#81 380 935 1023 1604 2598 -const int MAX_SERIES_LENGTH = 6 * SEASONALITY + MIN_SERIES_LENGTH; //==all -const int TOPN = 3; -*/ - -/* -string VARIABLE = "Daily"; -const string run = "Final 50/49 730 4/5 (1,3)(7,14) LR=3e-4 {9,1e-4f} EPOCHS=13, LVP=100 13w"; -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const int TRAINING_PERCENTILE = 49; //the program has a tendency for positive bias. So, we can reduce it by running smaller TRAINING_PERCENTILE - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,3 },{ 7, 14 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 9,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 13; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const unsigned int OUTPUT_SIZE = 14; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //##93 323 2940 2357 4197 9919 -const int MAX_SERIES_LENGTH = 13 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* -string VARIABLE = "Yearly"; -const string run = "50 Att 4/5 (1,6) LR=1e-4 EPOCHS=12, 60*"; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const float PERCENTILE = 50; //we always use Pinball loss. When forecasting point value, we actually forecast median, so PERCENTILE=50 -const float TRAINING_PERCENTILE = 50; - -const int SEASONALITY_NUM = 0; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 0; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,6 } }; - -const float INITIAL_LEARNING_RATE = 1e-4; -const map LEARNING_RATES = { { 15,1e-5 } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 12; - -float LEVEL_VARIABILITY_PENALTY = 0; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 30; - -const unsigned int INPUT_SIZE = 4; -const unsigned int OUTPUT_SIZE = 6; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#13.00 20.00 29.00 31.32 40.00 835.00 -const int MAX_SERIES_LENGTH = 60 + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -//end of VARIABLE-specific params - -const int BIG_LOOP = 3; -const int NUM_OF_NETS = 5; -const unsigned int ATTENTION_HSIZE = STATE_HSIZE; - - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 20; -#else - const int MAX_NUM_OF_SERIES = -1; -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6; -const int AVERAGING_LEVEL = 5; -const float EPS=1e-6; - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=50; -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN = false; -const float TAU = PERCENTILE / 100.; -const float TRAINING_TAU = TRAINING_PERCENTILE / 100.; - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - - -Expression squash(Expression& x) { - return log(x); -} -float squash(float x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} -float expand(float x) { - return exp(x); -} - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - -#if defined USE_ODBC -void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); -#endif - - - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; - Parameter sSm2; - array initSeasonality2; -}; -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - float sSm2; - array initSeasonality2; - vector levels; - vector seasons; - vector seasons2; -}; - - -array perfToRanking (array perf_arr) { - array index; - - for (int itop=0; itop losses; - for (unsigned int indx = 0; indx as_scalar(forec.value())) - losses.push_back((actual - forec)*TRAINING_TAU); - else - losses.push_back((actual - forec)*(TRAINING_TAU - 1)); - } - return sum(losses) / OUTPUT_SIZE * 2; -} - - -// weighted quantile Loss, used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 -float wQuantLoss(vector& out_vect, vector& actuals_vect) { - float sumf = 0; float suma=0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*TAU; - else - sumf = sumf + (actual - forec)*(TAU - 1); - } - return sumf / suma * 200; -} - -//used just for diagnostics, if LBACK>0 and PERCENTILE==50 -float sMAPE(vector& out_vect, vector& actuals_vect) { - float sumf = 0; - for (unsigned int indx = 0; indx& out_vect, vector& actuals_vect) { - if (PERCENTILE==50) - return sMAPE(out_vect, actuals_vect); - else - return wQuantLoss(out_vect, actuals_vect); -} - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int ibigOffset = 0; - if (argc == 2) - ibigOffset = atoi(argv[1]); - - cout << VARIABLE<<" "< 0) { - cout<<"Warning. LEVEL_VARIABILITY_PENALTY has to be equal zero if SEASONALITY_NUM==0"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)run.c_str(), 0, &nullTerminatedStringOfRun)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 24k for yearly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - allSeries_map[series] = m4Obj; - } - if (MAX_NUM_OF_SERIES>0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - cout << "num of series:" << series_vect.size() << endl; - - unsigned int series_len=(unsigned int)series_vect.size(); - uniform_int_distribution uniOnSeries(0,series_len-1); // closed interval [a, b] - uniform_int_distribution uniOnNets(0,NUM_OF_NETS-1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>> testResults_map((int)series_len*1.5);//per series, etc... - unordered_map> finalResults_map((int)series_len*1.5);//per series - set diagSeries; - - unordered_map> netRanking_map; - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - //create nets - array paramsCollection_arr;//per net - array perSeriesParamsCollection_arr;//per net - array trainers_arr; - array perSeriesTrainers_arr; - - - #if defined USE_RESIDUAL_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #elif defined USE_ATTENTIVE_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #else - array, NUM_OF_NETS> rnnStack_arr; - #endif - - array MLPW_parArr; - array MLPB_parArr; - array adapterW_parArr; - array adapterB_parArr; - - //this is not a history, this is the real stuff - unordered_map* > additionalParams_mapOfArr((int)series_len*1.5); //per series, per net - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - additionalParams_mapOfArr[series]=new array(); - } - - for (int inet=0; inetclip_threshold = GRADIENT_CLIPPING; - perSeriesTrainers_arr[inet]=new AdamTrainer (perSeriesPC, INITIAL_LEARNING_RATE*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainers_arr[inet]->clip_threshold = GRADIENT_CLIPPING; - - auto& rNNStack=rnnStack_arr[inet]; - #if defined USE_RESIDUAL_LSTM - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il* additionalParams_arr=additionalParams_mapOfArr[series]; - additionalParams_arr->at(inet).levSm=perSeriesPC.add_parameters({1}, 0.5);//per series, per net - if (SEASONALITY_NUM > 0) { - additionalParams_arr->at(inet).sSm = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - if (SEASONALITY_NUM > 1) { - additionalParams_arr->at(inet).sSm2 = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality2[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - } - }//seting up, through nets - - //history of params. Series->[NUM_OF_NETS,NUM_OF_TRAIN_EPOCHS] - unordered_map, NUM_OF_NETS>*> historyOfAdditionalParams_map((int)series_len*1.5); - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - historyOfAdditionalParams_map[series]=new array, NUM_OF_NETS>(); - } - - //first assignment. Yes, we are using vector , so the very first time the duplicates are possible. But a set can't be sorted - array, NUM_OF_NETS> seriesAssignment;//every net has an array - for (int j=0; j> netPerf_map; - for (int inet=0; inetlearning_rate = LEARNING_RATES.at(iEpoch); - if (inet==0) - cout << "changing LR to:" << trainer->learning_rate << endl; - perSeriesTrainer->learning_rate = LEARNING_RATES.at(iEpoch)*PER_SERIES_LR_MULTIP; - } - - auto& rNNStack=rnnStack_arr[inet]; - Parameter& MLPW_par = MLPW_parArr[inet]; - Parameter& MLPB_par = MLPB_parArr[inet]; - Parameter& adapterW_par=adapterW_parArr[inet]; - Parameter& adapterB_par=adapterB_parArr[inet]; - - vector oneNetAssignments=seriesAssignment[inet]; - random_shuffle (oneNetAssignments.begin(), oneNetAssignments.end()); - - vector epochLosses; - vector forecLosses; vector levVarLosses; vector stateLosses; - for (auto iter = oneNetAssignments.begin() ; iter != oneNetAssignments.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - - ComputationGraph cg; - for (int il=0; ilat(inet); - array& historyOfAdditionalParams_arr=historyOfAdditionalParams_map[series]->at(inet); - - Expression MLPW_ex,MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex= parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea logDiffOfLevels_vect; - vector levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - Expression levelVarLoss_ex; - if (LEVEL_VARIABILITY_PENALTY > 0) { - vector levelVarLoss_v; - for (int i = 1; i losses;//losses of steps through single time series - for (int i=INPUT_SIZE-1; i<(m4Obj.n- OUTPUT_SIZE); i++) { - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - - first = m4Obj.vals.begin() + i + 1; - pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - firstE = season_exVect.begin() + i + 1; - pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - - firstE = season2_exVect.begin() + i + 1; - pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - }//through points of a series - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; itupdate();//update shared weights - perSeriesTrainer->update(); //update params of this series only - } catch (exception& e) { //long diagnostics for this unlikely event :-) - cerr<<"cought exception while doing "< maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax=it; - layerOfMax=il; - chunkOfMax= irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - if (SEASONALITY_NUM > 0) - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - if (SEASONALITY_NUM > 1) - cout << "sSm2:" << as_scalar(sSm2_ex.value()) << endl; - cout << "max abs:" << maxAbs <<" at time:"<< timeOfMax<<" at layer:"<< layerOfMax<<" and chunk:"<< chunkOfMax< 0) { - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea = 0; isea 1) { - histAdditionalParams.sSm2 = as_scalar(sSm2_ex.value()); - for (int isea=0; isea 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forec loss:" << averageForecLoss * 100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - cout<at(inet); - Expression MLPW_ex, MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex = parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; i0 then this is shortened, so it always contains data awe have right to access - Expression newLevel_ex = m4Obj.vals[i] * cdiv(levSm_ex, season_exVect[i]) + (1 - levSm_ex)*levels_exVect[i - 1]; - levels_exVect.push_back(newLevel_ex); - - Expression newSeason_ex = m4Obj.vals[i] * cdiv(sSm_ex, newLevel_ex) + (1 - sSm_ex)*season_exVect[i]; - season_exVect.push_back(newSeason_ex); - } - - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - - Expression inputSeasonality_ex; Expression inputSeasonality2_ex; - Expression outputSeasonality_ex; Expression outputSeasonality2_ex; - vector losses;//losses of steps through single time series - Expression out_ex;//we declare it here, bcause the last one will be the forecast - for (int i=INPUT_SIZE-1; i::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il::const_iterator first = m4Obj.vals.begin() + i + 1; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression loss_ex = pinBallLoss(out_ex, labels_ex); - if (i>=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); //training area losses - } - - if (i==(m4Obj.n-1)) {//validation loss - out_ex=expand(out_ex)*levels_exVect[i];//back to original scale - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - out_ex = cmult(out_ex, outputSeasonality_ex);//reseasonalize - } - if (SEASONALITY_NUM > 1 ) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - out_ex = cmult(out_ex, outputSeasonality2_ex);//reseasonalize - } - //we do not need the matching label here, because we do not bother calculate valid losses of each net across all series. - //We care about best and topn performance - } - }//end of going through all point of a series - - Expression loss_exp = average(losses); - float loss = as_scalar(cg.forward(loss_exp));//training loss of a single series - netPerf_map[series][inet]=loss; - - //unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>, BIG_LOOP>> testResults_map((int)series_len*1.5);//per series, big loop, etc... - //No epoch here, because this will just reflect the current (latest) situation - the last few epochs - vector out_vect=as_vector(out_ex.value()); - testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]=out_vect; - if (iEpoch>=AVERAGING_LEVEL && iEpoch % FREQ_OF_TEST==0) { - vector firstForec=testResults_map[series][inet][0]; - testResults_map[series][inet][AVERAGING_LEVEL]=firstForec; - for (int ii=1; ii nextForec=testResults_map[series][inet][ii]; - for (int iii=0; iii0 && iEpoch % FREQ_OF_TEST==0) { - //now that we have saved outputs of all nets on all series, let's calc how best and topn combinations performed during current epoch. - vector bestEpochLosses; - vector bestEpochAvgLosses; - vector topnEpochLosses; - vector topnEpochAvgLosses; - - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); -#endif - - float avgLoss; - vector avgLatest; - vector avgAvg; - - for (int itop=0; itop 0) { - float qLoss = errorFunc(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals); - bestEpochLosses.push_back(qLoss); - } - avgLatest=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]; //used later for calculating topn loss - - if (iEpoch>=AVERAGING_LEVEL) { - if (LBACK > 0) { - float qLoss = errorFunc(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals); - bestEpochAvgLosses.push_back(qLoss); - } - avgAvg=testResults_map[series][inet][AVERAGING_LEVEL]; - } - } else { - for (int iii=0; iii=AVERAGING_LEVEL) - avgAvg[iii]+=testResults_map[series][inet][AVERAGING_LEVEL][iii]; - } - } - }//through topn - - for (int iii=0; iii 0) { - float qLoss = errorFunc(avgLatest, m4Obj.testVals); - topnEpochLosses.push_back(qLoss); - } - - if (iEpoch>=AVERAGING_LEVEL) { - for (int iii = 0; iii 0) { -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&avgLoss, 0, NULL)); - - for (int iii=0; iii 0) { - float bestEpochLoss=accumulate( bestEpochLosses.begin(), bestEpochLosses.end(), 0.0)/bestEpochLosses.size(); - float topnEpochLoss=accumulate( topnEpochLosses.begin(), topnEpochLosses.end(), 0.0)/topnEpochLosses.size(); - cout<=AVERAGING_LEVEL) { - float bestEpochAvgLoss=accumulate( bestEpochAvgLosses.begin(), bestEpochAvgLosses.end(), 0.0)/bestEpochAvgLosses.size(); - float topnEpochAvgLoss=accumulate( topnEpochAvgLosses.begin(), topnEpochAvgLosses.end(), 0.0)/topnEpochAvgLosses.size(); - cout<<" bestAvg:"<> netRanking_map - netRanking_map[series]=perfToRanking(netPerf_map[series]); - - for (int itop=0; itop diagSeries; - for (int i=0; i<1; i++) {//add a few normal ones - int irand=uniOnSeries(rng); - diagSeries.insert(series_vect[irand]); - } - for(auto series : diagSeries) { - cout<at(inet); - for (int iEpoch=0; iEpoch 0 ) { - cout<<"sSm:"<at(inet); - for (int iEpoch=0; iEpoch 1 ) { - cout<<"sSm2:"<at(inet); - for (int iEpoch=0; iEpochat(inet); - for (int iEpoch = 0; iEpoch0) { - cout << "levels:" << iEpoch<<" "; - for (int iv = 0; iv 0 ) { - cout << "seasons:" << iEpoch<<" "; - for (int iv = 0; iv 1 ) { - cout << "seasons2:" << iEpoch<<" "; - for (int iv = 0; iv - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Source Files - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/M43.vcxproj b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/M43.vcxproj deleted file mode 100644 index 3ab126fa..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/M43.vcxproj +++ /dev/null @@ -1,227 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - RelWithDebug - Win32 - - - RelWithDebug - x64 - - - - - - - - - - - {BE951571-3F3A-4048-BAA3-0C05F38CFF42} - Win32Proj - M43 - 8.1 - - - - Application - true - v140 - Unicode - - - Application - true - v140 - Unicode - - - Application - false - v140 - true - Unicode - - - Application - true - v140 - Unicode - Sequential - - - Application - true - v140 - Unicode - Sequential - - - Application - false - v140 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - false - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - NotUsing - Level1 - Disabled - WIN32;_WINDOWS;EIGEN_USE_MKL_ALL;EIGEN_FAST_MATH;NOMINMAX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - - - Console - true - E:\progs2\dynet\buildMKL\dynet\Debug - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - NotUsing - Level1 - MaxSpeed - WIN32;_WINDOWS;EIGEN_FAST_MATH;EIGEN_USE_MKL_ALL;NOMINMAX;NDEBUG_;CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - AnySuitable - true - Speed - AdvancedVectorExtensions - Default - MultiThreadedDLL - ProgramDatabase - true - false - - - Console - true - E:\progs2\dynet\buildMKL\dynet\RelWithDebInfo - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/M43.vcxproj.user b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/M43.vcxproj.user deleted file mode 100644 index 6fb136bf..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/M43.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/slstm.h b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M43/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/ES_RNN_E_PI.cc b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/ES_RNN_E_PI.cc deleted file mode 100644 index f016c3a9..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/ES_RNN_E_PI.cc +++ /dev/null @@ -1,1745 +0,0 @@ -/*ES-RNN-E: Exponential Smoothing Recurrent Neural Network hybrid, Ensemble of specialists. Prediction Intervals forecast. -Slawek Smyl, Jan-May 2017. - -Dilated LSTMs, with optional shortcuts, attention. Non-seasonal, single, or double seasonal. -It is meant to be used for all types of series from M4 competition, except Monthly and Quarterly (for performance reasons - Ensamble of Specilists is slower). -The program uses and requires Dynet NN library(https://github.com/clab/dynet); can be compiled and run on Windows, Linux, and Mac. - -In contradistinction to ES-RNN, each executable uses all series, but in a similar manner repeating the whole learning process BIG_LOOP times (by default 3). -Invocation should pass BIG_LOOP offset -so e.g. create a script with following lines on Windows -start 0 -start 10 -start 20 -start 30 -on 4-core computer. -In this setup, learning and fitting would be repeated 4*3 times, probably unnecessarily too many, 6-8 independent runs should be enough for a good ensemble. -Therefore if running on say 8 core machine , one can extend the above script to 8 concurrent executions and reduce BIG_LOOP to 1. -(Creating final forecasts is done in a supplied R script) - -There are four blocks of parameters below, one active (starting with //PARAMS--------------) and three inactive. -These blocks are as they were during the final forecasting run. You need comment/uncomment to have one block of interest active. -*/ - - -//#define USE_ODBC -//define USE_ODBC if you want to -// 1. run the program in backtesting mode (which means you also need to set LBACK>0 below. Read the comment below. -// 2. save forecasts to a datatabase. Mysql and SQL Server were tested. The table creation and some other scripts should be found in \sql directory of the source code. -// Of course setting up ODBC is not that simple, :-), e.g. you need to create DSN=slawek, that points to a database with the output table. -// Saving to the db is convenient, but not necessary - all forecasts are always saved to as csv files in automatically created subdirectory (sorry sometimes two directories, so you have to copy :-)) of OUTPUT_DIR -//If saving to database you need to modify run varaible, for each new run, otherwise you will get the table key error. - -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/expr.h" -#include "dynet/io.h" -#include "dynet/model.h" -#include "dynet/nodes.h" -#include "dynet/expr.h" -#include "dynet/lstm.h" -#include "slstm.h" //my implementation of dilated LSTMs - - -#if defined USE_ODBC - #if defined _WINDOWS - #include - #endif - #include - #include -#endif - -#include -#include -#include -//#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - -string DATA_DIR = "f:\\progs\\data\\M4DataSet\\"; //with the competition data csvs -//string DATA_DIR="/home/uber/progs/data/M4DataSet/"; -string OUTPUT_DIR = "f:\\progs\\data\\M4\\"; -//string OUTPUT_DIR="/home/uber/progs/data/M4/"; - -int LBACK = 0; //LBACK 0 means final mode: learning on all data and forecasting. LBACK=1 would move back by OUTPUT_SIZE, and forecast last known OUTPUT_SIZE points, for backtesting. LBACK could be a larger integer, but then number of series shrinks. - - -//PARAMS-------------- - -string VARIABLE = "Hourly"; -const string run0 = "(1,4)(24,168) LR=0.01, {25,3e-3f} EPOCHS=37, LVP=10, CSP=0"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 2;//0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 24; -const int SEASONALITY2 = 168; -vector> dilations = { { 1,4 },{ 24, 168 } }; - -const float INITIAL_LEARNING_RATE = 0.01f; -const map LEARNING_RATES = { { 20,1e-3f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 37; - -float LEVEL_VARIABILITY_PENALTY = 10; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 24; -const unsigned int OUTPUT_SIZE = 48; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK -const int MAX_SERIES_LENGTH = 53 * SEASONALITY2 + MIN_SERIES_LENGTH; //==all -const int TOPN = 4; - - -/* -string VARIABLE = "Weekly"; -const string run0 = "Att 4/5 (1,52) LR=1e-3 {15,3e-4f} EPOCHS=31, LVP=100 6y"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = false; - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 52; -const int SEASONALITY2 = 0; -vector> dilations = { { 1, 52 } }; - -const float INITIAL_LEARNING_RATE = 1e-3; -const map LEARNING_RATES = { { 15,3e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 31; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 10; -const unsigned int OUTPUT_SIZE = 13; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#81 380 935 1023 1604 2598 -const int MAX_SERIES_LENGTH = 6 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* - -string VARIABLE = "Daily"; -const string run0 = "4/5 (1,3)(7,14) LR=3e-4 {13,1e-4f} EPOCHS=21, LVP=100 13w"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -//#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER=false; - -const int SEASONALITY_NUM = 1; //0 means no seasonality, for Yearly; 1 - single seasonality for Daily(7), Weekly(52); 2 - dual seaonality for Hourly (24,168) -const int SEASONALITY = 7; -const int SEASONALITY2 = 0; -vector> dilations = { { 1,3 },{ 7, 14 } }; - -const float INITIAL_LEARNING_RATE = 3e-4; -const map LEARNING_RATES = { { 13,1e-4f } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 21; - -float LEVEL_VARIABILITY_PENALTY = 100; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 40; - -const unsigned int INPUT_SIZE = 7; -const unsigned int OUTPUT_SIZE = 14; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //##93 323 2940 2357 4197 9919 -const int MAX_SERIES_LENGTH = 13 * SEASONALITY + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -/* -string VARIABLE = "Yearly"; -const string run0 = "Att NL 4/5 (1,6) LR=1e-4 {17,3e-5}{22,1e-5} EPOCHS=29, 60*"; -const string runL = "alpha5L " + run0; -const string runH = "alpha5H " + run0; - -//#define USE_RESIDUAL_LSTM -#define USE_ATTENTIVE_LSTM -const bool ADD_NL_LAYER = true; - -const int SEASONALITY_NUM = 0; //0 means no seasonality -const int SEASONALITY = 1; //for no seasonality, set it to 1, important -const int SEASONALITY2 = 0; -vector> dilations = { { 1,6 } }; - -const float INITIAL_LEARNING_RATE = 1e-4; -const map LEARNING_RATES = { { 17,3e-5 },{ 22,1e-5 } }; //at which epoch we manually set them up to what -const float PER_SERIES_LR_MULTIP = 1; -const int NUM_OF_TRAIN_EPOCHS = 29; - -float LEVEL_VARIABILITY_PENALTY = 0; //Multiplier for L" penalty against wigglines of level vector. -const float C_STATE_PENALTY = 0; - -const unsigned int STATE_HSIZE = 30; - -const unsigned int INPUT_SIZE = 4; -const unsigned int OUTPUT_SIZE = 6; - -const int MIN_INP_SEQ_LEN = 0; -const int MIN_SERIES_LENGTH = OUTPUT_SIZE + INPUT_SIZE + MIN_INP_SEQ_LEN + 2; //this is compared to n==(total length - OUTPUT_SIZE). Total length may be truncated by LBACK - //#Min. 1st Qu. Median Mean 3rd Qu. Max. - //#13.00 20.00 29.00 31.32 40.00 835.00 -const int MAX_SERIES_LENGTH = 60 + MIN_SERIES_LENGTH; -const int TOPN = 4; -*/ - -const float ALPHA = 0.05; -const float TAUL = ALPHA / 2; -const float TAUH = 1 - TAUL; -const float ALPHA_MULTIP = 2 / ALPHA; - -const int BIG_LOOP = 3; -const int NUM_OF_NETS = 5; -const unsigned ATTENTION_HSIZE = STATE_HSIZE; - -#if defined _DEBUG - const int MAX_NUM_OF_SERIES = 20; -#else - const int MAX_NUM_OF_SERIES = -1; -#endif // _DEBUG - -const unsigned int NUM_OF_CATEGORIES = 6; -const int AVERAGING_LEVEL = 5; -const float EPS=1e-6; - -const float NOISE_STD=0.001; -const int FREQ_OF_TEST=1; -const float GRADIENT_CLIPPING=50; -const float BIG_FLOAT=1e38;//numeric_limits::max(); -const bool PRINT_DIAGN = false; - -string INPUT_PATH = DATA_DIR + VARIABLE + "-train.csv"; -string INFO_INPUT_PATH = DATA_DIR + "M4-info.csv"; - - -Expression squash(Expression& x) { - return log(x); -} -float squash(float x) { - return log(x); -} - -Expression expand(Expression& x) { - return exp(x); -} -float expand(float x) { - return exp(x); -} - - -#if defined USE_ODBC - void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); - - #if defined _WINDOWS - WCHAR* pwszConnStr = L"DSN=slawek"; - #else - SQLCHAR* pwszConnStr = (SQLCHAR*) "DSN=slawek"; - #endif - #define TRYODBC(h, ht, x) { RETCODE rc = x;\ - if (rc != SQL_SUCCESS) \ - { \ - HandleDiagnosticRecord (h, ht, rc); \ - } \ - if (rc == SQL_ERROR) \ - { \ - fprintf(stderr, "Error in " #x "\n"); \ - if (hStmt) { \ - SQLFreeHandle(SQL_HANDLE_STMT, hStmt); \ - } \ - if (hDbc) { \ - SQLDisconnect(hDbc); \ - SQLFreeHandle(SQL_HANDLE_DBC, hDbc); \ - } \ - if (hEnv) { \ - SQLFreeHandle(SQL_HANDLE_ENV, hEnv); \ - } \ - exit(-1); \ - } \ - } - -#endif - -struct M4TS {//storing series data - vector < float> categories_vect; - vector vals; - vector testVals;//empty, unless LBACK>0 - float meanAbsSeasDiff; - int n; - - M4TS(string category, stringstream &line_stream) { - array categories = { 0,0,0,0,0,0 }; - if (category == "Demographic") - categories[0] = 1; - else if (category == "Finance") - categories[1] = 1; - else if (category == "Industry") - categories[2] = 1; - else if (category == "Macro") - categories[3] = 1; - else if (category == "Micro") - categories[4] = 1; - else if (category == "Other") - categories[5] = 1; - else { - cerr << "unknown category?"; - exit(-1); - } - for (int i = 0; i < NUM_OF_CATEGORIES; i++) - categories_vect.push_back(categories[i]); - - string tmp_str; - while(getline(line_stream, tmp_str, ',' )) { - string val_str; - for (const auto c : tmp_str) { - if (c != '\"') {//remove quotes - val_str.push_back(c); - } - } - if (val_str.size() == 0) - break; - float val=(atof(val_str.c_str())); - vals.push_back(val); - } - - meanAbsSeasDiff = 0; - float sumf = 0; - for (int ip = SEASONALITY; ip0) - meanAbsSeasDiff = sumf / (vals.size() - SEASONALITY); - - if (LBACK > 0) { //extract last OUTPUT_SIZE points as the test values - if (vals.size() > LBACK*OUTPUT_SIZE) { - auto first = vals.begin() + vals.size() - LBACK*OUTPUT_SIZE; - auto pastLast = vals.begin() + vals.size() - (LBACK-1)*OUTPUT_SIZE; - vector input_vect(first, pastLast); //[first,pastLast) - testVals= input_vect; - vals.resize(vals.size() - LBACK*OUTPUT_SIZE); //remove last LBACK*OUTPUT_SIZE elements - n = vals.size(); - } else - n = 0; - } else { - n = vals.size(); - } - if (n > MAX_SERIES_LENGTH) {//chop long series - vals.erase(vals.begin(), vals.begin() + (n-MAX_SERIES_LENGTH)); //remove some early data - n = vals.size(); - } - } - M4TS(){}; -}; - -#if defined USE_ODBC -void HandleDiagnosticRecord(SQLHANDLE hHandle, - SQLSMALLINT hType, - RETCODE RetCode); -#endif - -struct AdditionalParams {//Per series, important - Parameter levSm; - Parameter sSm; - array initSeasonality; - Parameter sSm2; - array initSeasonality2; -}; -struct AdditionalParamsF {//Used for storing diagnostics - float levSm; - float sSm; - array initSeasonality; - float sSm2; - array initSeasonality2; - vector levels; - vector seasons; - vector seasons2; -}; - - -array perfToRanking (array perf_arr) { - array index; - - for (int itop=0; itop losses; - for (unsigned int indx = 0; indx as_scalar(forecH.value())) - loss = loss + (actual - forecH)*ALPHA_MULTIP; - losses.push_back(loss); - } - return sum(losses) / OUTPUT_SIZE; -} - -// weighted quantile Loss -float wQuantLoss(vector& out_vect, vector& actuals_vect, float tau, int offset) {//used just for diagnostics, if if LBACK>0 and PERCENTILE!=50 - float sumf = 0; float suma = 0; - for (unsigned int indx = 0; indx forec) - sumf = sumf + (actual - forec)*tau; - else - sumf = sumf + (actual - forec)*(tau - 1); - } - return sumf / suma * 200; -} - -float errorFunc(vector& out_vect, vector& actuals_vect, float meanAbsSeasDiff) { - float sumf=0; - for (unsigned int indx = 0; indx forecH) - loss = loss + (actualf - forecH)*ALPHA_MULTIP; - sumf+=loss; - } - return sumf / (OUTPUT_SIZE*meanAbsSeasDiff); -} - - - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - - int ibigOffset = 0; - if (argc == 2) - ibigOffset = atoi(argv[1]); - - cout< 0) { - cout<<"Warning. LEVEL_VARIABILITY_PENALTY has to be equal zero if SEASONALITY_NUM==0"<tm_year+1900; - now_ts.month=now->tm_mon+1; - now_ts.day=now->tm_mday; - now_ts.hour=now->tm_hour; - now_ts.minute=now->tm_min; - now_ts.second=now->tm_sec; - now_ts.fraction=0; //reportedly needed - - const int OFFSET_TO_FIRST_ACTUAL=5; - string insertQuery_str = "insert into M72nn(run, LBack, ibig, series, epoch "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - stringstream ss; - ss << iq; - string iq_str = ss.str(); - insertQuery_str = insertQuery_str +", actual"+iq_str+", forec" + iq_str; - } - insertQuery_str = insertQuery_str +", trainingError, variable, n, dateTimeOfPrediction) \ - values(? , ? , ? , ? , ? "; - for (int iq = 1; iq <= OUTPUT_SIZE; iq++) { - insertQuery_str = insertQuery_str + ",?,?"; - } - insertQuery_str = insertQuery_str + ",?,?,?,?)"; - #if defined _WINDOWS - wstring insertQuery(insertQuery_str.begin(), insertQuery_str.end()); - SQLWCHAR* sqlQuery = (SQLWCHAR*)insertQuery.c_str(); - #else - SQLCHAR* sqlQuery =(SQLCHAR*)insertQuery_str.c_str(); - #endif - - SQLHENV hEnv = NULL; - SQLHDBC hDbc = NULL; - SQLHSTMT hStmt = NULL, hInsertStmt = NULL; - - if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR) { - fprintf(stderr, "Unable to allocate an environment handle\n"); - exit(-1); - } - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLSetEnvAttr(hEnv, - SQL_ATTR_ODBC_VERSION, - (SQLPOINTER)SQL_OV_ODBC3, - 0)); - - // Allocate a connection - TRYODBC(hEnv, - SQL_HANDLE_ENV, - SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLDriverConnect(hDbc, - NULL, - pwszConnStr, - SQL_NTS, - NULL, - 0, - NULL, - SQL_DRIVER_COMPLETE)); - fprintf(stderr, "Connected!\n"); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLSetConnectAttr(hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER)); - - TRYODBC(hDbc, - SQL_HANDLE_DBC, - SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hInsertStmt)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLPrepare(hInsertStmt, sqlQuery, SQL_NTS)); - - SQLLEN nullTerminatedStringOfRun = SQL_NTS; - SQLLEN nullTerminatedStringOfSeries = SQL_NTS; - SQLLEN nullTerminatedStringOfVariable = SQL_NTS; - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&LBACK, 0, NULL)); - - // variable, n, dateTimeOfPrediction - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL+2*OUTPUT_SIZE+2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)VARIABLE.c_str(), 0, &nullTerminatedStringOfVariable)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 4, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, &now_ts, sizeof(TIMESTAMP_STRUCT), NULL)); -#endif - - random_device rd; // only used once to initialise (seed) engine - mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) - - vector series_vect; - unordered_map allSeries_map(30000);//max series in one chunk would be 24k for yearly series - unordered_map seriesCategories_map(120000);//100k series - - ifstream infoFile(INFO_INPUT_PATH); - string line; - getline(infoFile, line); //header - while (getline(infoFile, line)) { - //cout << string( line)<= MIN_SERIES_LENGTH) { - series_vect.push_back(series); - if (m4Obj.meanAbsSeasDiff==0) { - cout<<"Warning, flat series:"<0 && series_vect.size()>=MAX_NUM_OF_SERIES) - break; - } - cout << "num of series:" << series_vect.size() << endl; - - unsigned int series_len=(unsigned int)series_vect.size(); - uniform_int_distribution uniOnSeries(0,series_len-1); // closed interval [a, b] - uniform_int_distribution uniOnNets(0,NUM_OF_NETS-1); // closed interval [a, b] - - unordered_map, AVERAGING_LEVEL+1>, NUM_OF_NETS>> testResults_map((int)series_len*1.5);//per series, etc... - unordered_map> finalResults_map((int)series_len*1.5);//per series - set diagSeries; - - unordered_map> netRanking_map; - for (int ibig=0; ibig perfValid_vect; - int epochOfLastChangeOfLRate = -1; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&ibigDb, 0, NULL)); -#endif - - //create nets - array paramsCollection_arr;//per net - array perSeriesParamsCollection_arr;//per net - array trainers_arr; - array perSeriesTrainers_arr; - - - #if defined USE_RESIDUAL_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #elif defined USE_ATTENTIVE_LSTM - array, NUM_OF_NETS> rnnStack_arr; - #else - array, NUM_OF_NETS> rnnStack_arr; - #endif - - array MLPW_parArr; - array MLPB_parArr; - array adapterW_parArr; - array adapterB_parArr; - - //this is not a history, this is the real stuff - unordered_map* > additionalParams_mapOfArr((int)series_len*1.5); //per series, per net - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - additionalParams_mapOfArr[series]=new array(); - } - - for (int inet=0; inetclip_threshold = GRADIENT_CLIPPING; - perSeriesTrainers_arr[inet]=new AdamTrainer (perSeriesPC, INITIAL_LEARNING_RATE*PER_SERIES_LR_MULTIP, 0.9, 0.999, EPS); - perSeriesTrainers_arr[inet]->clip_threshold = GRADIENT_CLIPPING; - - auto& rNNStack=rnnStack_arr[inet]; - #if defined USE_RESIDUAL_LSTM - rNNStack.emplace_back(ResidualDilatedLSTMBuilder(dilations[0], INPUT_SIZE + NUM_OF_CATEGORIES, STATE_HSIZE, pc)); - for (int il = 1; il* additionalParams_arr=additionalParams_mapOfArr[series]; - additionalParams_arr->at(inet).levSm=perSeriesPC.add_parameters({1}, 0.5);//per series, per net - if (SEASONALITY_NUM > 0) { - additionalParams_arr->at(inet).sSm = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - if (SEASONALITY_NUM > 1) { - additionalParams_arr->at(inet).sSm2 = perSeriesPC.add_parameters({ 1 }, 0.5); - for (int isea = 0; iseaat(inet).initSeasonality2[isea] = perSeriesPC.add_parameters({ 1 }, 0.5); - } - } - }//seting up, through nets - - //history of params. Series->[NUM_OF_NETS,NUM_OF_TRAIN_EPOCHS] - unordered_map, NUM_OF_NETS>*> historyOfAdditionalParams_map((int)series_len*1.5); - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - historyOfAdditionalParams_map[series]=new array, NUM_OF_NETS>(); - } - - //first assignment. Yes, we are using vector , so the very first time the duplicates are possible. But a set can't be sorted - array, NUM_OF_NETS> seriesAssignment;//every net has an array - for (int j=0; j> netPerf_map; - for (int inet=0; inetlearning_rate = LEARNING_RATES.at(iEpoch); - if (inet==0) - cout << "changing LR to:" << trainer->learning_rate << endl; - perSeriesTrainer->learning_rate = LEARNING_RATES.at(iEpoch)*PER_SERIES_LR_MULTIP; - } - - auto& rNNStack=rnnStack_arr[inet]; - Parameter& MLPW_par = MLPW_parArr[inet]; - Parameter& MLPB_par = MLPB_parArr[inet]; - Parameter& adapterW_par=adapterW_parArr[inet]; - Parameter& adapterB_par=adapterB_parArr[inet]; - - vector oneNetAssignments=seriesAssignment[inet]; - random_shuffle (oneNetAssignments.begin(), oneNetAssignments.end()); - - vector epochLosses; - vector forecLosses; vector levVarLosses; vector stateLosses; - for (auto iter = oneNetAssignments.begin() ; iter != oneNetAssignments.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - - ComputationGraph cg; - for (int il=0; ilat(inet); - array& historyOfAdditionalParams_arr=historyOfAdditionalParams_map[series]->at(inet); - - Expression MLPW_ex,MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex= parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea logDiffOfLevels_vect; - vector levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - Expression levelVarLoss_ex; - if (LEVEL_VARIABILITY_PENALTY > 0) { - vector levelVarLoss_v; - for (int i = 1; i losses;//losses of steps through single time series - for (int i=INPUT_SIZE-1; i<(m4Obj.n- OUTPUT_SIZE); i++) { - vector::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - - first = m4Obj.vals.begin() + i + 1; - pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - - firstE = season_exVect.begin() + i + 1; - pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - - firstE = season2_exVect.begin() + i + 1; - pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); - }//through points of a series - - Expression forecLoss_ex= average(losses); - Expression loss_exp = forecLoss_ex; - - float levVarLoss=0; - if (LEVEL_VARIABILITY_PENALTY > 0) { - Expression levelVarLossP_ex = levelVarLoss_ex*LEVEL_VARIABILITY_PENALTY; - levVarLoss = as_scalar(levelVarLossP_ex.value()); - levVarLosses.push_back(levVarLoss); - loss_exp= loss_exp + levelVarLossP_ex; - } - - float cStateLoss=0; - if (C_STATE_PENALTY>0) { - vector cStateLosses_vEx; - for (int irnn = 0; irnn < rNNStack.size(); irnn++) - for (int it = 0; itupdate();//update shared weights - perSeriesTrainer->update();//update params of this series only - } catch (exception& e) {//it may happen occasionally. I believe it is due to not robust enough implementation of squashing functions in Dynet. When abs(x)>35 NAs appear. - //so the code below is trying to produce some diagnostics, hopefully useful when setting LEVEL_VARIABILITY_PENALTY and C_STATE_PENALTY. - cerr<<"cought exception while doing "< maxAbs) { - maxAbs = abs(state[iv]); - timeOfMax=it; - layerOfMax=il; - chunkOfMax= irnn; - } - } - } //through layers/states - } //through time - } //through chunks - - cout << "levSm:" << as_scalar(levSm_ex.value()) << endl; - if (SEASONALITY_NUM > 0) - cout << "sSm:" << as_scalar(sSm_ex.value()) << endl; - if (SEASONALITY_NUM > 1) - cout << "sSm2:" << as_scalar(sSm2_ex.value()) << endl; - cout << "max abs:" << maxAbs <<" at time:"<< timeOfMax<<" at layer:"<< layerOfMax<<" and chunk:"<< chunkOfMax< 0) { - histAdditionalParams.sSm=as_scalar(sSm_ex.value()); - for (int isea = 0; isea 1) { - histAdditionalParams.sSm2 = as_scalar(sSm2_ex.value()); - for (int isea=0; isea 0 || C_STATE_PENALTY > 0) { - float averageForecLoss = accumulate(forecLosses.begin(), forecLosses.end(), 0.0) / forecLosses.size(); - cout << " forec loss:" << averageForecLoss * 100; - } - if (LEVEL_VARIABILITY_PENALTY > 0) { - float averagelevVarLoss = accumulate(levVarLosses.begin(), levVarLosses.end(), 0.0) / levVarLosses.size(); - cout << " levVar loss:" << averagelevVarLoss * 100; - } - if (C_STATE_PENALTY > 0) { - float averageStateLoss = accumulate(stateLosses.begin(), stateLosses.end(), 0.0) / stateLosses.size(); - cout << " state loss:" << averageStateLoss * 100; - } - cout<at(inet); - Expression MLPW_ex, MLPB_ex; - if (ADD_NL_LAYER) { - MLPW_ex = parameter(cg, MLPW_par); - MLPB_ex = parameter(cg, MLPB_par); - } - Expression adapterW_ex=parameter(cg, adapterW_par); - Expression adapterB_ex=parameter(cg, adapterB_par); - - Expression levSmSerNet0_ex = parameter(cg, additionalParams.levSm); - Expression levSm_ex = logistic(levSmSerNet0_ex); - - vector season_exVect;//vector, because we do not know how long the series is - Expression sSm_ex; - if (SEASONALITY_NUM > 0) { - Expression sSmSerNet0_ex= parameter(cg, additionalParams.sSm); - sSm_ex = logistic(sSmSerNet0_ex); - - for (int isea = 0; isea season2_exVect;//vector, because we do not know how long the series is - Expression sSm2_ex; - if (SEASONALITY_NUM > 1) { - Expression sSm2SerNet0_ex= parameter(cg, additionalParams.sSm2); - sSm2_ex = logistic(sSm2SerNet0_ex); - - for (int isea = 0; isea levels_exVect; - if (SEASONALITY_NUM == 0) { - levels_exVect.push_back(input(cg, m4Obj.vals[0])); - for (int i = 1; i0 then this is shortened, so it always contains data awe have right to access - Expression newLevel_ex = m4Obj.vals[i] * cdiv(levSm_ex, season_exVect[i]) + (1 - levSm_ex)*levels_exVect[i - 1]; - levels_exVect.push_back(newLevel_ex); - - Expression newSeason_ex = m4Obj.vals[i] * cdiv(sSm_ex, newLevel_ex) + (1 - sSm_ex)*season_exVect[i]; - season_exVect.push_back(newSeason_ex); - } - - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - } - else if (SEASONALITY_NUM == 2) { - Expression lev = cdiv(input(cg, m4Obj.vals[0]), season_exVect[0] * season2_exVect[0]); - levels_exVect.push_back(lev); - for (int i = 1; iSEASONALITY) { - unsigned long startSeasonalityIndx = season_exVect.size() - SEASONALITY; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY); i++) - season_exVect.push_back(season_exVect[startSeasonalityIndx + i]); - } - //if prediction horizon is larger than seasonality, so we need to repeat some of the seasonality factors - if (OUTPUT_SIZE>SEASONALITY2) { - unsigned long startSeasonalityIndx = season2_exVect.size() - SEASONALITY2; - for (int i = 0; i<(OUTPUT_SIZE - SEASONALITY2); i++) - season2_exVect.push_back(season2_exVect[startSeasonalityIndx + i]); - } - } - else { - cerr<<"SEASONALITY_NUM="<< SEASONALITY_NUM; - exit(-1); - } - - - Expression inputSeasonality_ex; Expression inputSeasonality2_ex; - Expression outputSeasonality_ex; Expression outputSeasonality2_ex; - vector losses;//losses of steps through single time series - Expression out_ex;//we declare it here, bcause the last one will be the forecast - for (int i=INPUT_SIZE-1; i::const_iterator first = m4Obj.vals.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1; //not including the last one - vector input_vect(first, pastLast); //[first,pastLast) - Expression input1_ex = input(cg, { INPUT_SIZE }, input_vect); - - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() +i+1-INPUT_SIZE; - vector::const_iterator pastLastE = season_exVect.begin() +i+1; //not including the last one - vector inputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality_ex=concatenate(inputSeasonality_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality_ex); // input deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1 - INPUT_SIZE; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1; //not including the last one - vector inputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - inputSeasonality2_ex = concatenate(inputSeasonality2_exVect); - input1_ex = cdiv(input1_ex, inputSeasonality2_ex); //input deseasonalization - } - - vector joinedInput_ex; - joinedInput_ex.emplace_back(noise(squash(cdiv(input1_ex, levels_exVect[i])), NOISE_STD)); //input normalization+noise - joinedInput_ex.emplace_back(input(cg, { NUM_OF_CATEGORIES }, m4Obj.categories_vect)); - Expression input_ex = concatenate(joinedInput_ex); - - Expression rnn_ex; - try { - rnn_ex = rNNStack[0].add_input(input_ex); - for (int il=1; il::const_iterator first = m4Obj.vals.begin() + i + 1; - vector::const_iterator pastLast = m4Obj.vals.begin() + i + 1 + OUTPUT_SIZE; - vector labels_vect(first, pastLast); //[first,pastLast) - Expression labels1_ex = input(cg, { OUTPUT_SIZE }, labels_vect); - - if (SEASONALITY_NUM > 0) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - outputSeasonality_ex = concatenate(outputSeasonality_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality_ex); //output deseasonalization - } - if (SEASONALITY_NUM > 1) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE;//checking if enough elements is in the vecor was done a few pe - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - Expression outputSeasonality2_ex = concatenate(outputSeasonality2_exVect); - labels1_ex = cdiv(labels1_ex, outputSeasonality2_ex); //output deseasonalization - } - Expression labels_ex = squash(cdiv(labels1_ex, levels_exVect[i]));//output normalization - - //Expression loss_ex = pinBallLoss(out_ex, labels_ex); - Expression loss_ex = MSIS(out_ex, labels_ex); - if (i>=INPUT_SIZE+MIN_INP_SEQ_LEN) - losses.push_back(loss_ex); //training area losses - } - - if (i==(m4Obj.n-1)) {//validation loss - out_ex=expand(out_ex)*levels_exVect[i];//back to original scale - if (SEASONALITY_NUM > 0 ) { - vector::const_iterator firstE = season_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios=0; ios 1 ) { - vector::const_iterator firstE = season2_exVect.begin() + i + 1; - vector::const_iterator pastLastE = season2_exVect.begin() + i + 1 + OUTPUT_SIZE; - vector outputSeasonality2_exVect(firstE, pastLastE); //[first,pastLast) - for (int ios = 0; ios, AVERAGING_LEVEL+1>, NUM_OF_NETS>, BIG_LOOP>> testResults_map((int)series_len*1.5);//per series, big loop, etc... - //No epoch here, because this will just reflect the current (latest) situation - the last few epochs - vector out_vect=as_vector(out_ex.value()); - testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]=out_vect; - if (iEpoch>=AVERAGING_LEVEL && iEpoch % FREQ_OF_TEST==0) { - vector firstForec=testResults_map[series][inet][0]; - testResults_map[series][inet][AVERAGING_LEVEL]=firstForec; - for (int ii=1; ii nextForec=testResults_map[series][inet][ii]; - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - testResults_map[series][inet][AVERAGING_LEVEL][iii]+=nextForec[iii]; - } - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - testResults_map[series][inet][AVERAGING_LEVEL][iii]/=AVERAGING_LEVEL; - } //time to average - }//through series - } //through nets - - if (iEpoch>0 && iEpoch % FREQ_OF_TEST==0) { - //now that we have saved outputs of all nets on all series, let's calc how best and topn combinations performed during current epoch. - vector bestEpochLosses; - vector bestEpochAvgLosses; - vector topnEpochLosses; - vector topnEpochAvgLosses; - vector bestEpochLossesL; - vector bestEpochAvgLossesL; - vector topnEpochLossesL; - vector topnEpochAvgLossesL; - vector bestEpochLossesH; - vector bestEpochAvgLossesH; - vector topnEpochLossesH; - vector topnEpochAvgLossesH; - - for (auto iter = series_vect.begin() ; iter != series_vect.end(); ++iter) { - string series=*iter; - auto m4Obj=allSeries_map[series]; - -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)series.c_str(), 0, &nullTerminatedStringOfSeries)); - - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 3, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&m4Obj.n, 0, NULL)); -#endif - - float avgLoss; - vector avgLatest; - vector avgAvg; - - for (int itop=0; itop 0) { - float qLoss = errorFunc(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - bestEpochLosses.push_back(qLoss); - - qLoss=wQuantLoss(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - bestEpochLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][iEpoch%AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - bestEpochLossesH.push_back(qLoss); - } - avgLatest=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL]; //used later for calculating topn loss - - if (iEpoch>=AVERAGING_LEVEL) { - if (LBACK > 0) { - float qLoss = errorFunc(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, m4Obj.meanAbsSeasDiff); - bestEpochAvgLosses.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, TAUL, 0); - bestEpochAvgLossesL.push_back(qLoss); - - qLoss = wQuantLoss(testResults_map[series][inet][AVERAGING_LEVEL], m4Obj.testVals, TAUH, OUTPUT_SIZE); - bestEpochAvgLossesH.push_back(qLoss); - } - avgAvg=testResults_map[series][inet][AVERAGING_LEVEL]; - } - } else { - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) { - avgLatest[iii]+=testResults_map[series][inet][iEpoch%AVERAGING_LEVEL][iii];//calculate current topn - if (iEpoch>=AVERAGING_LEVEL) - avgAvg[iii]+=testResults_map[series][inet][AVERAGING_LEVEL][iii]; - } - } - }//through topn - - for (int iii=0; iii<2*OUTPUT_SIZE; iii++) - avgLatest[iii]/=TOPN; - - if (LBACK > 0) { - float qLoss = errorFunc(avgLatest, m4Obj.testVals, m4Obj.meanAbsSeasDiff); - topnEpochLosses.push_back(qLoss); - - qLoss = wQuantLoss(avgLatest, m4Obj.testVals, TAUL, 0); - topnEpochLossesL.push_back(qLoss); - - qLoss = wQuantLoss(avgLatest, m4Obj.testVals, TAUH, OUTPUT_SIZE); - topnEpochLossesH.push_back(qLoss); - } - - if (iEpoch>=AVERAGING_LEVEL) { - for (int iii = 0; iii<2*OUTPUT_SIZE; iii++) - avgAvg[iii] /= TOPN; - - finalResults_map[series] = avgAvg; - - if (LBACK > 0) { -#if defined USE_ODBC - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, OFFSET_TO_FIRST_ACTUAL + 2 * OUTPUT_SIZE + 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0, (SQLPOINTER)&avgLoss, 0, NULL)); - - for (int iv=0; iv<2; iv++) { - if (iv==0) - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runL.c_str(), 0, &nullTerminatedStringOfRun)) - else - TRYODBC(hInsertStmt, - SQL_HANDLE_STMT, - SQLBindParameter(hInsertStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLCHAR*)runH.c_str(), 0, &nullTerminatedStringOfRun)); - - for (int iii=0; iii 0) { - float bestEpochLoss=accumulate( bestEpochLosses.begin(), bestEpochLosses.end(), 0.0)/bestEpochLosses.size(); - float topnEpochLoss=accumulate( topnEpochLosses.begin(), topnEpochLosses.end(), 0.0)/topnEpochLosses.size(); - float bestEpochLossL = accumulate(bestEpochLossesL.begin(), bestEpochLossesL.end(), 0.0) / bestEpochLossesL.size(); - float topnEpochLossL = accumulate(topnEpochLossesL.begin(), topnEpochLossesL.end(), 0.0) / topnEpochLossesL.size(); - float bestEpochLossH = accumulate(bestEpochLossesH.begin(), bestEpochLossesH.end(), 0.0) / bestEpochLossesH.size(); - float topnEpochLossH = accumulate(topnEpochLossesH.begin(), topnEpochLossesH.end(), 0.0) / topnEpochLossesH.size(); - cout<=AVERAGING_LEVEL) { - float bestEpochAvgLoss=accumulate( bestEpochAvgLosses.begin(), bestEpochAvgLosses.end(), 0.0)/bestEpochAvgLosses.size(); - float topnEpochAvgLoss=accumulate( topnEpochAvgLosses.begin(), topnEpochAvgLosses.end(), 0.0)/topnEpochAvgLosses.size(); - float bestEpochAvgLossL = accumulate(bestEpochAvgLossesL.begin(), bestEpochAvgLossesL.end(), 0.0) / bestEpochAvgLossesL.size(); - float topnEpochAvgLossL = accumulate(topnEpochAvgLossesL.begin(), topnEpochAvgLossesL.end(), 0.0) / topnEpochAvgLossesL.size(); - float bestEpochAvgLossH = accumulate(bestEpochAvgLossesH.begin(), bestEpochAvgLossesH.end(), 0.0) / bestEpochAvgLossesH.size(); - float topnEpochAvgLossH = accumulate(topnEpochAvgLossesH.begin(), topnEpochAvgLossesH.end(), 0.0) / topnEpochAvgLossesH.size(); - cout<<" bestAvg:"<> netRanking_map - netRanking_map[series]=perfToRanking(netPerf_map[series]); - - for (int itop=0; itop diagSeries; - for (int i=0; i<1; i++) {//add a few normal ones - int irand=uniOnSeries(rng); - diagSeries.insert(series_vect[irand]); - } - for(auto series : diagSeries) { - cout<at(inet); - for (int iEpoch=0; iEpoch 0 ) { - cout<<"sSm:"<at(inet); - for (int iEpoch=0; iEpoch 1 ) { - cout<<"sSm2:"<at(inet); - for (int iEpoch=0; iEpochat(inet); - for (int iEpoch = 0; iEpoch0) { - cout << "levels:" << iEpoch<<" "; - for (int iv = 0; iv 0 ) { - cout << "seasons:" << iEpoch<<" "; - for (int iv = 0; iv 1 ) { - cout << "seasons2:" << iEpoch<<" "; - for (int iv = 0; iv - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Source Files - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/M44.vcxproj b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/M44.vcxproj deleted file mode 100644 index 4b183143..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/M44.vcxproj +++ /dev/null @@ -1,227 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - RelWithDebug - Win32 - - - RelWithDebug - x64 - - - - - - - - - - - {7A192E0C-8F58-4D65-998E-3A7010AB5F87} - Win32Proj - M44 - 8.1 - - - - Application - true - v140 - Unicode - - - Application - true - v140 - Unicode - - - Application - false - v140 - true - Unicode - - - Application - true - v140 - Unicode - Sequential - - - Application - true - v140 - Unicode - Sequential - - - Application - false - v140 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - false - - - false - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - - - NotUsing - Level1 - Disabled - WIN32;_WINDOWS;EIGEN_USE_MKL_ALL;EIGEN_FAST_MATH;NOMINMAX;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - - - Console - true - E:\progs2\dynet\buildMKL\dynet\Debug - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - NotUsing - Level1 - MaxSpeed - WIN32;_WINDOWS;EIGEN_FAST_MATH;EIGEN_USE_MKL_ALL;NOMINMAX;NDEBUG_;CONSOLE;%(PreprocessorDefinitions) - E:\progs2\dynet;E:\progs\Eigen; - AnySuitable - true - Speed - AdvancedVectorExtensions - Default - MultiThreadedDLL - ProgramDatabase - true - false - - - Console - true - E:\progs2\dynet\buildMKL\dynet\RelWithDebInfo - dynet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - true - true - - - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/M44.vcxproj.user b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/M44.vcxproj.user deleted file mode 100644 index 6fb136bf..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/M44.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/slstm.h b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/slstm.h deleted file mode 100644 index 654331ea..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/M44/slstm.h +++ /dev/null @@ -1,394 +0,0 @@ -/** -* file slstm.h -* header for my implementation of dilated LSTMs, based on Dynet LSTM builders - - DilatedLSTMBuilder - standard Dilated LSTM (https://papers.nips.cc/paper/6613-dilated-recurrent-neural-networks.pdf) - - ResidualDilatedLSTMBuilder - Dilated LSTM with special Residual shortcuts, after https://arxiv.org/abs/1701.03360 - - AttentiveDilatedLSTMBuilder - Dilated LSTM with Attention mechanism, as in the second stage of https://arxiv.org/abs/1704.02971 -* -Slawek Smyl, Mar-May 2018 -*/ - -#ifndef DYNET_SLSTMS_H_ -#define DYNET_SLSTMS_H_ - -#include "dynet/dynet.h" -#include "dynet/rnn.h" -#include "dynet/expr.h" - -using namespace std; - -namespace dynet { - - //basd on VanillaLSTMBuilder - struct ResidualDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - ResidualDilatedLSTMBuilder(); - /** - * \brief Constructor for the ResidualDilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - * \param ln_lstm Whether to use layer normalization - * \param forget_bias value(float) to use as bias for the forget gate(default = 1.0) - */ - explicit ResidualDilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model, - bool ln_lstm = false, - float forget_bias = 1.f); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - * \param d_h Dropout rate \f$d_h\f$ for the output \f$h_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - /** - * \brief Get parameters in ResidualDilatedLSTMBuilder - * \return list of points to ParameterStorage objects - */ - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - // first index is layer, then ... - std::vector> ln_params; - - // first index is layer, then ... - std::vector> param_vars; - // first index is layer, then ... - std::vector> ln_param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - bool ln_lstm; - float forget_bias; - bool dropout_masks_valid; - vector dilations; //one int per layer - - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct DilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - DilatedLSTMBuilder(); - /** - * \brief Constructor for the DilatedLSTMBuilder - * - * \param dilations Vector of dilations - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit DilatedLSTMBuilder(vector dilations, - unsigned input_dim, - unsigned hidden_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - float dropout_rate_h; - float weightnoise_std; - vector dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; - - - struct AttentiveDilatedLSTMBuilder : public RNNBuilder { - /** - * @brief Default Constructor - */ - AttentiveDilatedLSTMBuilder(); - /** - * \brief Constructor for the AttentiveDilatedLSTMBuilder - * - * \param max_dilations Vector, maximum dilations (per layer) - * \param input_dim Dimention of the input \f$x_t\f$ - * \param hidden_dim Dimention of the hidden states \f$h_t\f$ and \f$c_t\f$ - * \param model ParameterCollection holding the parameters - */ - explicit AttentiveDilatedLSTMBuilder(vector max_dilations, - unsigned input_dim, - unsigned hidden_dim, - unsigned attention_dim, - ParameterCollection& model); - - Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } - std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const override { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for (auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - - std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const override { - std::vector ret = (i == -1 ? c0 : c[i]); - for (auto my_h : get_h(i)) ret.push_back(my_h); - return ret; - } - - void copy(const RNNBuilder & params) override; - - /** - * \brief Set the dropout rates to a unique value - * \details This has the same effect as `set_dropout(d,d_h)` except that all the dropout rates are set to the same value. - * \param d Dropout rate to be applied on all of \f$x,h\f$ - */ - void set_dropout(float d); - /** - * \brief Set the dropout rates - * \details The dropout implemented here is the variational dropout with tied weights introduced in [Gal, 2016](http://papers.nips.cc/paper/6241-a-theoretically-grounded-application-of-dropout-in-recurrent-neural-networks) - * More specifically, dropout masks \f$\mathbf{z_x}\sim \mathrm{Bernoulli}(1-d_x)\f$,\f$\mathbf{z_h}\sim \mathrm{Bernoulli}(1-d_h)\f$ are sampled at the start of each sequence. - * The dynamics of the cell are then modified to : - * - * \f$ - * \begin{split} - i_t & =\sigma(W_{ix}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ih}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_i)\\ - f_t & = \sigma(W_{fx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{fh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_f)\\ - o_t & = \sigma(W_{ox}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{oh}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_o)\\ - \tilde{c_t} & = \tanh(W_{cx}(\frac 1 {1-d_x}\mathbf{z_x} \circ x_t)+W_{ch}(\frac 1 {1-d_h}\mathbf{z_h} \circ h_{t-1})+b_c)\\ - c_t & = c_{t-1}\circ f_t + \tilde{c_t}\circ i_t\\ - h_t & = \tanh(c_t)\circ o_t\\ - \end{split} - * \f$ - * - * For more detail as to why scaling is applied, see the "Unorthodox" section of the documentation - * \param d Dropout rate \f$d_x\f$ for the input \f$x_t\f$ - */ - void set_dropout(float d, float d_r); - /** - * \brief Set all dropout rates to 0 - * \details This is equivalent to `set_dropout(0)` or `set_dropout(0,0,0)` - * - */ - void disable_dropout(); - /** - * \brief Set dropout masks at the beginning of a sequence for a specific batch size - * \details If this function is not called on batched input, the same mask will be applied across - * all batch elements. Use this to apply different masks to each batch element - * - * \param batch_size Batch size - */ - void set_dropout_masks(unsigned batch_size = 1); - - void set_weightnoise(float std); - ParameterCollection & get_parameter_collection() override; - protected: - void new_graph_impl(ComputationGraph& cg, bool update) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) override; - - public: - ParameterCollection local_model; - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is layer, then ... - std::vector> masks; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned input_dim, hid; - unsigned attention_dim; - float dropout_rate_h; - float weightnoise_std; - vector max_dilations; //one int per layer - - bool dropout_masks_valid; - private: - ComputationGraph* _cg; // Pointer to current cg - - }; -} // namespace dynet - -#endif diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/readme.txt b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/readme.txt deleted file mode 100644 index 2aea5134..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -This is Visual Studio 15 solution, with 4 projects, one for each .cc file. -Two targets are defined: Debug and RelWitDebug, which is Release with debug info, that I used normally. -You will need to update include and link paths to point to your installation of Dynet. -In x64\RelWithDebug directory you will find two example scripts to run the executables -in conjunction with one program started interactively inside VS. \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/x64/RelWithDebug/readme.txt b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/x64/RelWithDebug/readme.txt deleted file mode 100644 index 749c35a8..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/x64/RelWithDebug/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -These example run scripts. They are meant to be run on 6-core computer and assume that the program, -M41.exe has been started interactively in Visual Studio, so they add 5 processes. -run61.cmd should be run for ES_RNN and ES_RNN_PI, so Monthly and Quarterly series, -although for Monthly you probably want to use computer with more cores, unless you are fine waiting a week or so :-) -run61_e.cmd is for ES_RNN_E and ES_RNN_E_PI, so all other cases. \ No newline at end of file diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/x64/RelWithDebug/run61.cmd b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/x64/RelWithDebug/run61.cmd deleted file mode 100644 index b4db82a5..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/x64/RelWithDebug/run61.cmd +++ /dev/null @@ -1,5 +0,0 @@ -start M41 10 2 -start M41 11 1 5 -start M41 11 2 5 -start M41 12 1 10 -start M41 12 2 10 diff --git a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/x64/RelWithDebug/run61_e.cmd b/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/x64/RelWithDebug/run61_e.cmd deleted file mode 100644 index 31ce87f2..00000000 --- a/prototypes/ES_RNN/sales_limited/github/c++/windows_VisualStudio/x64/RelWithDebug/run61_e.cmd +++ /dev/null @@ -1,5 +0,0 @@ -start M41 5 -start M41 10 -start M41 15 -start M41 20 -start M41 25 diff --git a/prototypes/ES_RNN/sales_limited/github/readme.txt b/prototypes/ES_RNN/sales_limited/github/readme.txt deleted file mode 100644 index e0f23354..00000000 --- a/prototypes/ES_RNN/sales_limited/github/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -ES-RNN programs, related script, and docs. -M4 Forecasting Competition, 2018 -Slawek Smyl, Uber. - -The programs are in C++ and use Dynet - a Dynamic Graph NN system (https://github.com/clab/dynet) - - - - diff --git a/prototypes/ES_RNN/sales_limited/github/sql/createM72nn_SQLServer.sql b/prototypes/ES_RNN/sales_limited/github/sql/createM72nn_SQLServer.sql deleted file mode 100644 index f7b6385d..00000000 --- a/prototypes/ES_RNN/sales_limited/github/sql/createM72nn_SQLServer.sql +++ /dev/null @@ -1,135 +0,0 @@ -USE [slawek] -GO - -/****** Object: Table [dbo].[M72nn] Script Date: 6/2/2018 9:37:26 AM ******/ -SET ANSI_NULLS ON -GO - -SET QUOTED_IDENTIFIER ON -GO - -SET ANSI_PADDING ON -GO - -CREATE TABLE [dbo].[M72nn]( - [run] [varchar](164) NOT NULL, - [LBack] [smallint] NOT NULL, - [iBig] [smallint] NOT NULL, - [series] [varchar](20) NOT NULL, - [epoch] [smallint] NOT NULL, - [actual1] [real] NULL, - [forec1] [real] NULL, - [actual2] [real] NULL, - [forec2] [real] NULL, - [actual3] [real] NULL, - [forec3] [real] NULL, - [actual4] [real] NULL, - [forec4] [real] NULL, - [actual5] [real] NULL, - [forec5] [real] NULL, - [actual6] [real] NULL, - [forec6] [real] NULL, - [actual7] [real] NULL, - [forec7] [real] NULL, - [actual8] [real] NULL, - [forec8] [real] NULL, - [actual9] [real] NULL, - [forec9] [real] NULL, - [actual10] [real] NULL, - [forec10] [real] NULL, - [actual11] [real] NULL, - [forec11] [real] NULL, - [actual12] [real] NULL, - [forec12] [real] NULL, - [actual13] [real] NULL, - [forec13] [real] NULL, - [actual14] [real] NULL, - [forec14] [real] NULL, - [actual15] [real] NULL, - [forec15] [real] NULL, - [actual16] [real] NULL, - [forec16] [real] NULL, - [actual17] [real] NULL, - [forec17] [real] NULL, - [actual18] [real] NULL, - [forec18] [real] NULL, - [actual19] [real] NULL, - [forec19] [real] NULL, - [actual20] [real] NULL, - [forec20] [real] NULL, - [actual21] [real] NULL, - [forec21] [real] NULL, - [actual22] [real] NULL, - [forec22] [real] NULL, - [actual23] [real] NULL, - [forec23] [real] NULL, - [actual24] [real] NULL, - [forec24] [real] NULL, - [actual25] [real] NULL, - [forec25] [real] NULL, - [actual26] [real] NULL, - [forec26] [real] NULL, - [actual27] [real] NULL, - [forec27] [real] NULL, - [actual28] [real] NULL, - [forec28] [real] NULL, - [actual29] [real] NULL, - [forec29] [real] NULL, - [actual30] [real] NULL, - [forec30] [real] NULL, - [actual31] [real] NULL, - [forec31] [real] NULL, - [actual32] [real] NULL, - [forec32] [real] NULL, - [actual33] [real] NULL, - [forec33] [real] NULL, - [actual34] [real] NULL, - [forec34] [real] NULL, - [actual35] [real] NULL, - [forec35] [real] NULL, - [actual36] [real] NULL, - [forec36] [real] NULL, - [actual37] [real] NULL, - [forec37] [real] NULL, - [actual38] [real] NULL, - [forec38] [real] NULL, - [actual39] [real] NULL, - [forec39] [real] NULL, - [actual40] [real] NULL, - [forec40] [real] NULL, - [actual41] [real] NULL, - [forec41] [real] NULL, - [actual42] [real] NULL, - [forec42] [real] NULL, - [actual43] [real] NULL, - [forec43] [real] NULL, - [actual44] [real] NULL, - [forec44] [real] NULL, - [actual45] [real] NULL, - [forec45] [real] NULL, - [actual46] [real] NULL, - [forec46] [real] NULL, - [actual47] [real] NULL, - [forec47] [real] NULL, - [actual48] [real] NULL, - [forec48] [real] NULL, - [trainingError] [real] NULL, - [variable] [varchar](20) NOT NULL, - [n] [smallint] NOT NULL, - [dateTimeOfPrediction] [datetime] NOT NULL, - CONSTRAINT [M72nn_pk] PRIMARY KEY CLUSTERED -( - [run] ASC, - [LBack] ASC, - [iBig] ASC, - [series] ASC, - [epoch] ASC -)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] -) ON [PRIMARY] - -GO - -SET ANSI_PADDING OFF -GO - - diff --git a/prototypes/ES_RNN/sales_limited/github/sql/createM72nn_mysql.txt b/prototypes/ES_RNN/sales_limited/github/sql/createM72nn_mysql.txt deleted file mode 100644 index ac46daca..00000000 --- a/prototypes/ES_RNN/sales_limited/github/sql/createM72nn_mysql.txt +++ /dev/null @@ -1,54 +0,0 @@ -CREATE TABLE M72nn( - run varchar(160) NOT NULL, - LBack smallint NOT NULL, - iBig smallint NOT NULL, - series varchar(20) NOT NULL, - epoch smallint NOT NULL, - actual1 float NULL, - forec1 float NULL, - actual2 float NULL, - forec2 float NULL, - actual3 float NULL, - forec3 float NULL, - actual4 float NULL, - forec4 float NULL, - actual5 float NULL, - forec5 float NULL, - actual6 float NULL, - forec6 float NULL, - actual7 float NULL, - forec7 float NULL, - actual8 float NULL, - forec8 float NULL, - actual9 float NULL, - forec9 float NULL, - actual10 float NULL, - forec10 float NULL, - actual11 float NULL, - forec11 float NULL, - actual12 float NULL, - forec12 float NULL, - actual13 float NULL, - forec13 float NULL, - actual14 float NULL, - forec14 float NULL, - actual15 float NULL, - forec15 float NULL, - actual16 float NULL, - forec16 float NULL, - actual17 float NULL, - forec17 float NULL, - actual18 float NULL, - forec18 float NULL, - trainingError float NULL, - variable varchar(20) NOT NULL, - n smallint NOT NULL, - dateTimeOfPrediction datetime NOT NULL, - CONSTRAINT M72nn_pk PRIMARY KEY CLUSTERED -( - run ASC, - LBack ASC, - iBig ASC, - series ASC, - epoch ASC)); - diff --git a/prototypes/ES_RNN/sales_limited/github/sql/readme.txt b/prototypes/ES_RNN/sales_limited/github/sql/readme.txt deleted file mode 100644 index 2e4add58..00000000 --- a/prototypes/ES_RNN/sales_limited/github/sql/readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -I provide just two example table creation scrits, one for SQL Server and one for mysql. -The mysql table is limited to output vector 18, so would not be good for hourly runs. -Anyway, starting using the database is a large investment of time, apart from installationm, you also need to create auxiliary tables with MASE, and a lot of queries. -I do not have time to do all of it here and suspect there will be little interest in ODBC, so this is all what you get :-) diff --git a/prototypes/cross_validation/train_validation.py b/prototypes/cross_validation/train_validation.py deleted file mode 100644 index 2595a19e..00000000 --- a/prototypes/cross_validation/train_validation.py +++ /dev/null @@ -1,184 +0,0 @@ -import os, argparse -import pandas as pd -import numpy as np -from skgarden import RandomForestQuantileRegressor -import json -from joblib import Parallel, delayed - -from azureml.core import Run - -NUM_CV_ROUND = 4 -NUM_FORECAST_ROUND = 6 - -parser = argparse.ArgumentParser() -parser.add_argument('--data-folder', type=str, dest='data_folder', - help='data folder mounting point') -parser.add_argument('--min-samples-split', type=int, - dest='min_samples_split', - default=10) -parser.add_argument('--n-estimators', type=int, dest='n_estimators', - default=10) -args = parser.parse_args() - -data_path = os.path.join(args.data_folder, 'train_round_1.csv') -min_samples_split = args.min_samples_split -n_estimators = args.n_estimators - - -def pinball_loss(predictions, actuals, q): - zeros = pd.Series([0]*len(predictions)) - return (predictions-actuals).combine(zeros, max)*(1-q) + \ - (actuals-predictions).combine(zeros, max)*q - -run = Run.get_submitted_run() - -datetime_col = 'Datetime' -data_full = pd.read_csv(data_path, parse_dates=[datetime_col]) - -quantiles = np.linspace(0.1, 0.9, 9) -feature_cols = ['LoadLag', 'DryBulbLag', - 'annual_sin_1', 'annual_cos_1', 'annual_sin_2', - 'annual_cos_2', 'annual_sin_3', 'annual_cos_3', - 'weekly_sin_1', 'weekly_cos_1', 'weekly_sin_2', - 'weekly_cos_2', 'weekly_sin_3', 'weekly_cos_3' - ] - - -def train_validate(train_data, validation_data): - rfqr = RandomForestQuantileRegressor(random_state=0, - min_samples_split=min_samples_split, - n_estimators=n_estimators, - max_features=max_features) - - rfqr.fit(train_data[feature_cols], train_data['DEMAND']) - - result_list = [] - - for q in quantiles: - q_predict = rfqr.predict(validation_data[feature_cols], quantile=q) - - result = pd.DataFrame({'predict': q_predict, - 'q': q, - 'actual': validation_data['DEMAND'], - 'Datetime': validation_data['Datetime']}) - - result_list.append(result) - - result_final = pd.concat(result_list) - - result_final.reset_index(inplace=True, drop=True) - - result_final['loss'] = pinball_loss(result_final['predict'], - result_final['actual'], - result_final['q']) - - average_pinball_loss = result_final['loss'].mean() - - return average_pinball_loss - - -def train_single_group(train_df_single, group_name): - model = RandomForestQuantileRegressor(random_state=0, - min_samples_split=min_samples_split, - n_estimators=n_estimators) - - model.fit(train_df_single[feature_cols], train_df_single['DEMAND']) - - return group_name, model - - -def predict_single_group(test_df_single, group_name, model): - result_list = [] - - for q in quantiles: - q_predict = model.predict(test_df_single[feature_cols], quantile=q) - - result = pd.DataFrame({'predict': q_predict, - 'q': q, - 'actual': test_df_single['DEMAND'], - 'Datetime': test_df_single['Datetime'], - 'Zone': group_name}) - - result_list.append(result) - - result_final = pd.concat(result_list) - - return result_final - - -def train(train_df, parallel): - train_df_grouped = train_df.groupby('Zone') - - models_all = parallel\ - (delayed(train_single_group)(group.copy(), name) - for name, group in train_df_grouped) - - models_all_dict = {} - for k, v in models_all: - models_all_dict[k] = v - - return models_all_dict - - -def predict(test_df, models_all, parallel): - test_df_grouped = test_df.groupby('Zone') - - predictions = parallel\ - (delayed(predict_single_group)(group.copy(), name, models_all[name]) - for name, group in test_df_grouped) - - predictions_final = pd.concat(predictions) - - return predictions_final - - -with open('cv_settings.json') as f: - cv_config = json.load(f) - -predictions_all = [] - -with Parallel(n_jobs=-1) as parallel: - for i_cv in range(1, NUM_CV_ROUND + 1): - print('CV Round {}'.format(i_cv)) - cv_round = 'cv_round_' + str(i_cv) - cv_config_round = cv_config[cv_round] - - for i_r in range(1, NUM_FORECAST_ROUND + 1): - print('Forecast Round {}'.format(i_r)) - train_range = cv_config_round[str(i_r)]['train_range'] - validation_range = cv_config_round[str(i_r)]['validation_range'] - - train_start = pd.to_datetime(train_range[0]) - train_end = pd.to_datetime(train_range[1]) - - validation_start = pd.to_datetime(validation_range[0]) - validation_end = pd.to_datetime(validation_range[1]) - - train_df = data_full.loc[(data_full[datetime_col] >= train_start) - & (data_full[datetime_col] <= train_end)] - validation_df = data_full.loc[(data_full[datetime_col] >= - validation_start) - & (data_full[datetime_col] <= - validation_end)] - - validation_month = validation_df['MonthOfYear'].values[0] - train_df = train_df.loc[train_df['MonthOfYear'] == validation_month,].copy() - - models_all = train(train_df, parallel) - predictions_df = predict(validation_df, models_all, parallel) - predictions_df['CVRound'] = i_cv - predictions_df['ForecastRound'] = i_r - predictions_all.append(predictions_df) - -predictions_final = pd.concat(predictions_all) -predictions_final.reset_index(inplace=True, drop=True) - -predictions_final['loss'] = pinball_loss(predictions_final['predict'], - predictions_final['actual'], - predictions_final['q']) - -average_pinball_loss = predictions_final['loss'].mean() - -print('Average Pinball loss is {}'.format(average_pinball_loss)) - -run.log('average pinball loss', average_pinball_loss) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..e6c68b54 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,16 @@ +[tool.black] +line-length = 120 +include = '\.pyi?$' +exclude = ''' +/( + \.git + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | _build + | buck-out + | build + | dist +)/ +''' \ No newline at end of file diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/benchmark_paths.py b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/benchmark_paths.py deleted file mode 100644 index 32476498..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/benchmark_paths.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -This file contains important path variables shared by all scripts -in the OrangeJuice_Pt_3Weeks_Weekly benchmark folder. It inserts -the TSPerf directory into sys.path, so that scripts can import -all the modules in TSPerf. -""" -import os -import sys - -SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) -BENCHMARK_DIR = os.path.dirname(SCRIPT_DIR) -TSPERF_DIR = os.path.dirname(os.path.dirname(BENCHMARK_DIR)) - -SUBMISSIONS_DIR = os.path.join(BENCHMARK_DIR, 'submissions') -DATA_DIR = os.path.join(BENCHMARK_DIR, 'data') - -if TSPERF_DIR not in sys.path: - sys.path.insert(0, TSPERF_DIR) \ No newline at end of file diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/benchmark_settings.py b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/benchmark_settings.py deleted file mode 100644 index 632e714d..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/benchmark_settings.py +++ /dev/null @@ -1,14 +0,0 @@ -# Define benchmark related parameters. The parameters should conform with the benchmark definition -# in ../README.md file - -import pandas as pd - -NUM_ROUNDS = 12 -PRED_HORIZON = 3 -PRED_STEPS = 2 -TRAIN_START_WEEK = 40 -TRAIN_END_WEEK_LIST = list(range(135,159,2)) -TEST_START_WEEK_LIST = list(range(137,161,2)) -TEST_END_WEEK_LIST = list(range(138,162,2)) -# The start datetime of the first week in the record -FIRST_WEEK_START = pd.to_datetime('1989-09-14 00:00:00') diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/download_data.r b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/download_data.r deleted file mode 100644 index 5ac4d291..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/download_data.r +++ /dev/null @@ -1,17 +0,0 @@ -# Retrieves the orangeJuice dataset from the bayesm R package -# and saves as csv - -#install.packages("bayesm", repos = "http://mran.revolutionanalytics.com/snapshot/2018-08-27/") -install.packages("bayesm") - -library(bayesm) - -data("orangeJuice") - -yx <- orangeJuice[[1]] -storedemo <- orangeJuice[[2]] - -fpath <- file.path("retail_sales", "OrangeJuice_Pt_3Weeks_Weekly", "data") - -write.csv(yx, file = file.path(fpath, "yx.csv"), quote = FALSE, na = " ", row.names = FALSE) -write.csv(storedemo, file = file.path(fpath, "storedemo.csv"), quote = FALSE, na = " ", row.names = FALSE) diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/serve_folds.py b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/serve_folds.py deleted file mode 100644 index 92e6bc77..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/common/serve_folds.py +++ /dev/null @@ -1,84 +0,0 @@ -# Return training and testing data for each forecast round -# -# You can use this script in either of the following two ways -# 1. Import the serve_folds module from this script to generate the training and testing data for -# each forecast period on the fly -# 2. Run the script using the syntax below -# python serve_folds [-h] [--test] [--save] -# where if '--test' is specified a quick test of serve_folds module will run and furthermore if -# `--save' is specified the training and testing data will be saved as csv files. Note that '--save' -# is effective only if '--test' is specified. This means that you need to run -# python serve_folds --test --save -# to get the output data files stored in /train and /test folders under the data directory. -# Note that train_*.csv files in /train folder contain all the features in the training period -# and aux_*.csv files in /train folder contain all the features except 'logmove', 'constant', -# 'profit' up until the forecast period end week. Both train_*.csv and aux_*csv can be used for -# generating forecasts in each round. However, test_*.csv files in /test folder can only be used -# for model performance evaluation. - -import os -import sys -import inspect -import argparse -import pandas as pd - -if '.' not in sys.path: - sys.path.append('.') -import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs - - -def serve_folds(write_csv=False): - """Generate training, testing, and auxiliary datasets. Training data includes the historical - sales and external features; testing data contains the future sales and external features; - auxiliary data includes the future price, deal, and advertisement information which can be - used for making predictions (we assume such auxiliary information is available at the time - when we generate the forecasts). - - Args: - write_csv (Boolean): Whether to write the data files or not - """ - # Get the directory of this script and directory of the OrangeJuice dataset - SCRIPT_DIR = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) - DATA_DIR = os.path.join(os.path.dirname(SCRIPT_DIR), 'data') - # Read sales data into dataframe - sales = pd.read_csv(os.path.join(DATA_DIR, 'yx.csv'), index_col=0) - - if write_csv: - TRAIN_DATA_DIR = os.path.join(DATA_DIR, 'train') - TEST_DATA_DIR = os.path.join(DATA_DIR, 'test') - if not os.path.isdir(TRAIN_DATA_DIR): - os.mkdir(TRAIN_DATA_DIR) - if not os.path.isdir(TEST_DATA_DIR): - os.mkdir(TEST_DATA_DIR) - - for i in range(bs.NUM_ROUNDS): - data_mask = (sales.week>=bs.TRAIN_START_WEEK) & (sales.week<=bs.TRAIN_END_WEEK_LIST[i]) - train = sales[data_mask].copy() - data_mask = (sales.week>=bs.TEST_START_WEEK_LIST[i]) & (sales.week<=bs.TEST_END_WEEK_LIST[i]) - test = sales[data_mask].copy() - data_mask = (sales.week>=bs.TRAIN_START_WEEK) & (sales.week<=bs.TEST_END_WEEK_LIST[i]) - aux = sales[data_mask].copy() - aux.drop(['logmove', 'constant', 'profit'], axis=1, inplace=True) - if write_csv: - train.to_csv(os.path.join(TRAIN_DATA_DIR, 'train_round_' + str(i+1) + '.csv')) - test.to_csv(os.path.join(TEST_DATA_DIR, 'test_round_' + str(i+1) + '.csv')) - aux.to_csv(os.path.join(TRAIN_DATA_DIR, 'aux_round_' + str(i+1) + '.csv')) - yield train, test, aux - -# Test serve_folds -parser = argparse.ArgumentParser() -parser.add_argument('--test', help='Run the test of serve_folds function', action='store_true') -parser.add_argument('--save', help='Write training and testing data into csv files', action='store_true') -args = parser.parse_args() -if args.test: - for train, test, aux in serve_folds(args.save): - print('Training data size: {}'.format(train.shape)) - print('Testing data size: {}'.format(test.shape)) - print('Auxiliary data size: {}'.format(aux.shape)) - print('Minimum training week number: {}'.format(min(train['week']))) - print('Maximum training week number: {}'.format(max(train['week']))) - print('Minimum testing week number: {}'.format(min(test['week']))) - print('Maximum testing week number: {}'.format(max(test['week']))) - print('Minimum auxiliary week number: {}'.format(min(aux['week']))) - print('Maximum auxiliary week number: {}'.format(max(aux['week']))) - print('') diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/reference/data_explore/explore_oj_data_python.ipynb b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/reference/data_explore/explore_oj_data_python.ipynb deleted file mode 100644 index ca3ad034..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/reference/data_explore/explore_oj_data_python.ipynb +++ /dev/null @@ -1,1185 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Orange Juice Data Exploration in Python\n", - "\n", - "In this notebook, we use Python to explore the Orange Juice dataset in R package `bayesm`. This dataset is used in the retail forecasting benchmark [OrangeJuice_Pt_3Weeks_Weekly](https://msdata.visualstudio.com/AlgorithmsAndDataScience/_git/TSPerf?path=%2Fretail_sales%2FOrangeJuice_Pt_3Weeks_Weekly&version=GBmaster) of TSPerf. \n", - "\n", - "To run this notebook, please first create and activate `tsperf` conda environment by running the following commands from `TSPerf` directory: \n", - "\n", - "`conda env create --file ./common/conda_dependencies.yml` \n", - "`conda activate tsperf` \n", - "\n", - "Then, inside the `tsperf` environment, please run the following commands to create the jupyter notebook kernel:\n", - "\n", - "``\n", - "python -m ipykernel install --name tsperf\n", - "``\n", - "\n", - "Finally, you can launch the Jupyter notebook by running `jupyter notebook` and select the kernel named `tsperf` in the list of kernels under Kernel tab." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: patsy in c:\\users\\yiychen\\appdata\\local\\continuum\\anaconda3\\envs\\tsperf\\lib\\site-packages (0.5.1)\n", - "Requirement already satisfied: numpy>=1.4 in c:\\users\\yiychen\\appdata\\local\\continuum\\anaconda3\\envs\\tsperf\\lib\\site-packages (from patsy) (1.15.0)\n", - "Requirement already satisfied: six in c:\\users\\yiychen\\appdata\\local\\continuum\\anaconda3\\envs\\tsperf\\lib\\site-packages (from patsy) (1.12.0)\n", - "Requirement already satisfied: statsmodels in c:\\users\\yiychen\\appdata\\local\\continuum\\anaconda3\\envs\\tsperf\\lib\\site-packages (0.9.0)\n" - ] - } - ], - "source": [ - "# install the statsmodels\n", - "!pip install patsy\n", - "!pip install statsmodels" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# import packages\n", - "import pandas as pd\n", - "import numpy as np\n", - "import os\n", - "import math\n", - "import itertools\n", - "import matplotlib.pyplot as plt\n", - "import statsmodels.api as sm" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "First few rows of sales data: \n", - "\n", - " store brand week logmove constant price1 price2 price3 \\\n", - "0 2 1 40 9.018695 1 0.060469 0.060497 0.042031 \n", - "1 2 1 46 8.723231 1 0.060469 0.060312 0.045156 \n", - "2 2 1 47 8.253228 1 0.060469 0.060312 0.045156 \n", - "3 2 1 48 8.987197 1 0.060469 0.060312 0.049844 \n", - "\n", - " price4 price5 price6 price7 price8 price9 price10 \\\n", - "0 0.029531 0.049531 0.053021 0.038906 0.041406 0.028906 0.024844 \n", - "1 0.046719 0.049531 0.047813 0.045781 0.027969 0.042969 0.042031 \n", - "2 0.046719 0.037344 0.053021 0.045781 0.041406 0.048125 0.032656 \n", - "3 0.037344 0.049531 0.053021 0.045781 0.041406 0.042344 0.032656 \n", - "\n", - " price11 deal feat profit \n", - "0 0.038984 1 0.0 37.992326 \n", - "1 0.038984 0 0.0 30.126667 \n", - "2 0.038984 0 0.0 30.000000 \n", - "3 0.038984 0 0.0 29.950000 \n", - "\n", - "\n", - "First few rows of store demographic data: \n", - "\n", - " STORE AGE60 EDUC ETHNIC INCOME HHLARGE WORKWOM \\\n", - "0 2 0.232865 0.248935 0.114280 10.553205 0.103953 0.303585 \n", - "1 5 0.117368 0.321226 0.053875 10.922371 0.103092 0.410568 \n", - "2 8 0.252394 0.095173 0.035243 10.597010 0.131750 0.283075 \n", - "3 9 0.269119 0.222172 0.032619 10.787152 0.096830 0.358995 \n", - "\n", - " HVAL150 SSTRDIST SSTRVOL CPDIST5 CPWVOL5 \n", - "0 0.463887 2.110122 1.142857 1.927280 0.376927 \n", - "1 0.535883 3.801998 0.681818 1.600573 0.736307 \n", - "2 0.054227 2.636333 1.500000 2.905384 0.641016 \n", - "3 0.505747 1.103279 0.666667 1.820474 0.441268 \n" - ] - } - ], - "source": [ - "# read in the data\n", - "data_dir = '..\\data'\n", - "sales_file = os.path.join(data_dir, 'yx.csv')\n", - "store_file = os.path.join(data_dir, 'storedemo.csv')\n", - "sales = pd.read_csv(sales_file, index_col=False)\n", - "storedemo = pd.read_csv(store_file, index_col=False)\n", - "\n", - "# show first few rows of sales data\n", - "print('First few rows of sales data: \\n')\n", - "print(sales.head(4))\n", - "print('\\n')\n", - "# show first few rows of store demographic data\n", - "print('First few rows of store demographic data: \\n')\n", - "print(storedemo.head(4))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "number of stores is 83.\n", - "number of brands is 11.\n", - "number of time series is 913.\n", - "lenth distribution of the time series:\n", - "count 913.000000\n", - "mean 116.253012\n", - "std 4.730982\n", - "min 87.000000\n", - "25% 115.000000\n", - "50% 117.000000\n", - "75% 119.000000\n", - "max 121.000000\n", - "dtype: float64\n" - ] - } - ], - "source": [ - "# Check number of time series and lengths\n", - "print('number of stores is {}.'.format(len(sales.groupby(['store']).groups.keys())))\n", - "print('number of brands is {}.'.format(len(sales.groupby(['brand']).groups.keys())))\n", - "print('number of time series is {}.'.format(len(sales.groupby(['store', 'brand']).groups.keys())))\n", - "print('lenth distribution of the time series:')\n", - "print(sales.groupby(['store', 'brand']).size().describe())" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total number of rows before filling gaps is 106139.\n", - "Total number of rows after filling gaps is 110473.\n" - ] - } - ], - "source": [ - "# Fill missing gaps \n", - "store_list = sales['store'].unique()\n", - "brand_list = sales['brand'].unique()\n", - "week_list = range(sales['week'].min(), sales['week'].max() + 1)\n", - "item_list = list(itertools.product(store_list, brand_list, week_list))\n", - "item_df = pd.DataFrame.from_records(item_list, columns=['store', 'brand', 'week'])\n", - "print('Total number of rows before filling gaps is {}.'.format(len(sales)))\n", - "sales = item_df.merge(sales, how='left', on=['store', 'brand', 'week'])\n", - "print('Total number of rows after filling gaps is {}.'.format(len(sales)))\n", - "# fill the missing `logmove` with zeros\n", - "sales['logmove'] = sales['logmove'].fillna(value=0)\n", - "# Merge sales and store demographics\n", - "sales = sales.merge(storedemo, how='left', left_on='store', right_on='STORE')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Compute unit sales\n", - "sales['move'] = sales['logmove'].apply(lambda x: round(math.exp(x)) if x > 0 else 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visualize sample time series\n", - "\n", - "We look at some examples of weekly sales time series for sample store and brand." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEYCAYAAACUdWs9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnXmYXFWZuN+v9u5Od/YOWQlIRFAUBBEVpUVEdHBQxgVtFRGNOjoz7qg47tFxfriMMyNjRHGL27iMoKIC0uwgqyAgEkM2sieddDrdXds9vz/OObduVd9aulJb0ud9nn666tzt3LpV5zvfekQphcPhcDgcjSDS7g44HA6H4/DBCRWHw+FwNAwnVBwOh8PRMJxQcTgcDkfDcELF4XA4HA3DCRWHw+FwNAwnVBwtRUQGRGTzVLc1sT9KRI5p4fUWiMhNIrJfRL7Yqus2GxH5pIh8f7pe31HACRUHIvIREflNSdtjZdouaG3vDjtWAruAPqXU+2s9qNUCV0T6ReSHIrJFRPaJyK0i8uxWXb+RiEhCRH4qIuvNJGKg3X06nHFCxQFwE/A8EYkCiMgRQBx4ZknbMWZfR/0cCTysWpx1LCKxKR4yA7gLOBmYA3wH+LWIzGhDXxrBLcAbgG1tuPa0wgkVB+jBIw6caN6/ALgBeLSk7W9KqS0AIvIUEblWRPaIyKMi8hp7MhFJishlIrJRRLaLyP+ISFfYhUXkn0XkYRFZUtL+QRH5WUnbf4rIV8qc5xIRecKYlR4VkReZ9lNF5HYR2SsiW0Xkv0QkUeYcZfstIvNE5FfmPHtE5GYRCf39iMhzReQuM8O/S0Sea9q/DVwIfEhERkXkrJBjX2Y+j/3mfj4gIj3ANcAic9yoiCwy/f2K0Sa2mNdJc54BEdlsPpdtwJWm/VwRud/cx20i8vSwe1BKrVNKfUkptVUplVdKrQYSwLFh+xtSIvJj0/d7ReQZgftab/ryAHBARGIi8mER+ZvZ/2EReWVg/zeLyC3meQyLyOMi8tLA9qNE5EZz7LXAvHKdUkpllFJfUUrdAuQr9N/RCJRS7s/9gRYi7zWv/wt4C7CqpO1b5nUPsAm4CIgBz0SbdJ5qtn8FuAo9w+0FrgY+b7YNAJvN638F7gXmh2xbCBwAZpn3MWAHcHJI3481/Vlk3i8HnmRenwycZo5fDjwCvCdwrAKOqaHfnwf+By1848DzAQnpyxxgGHijuebrzPu5Zvu3gc9WeA5bgeeb17OBZ5Z+NoF9Pw3cAfQD84HbgM8E9s8BXwCSQJd5TjuAZwNRtIBbDyRr+H6cCEwAM8ts/ySQBV5lPp8PAI8DcbN9PXA/sBToMm2vBhahJ7evNc97odn2ZnO+t5m+vhPYYj9z4HbgS+beXgDsB75fw31sBgba/Xs7nP/a3gH31xl/ZlD4hXn9J2AFcE5J24Xm9WuBm0uO/zrwCUDM4PCkwLbnAI+b1wPAE2ZAuCU4SJUOnOjZ+dvM63PRZqOwvh9jBsuz7CBW4T7fY+/JvFfm+Gr9/jTwS4wAqnD+NwJ/LGm7HXizef1tKguVjcDb0T6XYHvRZ2Pa/ga8LPD+JcD6wP4ZIBXYfjlG6ATaHgXOqHJPfcCDwEeqfH/uCLyPUCwg1wNvqXKd+4HzzOs3A2sD27rNszoCWIYWmD2B7T/ACZWO+HPmL4flJuB0EZmN1hweQ898n2vankbBn3Ik8GxjQtkrInuBQfQPfj56ALgnsO23pt0yC+2w/rxSal+FPn0HbQfH/P9e2E5KqbVoYfFJYIeI/EhEFgGIyJON2WqbiIwAnyPcVFKt3/8PWAv8XkTWiciHy/R5EbChpG0DsLjCfQb5B+BlwAZj3nlOhX1Lr7XBtFl2KqUmAu+PBN5f8tyWlhxThDH/XY0WGJ+v0vdN9oVSykMP4IvCtptzvylgituL/o4Fn43v/1BKjZmXM8w5h5VSBwL7ln7mjjbhhIrDcjswEz3Y3wqglBpBmxxWAluUUo+bfTcBNyqlZgX+Ziil3ok2g42jTWF220ylVNDBO4zWPK4UkedV6NP/AU8XkaeZ/deU21Ep9QOl1OnogVOhzT6gZ+d/AVYopfqAj6K1klIq9lsptV8p9X6l1NHAy4H3Wb9NCVtMH4IsQ2tnVVFK3aWUOg9t0vo/4Cd2Uw3XWmba/NOV7L8JWFXy3LqVUj8M64vxz/yf6fvba+j+0sCxEWBJuf6IyJHAN4B3o02Ds4A/E/5sStkKzDa+JsuyGo5ztAAnVBwAKKXGgbuB9wE3BzbdYtqCUV+/Ap4sIm8Ukbj5e5aIHGdmqN8Aviwi/QAislhEXlJyvSG0dvMLKROqambZP0WbNv6olNoYtp+IHCsiZ5pBcAItHKxDthcYAUZF5Clo23zYtSr22zi4jxERMefLE+70/Y35bF5vnNGvBY43n1lFRIe+DorITKVUNnAdgO3AXBGZGTjkh8DHRGS+iMwDPg5UytX4BvAOEXm2aHpE5O9EpDekL3H0Zz8OvMl8PtU4WUTOFx3d9R4gjfb5hNGDFjI7zfUuQmsqVVFKbUB/Vz9lPrPT0YK+LCaoIWXeJkQkZZ6lo8E4oeIIciN6hnxLoO1m0+YLFaXUfuBs4AL0THQbBYcwwCVoU9EdxuR0HSFRQ0qpa9HO/qtE5OQyffoOcAJlTF+GJPBvaG1jm+nvR822DwCvRztyvwH8uMJ5KvV7hXk/itbqvmYEY+k97UZrVe8HdgMfAs5VSu2qcN0gbwTWm+u/A2P+U0r9BS1E1hlz0SLgs+jB9QG0z+Ne0xaKUuputOP7v9Da4lq07yKM55r7OBvYK4Wos+dX6Psv0f42G6hwvhGOYX15GPgi+rPcjn7Gt1Y4dymvRwcc7EH78r5bZf9H0QJyMfA787pUo3Q0ABtJ4XB0JCKyDG2+OsKY4xwORwfjNBVHx2Ls8u8DfuQEisNxaNCOzFaHoyrGCbsdHdVzTpu743A4asSZvxwOh8PRMJz5y+FwOBwNwwkVR02IyPNF5NGDOH6ZiR6KNrJfB4u0uPR9sxGRLhG5WnTdsf81Icq/D2z371dEvi0iZaPFqlyn7mMD5/ioiFxRYfubReSWctsdnYnzqThqQil1M5WLCVY7fiM6G9rRXF4FLEAnFOZMW9mk0XailPqcfS0iyynUCsuVO8bR+ThNxeHoUKS+EvFHAn91A3N91PmZOwI4oTKNMaaQfxS9+NZ+EfmMiDxJdKn4ERH5iZgy8VKySJRULjV/tzl+u4h8ybQvN9eLmfdD5nq3mnP83mSF2/O/SUQ2iMhuEflX0aXTw0rFnya6rlc00PZK0SXWp1r6fkhE3hp4X2R+kcrl/ieVrC9zjSeJyB/Mfe0SkTUiMiuwPaxE/CIR+ZmI7BRdAv6fy5z7U+is+tcaU+PFUzEhSYWy+CJykuhy9vtF5MdAqsJ5NohJZhWRN5jnfrx5/1YR+T/zOrhao02utYmWzwmcL7T8fck17T3bv7SIDJltlZY0KLdEwNtEZK151leJqSXnqI4TKo5zKJSH/xCwGl0+ZSm6bMbrSg8QkWPRNZuepZTqxVTHNZv/A/gPU2frSRRqV4XxenRGfT96rY4PmPMfD3zN9GMhuiZZaEFGpdQd6OrCZ5ac9wfmdR54L7pQ4XOAFwH/WKFPoYgOcb7WnLcf/bl8TUSeanb5JvB283k8DfhDuVOhy+gvAo5Df86fLNnndcDfoQtveuiCjn9CfwYvAt4jJWVvAJRSn0AXzPyxqcX2zSnc3zOBb6FrfM1FV52+ygzICXQNsO+hS/v/L7rwZTluRFdJBl2Wfh1wRuD9jSHHvMD8t3Xkbjfvn43Ohp8H/DvwTZHJ5VWUUvaebcHJdegKBKCrPTwZXb7/GPTn+PHA4UeY+zoSWCkiZ6Kf0WvQ378NwI8q3K8jgBMqji8opUaUUg+hC/r9XukFmvahS8+fFHJMHl0a5XgRiSul1iul/ma2ZYFjRGSeUmrUDPrluFIp9VdTd+wnFBYEexVwtVLqFqVUBj0AVIp9/yFG+ImuY/Uy04ZS6h6l1B1KqZxSaj16sDyj3IkqcC66rPyV5lz3Aj8zfbX3fbyI9Cmlhs32SSil1iqlrlVKpZVSO9FLAJT256tKqU3mc3kWumr0p5VebGodutxMo5d1fhvwdaXUnUovyvUddO2u08xfHPiKUiqrlPopemG3ctwYuKfnowdo+/4MwoVKOTYopb6hlMqjS/YsRPuMQhGdMPsDYEgp9XUjgN6GXhdojykx9DmKPz8P+IR5JuPoycy3lFL3KqXSwEeA54j2+ziq4ISKY3vg9XjI+0nO9Uql5oGL0bPCv4he9fDcCtcOLu06FrjWIorLqI+h62iV4wfA+aILSp4P3GuKDk6l9H01KpX7hxpL1ote+/1HxkQ2gi4AWdqfYIn4I9ErPgav+1EqDKx1Uqks/iLgCVWc1Fap1PyNwPNFL0EdRddbe54ZlGei102plXLl78uxCl1E1JoIa1mKoXSJgKIlBZRSo+jvX63LF0xrnFBx1EW5UvNKqceUUq9Dm4i+APxUikuU18JWdNl0wF/TY26FvjyMHgReSrHpC2ovfQ/ajNYdeH9E4HWlcv+VStaX8nn05/V00583hPQnOHhvQi8UFrxur1LqZWXOXy+VyuJvBRaXmJ3Klpo3k44x9MB+k9EOtqGXULilTMXjg87CFpEL0BrrqwKFLGtZiqH02kVLCpjv71xqXL5guuOEimPKSIVS88YxO98MHHvNIVNdF/ynwMtFr/WeAD5F9XU2foAexF6Atvlbaip9b7gfrfF0i87luDiwrWy5f6lcsr6UXnSl470ishj4YJX7+iMwYhzJXSISFZGnicizqhw3VSqVxb8dvdLiP4sOHDgfOLXK+W5E+92sqWuo5H0pO9FmqKPr6byInAT8J/AKY1YEqi9pUIYfABeJyInmO/454E5jPnVUwQkVRz1UKjV/DvCQiIyinfYXlJgWqmL8O/+Edo5uRZet34G28Zfjh2jn8B9KysxPpfT9l9FL8G5H2+/9/I4ayv2HlqwP4VPoteL3Ab8Gfl6hPxhfwsvR/qbH0Z/5FWgzUsOoVBbf+LXON++H0eXtK/YbLTx6KUR1lb4vvf4Y2nR1qzFTnTbFWzgPmA3cEogAu8Zsq2kphkBfrgf+Fe0z24oOOGm0D+uwxdX+cnQ8IjIDrfWsUIXVJx0ORwfiNBVHRyIiLzdmqB7gMvQiVOvb2yuHw1ENJ1Qcncp5aDPTFvSqixcop1Y7HB2PM385HA6Ho2E4TcXhcDgcDcMJFYfD4XA0jGlXkXPevHlq+fLldR174MABenqmmsfXmRwu93K43Ae4e+lEDpf7gIO7l3vuuWeXUmp+9T2noVBZvnw5d999d13HDg0NMTAw0NgOtYnD5V4Ol/sAdy+dyOFyH3Bw9yIilcryFOHMXw6Hw+FoGE6oOBwOh6NhOKHicDgcjobhhIrD4XA4GoYTKg6HwzFV1qyB5cshEtH/16ypdsS0YdpFfzkcDsdBsWYNrFwJY2bNsA0b9HuAwcH29atDcJqKw+FwTIVLLy0IFMvYmG53OKHicDgcU2Ljxqm1TzOaKlREZL2IPCgi94vI3aZtjohcKyKPmf+zTbuIyFdFZK2IPCAizwyc50Kz/2MicmGg/WRz/rXm2GqrAzocDsfBsazMSsrl2qcZrdBUXqiUOlEpdYp5/2HgeqXUCuB68x70+uIrzN9K9NriiMgc4BPAs9FLmH7CCiKzz8rAcec0/3YcDse0ZtUq6O4ubuvu1u2Otpi/zkMv1Yr5/4pA+3eV5g5glogsBF4CXKuU2qOUGgauBc4x2/qUUrebdTa+GziXw+FwNIfBQVi9mh2zF+AhcOSRsHq1c9Ibmh39pYDfi4gCvq6UWg0sUEptBVBKbRWRfrPvYmBT4NjNpq1S++aQdofD4Wgug4O8dfhItuwd5+6Pvbjdvekomi1UnqeU2mIEx7Ui8pcK+4b5Q1Qd7ZNPLLISbSZjwYIFDA0NVex0OUZHR+s+ttM4XO7lcLkPcPfSiVS6j737xhmb8A6Z+2zVM2mqUFFKbTH/d4jIL9A+ke0istBoKQuBHWb3zcDSwOFL0EvJbgYGStqHTPuSkP3D+rEaWA1wyimnqHordbqKpZ3H4XIf4O6lE6l0H6n7bsSbGDtk7rNVz6RpPhUR6RGRXvsaOBv4M3AVYCO4LgR+aV5fBbzJRIGdBuwzZrLfAWeLyGzjoD8b+J3Ztl9ETjNRX28KnMvhcDiaSs5TZPNuOfZSmqmpLAB+YaJ8Y8APlFK/FZG7gJ+IyMXARuDVZv/fAC8D1gJjwEUASqk9IvIZ4C6z36eVUnvM63cC3wa6gGvMn8PhcDSdvKf8v2jEZTNYmiZUlFLrgGeEtO8GXhTSroB3lTnXt4BvhbTfDTztoDvrcDgcUyRntJRs3iMaiba5N52Dy6h3OByOOsh7Wqhk8l6be9JZOKHicDgcdZDztDDJ5JxQCeKEisPhcNRBziuYvxwFnFBxOByOOsgbn4rTVIpxQsXhcDjqwGkq4Tih4nA4HHVQ8KmYXBW3GiTgVn50OByOusgFo7/capA+TlNxOByOKeJ5CmUUlGzec6tBBnBCxeFwOKaI1VLAOOrdapA+Tqg4HA7HFLH+FDDmL7capI8TKg5HI3HO2mlBUFPJ5jy3GmQAJ1QcjkZhnbUbNoBSBWetEyyHHflAdeJM3vNXg9w554hpvxqki/5yOBpFJWftNBxcDmeKNBWbpzI4yDtGjuKx7ft54JMvaVPP2o/TVByORuGctdOGIp9KIKM+ncv7hSanK06oOByNwjlrm0sH+atyReavwut01iPrhIrD4WgIzlnbPDrMX5UvDSk2pHOe01Ta3QGH47DBOGv39S/CQ8gvXTptnbUNp8OSC0N9KmgBk/cUSk1fweIc9Q5HIxkc5D9nnsQVtzzO7R85k4Uzu9rdo8ODDvNXBX0q2RKfit6uiEen5xLDTlNxOBqMncUG7e6Og6TD/FW50pBiQ9oImOn87J1QcRz6dJADFwqDzHS3rTeUVavIp0q0vjb6q4p8KmFCxZu+5fCdUHEc0vRfd11HOXABcnk3sDScwUH+8pkvsrlvPkran1w4qfYX+rnnnZbqhIrj0OboK67oKAcuQNYMKDmnqTSULS87n9PfeSWrb3gM1q9vawBELqCdWEd9OuBbmc7P3gkVxyFNcseO8A1tTDi0g8x0nq02AzuQj2Xybe5JeEhxsVCZvlqqEyqOQ5p0f3/4hjYmHGadT6Up2KTCiWz7hUpxSLF+bSO/YHpPKJxQcRzSrHvrW1EdlnCYc+avptCxmkreLivszF/ghIrjEGfHWWeR/dr/dIwDFwqDTNDu7jh4rLAe7wBNpTThEYrNX3ln/moeIhIVkftE5Ffm/VEicqeIPCYiPxaRhGlPmvdrzfblgXN8xLQ/KiIvCbSfY9rWisiHm30vjs5k4rUXcPo7r+QDP7qv7Q5cKAx+zvzVWLJmoB7vIE0lEYsUHPXZoPN++j77Vmgq/wI8Enj/BeDLSqkVwDBwsWm/GBhWSh0DfNnsh4gcD1wAPBU4B/iaEVRR4L+BlwLHA68z+zqmGdkOyw3wHfVOqDSUTtJU7LPtTkQDmkqhX9N5QtFUoSIiS4C/A64w7wU4E/ip2eU7wCvM6/PMe8z2F5n9zwN+pJRKK6UeB9YCp5q/tUqpdUqpDPAjs69jmtFpGezWoTydB5ZmYJ/zWCbX5p4Unm1XPBoaUpydxqbPZmsqXwE+BNhPeC6wVyllvxWbgcXm9WJgE4DZvs/s77eXHFOu3THNsD/gTvkhFzSnBguVDqsc0Gqsj2o82/7nbL9rXU5TmUTTCkqKyLnADqXUPSIyYJtDdlVVtpVrDxOIoU9SRFYCKwEWLFjA0NBQ+Y5XYHR0tO5jO43D5V5GR0e59bY7ANi+c1dH3NO+/ToZ8/4HHiS+45Eqexeo9Ez6r7uOYy+7jGg6rRs2bCB/8cU8+sgj7DjrrIPtcsNpxvfrr3/LALBreF/LnnO5+3h4UxaAfHqcPRMwNDTEPdsKGtRd99zH6PpoS/pYK636zTezSvHzgL8XkZcBKaAPrbnMEpGY0UaWAFvM/puBpcBmEYkBM4E9gXZL8Jhy7UUopVYDqwFOOeUUNTAwUNcNDQ0NUe+xncbhci9DQ0M85fiT4eab6Js1m4GBZ7e7SyTuHoLRAzzluOMZeMaimo+r+Eze/GawAsUQTac5/vvf5/jPfrbuvjaLZny/7s/9FR57jEgi1bLvbrn72HzHBnjoz/TPmcnwWJaBgTPYe98TcP/9AJzw9Gdw+op5LeljrbTqN98085dS6iNKqSVKqeVoR/sflFKDwA3Aq8xuFwK/NK+vMu8x2/+g9KIEVwEXmOiwo4AVwB+Bu4AVJposYa5xVbPux9G5ZHId5lNpRvJjh5V+bwe+o76Dor+6EjHf/BXMU8l2SNBIO2hHnsolwPtEZC3aZ/JN0/5NYK5pfx/wYQCl1EPAT4CHgd8C71JK5Y2m827gd+josp+YfR3TDBv1dVhHf3VY6fd20EkhxX70V5GjPuBT6ZAJTjtoySJdSqkhYMi8XoeO3CrdZwJ4dZnjVwGTUqSVUr8BftPArjoOQWxOQKfkBvgZ9Y0MHFi1SldfDhbPnGZLFdvPdSybRymFDg5tV1/0sy0OKXa1v8Bl1DsOAzqt1HymGZqKWap419wj8OiMygGtxj5npYoH8Lb0xTzbVCLqP29XpVjjlhN2HPJ0Wp5K0zLqBwf557En8cfH97D2cy9r7LkPAbKBz3M8kycVb190VT5g/vI1lawrKAlOU3EcBmQ6LU+liRn1ubwi5yl0DMv0IuinGGtzVr19tsl4xK2nUoITKo5Dnk6qCqyU8vvRjKKC1lndKf6jVhKMqGq3sz6X94hHhUQ0iqe05lIkVDpkgtMOnFBxHPLkOmhRrOBg34yBP9th/qNWEny+7RYqeU8RjQiJmB5CMzmPdM7Dxg50wgSnXTih4jjksbb2TjB/BfvQjFIddmDN5qbfoBUUpO0uKpnzFLFIhHhUS5FM3iOdy9OT0G5qp6k4HIcwTau1VQfB2XQz+uPXOZuGmkpQ82t3UUmrqSRLNJXuhA4e6ITvYrtwQsVxyJPzOsdRnynSVJrgU8l3jlbWaqwfA9q/pHDW9CUejfjv01mPnqTRVJxQcTgOXbJ+smGVH3ILqvwGTTTNif4yAnRamr8Ufak40P4lhcN9Knl6klF/+3TF5ak4DnlqSn5cs6Y4I33DBv0eGppAGBzsmxE44PuPpqX5y6M3FWP3gUwH+VQCmkrOo9v4VKajJmlxmorjkCfnO+or5G9cemlxiRPQ7y+9tKF9CQ72zZitdtraMa0k7yn6urSm0inRX1aoZIxQ6YpHicj01lScUHEc8gT9GGVNTi2q8pst6kvjB/5craa+RtBhi4Jl84relNYE2i1UsnmPWKmjPpsnGYsQi0SmZR6RxQkVxyFPUcRVuR9zi6r8Bq/fTE0l02xNxZoLN2zQxbasubCNgiXneaRiUeJRaXtGfd5TxIoc9YpM3iMZjxKLSlOCNA4VnFBxHPIEcwLK+hpWrdJVfYM0ocpvkdbUhNlqy+qctchcOBVyeW1y6opH266p5DxFNBIpdtRnPZKxCNGIOE3F4TiUCRYaLDvYmiq/W2b211flt0ZTUDPzVDxP+dpP030qHbgomA7jjdCVaL9QyXuKWET8EGfrqE/EtPN+OvtUXPSX45AnV6QdVBhsBwc569G55DzFXz/70tovMIXIsWwt/p06CWphTRcqy5bp+wxrbxM5Y3LqTsTaHv2VzXtFIcVpE1JsNZXpWEbH4jQVxyFPUb2tKgN5JueRyXlTS56bgiko28Tkx1yT64oV0SJz4VTI5XUYbyoe7Yg8FV1QsjikOBmLEo9IR9ShaxdOqDgOebI1aip5r1BBeGQ8W/sFpmAKytYSNFAnwftsuqZizIXbZy/omEXBbBZ7dyLKeLa9ZVpypSHFZrKSjEWIRmVaZ9Q785fjkKfWGXwmUJp833iW/r5UbReYginICrV4VBpuVy+ugNwC88rgIK/buph0zuPWD5/Z/OtVwUZcdcWjHVH7KxGP+uav0bTuTzIeIR6JTGuh4jQVxyFP1qstNySdK5hM9k1FU5mCKchGf6Vi0aqmuKmSK/KptGbQSptCiZ2Azg3Rjvp2m79yxqdiNRVfqMSi2qcyDZNTLU6oOA55aspToVhTGZmYglApWR/eW7asrCnIXj+ViDbcp1JcAqY1g1Ym75HJtXcAt+SMH6MrHi34xNqUoGn7YjWV/RNWqESIRae3puLMX45Dnlp9DekS89eUGBzkPePHcMvaXfzp42czsztesS9d8WjjfSqtjP4yZHJe8xMta0TnqUTotppKi+q5heEXlPQ1Ff19SsQixJym4nAc2mRrzA0pEipjUxQqFDSdiQozd2vy6opHG+5TaWn0l8E6oDuBrKcd9V2JqA4pbmOCZukiXcWayvR21Duh4jjkydU4gy82f03d0Zs2566UeGcXDEvFG28CaWn0V+A6nmr/SoZ5T6EU2qdiM+rbmKBpfSqxaISIwOhEwacScyHFDsehTa0+lbod9YZsDZqKFXCpeLThCXCtFipeIAS73SYwe78xE1Kc8xRq6dLwnVuQoGkTMQHi0Qj7A9Ffscj0zqhvmlARkZSI/FFE/iQiD4nIp0z7USJyp4g8JiI/FpGEaU+a92vN9uWBc33EtD8qIi8JtJ9j2taKyIebdS+Oziab90jF9Ve50kBeGlI8VezAOpEtfw1rlupKNN6nEtR8WmH+CgqSdpvA7L3Ho0IqrhfCGv/kZ8gmS8LCW5Sgacu0gPajlJq/puN6N5Zmaipp4Eyl1DOAE4FzROQ04AvAl5VSK4Bh4GKz/8XAsFLqGODLZj9E5HjgAuCpwDnA10QkKiJR4L+BlwLHA68z+zqmGdl8cHGk2nwqU0p+NNiBtaL5KxBS3PA8lVxrNZXg59VuoZI3zzUWifjPev8/vIafvePjbO6bj5LWJmjagpIAiWjEd9Rb85fTVJqA0oyat3Hzp4AzgZ+a9u8ArzCvzzPvMdtfJCJi2n+klEorpR4H1gKnmr9cOKI8AAAgAElEQVS1Sql1SqkM8COzr2OakfMUXWb2WktIcVc8Wp+mUouj3uYvxBpvAikqnNmCQSsoSNqdq2Jn/tpRr4etsUyeX59wJqe/80re/b27Yf36lmX8l2oqowFNJerWU2keRqO4H9gBXAv8DdirlLJe0s3AYvN6MbAJwGzfB8wNtpccU67dMc3I5tVk81dI/oIdGOf3Jg/K/JWuUDcsl9f5C7FI4yOAci02RxWZv9rsU7GThVg0Qle8sFDXE3vHgfrMmQdDNu8V+1SMUEnFI6aawvQ1fzU1T0UplQdOFJFZwC+A48J2M/+lzLZy7WECMfRXLCIrgZUACxYsYGhoqHLHyzA6Olr3sZ3G4XIvo6Oj7NsfIW5mjQ8+9DArfno5x152GdF0Wu+0YQP5iy8me/F7ofd0Et4EO/eqKd//2EQGgHsfeIjUrkdD91m3IY0oj507tjM6lp/SNao9k/u2FSLWNm7azNDQzprPXQ/bDhQGxtvu+CObemufgzb6+7VzTPdl7V8fZVZSP+tb77yLzbsnANi8Y09Tvs/l7iOTzbH1Cf0MsulxfwJx7913sXtXhpH9Xsf9vlr1m29J8qNSaq+IDAGnAbNEJGa0kSXAFrPbZmApsFlEYsBMYE+g3RI8plx76fVXA6sBTjnlFDUwMFDXfQwNDVHvsZ3G4XIvQ0NDJFMwb0aCDSPDHLPiWI6/9G1gBYohmk7z4p9/Dy48nRVL+rn5sV1Tvn/vumsAj6OOeTIDp4ZHGF2390G6dm1j6eIF/HVkx5SuUe2Z7P/TFrj/PgDmL1jIwMDTp9D7qfPotv1w800APP3EZ/KMpbNqPrbR36/Hdx2Am4Z42lOPY8nsbrjndvqPegqZO+8HwIulmvJ9Lncf6rprWH7kkQwMPIVZf7qZrQdGADjj9Ody+/6/sC0z3HG/r1b95psZ/TXfaCiISBdwFvAIcAPwKrPbhcAvzeurzHvM9j8opZRpv8BEhx0FrAD+CNwFrDDRZAm0M/+qZt2Po3PJ5Dy6rKPeU2XzFLq36znH/N4ko+nclHIvlFIFn0oV81csIkSb4KwtysdpgXklaGJrv/nLhBSbPBWAv+3QLtuFM1MtN38V+VSiBWOKv56Ky6ivDRHpmcLuC4EbROQBtAC4Vin1K+AS4H0ishbtM/mm2f+bwFzT/j7gwwBKqYeAnwAPA78F3qWUyhtN593A79DC6idmX8c0I+d5dPuOeq9snsJo/0IA5s9IAoUs6FoIOl4rhRRnzOqEsSZUqrW1vxKx1jiCM/mC8Gx39Je9X5tRD/CYESrHL+xjZCKL16KIK6WUX6YF8Ot/gY7+iruM+uqIyHNF5GH04I2IPENEvlbpGKXUA0qpk5RST1dKPU0p9WnTvk4pdapS6hil1KuVUmnTPmHeH2O2rwuca5VS6klKqWOVUtcE2n+jlHqy2da+1YMcbSWXV/5Ak8urslWFb7/4/YDWVGBqzt3gTL2aphKPNkdTsdpJVzxaFF7cLDoppNhqaUFNZa0VKov6UAo/AdGnScUmgzkz+n9hGE34Kz86oVKNLwMvAXYDKKX+BLygWZ1yOKaCTn7UA03W82BwEO/rq9ncN79ogak/D5wLwNwZdQiVXG1CJetrKtLwXBIbAaUzyltr/mp7SLEf/aUz6kH7WXoSUZbO0ROIotwjW2xywwZQqlBssgGCxU4W/DwVo6nYyUQsEnHmr1pQSm0qaeqMetiOaU9Ynkr6NRdw+juv5Pz/utnPX0jn8iRiEWaZCsNTKX9fu1BRWqg0ZZEuo6kkomRaYf5qcbJlJfK+dhDxJxA5T7F4dhczu/TzLJokNLHYpNVCrE/FairJWNRvn86aSq3RX5tE5LmAMk7xf8aYwhyOdpPNeyTjEUQKDl1b5ysoAOxyr32pkEGohmtYKpdp8cyMVftUlFLoHN6DJxvUVFowyHdUmRbfUS8kY7qIo6dg8awyQqWJxSZtX3yfii9U9P/pvp5KrZrKO4B3oZMLN6PLrryrWZ1yOGpFKaW1g4gQj0T8rHO/pEpAqKSNUAkdhKoQNP9UKyhpzV+gB75GYQez7nisJZpDJ0V/2ecai0YQEV8zLauplCsq2YBik6U+FWv+sv/deiq1IUqpQaXUAqVUv1LqDUqp3U3tmcNRA3bQjhmTk3Vgp0PCf7WmEvUHoZHx2qO/ggNs5dL3unqtncU2cvC350rGWxT91UmO+oCmAvgh5ItndYcLlSksAT1VSn0qVrgUNBXBU7QsGq3TqFWo3CYivxeRi23uicPRCdix1WoHdhZpzV9BAZDOeSRiEVLxCIlopP7orwoDbLZEU2mkXyVrl7CNRlqjqXSQ+SvoqAf8+l9lNRWzBPTOOQvwEHJLljas2GSpT8VqKEGfSnC/6UZNPhWl1AoRORWdYHipCS/+kVLq+03tncNRhYJQEeKBwdbXVIpm23kSxnzS1xVrbvRX1NYia9zAkjPnjkcjLVkEqpPMXzm/oKT+XLvjVlPpojuhKwNPep6Dg7xx51L+sm0/v/7n03nqopmN6UuJT8V31McLPhVo7ITiUGIq0V9/VEq9D10deA+FisIOR9uw414sInoZVxv9ZTZkcp7/407nPP+H39cVryv6qzsRrbmgJDRYUzHZ+rFo48OVw0h3UEixX1AyIrBmDd/7zGtY94WXc+Lzn4H84AfM7IqHThJsgutYBZPllPviFWtNkxz11vQ5TYtK1pr82CciF4rINcBtwFa0cHE42ko+4MCNRSL+DzlMs8jkPH8AmNkVn9KaKja7vC8VL3L+T97PIxaN+LPYRuaTWC0oEY20RHOwn2E8Kh1g/tLXn/mL/4WVK+kf3k4ERXTTJli5klc+cmMZoaLbDpQmRh4E/neuJE+l1PyVn6bl72vVVP6Ejvj6tMlgv0QpdU8T++Vw1ESx+WuypgLFQsXXVFLhM9tyZEyJlJld8Yohxbm8IhHwqTTSTJUL5MC0xPyV90wIb7TtQsUO5DM/+4nQ/JOVv71i0iRBKcVougmaSt466kvzVPT/qHk/XTWVWvNUjlZKKRHpFZEZgcW3HI62UuSoj0Z8zSBoorKaRTrn0ZvSX/mZXXE27D5Q83WsZtDXFWN4LFN2v6wZiKNNMX/pNTzirXLUm8CGRCxSVAesHdiQ4ujmzaHb5w/vmDRJGMvk/ejARmoqhZIxJY56M2GJN+HZH0rUqqk8VUTuA/4MPCwi94jI05rYL4ejJnyfil8axeSphNTqsiHFQLgNvkKtKDtT70vFq2fUxyL+7LWRjnod/RVpvVCJRtquqVjnuLdkaej24XlHTHqeowFB0kyfin3W1rQabYKWeihRq1BZDbxPKXWkUmoZ8H7T5nC0FV9TiYiJirKayuQMeFumBYxPZSKHXl2BqrWifKFSxfyVzXvEizSVxg3GOZOtH49Ky/JUElGjqbRdqJjJwqc/E5p/cv0b/mWSUNkfCMQ4kGmdT6UZE4pDiVqFSo9S6gb7Rik1BEylDL7D0RSKHPXRYJ5KIFmxSFOJwJo1vP3CM3ns8+eirEZSpVZUxuS9zOyKk8l7ZU0bNuy3GbkK2rRmQopbUVAyHzR/tTujXl9fTP4JRx4JUigWuuGcVzAyXlz+Pri0wVi6eT4Vu56KNX8VNBXnU6nEOhH5V+B75v0bgMeb0yWHo3Zyfka9KdOSt9FfAZ9KpuBTedZt18Dqz9BrBcjGjVojKRUoFlMryg6q1ieTzuXpTkz++WTzqjj6q4EaRdaGK0d1Rn0j64qF0Vnmr0BI8eDgpCTGmTetw1Mwmsn5td2CQqWRmorvU4mGO+pthr3TVCrzFmA+8DPg58A84M1N6pPDUTN2MpgoiYoqF/119pqvhmsk0Wj4BUytKGtusgNWmAlMKUXW80hExR9wGpr86NmQYlsCprmDVjpg/mp/nkpxwmEpflb9WMHkVeRTaaSmUiWj3pZvcT6VyjwJvR58BIgDLwJualanHI5asb9bnRRYKCgZZv5K5zxm7tpW5kR5cqmu4rZArSh7PquphOWq5D2FUoWcGd3WwDwVU1eskK3f3IE+k9fmwk7wqdgSNeU0s74u/VyCfhXrU0nGIo31qeSLfSqlmkphQjE9zV+1CpU1wLeA84Fzzd/Lm9Uph6NWcgGfSjxQHbZogamsp9eYz3vsn78w/ERHHsm9H/sCm/vmowK2emtmsU5ru8JkWARYoXptc/JUbF0xO4jZ5YWbRcYENiQ7wKei14QvP1z1+UVCg0JFC5IjZqaaEv1VupywX6bF1f6qiZ1Kqaub2hOHow6CyY/F5q/iPBWradzx1vdz9lf+tdgEZjSSvz7pdF6z/2g+dM6x/OPAMUXXsf4Fa+IIEyp24LUrAEJjcxVs8qO12Tc7uS6T8+hKRDvCp2JzdMoRVlTSCpX+3mRz8lRKyrTY/zFn/qqJT4jIFSLyOhE53/41tWcORw3YCXQsEjHmr0JBSTuDHM/m/QF/4zmvgNWryS1Ziodw4IjFvkZiBcVEyKw2k8/7FY6hjKaSD2gq/sDf6OgvKWgqTdYeMvmCT6XdKz9agVqOMKEyms7Rk4jSm4o3VFPJl2gqR/zq59xy+UVc+PwnwfLl9F/9M91nZ/6qyEXoMi3noM1eL0ebwByOtmIng4mYGPNXYZEuO9BMZPP+TDsZi8DgIMMPP8bRl1zNz39xq2/isgNP2ADkm7/iVlOZPGDYgTdmVn6ECj6VComW5bC1v/w8iCbPhIsy6tvtqPe8sk56KKepZOlNxelORBsb/WUnDxEdnn7UR9/DkpGdiMlvWv7R9/D3D93gzF9VeIZS6oSm9sThqINcIBEtFkx+zHl63ZRYpMj8ZbWXbuMbGc9MzroOc8Jn88poKuXNX1nf/FXFp2ITLa0JziRa9r/3vTAwUPFebfIjNL8cvRYqnWL+Un75kzBmJGNES8rf75/IMSMVoycRa2j0l6+pRAUuvZTI+HjR9uj4OB+66bs8kv9gw655KFGrpnKHiBzf1J44HHXgR3/ZmliB5YSTsShd8SgTmYKmYoWK1TgOpIP5LFrAhAmVTE5ns6cqaiqFZWat+SvUp1Im0fLoK66oeK/ZnK6A3FJNJdoZyY85U/25HCJCXypWtJzBaDpHbypGd7Kxmko2WPurzJr3i0Z2NTTy71CiVqFyOnC/iDwqIg+IyIMi8kAzO+boYOow3TQLO9ZZB3ZBU9ELcqXiESaynu+4t472SERIxSNFAsTXVELMX2kza7c+lXBtJkRTCRMqZQai5I4dFe/VhtX663W0wqdi6pi1O08l66mKjnqw9dwKwmNkIseMpNFUMvlCSZ6DpMinUmbN+y1981pSSqcTqVWonAOsAM6m4E9xIcXTkSo1slpN8XLCkaLkx2Rc+0DGAz6VRGC2252IMRaYwVpBEaqpmAG2qwbzVywSKSTAhc1WywxE6f7+ivfqr/xotK1maw9pU9Ym2Qk+lbynfRjlWLOGn3z+dXz19Sf7E53RiSx9qTjdySh5TzVMMBb5VFatmlSLzOvq4t9f8CZXpbgSSqkNYX/N7pyjA6lSI6vVFJu/pCj6K2l8IBMBn4rNJQBtAgs65ccrOurzJKMRkhWFiu5MIiaVfSohAxHd3ax761sr3qte+THiD64tddTnvYbN9OshX0lTMROd/uHtCIWJznPv+B0zkjG6zTNrVARYkU8lpBbZ8Ff+m6ue+sK2R8y1i5qXE54qIrJURG4QkUdE5CER+RfTPkdErhWRx8z/2aZdROSrIrLWmNieGTjXhWb/x0TkwkD7ycYUt9Yc27xCSA5NGdNN2fYm4yccRiaXadHmqvKaSk8yWmTqsoNOaA6KGWCt+Sts1psLaCpFPpVScyHA6tXs61+EhzDSvwhWr2bHWWdVvNdsoEqxfd9MsjakOBpBqRYm84WYV21NtVDKTHTece23jE9FxyM1KleltEwLg4Owfj14HqxfT+a1FwBuPZVmkAPer5Q6DjgNeJdx9n8YuF4ptQK43rwHeCnaxLYCWAlcDloIAZ8Ano1ewvgTVhCZfVYGjjuniffjgLKmm7LtTSaoqcQiEXKeLrSYzuZJGnOV1lSMTyVeqPHVZWztlrFseZ+KX7E3GkGk/D6gTXE2/HXJNb8INxcCX1z9O46+5Go+f/lvJxVIDCPn2ZUfm5+nkst7eApfUwFaYwIrY1499bZrykd/lZnQLNy3k95UnB5T+LNRmkq1OmS2vZE5SocSTRMqSqmtSql7zev9wCPAYuA84Dtmt+8ArzCvzwO+qzR3ALNEZCHwEuBapdQepdQwcC1wjtnWp5S6XWm9/LuBczmaRRnTja2R1WoKyY+FGXzOU37dqq5ElImsF+5TiUeLfSqZ8kvPZnOF2lNWUJWSC0Z/GRPViZf/v7LmQpvxvXs0XfU+PU/5JqCEL1SaN2hZAdlyoVJG63jNLy4vb/6q4CyfYaK/oHGViidpKiVY82Temb+ah4gsB04C7gQWKKW2ghY8gPVOLgY2BQ7bbNoqtW8OaXc0E2ND3j3vCDyEsYWLi2pktZq8wh/sY4FQ23S2YK4aL+NT6U6U+FSyFcxfeW1OA7SfJlc5+svOVnt2bAnv+MaNfsHD3QfKL0/sn9srnDsea/56HUEhnGhRYABQVuuYu2dH+dpfFZzlvSZPBRpXqTjvKaKR8sUto60qfd9BUZhBak1+rBsRmYEumf8epdRIBbdH2AZVR3tYH1aizWQsWLCAoaGhKr0OZ3R0tO5jO42DupfFi/nSJVfywK48g09J8OLFcWjT5zKeziAIQ0NDbFivB+k/3HgT+8cm2LNjO1kPhkfyPPDnhwG4964/sqlbD077906we8TzP4d9ozqJbXQiM+mzGRkdY8/OtG7PZ1m/aQtDQ7uL9rl/u54J33/fPWw119g7Zz6zd08OFZ7o72fTtl0AbNq5l6GhoYrPZMIUj9y4/nHuPaAH3j89+BBdux+t9aOaEnsntABZv24tVg7fdMttzO+ubR5a7/frtP5+Utu3T2rfMWs+I3uHw8+5eDH9730vy1Z/g+6dO9k/bz4PvOliroo/j6VrH2V8ix4q7rz3fnJPTG3IC7uPdeszCKrs/aWNBvnXx9YylG+Or7H/uus49rLLiKaNlrthA/mLL+bRRx4p65tr1fjVVKEiInG0QFmjlPq5ad4uIguVUluNCcv+4jajy+tblgBbTPtASfuQaV8Ssv8klFKrMcsfn3LKKWqgQtZyJYaGhqj32E7jYO/la3+5HXbtYc6iZQwMHNu4jk2RNY/8jmQcBgYG2HDbevjLQ5z2nOfCrUMsX7aEbN7j0ZFtHHXMk+HPf+aM059Lf18KgN/s+hMb/7rL/xxyf/gtkCfjwRlnnFE0E5VbrmPZkgUMDJzArLuHmDm3j4GBZxb1Zf+ftsB99/HcZ5/KsrndcN1vuevtl4QWsEx98YtEd80ARhjLRxkYGKj4TPaOZeC6azl2xTGcftwCuOUGVhz7FAZOXhK6/8Gyac8YDN3A045/ii5t8+f7OemUUzmmf0ZNx9f9/friFycvmtbdzXfOfTv98+cxMHBK+HEDA4x9/JMc/fHf8cGXHMuzls+Br9/Oc04+kcWzu+C2IY5+8lMYOGlqn1fYfdwy+jCJJzaWvb9MzoNrr2HZ8qMYGFgxpevVzJvfDOlis2k0neb473+f4z/72dBDWjV+NTP6S4BvAo8opb4U2HQVYCO4LgR+GWh/k4kCOw3YZ8xjvwPOFpHZxkF/NvA7s22/iJxmrvWmwLkcTcYugLRrtLrpppnkvcJ6FsGFsYIhxeOZgPkrVnDUB/NUlFKMZ/PEo4JSk6O7Mrm8v15GKh4lHVr63tb+Kqyn8pczXw6rVzNiIr2C5sL9aa1ZjaZzoSa3IGHZ+s101FtTl81TgRb5VIx51X5etuDndSe9yPeZlaM7EWPejCQbd48xaj5bXaZlcvWEgyHnqbL+FGhR6fsOi8IM0kxN5XnAG4EHReR+0/ZR4N+An4jIxcBG4NVm22+AlwFrgTF0EUuUUntE5DPAXWa/Tyul9pjX7wS+DXQB15g/Rwuwg/GeA9WdzM0kpwo/YusgzeY9X6jEFUzkChn11j8A2qdS8KN4KAVzehJsH0kznsn7JVmgEP0F+Fn6pdj1TeJRwY45OU/B4CD/PfuZfP2mdXzulSfw+mdrx/L+iRxJs6ririrO+lzQp9KC6K+2+VQABgf56syTuOKWx/n4ucfzltOPIn/ZUMUyLZalc7rYuGfMD4IIhhSPNchRrwMmyvclEtHPv6l5RMuW6ci4sPY208zor1uUUqKUerpS6kTz9xul1G6l1IuUUivM/z1mf6WUepdS6klKqROUUncHzvUtpdQx5u/KQPvdSqmnmWPerdqZnTXNGDWzvt1hmkoLHYhhmooN903GdVmVvKf8HIVSoZLNKzI5zxcuc3qSQCG82JLNKz/qKlUm+ivoTBfRCZDWmW7PbwseKqUYncixfG4PUOZzDJ47F1iMrAXLCQdrpSXMUss1aSrm2Z9x5pkH9eytJmwFQdbzKhaUtCyb082m4YBQScZC67wdDDnjqK9ELBpprqbSYVGYQVoS/eU4/LCD9J7SyKUWl3HJK+UPsnb2eMAIFV37Sw8o+8azxCJSNBh0maig8UzeH7zm9iT8Nv8aJpw3HhAqobW/cgWhAjpfwSbATZQIlYmsR85THDVPC5VqmkpBYLVmPZW6QooDz14O8tnvN98vO3nJ5avX/gItVLbsHWfYfC97U3GiETHVExoUUmzWtalEcELRFAYH8b6+ms198/EQ8kuXtTUKM4gTKo4pk/eUP6hOGgxbXMYl5xWEiZ3JWoGXjBeW/903nvN9AxZb/n4sm/OFyBwjVIKaSFiF40rLCdvBLx6YrY4bc9m+cT3Y2XDi5fNq01TCFgBr5kw4zPxVVYg18NkfKNVUKmXUB1g6pxtPwaPb9xMzRUNBV0840MAyLVU1lYjo59NErX3/+a/h9HdeydGXXM36ex7qCIECTqg46sD+0HuTMUYmcsUz2BY7EPMBn4oddKzpJBGNkIoVNJVEOaGSyfv5KlaoBPNXSoVKsoxPxZ/d16Cp2Jn48rnahLGzmqbil4AR33fUTMd5sfmrfGmaIhr47EeN+cqarHJede0AYOls/Xk+vHWEGamYH8HXnYgxVq5MyxQH/pxXeRVK0N/F42+4uqlae3DtmOEacp1ahRMqjiljB9xlZkAcHgt8oadSxqUBs7i8Kgz2dgZvhV6xppItivyCwpoq4wGhMm+GMX8FNJF0vtjJn4pHfcd/EKtN+EIuIr6DfZJQseun9yXpSUSr+1QCiZWRiBSduxkEFzWr2VHfwBI+dmJgNZacKaZZDfudfHzXAXpThTik0kRXnzrMtbVqKi/+/lebqrUHhcokM3QbcULFMWXsD37ZHP0DLjKBrVqF11WDA7FBvpd8ILzTzuCtHd4u0gUwEqKp9CQLNaEmShz14yGaStL6VGLR0Npf2byHSKH2UzSwvPFkoaL/96bizJ2RZHeVKDq/cGYgKKEVZVqmFFK8ahVeV1dxW53OYyt0D/jmL69qSDHAEX0pPyx8RjLut/ckY+FCpQ6TXbZGn8qs3dvCNzZIaw8uSFY0sWszTqg4powtd2GFStEsaXCQJ/79P3wHIkceGe5AbJD9Pa8KZi+rqRwImL9sWZYw81eXb/7KTTJ/jWcLppJCSXvjU0lEmAgZYLN55Ud+QbFPZcL3qZjcFDNozkjGmDcjUd1Rn7M5MIVzt8T8FY3W7qgfHOSRT33Rf/ZqWf3O40L0lzV/1eaoj0aEJcYEVqqphNb+qsNkV5OmEo0wPPeI8I0NCvstMn+NZSfvUGIJ6L/uuoZctxpNL9PiOPywP/ilRqiUmm7WnX0eF25eCMDDn34J3YmQr1mD7O85D38Ga/+PBR31geivhTNTRccW+1T0Mb5QyRQG0FKfSiqmF33KmkWzLNl8cdhrqE9lrNj81ZuKMXdGUmewVyDraypBgdV8oRKPFaLNMiEmv1L+cubLef9uPWje+dEXsaAvVeWIySilisxfSplimjWYvwCWzO7S5q9k4XvXk4ixYyREcNeR75GrkqcCWlO56jXv4s3f/tyk6gCNCvsdqeRTsZYAe+0NGzj2ssvguOOa7tB3mopjytgBONT8BezaX3hf1lfQIPu7dtQbTSXM/GUER95Tkx318YL5y/pQ5ob4VDIlocI2TLk0rDiX9/xVGXV/JBD9pfcdmciR95RvuuhNxWvSVHL54j7Eo+LnrjQDK0CmmvwYNMOs3TFa17Unsp4vjA9kcgHTX23LJdnvZZGmUm6d+jryPYIm13LEosKdzzlHr5MzZwEeQnbJ0oaG/VpNpS8Vm+xTCbEERNPpliym54SKY8rYWeSiWSliEZn0hQ76B8oOlg1K3gpLfgwmOqYCzvnSkGIrcMYD5q9CnkphAMpMctTr/6VhxZkSZ7LWVKyjvjAg75/I+p+hNn8l2XMgg1chdze4VLH9n22mphLMU4nWaP6i2BRar1Cx5WsioqO//ACIGkKKAV54z3XccvlFfDmwtHBPooxPxZSF2WkGflsWptLAn817Vc1f0UhEm00HB3njx37C0ZdczYO3/qmhWsK+8axv7pvkU2ljGRcnVBxTxoZ5zkjGmd2TmKSNBN+X1VRKkre8Ou3vweRHK1zsjNSup2JJlER/Bc1f1vHeZ5LliqK/StZisQt9pUvCinN5j0S02Pxl/THpbJ6ZXdpxvG88y/6JHD2JKNGIMLcngadgNMQsbgnW/tL3EmlZRr29Zi1CZXgsw7wZSbpi8Led9QkV62+a35vkQDrnC89aQopZs4aBL17KkpGdRQmYp9x2TfmVHwcHee1HfsTRl1zNlWtuqPodrEVTiUcLEwoblBE0VzWCkYksfakYc2ckJmsqbVxMzwkVx5Sx5q/uZJS5PYlJ64HsGs34P7pKUU17X/lqP3lr+wN/qWsWlw8kP9pr+llGWRMAACAASURBVMmP1TSVwNrl49k8qbgO1+2KRyv6VLrKrFOfzXtFs+l4NOKbccazeY4w/gUtVLL0prSQmderI85G0uWFRLD2l73XVq2nIiIkYhHSNVxvz4EMc3riLOyJ1K2pWC1uQV+KdM7zhXdNQuXSS4lNjBe3jY3xwu98hXTOK/uZbR+ZAGorkFqLTyUaMH3anKSRicZk9Fv2jeeY2RVndndisqN+1SpyqeJIvHwy2ZIyLk6oOKaM/dH3mKqwpYJj12g6UH6k/I80qLLvDYteqYGcKmTS+5pKumCuSiUKX/FSn4ovQLLaUW+FRVciGhr9FaxSDJN9KllPFdn97cCSy+uSLP19WnhYTWWGsfnPNWHMI5lK5q/J2frNLNOSNuvT20i2ZI3RZsMHsszuTjRMqEDBd1CT+auMead351Zgck03ez2bbV/Lgmk1aSqRCLm8wvMKQQf7Gq2pjGfp64ozpydEUxkc5PZLPsfmvvko0VGYj37gAy3JundCxTFlxjJ5uuLadBP2hd59IM2S2V1Vk/r2BoRKvT84ramUM39FSUQjfsXgUk0FbFKc9qnYKLWueDQ0T2WyT6V4kM3miqPBYsanYsOPraayd0z7VKwjeX6v9uNUFioljvoWmL+CQjgRq02o7BnLMKcnwaIZwo796aJcilqx5q8FvhDW35OaHPVlzDtjCxbp/yFFJbftm/Bf11J1uzafik5OHcvmsa6yRpu/9o1nfU1l33h2khZ23/P/jtPfeSUXf+tOWL++7OJdjcYJFceUGU3n6DHrfs+dEe5TmTsjWTWpb/hA4UdWr6aifSrlHfUi4msWYUKlKxFlLK19Ktb/0lVSMNJ31JdEf5Wav0rLd1ifihVQR8wszLxHJnK++cvXVCqZvwK1v0BrZ80ufV+PUBk+kGF2T4JFM/Sx9WgrdmZ/RKmmUktIcZkAkEf+6cNA+Dr1O4zpqzcVq1rZAGqP/sp5yvenAHUJ2EoUNBX9PdpbIrSsJWBvixMjnVBxTJmxdM7PRp/bkyhaZEopZYRKIlTgBBku0lTq++LrNertQFsaUlzsA0mEmE9s+Y7xbN533HeVlPQo5GzU4lMpDDaxqM5Tsfv1l/pUzGc48xf/y62XX8Sqi15StlyNH/3VIvNXJucVfV6JWKRqSLHnKYbHMswx5i+Avx2EUOnvLWh2QE3JjzaaiyOPBCkk3+59hV62KUxT2b5fC5XjFvbV5FOptp4KWJ+X8rUugJHxxvpUtKNeB8vA5FwV+7mVCptm44SKY8qMpgumorkz9CzbmsBGJnJk8h7zZySZ25OsmH8R1E7q1lS8YEHJktpfJT6QZDw66fiuRIyxbN436cHkKsSZkuiveVf9lFsuv4gXn7CoSAhkJpm/dEa9PdesrjiJWISR8SyjE8b8tWYNkbevZPHIToTy5Wr86K9IQStrdpmWIk2lBp/KyEQWT8HsngRPu/V6br38Lbzq1CNh3jz9V2ONt2BdNCiYjaoVcfQZHIT168Hz9P/BQbqNZh2mqWw3SZHHL+xjeCyDV6X6c7WVH6GwnspIkVA5iMG9JDterVlTZP6CyfW/7KRtX52/rXpxQsUxZcYyOWaYH6nNQLcayW4jRObOSDC/d3JkWJDhsQzRiJCIRuqeTQVL3xeESr7IyWx9IGGaSk8iynhGl74PaiqhIcWxCKxZQ//7/2lSyCpr1hjzV0BTsT4V43tJxaPM7Ir7jvreVKzmcjWF5Efx76XTzF92UHv6jb/iuC99kcUjO/RntHu3/quxxttoOkc8Kv53a5+Z4dcU/VWGnkT51R+3j0wwIxnjyLnd5D1V1b+Xq8GnYqPzrPkrIgdh/ipTJ++lD/yBvq6YL1RKc1WGA5pKK9cvdELFEU6FCsIH0jlfU7FVfa3vxAqRuT1aU9lzoPzMb3gsy+zuODO74wfhU8HPDYkHbO5B/4n1lZR31Jvor3Lmr0BxRS69lMj45JBVLr10UtkWW1BywmSnd8WjzOqKs2s0w3g2rwse1pikZsu0RANaWTOXq63H/GUHtRO+9u86e7scVWq8jU7kmJGM+SbWvb6jvv7hyvoAw1Z/3DGSpr8vWZgg1VDcsxZNJR+I/FrQl6pfUwmZeMjYGB+66bvMNNFfAHsOFJ/f+lLynvLDmluBEyqOyVSpIDya1j96gGXX/B+3XH4RZxx3BCxfTuLHPwTwfSqVZn57xzLM6k6Y2fvUfSp5T6EoaCp2bXDALyQJAZ9KqKM+xrhJfuyKF6K/JgJCxZZDSUQjFYVAtiSj3jprraM+FY8wsyvOE3u1UOpNxWpOUrNVeoPFKpu98mOp+avaeip2UEtufaL6BSpkdo+mdbi11S4KIcX1aypzf6lNlueetGTSJGnbyAQLelPMM6bcan6VfA3FLWMRIet5vilv8ayu+vNUynxWi0Z2MbMrzqxu7aifpKkcyNBjl35ooQnMCRVHAaudvOENFU0yY9ZUtGYN80pMQU/95Af5+4du0D4V8yMtN/MbHsswuzvOrK76NJVS57V+PdnUVSn6qzuua0IVOepDor9iESESkYpCIJv3SMSCeSqRIke9NX89Maw/295UrOZyNbkSLSgebW6ZlnSI+auaELOO4vziJdUvUCGze/9EjhnJuK9d2Bl+NZNTWdasYda/vDvUZAna/HXEzJRf963a2iS5GopbxiJCPuCoXzy7q35NpcxntaVvHn2pOKl4lJ5EtKjfubzHyETOX1m0XktAPTih4tAEtZNymBnTqI3+uvRSpET4xCbG+dBN32V2T4J5Ri0vN/PbO5ZlVneCWXWav/zcjcAP3CZCBp3yKV9TCXPUW/NXQaiULuhU5F+oIAT02uXFfckF8lSsUBkJVCi20UrD8xdWXCpAa0GFQbX5BSW9IiGcrMWnYmbKuc+u0tnb5ahS4200rSPjrInVfjfqNn9deikyHj5JUkpNNn9VKe5ZW+l7IRsIKV44s4t99fo2Vq1ClaxRlE918e8veJNf+md2T6Io+stqd75QqTO6sh6cUHFowhzGpSxbhlKKsUxezyIrqOXxaKSgqZQRKlZTmdmVqCv5MVeSZa5fm/pcscmaSpj5ywqQdM7zfSp6ZUfP9wUVRXUZIbBr7hGThIBdT8USNbPViYD5q6+rsHCUzVNhcJDV3/0DKz58Nerxx0Oznkv9NW0JKa4iVIbHMiRiEZJveoPO3rZhvXPnkpk1Gw8hvXhJ1RpvB9J5ZqRiRE3Fg0KeSp2aSgWT5d6xLJm8x4LeFHO6K0+CLLUt0hXxfRkzkjFmdce1KTQko78qg4Nsu+yrfp28iUVLuOdjX+Cqp77Q/z7N6Un4Qh0KTvqj5rZeU3HrqTg01aqXmtllOqfLkvckY2XXotgxq58jKJSRDwsrVkoZR32CXA0RN2FkS+ph6deFgouWrvhkQePfViLq1+cKlmkBmMjp0OlS/wKDg3yx6wSufXg7d3/sxYX+lKxOaH0q1lFvNRVLsDT7jGSMvNJmp1RI6HOuRGC1w6dS1VF/QOeoiAg7zjqL4z/7WX/b3v0TnLrqej72d8fx1ucfXfE8o+mcX+anJxn1IwPr1lQqrJlic1QW9KWIRSPM7o5XddTXoqlETXKqjfLrMxOIkfFc+PpCVXj87PN4/Ua96Ne/nX+CFk5XP1zQVLqLNRXrXznK11Sy9E75qvXhNJVOpgFruNdMGbutgqLZ+IFA3a8wU9BEIslPXvkOQH/RRcLNCePZPJmcp81fXXFG07kpD5K5ksq9UMi6Lor+qqipFK8OGPxvTWDpklk76EFo12imaPYeGv0V8Kl0lQiVGYFFpKyAKVdJN+sVJ1bGm52nUuJTqWWlyT0Hsn4iXin9vSmWzO7i3o3DVa8drIvWnYj5voi6HfUVTJa2RMsRM7VWPdcsQ1AOpVRNBSXjJvHVRrL1den7qTeseGfgN7R+91jRWioQoqmYe7Dmr30tzKp3QqVTadAa7jUTUtU0k0zxgVd8sMgkY0Mye5IFf4C3dBkewkj/Ii77hw/w6Iv+HtCD6pzuBLtCfqRWPZ/dXYhemaq24pu/SiKuoFiAVHTUB0rjdxkB4xeMNEIlm1eTjrXFDneYmS5r1vDrL72RT5//dH8CEItEyOU9v+JxKh717xUC5i8KAma0nFAp0VRiLVj5sR7zly0ZEsZJy2Zz38a9Va9tfSqgv2c26qzWlR8nYb6ne+ZN9lvZ1SBt9v6cnkRF85eNjq9m/oqagpL701l6UzF/MlGvs96akOf0JNi45wAj43rpBCvctKYyOZm4vzdJTyIavtxwk3BCpVNp0BruNTM4yM/f8XG2zOz3q5redsnn+dmxZxTN3GxGsk1+ZHCQyMYN/P1Xb2TlZ37K/x77At/sBbY22GRNxc6kZnUnfLvwVO2+mZDor7jvUwlz1IfX/rIEo7+gUIYlk8tPOtbWpdo+kvYnAIv27SiKLnrGTb/W0V+5PPGoEI1IWfOXzcnYXybsNFdiWtPmL9W0pLZJ5q9ahMqBjJ+IF8Yzl81i674Jtu4bL7tPNq+TRa2Q7Qk8n1pXfgxlcJArvvcHnvyRX+GtK0ySbMl7m70/r8z3Ndg/qB6JFo/qII1RU+PNmr/qLZy6azRNLCKcsHgm63eN+dn0ljk9WttPG1OrNX/N6o4zqztxeER/ici3RGSHiPw50DZHRK4VkcfM/9mmXUTkqyKyVkQeEJFnBo650Oz/mIhcGGg/WUQeNMd8VWwA/+FCG1ZuW730OVz65asRU94i85oLAPy8CiiYZ0rtwqcdNZd7N+5l33jWj/cHnQQZ5qi3X/rZ5ksPU6//VbrGCBRmkL5msWYNb33jC1n3hZdz8hknTdL0gvfRVcb8VWoKgoKmsn1kouwE4MzvfcXPU7GCzQ4E8agUaT+9NWgqpZFl+jNoklAJCSmutp6KrVBcjpOWzQaoqK3Y75dv/gqYCGtd+bEcR8xMkfNUUZWH7fsnmN0d9ychc3uSFatAWP9bdU1F8JQWIjNSMX/iVK/5y9bTO2peDxt2H2CfKSZpOfHm33DL5ReRSMRh+XKO+PXPiUWEGclY3Xlg9dJMTeXbwDklbR8GrldKrQCuN+8BXgqsMH8rgctBCyHgE8CzgVOBT1hBZPZZGTiu9FqHNi1euW3n/jRrd4zy7KPn+m2LZmlz2JaAUPHXUkmWCJWj5/oz2UmaSiXzV4/2qcDUNZXSyr0QyFMxJVVYuZLe7VuIoEg+sXmSCbHI/BUv1lRspE4mH+ZT0YJz276JsoK+b+c28p4inZssVHpTcYLzIDuIjpbRVEqDAGxxy2Y560uFil1PpZxmlMt77BvPVtRUnjb0K269/C289BmLy/oIraZmNRVfI+bgyrRAyUQAYM0a3vPWs7nnE+f4/ZnTo2f15RbzskK8uk9Fb987rldntL6PeotK7hpNM7cnyfK53RzI5Fm3a7QgVNas4bR/+0hRHs5L/+PjXPDYzYhI3SH79dI0oaKUugnYU9J8HvAd8/o7wCsC7d9VmjuAWSKyEHgJcK1Sao9Sahi4FjjHbOtTSt2u9Lf8u4FzHR6sWoVqwBrutXLn47sBLRwsS2ZrobJ5uCBU7Oy9J1kcofTcO3/HLZdfxLovvJzzX3m6HjDWrOGz7zmX6z945qRBZG+Rel6fUAlLfrQDry2pUs2EGGb+SiVKhEpJoUjQtu1ENKKjh8oI+v3zFwY0FX18QagUC+VqPpWcNzmkWH8GjddUlFJk8h7JEp9KpevpHAzKaypr1hB7x9sL9cDK+Ajt/fcGHPWWRgmVbfsm/AnHvN3biAQKeZ5y628AipzeQaaiqYDRVJIBTeUgzF/zepMcaRzv63YeKJi/Qla7TGQm+KfrrwT0b6yVlYpbHVK8QCm1FUAptVVE+k37YmBTYL/Npq1S++aQ9lBEZCVaq2HBggUMDQ3V1fnR0dG6j50yixfD2/+FY755BYtGdrFj1nz2vOtt7Fi8GBrQh+C99F93Had97RusG95J+sr5PPy2t7HjrLNQSpGKwh///BjH5PVs/J7N+sv54L13s6074h9/7GWXscTUe+rauhnvwgtBhFk5M0hu2ED+4ot59JFH2HHWWdy3Vv9oH7jrdmw5prsffIS5+9fWfA9/HdYHPvzgg8hWY7Ia1T+uXTu2oTZuJOynrzZu5EZz75v3F2akf77/XvasjbDJtN193/9v78zjo6rOxv99ZibJTBKSQBKQIAlSEYq4FeqKElyo9nV5a+tbbRCX+rPVurW8P3GrVQSrVqvVqnWvQqp1qUsRcSWyqLjVakVxhbBJIBAh+3beP869k1nuzcwkE2YSzvfzySczd+7ce545557nnOd5znM+RDb62LKtidwMiar7vEzFh5+tYeX06ez5h5vJbO2yxXdkZfHsCadr0TdsorO1k6qqKoa89DLL7r6Pku1baL5lKF+dcw41Rx9NXYu+5/sfraTg28+jyryltgkRgmX4eo2uh9eXLCMvq/eW36GvvMLo++8nq6aG5uJiTjzwdNaNyaCqSu+YuNa636tVrxPwRd9vQ70u/8Y1X1DVujrqWTl45kz8Dgq+eeZM3hrR9ejadfrFpyup2rKKbZu7ftO33nyDnIyey7qtWZdx6bsfMvlS5/Lse+fv4ecP8mLVG4wc5ImSo866xpdffE5V62rXe61ZrX8vpWDLxnUsX1pDlhf+8/lXVHnjSGMTwbotjeQM8bLpi66tBBrraqmqqmKKSzsv3lZDVVUVjdtaqKnroL6+c6f0X+myTsXx2e/BcUeUUvcC9wJMmjRJlZeX96CI+oHu6XdjUlmpR9DV1XrkO3culT/9BWdmHsYJ+5Xwwkcb+fDqaYzvQYy7E0FZKivh1luDI/pATQ3jb72V8d/9LlRUMPJfryO5OZSXTwJg9fKv4T8rOWrK5K5R6ZlnQkQCQU9H9CIvb0sL4+fPZ/ycOVRt/5hBa9dx9JFT6exUyGsLKS4ppbx8bNwyZH6xBVasYOL39g/OsO5a9SbUbWWP0pGIy/oEKS0N1uParY2wfDEAUyYfwoiCAGtqG2B5FaPHjKN84u7c+O+l7DY4EPwNbEZ98gbKK4yfM4fHG3KZ/NCtDN++GSktxTt3LjtGHASLVuHPLaAws53y9WvgT7cFf2v/pk3B37rplFNh8SJKykZTPuU7UWX+08rl5Gb5KC8/CICNb1fDJx9x+NrVDJ5zbVi7SXjLWIc2cMOiP/Pm/iMo//mvAVid8TWsWslBhxzmOBt5++utsOxNJk/an8ljiqKflZoax1v7a2rCzlOramDFOxx24Pc4oHQwbzd/yqvVXwIwdcrhPVrjYdPe0cnM118gf7dS/C7lyavdDMAe4/Z1lGNDXRNUvcb4cWMpP9DdFL16+dfw6UoA9hk3hvLJezD4jVfJLyqivHy/hMqtlKL+lUVM2LOUk6eN5YplL9CpYOweIykvH++6Dmdb4TDKy8tZ0fwpyzd+RU5OTt/1XyHs7OivTZbpCuu/XbPrgJEh5+0ObIhxfHeH4/0Tl/Bh76OPkuf38aMDSmjvVHywti75a1dimIhGDA6EO+qdzF+JBA9Y59Y1tlJghZ96rKioRKfoduZep8WPWT5PXHm1wsxfbj4Vh+gv0OYUOyT1qXFTuOD6fwSDHKioCJpIGlrb8fu83f7W/gwPgrtPJXLxo88jnPjxYvIv+lXvw84dypXd3sJB990cfG+nuHGLALMjBAe7hRTH6SOsbw43f4X67nocUmx/3+uhKDeLb7a7myzbrbxlbgsgO+L0qYR+bsuSF/D1yKfSYGV8KMzJJNPnYYRllrbXvji186aMLF6uuAjQwTBtHQqHBM19ws5WKs8BdgTXGcCzIcdnWFFgBwPfWmayF4FpIjLYctBPA160PtshIgdbUV8zQq6VfKyOfMqR0b6BpOAWPfTIbUwYkc/E0iGIwPYHHu7Z2pXuFFGMKLOSggAb6rr28G5oacdn7YESJJHgAetcezW9TYG1z0giRO4xAqGLH72uuwCGjuTD16mEr6i316lE+hdshuX5+WZ7M0opPq+pZ69h4WuWvfZOlM3t2k/TzW8tIgR83UV/hacGyfR5uHTJI65p+BPCpVw5NRvD7gcuSqWyksOPmcRXN57A2IP3cW6PcSbOtOXPzdLKKWkhxRa75ft1GLjDuiyys+k49jiW3X0WJ35vJIwaxdBXXgk7pT1On0ro50Gl4s/oUfTXlh1awdlRlaOs1CtBn4rVzr8dWkIngiot5YrjLmT1sT8CoCCgn7P6tp2zp0pfhhQ/CrwJjBWRdSLyc+AG4BgR+Rw4xnoPsBD4CvgCuA84H0AptRW4DnjH+pttHQM4D7jf+s6XwAt9IkjILKI7B2PC1wzt5F2SOBZtq2GfEfnkZ2cwdtggJt17c+JrV1xmQcGHJcYIckRBgK0NrcHNjRqsZJJhEdxOHUZGBmRGmElCOhE77b1Nvp2p2EkBuijFNofFj1FpWhx2AQzFb43ARaJ3igx11DvNVHbLz6KxtYM1tY1sbWhlz6G5YZ/bHUt9Szt+nyfmbx3wies6lcjV+j6Ph5LtW5yvl2jYuUu5GoeVBF8HlUqkWdNqXznfrMeDwrd2bXj7srEXypZ2LZR1ygFmz1QiQ4q9HiEZqwaG5fl19FdFBc9fcC3r87rWZXHGGWT9bX5YFNXYm28Oe9bb41ynEj5T0Z2/TibaA6VirZspGpQFlZXcfvmP+OrGE/ifnxzeVbaKCpa9/C6jZ/2TFYvf5+nvljPYCoDJt/439HelopQ6TSk1XCmVoZTaXSn1gFKqVil1lFJqjPV/q3WuUkr9Sin1HaXUPkqpd0Ou86BSak/r76GQ4+8qpSZY37lA9dUqsGQvQnTq5F0elg15RUwYkQ/A2WveoLD2G+drdteJuJR/9P33A9By7XU0+SIyyoZ0/iOCYcV6ttLQ2hE2egScZwQPPQQPPghlZSgRNuQPpfOerk7E3qDLJj87k32XPB/925x1Fpx9dvix008HEY6YNokTP14cM01Ld3ispIXZGd6wvUoyvBJTqdjRREu/0J179EylS6kEMr0xR+t6puLc6UTuKpnhFTbkFTkLNWRIYibSuXPpiBi1N/qy+PSiy4Lv7Zlp1J4qMdpXGBUVeNas4cDrXuL3d7/g6PvZ0dKOSJcp0t5TpbeRXzbD8izzF/DM+CmcM/vJLpPlwoVRWbe9LS1hz3pPZip2ZF9eD2bj0JXgcvRLz8K55zJ480Y8KHK+WR82wJ0wIg+ApZ9rv5BtCbBD9hsSv3WPMCvqY5HsRYhOD6FSUYqlLcvPTUfM0EqlspKT/zLbMToB6N785FLOLMtRWTXpGGYdewHNJbs7mohs+63tV7FnKlE4zQisY8+9v5ZDf/kgnxx5fPB0naE43PxV8exfon+btjZojQjvtMYP2RvXc8OiP5P/9BPBj+zw4tBNumKRk+UNpmixCWR4u8xfDiHF0KVUllkP8Zhh4TMVWwk0tnboGVEMc5zfJ+4hxR3h+aYyvB5uOmIG7VkRJpyMDNixIzETaUUFL11yHevyilEirMsr5rJjL2DzCT8JnpLlZv6K0b6cKCnwsz7EpBpKfXM7uZk+vXcNXb67ZCmV3fL81DW20dzWwWeb6hkTOruM41mP36fiZP7qmU/FnqmU3DS72wFu6ZBs8vw+ln2uBzl2qL5tEej35q8BQ7IXIbo1XKXYWDCUToRa/yDqPZnctuCPjJo4Hi6+OCoOPUistSsu5WwZqqO5X/p4E1UTj8FbvcbRRBS5ALK+pT1slXM8TBo1BIB3V+tkgu1W9tbQPFgF2RkMrduc0HVBO5SHzL0m+N7u/J32o3ekspIFt0zn7d9OCxvVBzK9Ybm/HM1fllJ548taBmX5gu9tvCFmOXudSnfmuIBPXB31rQ5pWp7beyqPnH2FVgbo2aDKy4tWwnHMrJ/+7hRmXP04dfc+AMBtC/7IlB98P/h7lCz8B8vuPov9RxWGz35itC8nSvIDYQtqQ6lvaQuavqDLUd/b1fQ29kBgdW0D6+ua2Ct0IBDHs5771OMsu/ssjp4wvNtZYNhMxd81U9nR3Oa6vXaQCHNv4bNPAuBZt875fKtPEREmjMjnw/XfAgSTe9rPWUOrUSrpQZwOxrhxywZcWsqUX/2Vf/7vjeR2tjK4aTseFFJdDbW1zt+BmHtTMHcurZnhnR3Z2Ww5+GBUWRl/+OkBVN15FhmPPer49WGDsvB6hPXWAsjG1o6wVc7xMKIgQEm+n3dWb4XKSmSPPfjqxhM4Z/qRwYeyIJDhbs6JgXd918MWjP5ySB8fhWWK3K2uJmwBHJWVwd0f7YWATkrK7qB2NLczZlhulM0/tGPxR5oMHejOUR+986O+9l0lB/OTWY/y5DtrOPSXD8LWyPXGFmvWgM+nZ0gOneHKjduZ8dVyBls7JHpQBDZYGQjOP589r/qN886Jc+fSGYh2eH91zjmucurgjybH1fmhW1VDVyBFMpz0oB31QHA0v+fQEJOlw7OuALZsgaIiEKHskl+47iAZSqifz877lefPoFNByyPz3M2TDubxo269itM+X6pD5J0IOT5hRL49ke/yqQTNX0appAeWyaLWYVOmHjF3Lp2BaCXVMnsOre2dHDnvNrJau9/PwaZh2IiY5VA/+xnXnXQJtYW7oRA2FgxFnXEGwxctQqqr8aAYsmWj+8Px2KMsv/ssZh73XRg1iu8vfyFo506ESaOGMPiZJ1Dnnot3rb5v7qYum3B+diY3HTGD5sxw/47KyKDd5575FqBz966oc6fthF3pxl8WyPTR2NoRTFrplozSTr8xZmj0bhWhzly/w66TkcQ0f4VlY9avt9S3sP/IguA6nYahJY7fB8B2skd0ht82trFuWxMnP3WX8+9x77143aLMKipYfun1QdOZ/XzUHH20azFKCvw0tnZE+xcqK5l90fG8OHNqsLO1FUxvw4ltgn6wz20/WMhMxTZPFhYGF70JQENDcGAnPfMR+wAAGhdJREFUkYrQZRbotZSgz9OV4y0/kMGJHy8m6/xfupsnHdpkZkszF7/217gGuLYPFrrMXv4ML/4MD/XGp5JGVFRw2/0vs89V/3SMIEr0Wp/Mvjm4i1vb7iPh3nvZdPzJAOSGhHF2R6MviyVn/jrmeR9v2M680ZNZ/OI7PPnOGg75xYO0PbdAOyDDLujwcISM5O2R2cWP/4HD33kprjKGcsqq1/ndkzdFOULt+06oWsClSx4hs7WFTo8XBazLK+bLG+/g6pN+Q22h3qAo0vfU6Mui5drrgu+7thOOo2m7mSLXrOHha0/hvjMPJGP0aN0RODn+Kyt5+fYz+OrGE7jqguOilHLYTCWOmVPA675OJdL8Fao0DygtYPfBAYbn+3nix+dFz0ydaGyE6dNh1Cg23fMgAIPc2p7DQlYg+Ps9OW4KJ1/6N31eHM+HHfwRuv4pmDZla3jalMHPaNNPj/dSicBWKiu+riXT66F0SEQnXVEBubnu/ksnHNqRvcX1IH9XpGRewBc7DNylTQ6tq4krRP6gNxcF0yUV7r1XiCUg08xU0o2i3Cwa2nqQwM8hHHbp96cx+byHGD3rn7z/+r+goiKYdLF5uEu2mcLCsMY056RLeOPgaTHvu/fIwSy7+yym/ftVpo4bykkrF5Oxfq3zdyIbtMOoKdDWwvQ/X5nYep3KSg676Qp8yuW3W7OGSXNnWWYX8HR2QHY2S8YcSM7sq5nz1E3atj5/PsybpyPKgHbxEGhvwX/Nb4NlcdpO2BU3c4IIQ7dtQlB41lZz24Jb+PkR3wmX2eoEh23bhAfFoE0bomZ7oX6AQBxKzu8TGlo7gs7gUHT0V+hMpavb239kASLCeevf4geVt+NrbaYj3pH9mjXscfmvOfHjxWEzvjC8LgrR44HKSt5bs42JZYPjDvktiYgoBFxnjbmzrwZ6setjBHl+H4EML81tnYwuznH21SQhJNuepYb6h/L8GbHDwF3a5LaiYfpFdyHylZUMnXlh0Hwp1dXBNlmQnWEc9elG0SA9lXTbb90RlzUiOU/+PTjgtsMFt1r/a2Zd7TzF/dOfwhrTO4ce516WiLU1u2/fTN6F51N06a+5cdGf448ic3m4BBJbr3PlldGjs1C8XrwRgQjS2Mhp7z3PcMvf4bft+6CTbQYC+FQnAnhCHh5f6Ir6WDiZE0SC0WU2HhxkjiPUPOGZipVTy96zxqazU9HRqcIUyeBnngyOSL8/9Xtw/vn87IG5lHxbgwfwdna6hqpHktHSxOVL5+H9/fXObe/cc6OPA3R00Pn/zuV7yxYysWxw9OcuOGW/dm1ra9cikrzoLxEJZpgeM8xlg91EgnBc/Kv2rHJQVpfpduSiZ+h0qxP7nnPn0hIx02zKyGLx6ZfELsuVVzpbAi6+mHnX/Q9Pzfxh3+8gi1EqcVOYoxui037rrrh0PNMqb2dCibZ9brZ2DrTTXHimx57igr35lYNSqayEM85wtY3721zK7/RwxHq44l2v093ILzvb1bwS9fjZ93NSUtZnGaEr6mPhZE6ItdzJLkMc4afehJWK/h9pAmuL3DemspKhM7sc6p7qavjLX6IjBB1C1d3Y7VsrBNip7d11l/7vMGPxNDVy6ZJHghF+8WCnG9lQ1xScUbstM5PSUnIyfUmL/qKykiduOI2vbjyBuZccH//q/7BCWb9pN/5Vu+6D2agrKxlx6UXOs/WQZ6/t1NO4+r8uYlvR8KAPdNYPLmDjf50cWza3NllbS/HWTVHBKH2FUSpxUmzNVBJSKi6VXLythoNHD8HrkeBMxTZ/FeZmxlwFrs/LYktkfiJ7huJmA3c7Ds4PR6yHC+IzFbgpJ6+3qxOLl+rqbjv0hGYqEP1bx1MWO3mjEyHHezpTiXTWd+0bY13PSam6KUOlumRyM2NhKXB7JujU9ioq9DEHRmzfzH6T94u7o/J4hJJ8P8Of/0fXjNrpxOxs+OEPefn2GTx/yZTej7Kt58PuYPNqok2WQNhgQ4lo03NhYZeinTdP/67d+I/sAUBQqbjM1tvFw/Y77gpe553VW/n7XkewYvH7vDvndjo6Fbct+CNnT58aW/Z4Z1h9uYMsRqnEjZ13p7v9q6NwqeQNeUWML8ljSE4mm628PlsbWvBneOLOwlqUkxnMCRTEaWYUilunUlbm/HCEjuTdiKchu0WtPPywvoebGcrtfm73HDKEsyv0Lo97TNq7Zx1QPIrUzgYcIxInfKYSj09F/3dTKsEIqERs/mVluvNTCtrbtV/KTb5YnY3L7y4QZr+Ph5KCAD989A739mqlTeHhh4Mm0F6PshPJjmENNl5/7TUdUrxlS7eDvEi6ZiqW+culzjxK8eK+RwbfL/60hkyvh/L3XmbS9bOCs9HI1fOOxNN2bfpwB1mjVOKkS6kkMFNxCB9u9we46YgZjB2WR3FuVvB6tQ2tQRNbPBTmZrG9uT18hXMsM5OTbTzWmht7JO/UGcW7XidW1IrT57/8pfv93HKN7dhBXo3e5dG3bm3POqBIRRqp3OwyxBGJE2qySWimEmH+ao1MnNlNgIFjWZ3kc6O7NhSr00pgBFxSEKBom8uqe5Fg2pSkpkjaiVt023UVXHPjUmffBnI58tgDtcw+H1ccvzdv/OVs/DN/7Rop6YpTmywsdD63j3aQBXSu/l3pb+LEiaondHZ2qjGXL1BzFnyc0Pe+vO0etTavWHUgam1esXr04t+r0Zc/r5rb2tXpD6xQJ9yxVCml1BkPrlDH37407uvOf2u1Kpu1QG2sa+o6WFamlB6Thv95vUrNn299cb5SZWWqU0Sfbx+P66b6u6on3+0J3d0vUo7CQmfZy8r6rgwx+KB6myqbtUCVzVqgPqjeFvP8R557VZXNWqCe/3BD2PGt9z2o1uYVd8l63nlKZWeHy5mdrY/HW1a3thLr97J/D6fvgr63Umrx4sXdXuaWl1aptXnF3ZdBpNt7JEwPZI4lhxub7n4gdp1lZKg2X4b7b5kM2efPd24rCT67wLsqzj425Z38zv7rqVJRSqmJ1zyvLnnsXwl959kP1quyWQvU0++vUxceP1OtyxuqOtANbd4F16tDrn9FKaXU8bcvVTMeWBH3dV/4aKMqm7VAfbSuruvg/PmqPRCIqwH19GFJN4JyJLsDSgIfrasLKpVPN26Pef4TC7VS+fvb1V0H589XHU51mogCcaK3nU2MDjpW+3rs7TXqwuNnqpYsv3sZeqr4kihzj56TeOvMbSDU3V9PZO/NQNIiEaVizF8JkJcpiZm/IJje5NgPX+PGF//MiO1d9uH/uW82B7/1Ikoptja0aid9nBRZ59oOfgAqKvjXVTdFrW7u1WLN/kKyc7QlgdAQ4Hh8Krb5a0eoT8Ut0m3hwpjBHN0Sh/muW3qZvqikIMBze0/l8mMvpGbwMOcyJDtFUm9ljpd468wtpY4bPZU91D/U28XbcWCUSgLkZ0nQsR4vG+qayA9k4P/dbwlEhPNmtjTzm6q/sr2pndqGFgodtml1o9Dy8dRGKLk3D/oBk897iJaWtp3SgNKGZHdASSA0+isQh0/Fb50S5lPpSz9AHFGG3X63Fx30Xq/+k2V3n8Ufnr1ZB6fMmxddhr5QAr2ROV7irbNYA56IBc/9ZYCYLnvU9wsGZQpr6xKI/kKnoigpCLg2tJLtW/h4ayPNbZ0MSchR77wYs3prI8PysuJyDA8o7IfNXkPS0/3ak0hovqp4Elx6rb1dwvZUcdl/PJUzsCD29gaJYq38th3RwRxw9jWTcY9UEm+dzZ2r5XaKgLMXPPc32TEzlYTIzxS2NrTETl0dwoa6Jp3rqJvw4k+/2Q6Q0ExlUJaPTK8naq1K9dbG6HxGuwo7YxSaAImGFINO9V4fupn43Lm0ZkVnmU7lDKzXuK387sO1EzuVeGfNkZGGdsh/P5qVOGGUSgLkZQmdSm8wFS/rtzUxosDv2NA6Azq8+LNNOwAYkoBSERHHVfXVWxsZuasqlTTD9ql4JP79XQb5feHrVCoquG/6Ze5+h/7ITgztTQmJmO3sgZBSeh2RUmkxIOoNxvyVAPmZupPYUt8a9Gl0x7dNbexoade7J54UbZ5pvPpanvusiMO/sZRKAo56sFO1dM1Umts6+GZ7M2VDchK6jqFvsGcq/pCtimORm+WjPmIf84dGHcrqe/6bP5yyX9LLmBLS2aSXLPqj2S5JmJlKAgwKKpX4nPV2wrwRBdbMIcI8k33mDHweCc5UEjF/6fOzwqK/1tc1oRSUFga6+ZZhZ2HnIYvHSW+TmxU+U9m8o4Ut9a2MG56X9PKljDQMqjAkD6NUEiA/KzGlYocTlxQ472/h8QhFuVls2q6vF8/sJ5RI81f1Vm2n3mV9KmmGvVFTIkETuX4fO0Kiv1ZZs9hxu7lk1O2P7KzQXkNKMOavBMgLMX/Fw4ZvrZnKYPeZQ9GgTL7Z3kymz0NOHFvOhmKneVFKISKstZSK8amkB75ENgyzGBQxU7GDOMYOJKUCu7R5aKBjZioJkJOhO4pEZiqZXg9F3YQKF1uzk8KczLjt7jaFuZm0tHfS0KqjhaprG/FneILXNKQW26eSkPkrwlG/6psdFOVmBnPPGQzpjlEqCWBHXEVlB3ZhXV0TJQV+PN1sMGR3FolEftnYCShtZ70dTpyocjL0DfY6lUTMXzlZPhpa2nUOJWDVph0Db5ZiGNAYpZIgRbnhzvHu2FDX1K3pC6B4UC+USm74Hi+79BqVNMTrEUTiX6MC2lHf1qFoae+ko1Px2aYdjNttADnpDQOefq9URORYEVklIl+IyGV9fb+ikHT1sVi/rYmS/PiUSqKRX3ZZQPt4lFKWUjHhxOmEz1olHy/2pk71Le1UW5kWzEzF0J/o10pFRLzAncBxwHjgNBEZ35f3LMrNisv81dLeQc2OlpgzlS7zV+I289BULbUNrTS2dlA6xIQTpxNej8SVosXG3n+jvrmdTzdqJ/2AivwyDHj6e/TXgcAXSqmvAETkMeAkYGVf3bAoN5Mt9a20d3R267vYUKf3nh9REOdMJcGFj9BlMtu8o4U1tQ0AlBYa81c64fN48PsSVyrfNrXxyTc7EIExQ41SMfQf+rtSGQGsDXm/DjioL29YPCiL1o5O9rzyhbjOjzVTGZan17D0JGIry+clP5DBra98xq2v6GPG/JVe+DM85GbFr1TyAnr72ZPuXA7A6KIcAgmGmhsMqUTsKJP+iIicAvxAKXWO9f504ECl1IUR550LnAswbNiwiY899liP7ldfX09nZg5L1rXR0Rn7fL9POKrUF5YC3Ym3NrZzQLGXLF/iUVsf1LSzZrsuTF6mUD7SF1f0V319Pbm5uQnfL91IdzlW1nZQHBCKs2Nbmuvr6/Fn5/BqdTvN7fq5HDvEy7gh/U+ppHu9xMtAkQN6J8vUqVPfU0pNiuvkeHfzSsc/4BDgxZD3lwOXd/ed3uz8OFB2S1Rq4MgyUORQysiSjgwUOZTqnSzsQjs/vgOMEZE9RCQTOBV4LsVlMhgMhl2Wfu1TUUq1i8gFwIuAF3hQKfVxiotlMBgMuyz9WqkAKKUWAgtTXQ6DwWAw9PN1KgaDwWBIL4xSMRgMBkPSMErFYDAYDEnDKBWDwWAwJI1+vfixJ4jIZsBhg+y4KAK2JLE4qWSgyDJQ5AAjSzoyUOSA3slSppQqjufEXU6p9AYReVfFu6o0zRkosgwUOcDIko4MFDlg58lizF8Gg8FgSBpGqRgMBoMhaRilkhj3proASWSgyDJQ5AAjSzoyUOSAnSSL8akYDAaDIWmYmYrBYDAYkoZRKgaDwWBIGkapWIjIj0Vkf2vfeySena7SFBGZISJTRCTfet9v63mA1cvuIa/7c52MFpFs63W/lQMGTp1A+tTLLu1TsTqoUuBJYDtQC6wCblFK1YmIqH70A4nIbsBjQAfwBTAIuEgptaU/yTIA66UU+Cs6K/jXwDVKqa9TWqgeICLDgb+j5WgALumvW00MlDqB9KuXfq2Ze4OI5Fkd0wjgHaXUUcBv0R3x3JQWLkFEpEREitBlX2fJ8iv06tl7Ulq4BBGRXKteSoAV/bVeImZU5wFvKaWOADYCfxKRgtSULDEi5Pgp+lk5FHgVuFxEJqamZL2m39aJA6eSRvWySyoVEfkVsERExgO7A8Otj74E/ghMFpHvK6VUOptbRMQjItcDbwETgP3tz5RS7cDFwKEiMsWSJW3rW0R8lixPi8h04CQgz/q4X9WLRSDktQK+AVBKXQZ0Aj8VkYxUFCxBMkNe+4EMAKXUDUANcIyIDEtFwRIl1NQFtNN/6wQROVFExlpvM0ijeknbTqYvCOmIBgHNwLnAU8AkETlAKdWulKpGT4t/BZDmZpbTgXHAfkqpKuB5dMd7IATLPhu4xnrfmZpido+IDAb+BhQAtwH/DawAjhaR/ftTvYjIUSKyDLhTRCqswzuAThGxleSdwE/oUppph4hME5EXgDtEZIZ1eDVQa5mOQJtcxgOjdn4J40dEMkVkPvBayOF2oL0/1QmAiBwgIh+in31bAW4ANqdLvexSSiVktD4M3YjygWnA5cANAJZD+F2g0ers0hJLQY4BbldKbRORQ9CN7H7gZuscD/A0usGVpaywsckFRimlzldKPQ80AevR5q7Z0D/qRUSGAHPQivER9Mj3AnQdTANGWv6gl9Ej4+nW99Ji1iUan4hcClwP/BmoAn4oIkcBHwAjgX0tOVag/XdH299PTcmjiShLG9rfMEhEzrSOrUCXO63rxIFT0c/8KUqp/1jHPgPKSJN62aWUioh4rNH6FrRD6yV0I1qBrpCfKaU6gGwgWym1LXWl7R5rpF4EnCwiF6I7gL+gR1r7h4wudwc6lFI9zczc5yil1qKVxV9F5BXgULSibwMOE5FT07VeLBOk/RyVAB8BTyulFgP/C1yLVpAfo0fC46xzn8DazjsdZl2WDGKZTdcCp1kK/jlgHTBEKfUp2hR5CDDF+urz6HaYFnJAlyzW60zr9VvAhcCVlj91EdpMdDJpWicQ3r6sgVUxWrkjIudZ5uC3gfeAw0iDetmllEqI+Wcf4EVgEbAv2vRyF3CaiDxuvV4BaT1iAT3bmgjsrZSaCFwNVKMb2L7oDuFvwPuQ9rKcArwBbFBKfQetJHPRI+UfWfVyN2lULyJyFrrDnW0dqkd3uPbD/BnwOHrmMgctzw0i8mt0Xf17Z5fZiRA55liHngG+FJEMpVQ9WlnmW589jFaSt4jIZWjZqnZuid0JkeVaAKVUK1qpnAAsBJYCV4jIPugZfS7w+3SrE4iWBW2296FnV/8ADkbLMh9t8kqPelFK7XJ/6FHww+gGtAQdMRGwPjsRGJnqMsYphx94CHg/5Ni5aAe9AEcCI1JdzgTkORP4Y8j7m4HT0DOUtKoXdGf0jPVbvw+MtY4/DDwacl4e8A7abJRpyXMHcFiqZXCRY8+IzzOBfwATIo7/F7oTnpxqGWLJglaI11ivT0P7Uz9BD6oL0CaltKkTF1n2so5fa7Wn/2+99wKfA+XpUi8p//FSVGFXAi8AU6z3NwGzUl2uHsoyzFKOPwa+i3ZGnp/qcvVQlsnokf3BwFBL4VekulzdlLfU+n8D8HfrdQ6wGTjEeu8D7rPPTce/CDkqIz4bCiyyXo8ATkl1eROQ5W/W6wDwH/Tg8d9WZ/1UqsuaoCyPWa/9aFPeVWhTMOjB11mpLq/9t0sufhSRgFKqyXotwFCl1KYUF6vHiMhk9KzkeOA+pdR9KS5SjxARP3r9wAnozux2pVTaZ4kVvej0OeBapdTzVsj6D9GLN0ut18cppbamsJgxCZHjKqXUS9axg9CmlMfQM8n7lVJ3Wg7htO08QmT5nVLqBRGZDfiUUldYn38C/FgptTKV5YyHEFmuUUotFJGfop3wK9Gz+J8BJyulVqWwmEF2SaViIyI+pR2TAwIR8Srt0O7XiMge6EWcbakuS7yIyC+A6Uqpw633xwFT0aP7y5QORkh7LDl+ppSaYr2/BPgD8AAwt7/IAdGyRHyWrZRqTEGxeoRD+9oPOAr4DnCj0iH3acEurVQMhmRgRxWKyJPoBXWd6NDuj9J5NB+Jgxxb0Y7iT5VSS1JbusQIkeUptANbgPlKh9v2KyLqZSNalnuUUh+luGiO7FLRXwZDX2A98Nlok91PgS+UUh/2J4UCUXKcCtQqpe7tbwoFwmQpRjvnP++PCgUc6+WzdFUoYMVkGwyGXnM+OkrnGKVUS6oL0wsGihxgZEkJxvxlMCSBkIW1/ZqBIgcYWVKFUSoGg8FgSBrGp2IwGAyGpGGUisFgMBiShlEqBoPBYEgaRqkYDAaDIWkYpWIw9ANEpEpEJqW6HAZDLIxSMRgMBkPSMErFYOgDRORSEbnIen2riLxmvT5KROaL3q73TRF5X0SeEJFc6/OJIvK6iLwnIi+KyPCI63pE5GERmRN9V4Mh9RilYjD0DUuAw63Xk4BcEclAp/f/CJ26/Gil1PfQ2yT/xvr8DuAnSm+69iB6S2UbH1CJTtNx1c4Rw2BIDJOmxWDoG94DJorIIKAFnWJjElrRPAeMB5ZbG1hmAm8CY4EJwMvWcS86gaDNPcDjSqlQRWMwpBVGqRgMfYBSqk1EVgNnobdJ/hCdCv87wNfAy0qp00K/Y21x+7FS6hCXy74BTBWRW5RSzX1WeIOhFxjzl8HQdywB/tf6vxT4JfABeue+w0RkT9B7e4jIXsAqoFhEDrGOZ4jI3iHXewC9z/oTImIGhIa0xCgVg6HvWAoMB960dhZtBpYqpTajd1F8VEQ+RCuZcUqpVuAnwI0i8m+0Ajo09IJKqT+iTWnzRMQ8v4a0wySUNBgMBkPSMCMdg8FgMCQNo1QMBoPBkDSMUjEYDAZD0jBKxWAwGAxJwygVg8FgMCQNo1QMBoPBkDSMUjEYDAZD0jBKxWAwGAxJ4/8AR81WNGWWbLYAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Plot sample time series of sales\n", - "sample_store = 2\n", - "sample_brand = 1\n", - "sales_sub = sales.loc[(sales['store'] == sample_store) & (sales['brand'] == sample_brand)]\n", - "plt.plot(sales_sub['week'], sales_sub['move'])\n", - "plt.plot(sales_sub['week'].loc[sales_sub['move'] > 0], \n", - " sales_sub['move'].loc[sales_sub['move'] > 0], linestyle='', marker='o', color='red')\n", - "plt.gcf().autofmt_xdate()\n", - "plt.xlabel('week')\n", - "plt.ylabel('move')\n", - "plt.title('Weekly sales of store {} brand {} \\n missing values are filled with zero'.format(sample_store, sample_brand))\n", - "plt.grid(True)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Weekly sales of all brands in store 2.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Plot sales of all brands in a sample store\n", - "sample_store = 2\n", - "brand_list = sales.loc[(sales['store'] == sample_store), 'brand'].unique()\n", - "fig, axes = plt.subplots(nrows=3, ncols=4, figsize=(15,15))\n", - "print('Weekly sales of all brands in store {}.'.format(sample_store))\n", - "\n", - "brand_num = 0\n", - "for row in axes:\n", - " for col in row:\n", - " if brand_num < len(brand_list):\n", - " brand = brand_list[brand_num]\n", - " sales_sub = sales.loc[(sales['store'] == sample_store) & (sales['brand'] == brand)]\n", - " col.plot(sales_sub['week'], sales_sub['move'])\n", - " col.set_ylim(0, 150000)\n", - " col.set_title('brand {}'.format(brand))\n", - " col.set_xlabel('week')\n", - " col.set_ylabel('move')\n", - " brand_num += 1\n", - " else:\n", - " col.axis('off')\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Impact of demographics, brand, and store\n", - "\n", - "In this section, we plot the boxplot of the sales across different stores, brands and different values of the demographics variables. There are variations of the sales observed across these variables. We also observed through our modeling experience that once we included the store and brand variables, the contribution of the demographic variables seems to be limited. However, submitters are encouraged to make the decision of whether to include these variables or not according their own judgement." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Correlation between unit sales and each demographic feature:\n", - "AGE60 0.047409\n", - "EDUC -0.026599\n", - "ETHNIC 0.074581\n", - "INCOME -0.050484\n", - "HHLARGE 0.000940\n", - "WORKWOM -0.063461\n", - "HVAL150 -0.026362\n", - "SSTRDIST 0.032859\n", - "SSTRVOL -0.027255\n", - "CPDIST5 0.006355\n", - "CPWVOL5 -0.078144\n", - "dtype: float64\n", - "\n", - "Correlation between log-scale sales and each demographic feature:\n", - "AGE60 0.034674\n", - "EDUC -0.012200\n", - "ETHNIC 0.044293\n", - "INCOME -0.023183\n", - "HHLARGE -0.026629\n", - "WORKWOM -0.023059\n", - "HVAL150 -0.002460\n", - "SSTRDIST -0.006033\n", - "SSTRVOL -0.071799\n", - "CPDIST5 0.026050\n", - "CPWVOL5 -0.059456\n", - "dtype: float64\n" - ] - } - ], - "source": [ - "print('Correlation between unit sales and each demographic feature:')\n", - "print(sales[storedemo.columns[1:]].corrwith(sales['move']))\n", - "print('\\nCorrelation between log-scale sales and each demographic feature:')\n", - "print(sales[storedemo.columns[1:]].corrwith(sales['logmove']))" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEECAYAAADUGGjBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsvXt4HNV9N/45s7valVZ3JMsX2VqH4ESsRQq4bWrTBIMtJylV3IRLhNOQYuJaIOd9Agk2KG2Tt4EEJ+6vxHnBBDCxA1Ib0lxcA8EYhVAgcX4QGhvHTeK8sYwRBvki26yt637fP1ZnfObsmZ2ZvWh35fN5nnmkmZ055zvn8r2fM4yIoKGhoaGh4QZGvgnQ0NDQ0CgeaKGhoaGhoeEaWmhoaGhoaLiGFhoaGhoaGq6hhYaGhoaGhmtooaGhoaGh4RpaaGhMGhhjBxhjS/JNRy7AGLucMXYo33RoaOQaWmhoaBQYGGPfYYyNMMbeEY5fM8b+UjiPMcZIumcOY+w5xthNUnkWgTZxzxBjbLZwbQlj7IBwbhHwjLEZjLGHGWNvMsZOMcb+hzH2ZcZYOMfNoVFg0EJDQ6MwsZ6IyoXjfUT0X/wcQHTivmrhnoMeyo8B+Ac3NzLGagH8HEApgL8gogoASwFUAzjfQ50aUwBaaGjkBYyxIGPsXxlj/RPHvzLGgsLvt09otf2MsZsmtOp3T/z2HcbYfYyxpyY07BcZY9Mnyjg+oQVfLJTVPKFdDzLG9jLG2iauv58xdpgx5hPu/RvG2O6J/w3G2DrG2B8YY0cZY9+bYKCp3utOxtiRCU19xcS1P2WMvcUY8wv3fZwx9t/Zas808E0A7bxNHXArgFMAPklEBwCAiF4nov9FRLtzSKNGAUILDY18oQvA+wH8CYD3AfgzAF8EAMbYh5BgVEsAvBvABxXPXztxfx2AYSQ04V9NnH8fwL9MlBUA8J8AdgCYBmANgMcYY+8hol8goXFfIZR7PYDuif8/C2D5RP0zARwH8H9SvNP0ifpnAbgBwLcn6vn/ARxFQjvn+CSA76YoK9d4A8CDAL7k4t4lAH5ARPGcUqRRFNBCQyNfWAHgfxPR20Q0AODLAP524rdrATxCRHuJ6PTEbzJ+SESvENEQgB8CGCKirUQ0DuDfAXBL4/0AygF8jYhGiKgXwHYA7RO/9/D/GWMVAD4ycQ0A/h5AFxEdIqJhJBjs1aLFoMA/ENEwEf0MwBMT7wIAW5AQFNzdswxnhZMKn5+wjPixJcW9Mr4pPjvxvip8FcBfM8aiNr9znAfgTQ/1a0xhaKGhkS/MBNAnnPdNXOO/vS78Jv7P8Zbw/xnFeblYlqQl9yFhDQAJxv2xCdfYxwD8iog4XU0Afigw330AxgE02LzTcSKK2bzTo0gw6HIkBMl/EVEqRvwNIqoWjhtS3Cvjs+KzAK5S3TQhrL8F4H87lHcUwAwP9WtMYWihoZEv9CPBlDnmTFwDElpto/DbbKSPfgCzGWPiWJ+DhHsGRPQbJJj7h2F1TQEJYfVhiXmHiOgNm7pqpGwi850mnvk5gL9BwqLKp2tKxNcBLAZwaYp7dgL4G6kNNc5R6EGgkS/0APgiY6yeMVYH4B+R0MYB4HsA/m4igF028Vu62IVE3OJ2xliAMXY5gL8G8G/CPd1IxC8+AOBx4fomAHcxxpoAYILWjzrU92XGWAlj7C+R0PDF8rYCuB1ACxIutbyDiAYBbECCLjv8C4BKAFuEtpjFGPsXxthFk0CmRgFBCw2NfOErAF4GsBvAHiSC2F8BACJ6Consnp8C2I+Ehg4kAt6eQEQjANqQsCSOALgPwKeI6H+E23oAXA6gl4iOCNfvBbANwA7G2CkAvwDw5ymqO4xEsLwfwGMAVkv1/BATLi/JjaXC7dIajCMO92eCe5FwuylBRMcALAQwCmDXRFs8C+AEEv2jcQ6B6Y8waRQ6GGPNAF4DECSisXzTkwkYY38A8PdEtDPftGhopANtaWgUJCbWS5QwxmoA3APgP6eAwPg4AALQm29aNDTShRYaGoWKvwcwAOAPSLhOOvJLTmZgjD0H4H4At+j1DhrFDO2e0tDQ0NBwDW1paGhoaGi4hhYaGhoaGhqukWo7hIJBXV0dRSKRfJOhoaGhMWXxyiuvHCGieqf7ikJoRCIRvPzyy/kmQ0NDQ2PKgjHW53yXdk9paGhoaHiAFhoaGhoaGq6hhYaGhoaGhmtooaGhoaGh4RpaaGhoaGhouIYWGhoaGhrnGHp6ejB//nz4fD7Mnz8fPT09zg9NoChSbjU0NDQ0soOenh50dXXh4YcfxmWXXYYXXngBK1euBIBaN89rS0NDQ0PjHMJdd92F66+/HmvWrEEoFMKaNWtw/fXXAy4/6astDQ0NDY1zCL/5zW8Qi8WwefNm09K48cYbASDk5nktNDQ0NDTOIZSUlGDRokVYs2YN9u3bh+bmZixatAgHDhxwteV5UWyNvmDBAtLbiGhoaGhkDsYYDMNAfX093n77bUybNg0DAwOIx+MgIub0vI5paGhoaJxD8Pv9KC0tRWlpKRhj5v9IfFXSEVpoaGhoaJxDGBsbQ0VFBTZv3oyhoSFs3rwZFRUVAOBoZQBaaGhoaGhMeYjrMgDgz/7szyzZU5/+9Kddl6WFhoZGDsEnJmPMnKAaGpMJvi5j48aNGBoaQn19PbZv347ly5djaGgIGzduxHe+8x0AGHVVIBEV/HHppZeShkaxobOzk/x+P23YsIFisRht2LCB/H4/dXZ25ps0jXMI0WiUent7zfPu7m4qKSkhJGIYBIBKS0sJwP8lF/xYWxoaGjnCgw8+iOuuu870GW/evBnXXXcdHnzwwXyTloRMtpXQKGzs27cPl112mXn+0ksvYWxsDEAik6qhoQHDw8MAEHZVoBvJku9DWxoaxQgA1NTURL29vTQyMkK9vb3U1NREiWmXP3R3d1M0GiXDMCgajVJnZyfNnTvXQufcuXOpu7s7r3RqpA+xj4PBIC1fvtw8Z4zRlVdeSdFo1Lx/w4YNBCBOLvhx3gWCm0MLDY1iBGOMOjo6LNc6OjqIMZYnihLMRBYQgUCAurq6LPf19vZamIpG8UDu4+XLlxMAqqqqIsaY6ZKqra01FYfNmzdzZUYLDQ2NfAGAMqaRT0tD9m8TERmGQRdeeKHl2sjICBmGMZmkaWQJch83NjZSOBymQCBAhmGYQoNbHZFIhMLhsGtLQ8c0JhH58BtrX3X+EI1GcdVVV+HOO+9EOBzGnXfeiauuugrRaDRvNMn+bQB473vfi3379lmuvfDCC2hubp5M0jSyBLmPDx06hMcffxzj4+MYHx9HOJwIXcTjcRw/fhwf/vCHEYvFAJeL+/JuRbg5poKl0d3dTfX19RSJRMgwDIpEIlRfX59Tv7HKFaF91ZOHfPS5E1SWRldXF/l8voKis5ggx4gmo91S1Sn3MQBav3696W4EQO9///tNiyMYDFJbW5t2TxUaGhsbacaMGRYGPmPGDGpsbMxZnSoGoX3VkwdRaHA3QL6ZsYqmiooKKi0tpUAgQAAoEAhQZWVl3oVGPpixG4h0NTY2Un19/aQqZk7KiKws1tfXE2OM6uvrTfdUWVmZhffs2LFDC41CAwDasWOH5ZrQUTmBYRi0detWy8TbunWr9lVPEgpRaKsYjmEYVFpaarlWVVWVU4XGDZ0VFRUWQVZRUTHpgsMp0ywSidD06dMtdOW6j1UKaFlZmcVyaG1tNemura0lxhg1NDQQADMYXlFRYSoO1dXVBGCEtNAoHORDaOTDutE4i0IU2ipBBoB8Pp9lnEyfPj3nAftUloTM6BoaGogxRrW1tTmlSabPKdPMMAzasWOHRUjkOolA5iWdnZ3k8/kIgJlwwYWFKuWWt63P5yPDMGj69OncAnmLtNAoHDQ2NtL06dOTJmYuGXg+6tQ4i0Jsf5Ug4xqqeK29vT2nQkPFkOvr66mxsdHiQhF/r6mpcaSps7OTgsGgqXFnsvreTaZZNBqldevWmdlI0WiUurq6cmppyEIjGAzSFVdcYdLQ2NhI5eXlFAgETAFWV1dntm0wGKRIJGL2O2OMFixYQADO0LksNArNH5oP/3YharpTDanGWSFaeo2NjVRdXW0Zh5x5iKnBXHPNFVRbW8yYMYMikQiNjIwQAKqurra051e/+tWUNGVj2xaxPwHQ1q1bLb9feOGFFgHLtfmGhgbXdba2tpouIsYYtba2uqaPKFkZ4eVwy4HHpHhbNTY2Um1traVtRTcVt+LO6ZhGoWYNZVMLcoNC9Kmni3SUgFwrDk6KgGEY1NHRYenzjo6OvArt2tpa0x0l/gVgiWmEw2Hy+/05o8MwDBoZGTHPo9GomcHDj0AgYDI6N5ZGMBikDRs2WK5t2LCBgsGgK5rkeE8gEKCqqirLuOEL5bhLh6+7ERfKLV++nILBoHLctba2EgDq6OigwcFB6ujoIACeBEd3dzffK8pydHV1mZZFeXm5RWhUVVWZloj8nHidzlWhUYjMMh+CLN2Uz0K00ry23WS0t5P7KVeWRib9I2qlstCQg865XLmuSgv1+Xymxi4yRR7b4Jp9qnfbvHmzpW2Elc6OkPurq6vLosFz5aCsrMz8HxOb/fn9ftM1VFFRYTJiec5lY5eAzs5OORZBAGjRokUUi8Vo+vTpouVAjDGqrq6mQCBgWREOgAYGBizCmqaK0Jg7d66nSSJrMUREW7dutfgdvTLOzs7OjBhpPgRZd3c3VVZWekqlLEQrTdTeuMbOA3upnsl1ezslN+QippFp//CsGfF5zkjEcSKnZGYb8nsAoFAoZPrdGxsbkwSaU/aU3++ncDictsUEgO644w5LOi3PShJdeW1tbeY9fr/ftDbEo66uTqkoAKCHHnrIwkseeughi2Bzcl8Fg0FasWKFxY0mZk8BMGkaGRmhQCBA4XDYEi/ic4n/zxMOaKoIjZKSEk+TRAxGiZ3PJa1K406Ve93V1UV+v980/9JhpPmIL6TDtOS2m4zAnhO4tif73FNpZyrFIdtZLU5CIxfuqUz7hzMYVUxjsjOV5PgBY8zSxyITdOP7n9gKw3Rj8b/hcNg1DVVVVZZ0WtklxhVPfk8oFDJpHBwcNP8X6xTHhEpoc8uE6Kz7Sn4H8d0BmIFuWViJLi+3B69jSgmNefPmWTp6+fLlpiRWxQbkgBj35y1fvlzJPGWtR869jkajtGHDBsvE9Kq1cr9itnPhU7kqnJiaCowxZVaLaKVlanV5RTomfTrWiVeogsrV1dUW91Q2LA2ZsdXV1VnK5PW7AWcO3LXBU2vlmAZ3D01mH/OdV7kbSvS3c3pTxQG5q0i0mPh7qCC7b1WxgerqaoulwjV40T0lHxNrHsy2u+SSS5Lu4fXxv1zIcItLHFNcMInvKQpYkXbGmCmE+Dn/X/6GhmyVTCmhcckll5gNxgUCANtsBVkbA0Dt7e0WhiEyT9mVYRgGtbW1WRp81apVFg3Rq9bKc6Plycr9paqJ6eS7dnJVqITGHXfckZIZyMHE7u5uqq2tNdP3smF1eQWfpDKjTCX8uMYmT06vmSqpIPuWZcbmJFTcQA62cwYjtreXYC9vB1VMQ6yTM+1c9rEsDA3DsGWEkUiEysvLU7qagMR2GSLWr19vO07k/lEx1FAoZBHI/LrYbiKdcjlcaJWWllIsFkup8YuuI1GAcyEgtpUdDfzgypKYLSULEdVBU0VoTJ8+3XEveHHSyK4JAPTkk09amLzsRhBdR7weLpg4MxDNda+WRipJr5qYbnzXTn57VWDP5/NZ/K1ymXyCilYXd1fwOlesWGHJDknHfeUlmCv7cEUa7MAnFFcw+F+fz+eJzlRwsmYYY1RXV2dhAHV1dZ6CnrK1wl11ch96sTTsAuGceXIfuMhssx0PUln3sruF08LbTkwjtXs3L5YGAEvbcotaZMq8D3lbi0xdZMCMsaQAvnhw3sEYo4ULF5pjl698Fxk8Y8yilHG+IcZ/RCGjEjwlJSWmgLW7d0oLDeBsDjlvANGy4Nc5ZGYq5ynLwSmZucqDpauryxQm6WpevFPkVD27iekmkOvkt5e3YuCTKtWWByorra2tzRQSAEzGl457hNPlZc0K1+hFn7s8BmQhBCTcBKLQ5W6DbIHv5yPv48THKGOMFi1a5EnYyQCs1qK48C4doR0MBmnRokUWQWensYpKUrbjQfL45quaefYUp0F0KYtppCp4jWkAVsuEewO4srhhwwZL9hQfV5WVlUkurVSWgxwo522vWlMhPmsYhiXeIM5JvsGkm7iKWLf4Oz94u+ZdaADYDOBtAK8J174O4H8A7AbwQwDVbsqqrq62RPuj0WhKS0PWYjjT5xt2yUxKtVhGnkizZs2yTFSvpjovhzM+eXDJgXE3gVwnwaLy2dbV1Vlol8tUCRpR8+FZLKKLxYt7hMi7r99pHyKVVQaALr/8cks5N910U1aFht/vp9ra2qRxxvtOZh5cGfFCgyw0uru7TdemnQLjFOeSF8DZMT2R2Wbb0pCte3GnVTfMWDUHVdlTIoNWtUVDQ4Nl3vMsJH4/X+0tPsOFhpjhJNJ33nnnmc+IfETlduPtLFoFdodsabg5ZGtIbltxq5ZCEBofAHCJJDRaAfgn/r8HwD1uyvL7/WYniUGeVCswvaTMygNYlsxiNkKmQkOl1akYpxtLw8mFJZfhJqAvavXiIOMaH/fbck2aC2AvlobMCIlSB+id3ECqtuJtKzJH/i7pQl6cKTIQrjVypkNESWOJ970XjV211oMHZ1Vj0WlMqFx9okLDGDM131SCKVPI78Xbzw0jVCl+RGQqlHZtrlIW5ZiGnGosxwB9Pp9FURC1fJkZqxi0LGA4fdyq8/v9lnYQ/xcV50wPMY4UjUbpgx/8YP6FRqIPERGFhvTb3wB4zE058mZqco6xm5XVqbQvmemIkygWi9GKFSuUA9ZLFlGqDlS5zNzu8pnqvWRhyFOJRdeSuN9PNBolv99vcV8AoAsuuMCcBH6/35JZk05wF7Dmw0ejUYuWqdIIZfcUn3x88MvbPYhmvXikm0aqCnrzfhGZDmciMsNIV3CpFmhyS89uLKdKyeWKlziuZKYUDAZp5syZ5vVsZU+JY9Xv91vSW3m7OQVqRWYqM3j+LF9tzd1VqeaY2LZynMcupiHGTewOlYBwy8jF/0Ulk7+X6O4aHBxMGRAXj5qaGqV7SjyowIXGfwL4pJty/H6/RWiIS+LtrAhxgYw4uVUah2qhETcZxedFRllWVpa0M2gqN4E4mFSDRXZPyRq/yo/vBCctVfUtAE4j19DFVae8TDk+5DWNtLa21rLuggvliooK2ywwnoZoGIYZU+HMQA6i8liDaiKnu3WLyvUhjw2xP/k4CgaDFqvgE5/4hCehQWS1cLjQthvLTsH3VNuIyFtbAKCmtduJyF0mn5dMP+6S8sJUZQEs74/lwAyJKNmiFenmQkYW+GLGHVe63MQ0xPHA54ff77dkNnV1dSmfEV3p/JrYXm6tMq+Ci1zwY5Zo69yAMRYBsJ2I5kvXuwAsAPAxsiGAMbYKwCoA8Pv9l46NjZm/+f1+jI2N4ZlnnsGWLVvw2GOPobKyEqdOncK0adMwMDCA8fFxMMYgFh8IBDA2NoZp06YhFoshFArh8ccfBwDce++9eOKJJzA6OgoACIVCGBoaEukBEeGZZ57Bnj178IUvfAHj4+OIRCI4ePAg5syZg8suuwwvvPACHnnkETz77LN4+OGH8YUvfAEtLS1YunSppRwRP/3pTwEAr776Kr75zW/ikUceQWtrK2666SZce+215n3f+9738NBDD2HHjh3mtWeffRaPPvqoScMnP/lJXHnllQCAa6+9FqdPn0ZFRQXefvttTJs2DcePH8fY2Bi34HDddddh5cqVZnmLFy9GIBDArFmzcPDgQdTW1mJwcNBs79bWVlRWVqKkpARHjx7FnDlz0N7ejnvuuQfPPvus/WAQcO211+LkyZMYHx8H79dAIIDq6mp873vfS2qLxYsXAwBqampw4sQJAIlPVQKAYRjw+XwYHR1FKBRCT08Pvv71r+Oll14CYwwNDQ3mu586dQplZWVmHV6wePFihMNhlJeXm+W99dZbAICKigrEYjFRIcIzzzxj9rlhJL6qzNt/eHjY7HMnyOPo6quvxsmTJy3j/dSpUygtLcXjjz+OJUuWoKysDF/+8pfR0tKCPXv24J/+6Z9w+vRp7Ny5E1dccQUAYPXq1Whra8O2bdtw//3329bftHY7/jbwC3zrW99CKBQy3/3kyZMIh8M4evQoamtrMTY2hn/8x3806/z617+OlStXmmPx7/7u78z5cfDgQQCJPqypqUF3dzc+/OEPu+4LwzAwZ84c1NTU4NVXXzXbko+TVHPs5Zdfxhe+8AVl+y9ZsgSGYSAej2N8fBxAgtcQEXbu3AkAuOaaa3DkyBFzXKXinzIdTz31lOU9GWMAYN4j/s5/E8dZR0cH2traUrYVp5//FcehGxARc3PTpFoaAG4A8HMAZR7KMd0NXLqL7pLy8nKL5osJqSlmXPFD9b0AWQvicZOZM2dSX1+f+aycRQEgydIQU1Nll5doucgmpex+woRGJULOEnPyX6cykVVbJovvpdI6ebsvWLDA1v3hBnLWEYCkVFQxQC/2u+o9ACQFPPnvIjL5fgmQsD5lq0ysG7AmTMhtz99BDDA7aehyPIfXJ1t6/L0AKJMMxN9vv/12ZUxDdTSt3Z7k+6+rqzPHjmoxLFFyrExO5RaTAsR2kpMIVIeY2ST2p2peqea9aBXL3oBAIGDR4nm6q/gePBU4FY3ifBEXKqY6xDiDyBdU48xNvXLb2tUZjUbp85//PH/PwnJPAfgQgN8AqPdYTtLmXGKDVFZWKhfgiI0sf9nqL/7iL8zBoEoztQtwyRknIlasWGEJgIl+dpluOZ9bdj/Z7djp9/stGSfiB2GIEt97FtNjnQ6ZAXH65KwLPsDElFIgIQid3D4yY5TjJvLEkgPd/LqYGii2PwD6yle+Ysng4r+L9cqZME50im5PXp7KreP14HEVNxtK8pRPWQESx7u4gA04myLN21L4/jMBMNcJpGJEvM+b1m4nPv/ENRWyK2fdunUWISHv9cYztsT+savbye+eaqW0SJPMMFVZd6oV4arnRVeRap2G3SHHVfj/F198MQ0MDCjbXDxU7sNU9fX391vOnfgAx6pVq/h5/oQGgB4AbwIYBXAIwEoA+wG8DuC/J45NbspqaGhI0gbEBuF+Y3nwqCwNIGmvFaXmm+oQpb+8PxUfHOI2IW5TCBctWmQKHdUKcp7ZIvqFI5FIUmyGB7qd6hTpkrVnFc2iFSYOas707RixKh1WnASNjY0WhiFvF81/U20Mx9+zvLzcwkg5Q5KDmm7plFe+yxNbxWTEQ5zc/BlRi+VWsryWRN4FlzHrFiri+OPMU8zzl+NF8loDThMXwKIgVmm6XGiI6xkYYxahwdca8Pbv7rZ+G4P3uRg/c5pjqQ4xxicyPjfzVtywU7SgVH0oCzVx3qvGopdDZamoeJVIl0gPX6nuVjl0eYy74u1ehUE+jlmzZlkGhqwBiAxEZEp2GTTy1gl+v59qampcDWg5r1nU+rn2zJk+D2Q7bR+gEjp8W2a5btGykFdni+mUTpNIDkZywcXrlDVp0VUkPsOTAsTJK8IuHbasrMxsO7FNOR3iIjh+v7himbeVGMC062/xsFvopUpPFtuWMwpx00teJhd+KkEi/q2rq7P0JZDIxBHdg6p1ATywLTMJ3m6iMBT3OOOuJDEDKBWTUVlRXGjYLWhTrU9Ruat41pfMiEOhUJJ27OYQ3aRiW8k8QeYNonuKjys3riY5KJ2LQ0W3WzdYpseE5+P/uuHHeRcIroiENc2SN7BqInrtWD547NLo7DSQefPmEXDW0mCMWTRTbmmIZXCtTDZ/OZPi+13xyR8Ohy3bKAAJnzkHz7AS6xBdRaneO9UunowxiwAVhQRwlqnw9k61VQNnJCI4DWIdc+bMsZQhxm84Dbx/RKbGmYHoTnRjLRKl/kobfzfRahOtDHGcifWJmzs6tT9/VkzplL/NLWdtqdxiJSUlJiM0jORFc+vWrbMIfS9H09rtlm9Ki7+J2W7yWO/o6LC4+pYsWUJAsvXvxs03MDCQ1N6qbEKnclSuOhVNqkPmLW4UFHkcpmNhiRZNTU2NqxhFKhqSDnY2lgbgZVf8ONsMPheH6mUrKirMyasKgsoBLbtDZJSquImqU8T7RG15xYoVFmbZ3t5u0Q7t9p6KxWKWOAK/nzNjOcVP1NbkScf393djtorfAhAZYVNTk+Ng4xuwifEdVTBXtW7A5/Mp6RYn97x58yyLCPmkMYyzWyvw38U6eYooL8sujVTeykT+ShvfxpxrssFgkC6++GJLnXZ94GayyrEzznxramosrlbZ3ZSKQfH2ljff3LFjh6316TRORKEhzw8xMUS0kGS3j7j4UVb8VB8GcmKGfD7Iu0Snel61ToaPNTfps7LQSCem5cTQVfEKUTilY3W46V+h/aaO0OCDS/XSqq0Z+HU3GgS/X9zj3qkjAoGAZcM+3jHiltU8z5ozBDcdLO4nI09McWBz5snvWbBgAY2MjJifouSTxGkwiUG6dDQpu4klBnNV323m99slG3ChOHfuXOVGcrwPVGtDZKGhWsTGM4LE4K68mSPXrLnlKLat7KJUHU4By1RtJ8ZmDMOgJUuWKBmrLAyJnLf55/eWl5cnfbUtVUyDB7p5LIaPHdHS4MqK6HKU28qtVu80dlULQlM9w+kUv13B63IrAMT3kD0fbg43cUa5HcQ63Si1Xo8pKzTExX1yo4kdLg6eSy65xLWbAoBlQZSXRhc1VdE/LacCy4PBTuvgAkC+Lg4eMWDP/ftECS3ziiuuUA7AVIcqldjNoFb9LmuAKkvDDU2y1SVaaYFAwLLyOpWlYTdRgNTbxgeDQTOpQPX+2fY18/eQ05fFD4jJ93NBI1qL0WiUWlpaLHSXlpYmKUR83ojlphIa8v5XfPNHOW4i1svPRWVEFIbptpUc8/MSbxAzruS2cOof8dsjuTzsxpnA3Om9731v0nukc0xZoSEHwsVDlVbn1FBy6qbq84npHmLAsaKiwlOeCdaOAAAgAElEQVSWhWrS8kO1K67qfbmW7nUwyUkEqsOpTD55xW1GgOQtPvj9Km1Nzi/nOf129cnrU7wIDXkrEy40iM5+j4O7t0SXmNjOgP1+Yk5tpRqr8q4CXKO3S7eUlSauSVdVVZmMjgfKxXElbsnCr4lWGb9XZZXJloW8JQgA8/Oicp+L96Qz17iw5B4GcQy4LYNvjy/PO6cj10FpN0qZ13HmdExZocHdNk6Wg9OunaqJ1rR2e5ILxel50a0ib8PMO1dOp3QaDPJmdzKtqowtu/Zwk4ona/Ly5Fa1t/weqTJp+Lkqk4bfr2obOdgu3s8Yo4GBAUvaLwdfTOZWaNilNPMsJDtFwufzJY0zuw8HOfV5NBqladOmJa4x9eI+wLquwq4feXurFo2KKemp6Gpra0tyWaniP/L+V/xZsa3ENTiiFSDe8573vCettFH5fnlcqY7+/n5auHChbRlu6szU0si2aykbx5QVGl46xa37Q240cX8fL4eofYmmr2q7dbeH0/1u4g1uhJ9cpxdtza79RdcRkX3Ovt17yNq0nVba1NRk1kF0dgW5V6Gh8rvz44orrrAwucsvv9xSZyZtJWcd2e3xBCSUFC9JHfyQ34vorAXl9lDRJe9Zxuvi7ihRMMk0yO1cWlrqKGC5EBdjcADowgsvVC7o9HqEQiFXDF3sg3TmYKZWgd0uDU7jzE3/Tkmh4SY+IWs1blxDvNHkDQ7dHqLQkLOjGhsbXZep8i3zAS3+BTJbjZzLQ35Xzvj4IM8kpsHfm1txch08FuA2ewqwBnflD/DwevmW8LloL5GByhq97Kd3w9T4e/OxxMeluKBQbldVuWJ8TmQqHKodFMT+Ea/x9+BWtJ071c17if3Dha3bQ7bM3STIpMMPsn3Y9TtXmvhYFtvHzfPiuJuyQsONpiVrNW4mWtPa7ab2JWcluTnE1bkyLQBsP/8oH7Jvmv9VMRDVRLPT0FO1lVjOnM//yNHSEAeoXZni9ws40xLbQKzTTluzCz5XVVURY6m3YJGFhvy5V/E9xOBuMBgUt1JwvV+Q3eHG0uPv1tLSYsYO5F2J+b2qLVRkRij2eWVlpXJbfxUdXINPjDFrBpzK0uD0uE0cYezsCnKxDLfxPnnhpNOYcXOIY0R1OCXdLFy40MWiROeUWqdDtV+davElkF7MZcoKDXELci8DxS6lU2403uDpNLo8mQOBgOPKW9WAV60WBtQZKG4mq9Ok4IdZDnO3eZ2XthFTVTkTcxNzsutjO01KzNhy655SuQ+nTZtmBm8ZY0pGDYD279+f1upgVZ+1tLQQEdlmdGXaPk71i0c0Gk2KrXALSP6aI4CkLVZUh9jn4oJJ8R4vzLSqqipJIMvzw83h1LYyjemM3WwfcpIIoJ6TshsvVXlTVmgAuctc8MoInTpB3KIg08HBXTGyW8dNwN5N8F1cte4l6wg4uzrVjlFxVwVjjNrb28kwzn6tTizDqS04o7Orh4PvYMvfw06L9fv9yuAucHZlNaf74osvtmxl4uVw6h/Z7eMkNLxq0um4VjgdMl12K8JTJWOI41C0mGTlj1ukbugrLS21WCp/+Zd/mXZMQ1Vntq2ZyTia1m43+Y4oVExLmRm2VrNomXsRGomN/osA4vc07DA4OIiOjo606ygvL/f8DGNnt58///zz0d/fb577fD4AwMjIiOcyA4EA4vE4xsbG8NZbb+H88883f1+3bh3C4XDKMkpKSlzX19jY6Ik+AAgGg0nfC4jFYpg+fbp5fXx8HESEU6dOgYjAGEMoFDLv/4//+A/HthkaGlJ+H4HD5/Nh/vz56O3ttVzfunWr2f7ivVu3bgUAtLe3495770U4HAZjDOFwGCMjI/jrv/5rHDt2DESEV199FS0tLeY3VkSI/a6CU/+o0NjYiE996lP46U9/itHRUdff3OAYGRkxv91h117pgLeHjHg87lhPKBTCmjVrzPMbb7zRMgbi8bjlXIWmtdvNb6Ns3LjR/M7Nq6++6nlucajmB/9Giwzepk59Lt/TtHZ7WrR5xdKlS3Ho0CGsXr0ajZ/9N6xevRrHjh1Da2srmm7fhqNHj6KzsxPBYBBAYu52dnZi48aN6VWYbyvCzQGXUtfLIh8IktrL/fKhygYRtUz53OngJn9vb69S83G7wZrTIa/e9mpp2LV/Y2Ojkr4VK1a4MvFV6ZRO7yJ+Z1nUnLgfXuVykRGNRmnBggUWbXL69OlZ/S6z2PYqjV6V2mrXLqnajrta5WfcBH/tLCDeHl7LzMai0aa12y3Bd/E3/glTLxlF8iFu+Kka6yq3kBfXN+A2BuL9UCXyMMbMHaJV/Wl3jqlmabhBPB7HgQMHzHM3mkGmYIzBMAxUVVUBAM6cOWPRMkdGRpy1TpbohnA4bH7pDACqq6sBJDQWosSX9k6fPo3zzjvP1H7s4PQ7EeHAgQO499570d7enpo+l4jH4+jv71dq5j/4wQ8QDoexfv16xzJEyGWp3mtCscDw8LDlent7O1577TU03b4Nr732WtJ7rlmzBqFQCIwx7N27F7/+9a/h9/sBJKySt956C8PDw5jz+R+lpNkrOL0y2tvbcd111+HNN98EEeHNN98EkBhjdlqwqtyxsTGMjo6az/B5kI4l7QSnsU1EFuu7pqYGhmGY7QwkLBkndHV1obu7Gxs3bsScz/8IXV1dAIDjx4+juro65dcHVRDH0fDwMOLxeNL4Ed9B/AvA8lVPFVpaWsz/Kyoq8POf/xwzZ8603JNN/vT0008jHo+jae12xONxPP3001krW0bRCA3Z1eAGXlw06SIUCoGIUFNTg9LSUvO6YRhgjJmfjUyFptu3AUgMymXLlqGkpATLli1LGpjiJ2ydmIjT71wQZUtgAGc/NSmec5w5cwYAzE9XugXvQ5/Ph0gkktQmjDHMmTMH4XAYsVjMdblr1qzBfffdZwpmICGg/H4/GGOoq6szmcTBDR/zRDOQcJXKcBrDPT09+Pd//3fMmDEDjDHMmDEDgL2QkcGZHr9/YGDAcu62nFTly+PKjXJy/Phx8/z48eOm25VD7AM7tLe346677sKaNWtwcMPHsGXLFoRCIQQCAQAw/7qF27awY+wdHR227vCWlhbs3r3bPOfu2XRpKDQUjdBww3xlLFu2zJw4uYKoFc6dOxdAgiE/+uijKC8vdz2Ya2trcfr0aVOzHh0dxenTp1FbW2u57xOf+ATq6uocJ2s+IDMUeVKMjIwkxR6cwCft+Pg43n777ST/dzwexx//+Ed88Ytf9FTupk2bUFpaitLS0iThRkQ4cuSIeY0LdS+Q+21kZATPPPNMymduv/32tH30AJLapr6+3noDy2zMnDp1KumaGwtIFJYNDQ1mfMKrpi1ajkDCann66acxMjLiWbMWrQqu4DU0NCTdZ8fYN23ahOrqamzatMm8xhUxUWBMRRQe57GB2wEmMult27YlTxyPcApm8cE3PDyM3/zmN+b19vZ2PPDAA5g3b55lsjLG8JOf/CTpfexMY/n6k08+iVgslnMthdNn1+69vb2ODE6msaSkxGLZ8MCc2zJOnz5tYVKMMfh8PsydOxf//M//7FiWiLGxMZSXl2Pz5s1KV0NdXZ2n8mTIDDYYDOLGG2+0uGVkHDp0CKFQCJs3b8bw8DA2b97sqU7HMUHODD6j8m0gKnw9PT0YHh5GT0+PKeTEOcYFuJNSdOjQIdxwww2mi3HNmjXm3HfjlZCD8URkq2Cq5kK2rLdiRNEIjWnTprm6b2xsrGC0cFkzAhKD7EMf+lDSYIvFYhYNjP8VXS61tbU4ceIEDh065DhYM20Dp0mxbNmyJKYv19nX15f0nOi/thOUIkZGRkz/tYpGHsc6ffq054ylaDRqMh0RhmGgtLTUs8tDhEwLEeHEiROOWYC33XYbFi9ejEAggMWLF5vX3dDi2J5pWhqNjY0oKytLsva5hu4EkfYrrrgCJSUluP76602XpQiuFLixYO6991787ne/Qzwex+9+9ztTILvxSqgUBVWdPp/PLFcl8AOBAMrKylJmIE6Gm3wyURjc1QVEd0EqiH71yQiEu9WM3GDlypU4fPgw4vE4Dh8+jJUrVyrvc5N+nCvw9xwdHU0SKHJAs6mpKel5VZBchNxngUAAX/nKV85aKALjk9vea7v09vZi3759ScwiHo/j4MGDjrR6BfftpxJud911F+bOnQvDMEx3JwDMmzdPKYRFODGndNxsALB+/XqEw2FEIhEAZ/tHdsHZQWxfLkCOHj2KYDCY0vJKBcYYzpw5g5tuugmDg4O46aabcObMGTPm5+QhkNvKLj4RCoUwa9YsMMYwa9YsU1GKRCIAMzBr1izHBA87i3yyUnKzjaIRGm6Zsqhl8GwCjvLycjDG0s4iKSkpAWPMMuC4Kezz+TIWHD09PZg7d67pcunp6bH87ibLhMONppYObr75ZtMtJMIwjKSApkpoOwly+Xe+XoGvWeCMb9asWRZraNasWa4sF7d0ZKP9VEwxHA7jnXfeUd5fW1uLkydPmmtTRG147969SiHshGwoM+KaFgiumiNHjiQpDqp2Fe9JCBqG2tpajI6OYvXq1WnRREQIh8N46qmnUFNTg6eeegrhcNi1u0huF7sMrFgshqGhITPbkI8xLvjD4XBWMhDdWJLTp0+HYRiYPn16RnVliqIRGtlIF3znnXdARLaT1gkjIyMgIovmwIXU+Ph4SkZjx6REf2ksFsOJEydMVwZ3WRUSNm7ciFtuucXCDC+55BI0Nzcnaf6qCSw+p4ppyG3IM8lOnjxpcQEcPnwY3/jGNxCLxfCNb3wDhw8f9vQeRISysjLMmTNH2cY1NTWeyhPR2dmJprXbMTQ0ZFpkPEiaauyVlZWhsrLSdJc5LXqTIboyKyoqMDIygp07d2bkZuOQXa1EpJyTqj4X+zSRVUYYHBzEzTffbC4w6+zsVNZrdx0AFi9ebElEEd15TuA0iW0TDAaxaNEic1y2trYCAN5++20AZ8d1a2trylTudOBmnoteiHyiKIRGZWWlMoVRRiZWBAAsXLgQ/f39WLhwoetn3Ppg4/F40sAQ8+85kzp+/LglTVHFvNra2nKeFZYKfFVu09rtaGxsRH9/PzZu3OiqLUSXz9133+0qTZZnki1fvty8xhjDxo0bUV5ejo0bN6YlXOvr63HgwAGT0YnW0+DgIC644AJX5WRrpS1vR1GL9SK8KioqzP9PnTqFYDCI9vb2rLvZONJRvvi4GRoasrTTxo0bPa1a9vl82L59u+mSHBsbw/bt2y19yJl+KmuLt83sz30fd999N3bt2oXPfOYzABJrH1pbWy0WbWtra07WQKhcWFzRmD17tvIZu+u5RlEIjQsuuCDJ1WRnBqsGspOWz7Fr1y7MnDkTu3btslzPVmCdZ2nwwSAy1+PHj1tSdAOBAMrLyy057kBisuzevdt1YoAKbnzRXDC1tbWlvG/9+vUYHx/HjTfeCIAhEom4XlNz2223pfTv84WTnHE+8sgj5m9jY2M4evQoGGM4evRoWnGevr4+iwAWXZtEhN///veuyrFjhF7R3NyMxsZGvPbaa4jH49i7dy9uvvlmc42KGE9QQQ4AE1HSuhjOSGXYXZ9MiMqIU1vKQW/+V7RkZabPIbqUOV7//67GnXfeidWrV1vqzdaiObv5ZDcXxesHDx5MEhCzZ8/GwYMH06IlUxSF0FDBS6rbLbfc4nhdzNfn2TMc3I8vZ1EYhmFh8m5SSO1QUlICn89nWafh8/mSAnbj4+OmzzsVuGCSB2VtbS2OHj3qSA9PV962LXXwVPZ3h8NhfPe7300KRqqsuFRpvWVlZYjH4xgfH8exY8ewatUq0yphjKGxsRHvvPMO4vE43nnnHTQ2NqZlbezatSulAFZZh7lCV1cXVq5ciZ/+9KeY8/kfobe3F93d3ejo6LDEE+wwOjqKBQsWWK6JLhXgLCMV2z5d7Vm1wG2ygrtuU9RFps9RWVkJwzBQWVlpXsuG0E8Fu/l09OhRV3P04MGDFoUzXwIDKGKhYQeVH9iN6UtEFoYtCiXux5c1lNLSUvOZWbNmpZ0JAiQG+4kTJxCNRtHX14doNIoTJ04oJwf3bbrB0aNHLYPNjcDwCqftOgDgpZdewsyZM/HSSy+Z10Szf/bs2RZBc/nll5tbfIRCIRw6dMjyHI9piOdec+Z55k2q5/hv3Lcu35vK5+4V8qrnNWvW4K677sLGjRuTUrdVwisYDOLIkSMWP73KpZIt7fn+++9PawuPbMHn81mUNjcWbiAQsCgb2Yj3ZIrJmKPZxJQTGnZ7wqQyfVtbWzE0NGS6QWpqajA0NGQx2eXn+QruxCrSRPqfagW3F/BAL0+1lHO/J8OFYOeKy8RFFwgEEIlEwFjCfcUnairN6cknn7QI8SeffNL8LRqN4qqrrsKdd94JIMEsr7rqKkSjUdc0Mcbwxz/+Ee9+97uV7yZf8+pzTxduBDBwVnERFRWeUbRlyxazbXO5D1E2083Twfj4uMU95WZ9xujoqDlHeQaXhjdMOaEBWAOCbsBNdh5sHxwcdDTZv/Wtb6G8vHwiDZZw7NgxlJeX41vf+lYmpJvCScWMZNdCLvDoo48qXTKPPvpo2mWOjo6a6ZlHjhxxPVHtAutdXV349a9/jaeeegpzPv8jPPXUU/j1r39tuwhQhfnz5+PZZ59FX1+f0mpTXfPic881ZF8+kHCxZCubxw2qqqosm3XmA14WA3LwOI/XfdDSQXd3t6frxYApJTRm3fIo2tracOrUKcsuk27g1WSXtwmZN28eHnjggYwmLN8OQfybik6ObGp87e3teOyxxxJaOzMQjUbx2GOPpf1e3H3DExT430zcOnZuHC80Hj9+HIyxtNOv841C2MaCbz4oJ2tMJpy2u8k32tvb0d3dbZlP3d3dkybYc4GiFRo8tVZMsX3j/3wS27ZtS9plMldw60pwg9mzZ2P//v2oqqoyM2f279/vKq0uHW0rFbL5Xrly62RKI4+RpLN7cj6RznqGbIMxhmg0akn8iEajk8645S0+CrUvszmfCgFFKzRkzRUo7l0meVqdGCh2SqvLRfwhFygkt44IIkpr9+R8YrJiK6mwdOlS7N27FzfeeCMaP/tv6OjowN69e7F06dJJowFIKElifMKt0lQoK6uLFYXFXc5xeE2rU6UCM8Zw8803Twa5UwL5XiiZDvIthHlsbdOmTTj0zU9g06ZNOVv0Zgefz2fJNOIZSE7WBl/XE4/HzXU+Gt5QdELDbi1EJmskihWqVOBbbrmlYDT5QgdfKKn6joJGaqSKAbpdTJsJOjo6LN+OJ0p8g1616aCIVKn1Gu5QdELjkUceScqtDgQCltXC5xLyrXUWM8bHx3HmzJmcbe54rsLNYtpMIe+BNj4+rhWmSULOhAZjbDNj7G3G2GvCtVrG2DOMsd9P/PW8K1x7ezu2bNliyUbYsmVL0QeXNPKDyUi7PNcwWXEXUWEiIi0wJgm5tDS+A+BD0rV1AJ4logsAPDtx7hlTLRtBY/LhZjM7jfShLeCpi5zNGCJ6HoD8AYiPAtgy8f8WAMuhoWEDcYuIbMNuMzsRhZrCqZEZVBsWarjHZKtZDUT0JgBM/E1/q1aNKY9cT27VQsnp06cDLJGOWWzpuBruUAgLI4sZ6e+wl2MwxlYBWAUADQ0NeO655wDA/MvhdJ7OM4VYx1R9L7trwNl9xOT9xHLxHgsWLMDLL7+ciHEIW4ovWLAAA1mqo1j7Y6rUwWG3GLYQ3yNfbZcSRJSzA0AEwGvC+W8BzJj4fwaA37op59JLLyUioqa120mE03k6zxRiHVP1vezuaW1tJQBJR2tra07fo7W1lRhjBIAYY9Ta2pr1OtI913VkXodqTPGjEN9jsusE8DK54MeT7Z7aBuCGif9vAPDjSa5fowiQzW8+eK03G1uGaxQm7D5dkMknDc5F5DLltgfAzwG8hzF2iDG2EsDXACxljP0ewNKJcw2NJGgGrpFtbN26NSk+5vP5sHXr1jxRVJzIZfZUOxHNIKIAETUS0cNEdJSIriSiCyb+ytlVGhoaGjlBe3s7vvvd71rWeH33u9/VKfseoe0yDQ2Ncwbt7e1ob29HZN0TeO1rf5VvcooSri0NxlgTY2zJxP+ljDFvXzrS0NAoKrzvyzssfzU0AJdCgzH2GQDfB/DAxKVGAD/KFVEaGrmCZoTuceLMKA587a9w4oz+JKrGWbi1NG4BsAjASQAgot9DL8zTKDC4EQiaEWpoZAa3QmOYiEb4CWPMj0R+s4ZGwUALhMygrTANN3ArNH7GGLsTQCljbCmAxwH8Z+7I0tDQmGxooavhBm6FxjoAAwD2APh7AE8C+GKuiNLQmMrQGr176LYqPLgVGh8FsJWIriGiq4nowYll5xoaGh4ha/SaMdojH9aP7o/UcCs02gD8jjH2XcbYX03ENDSKFHpSFBa0W6iwUCz9kek85s9F1j3hqQxXQoOI/g7Au5GIZVwP4A+MsYe8k6nhtaPT7dhUKJZJoaFRLMiHIpapxcqf98oLXC/uI6JRAE8B+DcAryDhsprSyMVA8Mqw0+1YDY1iwFSxegvB5ehEQ7Zocru470OMse8A2A/gagAPIbG1+ZSG1sjPolgnd7HSfa4g23PsfV/egci6J8z/84VC4B0yDdmiya2l8WkkVoDPI6IbiOhJIhrLqOYcw83gKQSGUgg0uEEhTIJ0UKx0a6QHbZnnHm5jGp9AYpvzpYyxqxhjBb8a3M3gKQSGUgg0aNjDjVAvFsEvohhpnkoo5vZ36566BsAvAVwD4FoAuxhjV+eSsGJFrvyI2aTJ7vdsBtunCtwI9WIU/IVKcyHMl8lAoba/G7h1T30RwJ9OuKY+BeDPAPxD7sgqXuTKj5hNmux+90JnPiZ3sTCUYqEz28jGe+divhRjfxSyIudWaBhE9LZwftTDswWDYhw8hYp8TO5sZKhUNK9Dy5YWVDSvywmNKjqzQUMxjN1CUJBUyJSuyWh7uQ6VIlcoY8At4/8JY+xpxtinGWOfBvAEEum3RYVCHdQaCaSbjuylP0/t+xr23LAHp/al96XhdOqUJ3s6NBTC2C0UpjXZUCkr2c7QKiY3qNtA+BcAfBvARQDeB+DbRHR7LgkrRBTLpMkGncXyrsWAQpnsmSIbGrvMbL1aXYUwLs/1DC0vi/v+A8CXAPwzErve1uaKKBUKabAU+kDJhnukGEx6jewiU9edE1TM1snqkmkqljk4leE2e+rvGWNvAdgN4GUkVoS/nEvCZOjBkj1k6qJRwc4nq/vLO3JhKbopUx4XuRYibpCLsaqRGdxaGp8HECWiCBG9i4jmEtG7cklYPjAZ2rHXicjvz/fkdUIhCIlCYHLZQDbiJtnI4jtXGXY648jpmalkebsVGn8AcDqXhBQCvE6sdAJiXicivz/VM8U6ILNN97nK5AC9hXg2kc44cnqmEJSqbMGt0LgDwEuMsQcYY9/kRy4J84pcDGAn7SFfAbGp4goqVroLAZmO92xYZVOl/6aq8MsV3AqNBwD0AvgFEvEMfhQMcjGAC1VznSqTtRjghrlmyoDTeT7TMVCoYztTpOPOLdb5JI+byXLPuhUaY0R0KxE9QkRb+JFTyhxQqNrBVPGrZxv5sASzATfMNdMA8lRl4PlYfOnGnTtVII+byUpkcCs0fsoYW8UYm8EYq+VHVinxCLdppZPNwL0ygEIQMm7aKlM63WhzTnXIvxcqsy1UuiYbOvhuj0JReNKBW6FxPSbiGjjrmprUlFuvKBaNQ+7YfGjkqrbKB4N2qiMdGopx8ZjG1EcxC0e3K8LnKo6iS7ktBK3eCYUSmymEQZ0NBu70Hl6TCvI1hoph7BYq8tF2uagzH7EzFdwu7vuY4riyGL6rIaIQGKGGe0xGgNJrHfkaQ8UwdgtVsGXadum8Vy7c1Jm+R7bGkFv31EokPvG6YuJ4EMCtAF5kjP1tRhQUEApROyjUOr3GHzRyi2y1d2TdE6gqDaRVh9stQbI5LibDnZgP12whL+p1KzTiAJqJ6ONE9HEAFwIYBvDnANbmirhcYzL89qoyU03MXNU52XUUsmac6/bPB7LR3ge+9lcAgF//U2tO6shFnLFY02WdMBkx2XQFk1uhESGit4Tzt5H4XvgxAJPSW7nQXPOR6eQ0MdNBIWj1hUCDG+Si/bONbLRlsfSHRv6QrmByKzT+izG2nTF2A2PsBgDbADzPGAsDGPRKLGPsc4yxvYyx1xhjPYyxkNMzhaC5FgINQGGmnk5GZlOxQvWeqaydbPTnZIyJyeq/bFuG2VpNfy6MXRXcCo1bADwC4E8AXAxgC4BbiChGRIu9VMgYmwXgswAWENF8AD4An/BSRqGgWNaCqFAILppcMLZCeC8Z8nsWg7XjBpMhmHLRVm5cWm6Eer4VtXzBbcotAXgBia1EdgJ4fuJauvADKGWM+QGUAejPoCwA+dFai3XwTBWmJWOqvlc+MRlCuNAEvR5HqeE25fZaAL8EcDWAawHsYoxdnU6FRPQGgG8AOAjgTQAniMiznThZLppCGNCRdU8UBB2Z4FxxRRUqvLrIgMyZp5s+91qHmzLzNV8yyTwrJvhd3tcF4E+J6G0AYIzVI2FxfN9rhYyxGgAfBTAXiXjI44yxTxLRo9J9qwCsAoCGhgaEADz33HPAxN9T+76G73wojE//JGa5rvqb6rdUf3n5936wJKt1eHmO0/CdD4XTfg8vNGSzDqf+cnomMdHWoaIZeO45d+8v/+/l3bPRlum2f2TdEwgHsj+G+V+5/VVjW0VXJjSkmqNu/lddc5r3fJ64nbdu+8fpPide4YVfZbvv3dbhGkTkeADYI50b8jW3B4BrADwsnH8KwH2pnrn00kupae12IiJPf/lx0Zee9vwsh+r/VPdlq0y7+9N5D7kdMqEnW39zXaZdHdmmgf/vZZylotPpfv53/nfmm0cmdMvwQle2+sntu+1pOfQAACAASURBVLstO1O63T6fCZ3ZmifyuPMyDuU6ALxMLni420D4TxhjTzPGPs0Y+zSAJwA86V1EAUi4pd7PGCtjjDEAVwLYl2ZZtuDfuQC0b3Iqt0O23RDpuBHy0b6FkDGXKxS7K3ayII871TiU2zIbbes2EP4FAN8GcBGA9wH4NhGltaiPiHYh4db6FYA9EzR8O52y0kGhD8ip5PvMNdwyay997oYZF/oYKmbkSgDnI97gNE5yPY7cCJV04NbSABH9ByW+qfE5IvphJpUS0T8R0XuJaD4R/S0RDWdSnlsUqsYtDp5C0iDzMeizXaZTn3tlGLkQVG5RDMKqEGnM9Ur3dOp0M44KNQEmpdBgjJ1ijJ1UHKcYYycni8ipjEIVZNkY9NmuMxfIB8MolDKzjWKgsZAhCgjelge+9lcp3U35QEqhQUQVRFSpOCqIqHKyiCw25MKPWAgohPcotFRKjXMDk+1KSveeyYBr95RGAl5z2wulozNFIbxHPmgohPfWyC+m8hhIxwWmhYYHFNPg0dqxRi5QaOMqnSB2NgLfhRpv8AI7F5gTznmhUewdz6Hyh+ZbuE2Vts0G8rEdx2QkFeS7j/PxVcpzPZ2/qITGuTAJ0kE2BnA2NKdCFFyFgHTawmtf5MMtmu57FeMcywamynsXjdDQkyB3SNdMVZWhhUTmmKpteS5r6FPpvYtGaKiQb2Z9Lk+CbCHffVjMOFfb7lx970JB0QqNqeJaShdT4V3dLnDSKbbJKBZlZbIXa2rkHkUrNGScS4PpXHlXnWJb3NBtOTUxZYSGRuGjGDT4qQzd/hrZgBYaGpOCQtY6zwVmWsjtXwg4F8ZAtqCFhsY5Dc1MNfQY8AYtNAoQWuvR0NAoVGihUWDQWo+GhkYhQwsNDQ2Ncw7amk8fWmhoaGgUNTLdckXDG7TQ0NDQKFpoATD50EJDQ0NDQ8M1tNDQ0NDQ0HANLTQ0NDQ0NFxDC41JxJw5c8AYQ989V4Exhjlz5uSbJA0NDQ1P0EJjkjBnzhy8/vrrlmuvv/66FhwaGhpFBS00JglcYCxcuBD9/f1YuHCh5bqGhoZGMcCfbwLOJQSDQbz00kuYOXOmeT48PJxnqjQ0NDTcQ1sak4jh4WG0tbVhYGAAbW1tWmBoaGgUHbTQmGQcOXIEo6OjOHLkSL5J0dDQ0PAM7Z6aZIjuKQ2NfKC8vByxWAwAwO4BwuEw3vWud2HPnj3mtZaWFuzevTufZGoUKLSloaFxDoELjEgkgv379yMSiSAWi2HPnj0W1+mePXtw0UUX5ZtcjQKEFhpTHOedd55lbYjP57OcFytjWLZsGQzDQN89V8EwDCxbtizfJBUFYrEYDMPAgQMH8O53vxsHDhwwf9u2bRvq6+uxbds2VFRUmJZHrnDRRRelHIs9PT2YP38++ta3Yf78+ejp6ckpPRruoIXGFMZ5552HY8eOIRqNmtfi8Tj8/rNeyWLUKJctW4YdO3Zg9erVAAAiwo4dO7TgcIl4PJ6U+g3AYmmcOnUqpzRcdNFFFqEkWzc9PT3o6urCxo0bAYpj79696Orq0oKjAKCFxiQiEomAiMwjEonktD4uMF577TUQEYCEe2JsbMykgU/WYsIzzzyDjo4O3HfffeZ7dHR04Jlnnsk3aUWBQCCAF198ETNmzMCLL75oXv/xj3+Muro6/PjHP0ZDQ0NOaeDuMN5/P/7xjy1j8a677sLDDz+MxYsXm/c8/PDDuOuuu3JKl4YzzhmhsWzZMtMUduPOcDKd08GBAwdQW1sLxhhqa2stroFc0XDs2DEwxsAYAwCcOXMGAMAYg2EYOHHihOcy8w0iwle/+lXLta9+9aumYLTDmjVrzPYMhUJYs2aNp3plV995552nvJYKoluNMZYX62h0dBRz587FH/7wB8ydO9e8zscJYwxvvfVWzul4+OGHbc/37duHu+++G4ZhmGP17rvvxr59+1KWmemcSad/Mh1XxYZzQmhwd0ZHRwcGBwexevXqlO4MbjpnOzBoGAaOHz8OADh+/DgMw775s0XDm2++aboiAGB8fBwAzHb42c9+lubb5A+MMdxxxx2Wa3fccYcpGFVYs2YNNm3ahA0bNiAWi+Huu+/Gpk2bXE9w0dXX19eHaDSKY8eOKa/ZCQ7RrTY4OIiOjo68uNUYY8qYxmRj5cqVtuelpaXYuXOn2VarV6/Gzp07UVpaaltepnMmnf7JdFwVI/IiNBhj1Yyx7zPG/ocxto8x9he5rE90Z1RVVeG+++5L6c7gA0801zN14wSDQcTjccuAjsfjCAaDOafhxIkTGB0dtVwbHR3FG2+8kda75BtLly7F/fffj5tvvhknTpzAzTffjPvvvx9Lly61febBBx/EPffcg1tvvRVlZWW49dZbcc899+DBBx90Vafo6pszZw5ee+018zfxGhccKngdh7nA7NmzQUSOMY1co6WlBdu2bcNHP/pRHDlyBB/96Eexbds2tLS0AEgE7CsqKnDNNdegrKwM11xzDSoqKsxUYRUynTPp9E+m46oYkS9L414APyGi9wJ4H4DUNmcaEM1UIsJDDz1kMb+fe+65lO6MZ555xnJ/phObM20xQ0W8rsLzzz9voeH555/3XK9hGNi7dy+ampos1zkN1dXVSc94deVlA17qfPrpp1FbW4v7778f1dXVuP/++1FbW4unn37adCvIGB4exm9/+1uEQiEwxhAKhfDb3/7W06r848ePW/qDQ7x29OhR2+fTdavxOvruuco1rXY4ePCgZTubl156CQDwnve8xzI23/Oe93gq16tbZ/fu3Zg9e7alznA4jD179pjvOT4+jiuuuAIlJSW44oorUFlZ6UjHyy+/bOmPnTt3AoAr1xER4eKLL8b8+fPh8/kwf/58XHzxxSn7Z3h4GE888YTFjfbEE0+kHFdyW5133nl5d1l6waQLDcZYJYAPAHgYAIhohIgGs1mHbKYCCeZcXl5ualJOvtEzZ85Yctl5LCBdxONxAEBDQwP27dtnBhr5dRUGBwctro/BQe/NFI/HTbeciFgshg0bNiRd9+rKywa81rls2TIcO3bMvL+jowPHjh3DsmXLzKCpDMMw8NBDD+Huu+823QgPPfRQShehDK6Zyxq6eO3w4cO2z6fjVuOwey+vWLZsGYaHhy1tByTcmGKShlNsRi7Tq1unp6cHfr8fvb29GBkZwfLlyxGLxbBixQrTmjh9+jQikYg5Z91YxmIfTZ8+HadPnwYA166j2267DRs3bsTQ0BA2btyI2267LWV9jDH09vZa3Gi9vb22fSq3VWNjI44dO4ZZs2bl1WXpBflYEf4uAAMAHmGMvQ/AKwD+FxFZ7E7G2CoAq4AEo33uuecAwPzLoTrfs2cPFi5ciM997nMWN8I777yDX/ziF0kEyWVwzJw5E3v27MHMmTMtvl/V/U50caxduxaHDh3C2rVrceuttzreX1VVhV/96leoqqpKutdtnc8//3ySpdTb25sUz3juueewY8cOtLW14dprr8Wrr76Ka6+9Fm+88Qa2bduGpos/66r9vZwD8Fxnqvvt2gBIMN79+/fj+eefx/79+0FE5uR225b9/f342c9+ZsaI7K6pyrj00ktx//3344033sBnPvMZPPjgg9i2bRsWLFiAAQ80pLrH6VzVdo888ghOnjyJ+fPn40tf+hK+9KUvYe/evaivr0+7zFT9BwB33nknPvvZz4IxhhdffBFPPPEE2tra8OKLL+KXv/yleV9fX5+rOSuf79q1yxLM/+Uvf4lLLrkEn/nMZ/DAAw9g5q0fSnomFArh1KlT+Nd//VfEYjE8+OCDOHXqFEKhkLIOABZB/vOf/zzpulNbHTp0CJFIBAcOHHDddtmeg27GmQWidjEZB4AFAMYA/PnE+b0A/jnVM5deeikRETWt3U4i7M4B0MDAgHkdAC1atIgAEABijNEHP/hBAqAsAwDNmzfPvF917oYOucz169dTNBolwzAoGo3S+vXrlWXy+y+44ALL7/xcrsOOJgA0c+ZMSxmBQMDSDldeeaWlHQDQ4OCgpazBwcGktlLVqXqPVO0i0mlXp10ddverwOtYtWoVBYNBAkDBYJBWrVplOwZUz1dVVVnaUnVUV1enHCOtra3EGDPbv7W11VXb2b2X13OntubH7NmzXZXp1B92fW4YBo2MjFjKGRwcJMMwzPPLLrvM9Zzlz7z3ve9VzluOWCxmW4ZhGLRkyRJL/yxZsoQMw0g5x2666SbLuLrppptS8haxrQBQX1+fpWy5P+S2dnvu5h5pTr9MLnh4PmIahwAcIqJdE+ffB3BJtitpbm42/YwALPnoRIRdu3bZPQoA2L9/v+X8d7/7neU8nUyqr3zlK8pz3hky+vr6Up4DiXUXHIyxpHM5pXZsbMz8v6SkBENDQ5ZgPGMMdXV1Fr8wP+dYs2aN+YzoJ7Z7Dydwv65YZ01NDYCEW2n+/PkoLy+30FBTU2PxI7/rXe8CANMXLS8CCwaD2LZtm+lrHh4exrZt22wTEVTgrg4V/fyvuChOFZuZN28eSkpKACTaf9++faaLzM6fvWbNGkssJpPMHMYYPv7xj1v89h//+MeT7lPFukTwmCHHtGnTLDQuWrQopdutubnZ0ucAUFtba7H+fvWrX5n9e+GFF+LkyZOO7/eHP/zBcv773/8ewNlxsWrVKts+b25uRnl5uaV/XnjhBYsLWf5oGmMMP/jBDyzj6gc/+IHtu8tjHYAZb+TXamtrLfcvW7bM4i5UxdQCgYB5zTAMsy84RF4IwJP7UcakCw0iOgzgdcYYj7RdCeA32awjHA7jyJEjaGpqSmL+u3fvRk1NDYaGhiwro2XE43EEAgG88MILluvppr/6/X6cPHkS/f39+O///m/09/fj5MmTtjQYhoGRkRGUl5fjlVdeQXl5OUZGRiw+eLt9hLjgKCkpQSwWM+MoPp/PnJQDAwNYtmwZXnzxRcybN88skzGGsbExS71jY2PmgOMphmJsINMUQ8YYxsfHzTqDwaBJ59DQEA4ePIhYLIaZM2eir68PhmGYwqmvrw+zZs3CsWPHUFFRYfqi5dXD4XAYhw8ftsSIDh8+jHA47IpGwzDMuBhvF45p06Zh37598Pv9GB8fh2EYytiM3HZNTU14/fXXceGFF9rGcrLd3vPnz8ezzz6L888/H2+99RbOP/98PPvsswDgOlVVjhmGQiGMjIyAMYb+/n5ceuml2Lt3LxobG23pOHDgAE6dOmWO3UAggHg8bo7NUCiE06dPIxgM4tChQ6iqqsKrr76K2bNn25Yp95E4To4dO4YPfOADeOyxx/DBD35Q+fysWbPwox/9CDfeeCMGBwfh9/sxNDSEyspKM1Yif22zrKwMx44ds8zBY8eOoaysTFmHPNZF7Nu3z2wHeQyJqd2iktHX14dwOIyxsTEEAgEMDg6irKwMw8PDJt183vt8Plep4Y5wY45k+wDwJwBeBrAbwI8A1KS636t7ijFGtbW1Kd0IpaWlKU1IbqLKB0dbW5vSVWR3Ho1GLa4hTLiKotEoyeA0qO4X6wRAkUjE8mwkEjHfCwBVVlZa3kU0tYPBIC1atIiCwaDFxA8GgxYTnZveTWu3UzAYpA0bNljq3LBhAwWDQeV7pDoX30OsU35X/p68rRhj5PP5LG1TV1dHjDGz3N7eXvN+sa1EN4LYVk50q/pDdfh8PgsdHR0dxBhTth1jjBYuXGhpO/F+IkrZ3um4p6LRKC1YsMDSvwCovLzcci8f33Zt0dbWZl4LBoMUDoctrqR58+YpaRTLmDlzpumuZYwluU55X/Fj7ty5FI1GU7qnUvVRMBik5cuX25YRDAZpxYoVJk0A6LzzzrP0z8KFC5PmIB97nO66urqUbRcKhWz5izz2+XvJ5+I9jDGqqamxzJeGhgZzHPI6xTKi0WgSjXDpnsqL0PB62AkNuTHt/PIAaN++fZZ7+/v7VY1mHv39/Zbru3fvtjw/MDDgye8o+3CJiEZGRkwfrgg+uMS4jFineM/+/fst9+zfvz/le/DfOWQfb6oyeZ2xWMzyOy9Dhl3/qN5VrNMwDEt/8d9Ff7fYH4ZhWNqG6Gzbim1h155O40rVlnb3OfmnxbbjZaa6P1V7pxp3qmuqWILds+L4lu+T21L13iKNctm8z/v6+ixliH1uGEZSnIr3aSqhIfaRYRhJdKUqQ9U/8nzh/eVmXNm1nTjWAdALL7xgGesyr1KVJT8jzge5DAD0i1/8wlIGb5diiWlkDfwlZKhSGy+//HKLT+/qq69OWZ78u2zS8tWrMg12583NzUmurhdeeAHNzc2275dqxSzHkiVLlOeq9wgGg0n3b9q0KcnHa1cmL2PTpk2OZXAaVP2jglhHc3MzLr/88qTfeVsxxiz90dzcjJUrV1r6l7etSIOb9lTRbTcmZDDG8JGPfMRCB0+pJaKktmOM4eqrr7a0nXi/6hngbHunGnd211TjELDGxgDr+FaVJ7ZdMBjERz7yEVsa7caA+EwwGLT0eXNzM+644w5L2zjNF8DaR83NzUl0pSpD1dZLliyx0MDLdzOu7NpOnl+LFy82/2eMJY19FeRnZP4k8zu5TLldPMGNZMn3IVsaoikMgMLhsOX31tbWJG1AdcyePdt8pqWlxdUz4pHKxLQ7IpEIMcYoEolQKBQiv99PQMJ07uzsNN+D08O1Zf63paXFvEduB68Hd6V0dnbatq3Yxk1rt1NnZ6fneuT+EZGN97B7N1W5bW1tNDAwYLpfWlpaTLpmz55tuZf3jdMhWzRO1zds2ECxWCwpI8+uDNEdJ/8NBoOOdIrt393dTfX19RSJRMgwDIpEImZZsstKLiOd8S7TwOng7uNoNEp9fX2O7mROV3d3t62lIfefOBb4u9bX19uWkc7YTkWr2/5JZ2xl46itrT03LA2n4C9gzZRKBa5xyIE9n8/n6nkiMungz/BgoIjdu3ebAdcDBw6YK4eHhoZw3XXXKQOcXHPgmRv8r6hR2GWB8ACZl8wgDp6FZHedr+2Qs0NCoRD6+/stGRx2/eMFXhbfibSMj48jFotZAt+AdUW++HW6OXPm4PXXXzcXhpWWlmJsbAyhUAgDAwOoq6uzrc9ugaa4oFNcEHjbbbchHA6bmT0yAoGAuQA0Ho+D6GxGES/z/e9/P2KxGOLxuJm4ICd9OLU/TWi+gUDAcs7/8oV1dXV1iMViqK6uxuDgoOvkgWAwaEvD0aNHUVtba+5WwLdekfubv3dJSQmICJ2dnbb12W0xwpmdE3iGpJsxx+c9X8Mh44ILLlD2j5uFnCJSLf7NFAsWLEjvwVxbCdk4REsDSB38nZCYlnsYY1ReXk6J101ADDgC1sAeYA0cQdDsxHvkczl4y7UEokTgSaQhGAxSR0eHJRAuBjidAs6cbvF5FQ1ynTwApqqTPyO2BZE1KKpqKzkIJwfy7ALO4nuI/QVBU+N0i+/B35u3hUyDqn94H8jXRBoWLlxo+17cOhSfF/uX09nW1mahiwffOcRAKmOMOjo6LHXyIKnde6jqqKmpsZzLdIntH41Gqbe31/L+gUCAGhoaLHWK7Su/O2ANtDLGqKGhIWncie8hPq8aB6q2qKmpsZShCt6K5cnzIRqNJvUZT5BQlaGiIRAIpOwPmbcEg0FauHChJQgt94/IS2ReIyZo2NUpj015Xjv1H1FywsXEc1MvEM4bzyn4K98DgF555RVLo4mLj4DkwJ4YOAJAzz33nGNHysGpnTt3mueGYVhoAKyLmYisQWkgdQCUH3IwUaZBrtMuYGm3MJIoOegvt5UchBNpUPWP3Iaq/vrJT37i+j1kGlT9Q0RJ7y7TkCr5gdPoNAbEgLzqGTHwzceA+LwcsHRTh0ynOO7E9ncbCFe1r/geQHKgVT6X55vdGBDrlNtC7lNV8JbIKjTE+WAYRlL7j4yMKGmwW3gnj2VVW8ljU+5juX9EXqLiNW7GmVym3F+p+o/IdsHu1BMavAHsLA27e6aipcHrmExLQ/U74N7SsIPcX8DkWhr8fm1pnK0zl5aGCpNtacjQlsYUFho8uBmJRGj//v1mY4iBNvke3ik+n48GBwepo6ODAFBra6sl6MyDpGKwcf/+/ZYAYF9fn9lBYh1iMFFOy9u9e7dJE9f0li9fTgBoxYoVFIvFaMOGDeT3+82gdGdnJ/n9fjNoKv7OIQcTObNgjFFfX5+Z5+73+2lgYMBsq+nTpyvrJKKkthADxqrfeduGQiHq7+8324prear+kSH3l9h2+/btM9fU+Hw+isViNH36dPN+FQ2cMYttw/ustrZWSQMPoi5cuJD6+/vNOkOhEA38v/auKDSOI01//4wmHnlGcsbyIINntNItDhwjyY41sHDiyMbOSXDeU/J44DyFY8GLRWBJ2Lv46eCWPQh+COTluCNPOckJgYOcjUMOiXBHwA82cZzs6iHezcoE+cGJ0SYZ1hqP9d+DXO2qv6u7emRHssX/QWO3prrqr7/+rurq+urrmzcj7n2lUnFiiIiiNjJSNZOTk9xqtSLZkcHBQccuI9FhCBsnT56MZp2mo1paWoo6YgCJZZgBulwux3wn/W8WwkdGRnhxcZHb7TYvLi5yX18f53K5qAzpX1l30179/f28srIS1bNUKvHq6qpD7sgaA9IXJnZ3794da7+kQUPeD7VajQFwX19fVNeRkRGem5uLlf+jX52L2WBiOZ/P89WrV6OOOq1vGR0dZWBDvsTXPrIvMb7K5XK8srIS+X7Pnj3RPWrSJ8WmvK9D7Sf7P4MdNWjYG9SyMDhKpVJXjBJmjm0kCh2bZZLYm8vq9bpXhyiJ0TU2NpbIEMl69PT0ODbYjC0DWYbc7LcZNogsczN5dBMD9Xo9xsiRA8aDsFpMfrKMnp4ex05pq9wEmYU1FCoji612G586dSrWHlIT60H8krUepVLJ0WILsejs9TzZ4Se1qcnb/OuLqbR7zneEGE0P23979+7N1D/Z7Rey0acthp3Envr2228jKeGNum2wKqT6pc3U6HQ60de09u/fD+A+G2RmZgatViuSSRgfH8fa2pojiwDcZwQZdkmhUIhYMMYOw86xWRGSxbK0tBR9C2B9fR3tdhuvvPIKbty4gddeew3tdhsLCwv44osvIumL2dlZLC0tRXU4c+YMPvvsM4fhI+0ySrilUimSXQaAWq0WyS53Oh0888wzYOZIcsOGlKxuNptYW1vD0aNHI6n2TqeDp556Cq1WK/qSWqVSiSQNgA22y+rqKkZHRwFs6OsYltibb76JTqeDSqWCq1evOr7z1cPw2icmJiJpFQCRrIhhRhntImbG9evX8c033zjBbn/rolAoODbYkPIOPpuMHPutW7eiuDly5Ag6nQ6Gh4fRbrcxMTEBZsaxY8eia9bW1iKZECnxblg7NnsKQGoZzz//PABEkuImJgxbZ/jed+iNz+bn53H+/HlcuHAB7XYbFy5cwDvvvINPPvkECwsLaLfbkbRNf38/lpaWojbO5/NotVqRLwwrTPrGXG+zp0w9zP1Sq9XQarVw/fp13L59G729vWi1WpGvTNyYODtz5gzu3r2bKp8yPT2NTqfjyL6vr6/jwIEDuHv3Ln73uw21omKxiIsXL6JYLG50gvf8Pj8/j++//z6KfdMPDAwMOPWwPzcg77FarQZmjs4Ng3H37t1YXl6OdKVMfScnJwEAk5OTiX3VrVu3HDl7GSemb+np6Ynibn19PdWXN27c2Lz0zw8xM3jYR7VatUfDiLtuzs1hp5Hn9js+5u4ZQXJNxFeGfFdpv5dvNBpOno1Gg8+cOeO8X7WZHb41DV+Ztl3y3TIRcaPR8MpaSJgnDvnOm4h4ZmYmstP3znZwcNB5fyrft9rpk+phv4eX9Wg0GjwzM+OUacuKmDR2niGYNpY2JbWftMlXj0ajEVuzsH3H7Pp/M2sasgy5NmbqZcd6aE1jeHg4tqZUqVScNpdrSvZaTZY1DV897PfsoThjDsunSH9Kfxv/2jCvl3y+MbEt1w3tesh7TJ4bX5rzXbt2Ob7yrVHJvsp3v9hxIvuWzfoSO+n11OHDhx2H2ewQAPzee+8FO3TJnOmWESTZIL4yJCvCZgDlcrmY9EWr1XLYU1L6QrKnfGVK5oZksSTJWkiYvH2S1Tdv3nQkPCQ7RJYpfSelMnz1kG0qJSV8rCTbdz5mVBqMnfb52bNnE9tP2uSrh3kvbV9j+47Z9T/QPXvKV4aUFJesI7nWIdlT9kOYnYedp4yzEJsqdL9IZlMozpiTpUnsv6VJ5hv/2jD+9vnG1Mtuv1Df4jsPSXzI2Jax7CvTjhPZt2zWl9hJg8YPOdMwvz9KMw1mv1Cdr8yHNdMw0JmGv/12wkzDXP+4zzSS8CAzDZ9vTGzv5JmGjR01aAD3GQ3GgUQUe0qwmRoAEtkg3TKCDAOiUCgksnPsxS8fA6i/vz/Ko91u8+nTp7mnp4dPnz7tZXb42FMmP8OikHZJFothj9RqtRhrIgmSXdNsNhkAHzt2zMsOMUyOSqXCy8vL0WLmE0884U1v16NSqfDVq1cd3/nq8dxzzzEAbjab3G63ua+vj4ENldQszCgfzIKpscFuL/OUnGaT8aUdN0eOHGFgQ43V5zvp/27YU0llSBaeZOtI5pKPPVWtVrlarUZ/M3n09/d72WuSFZaVPWXfL5LZFIozH3tQQvpT+tvEWbFY5IsXL0b3uelMpW/M7wMDA7F6mDLkPSbPJQvMkAF6e3u9bLikviotTmTfsllf7qhBYzPsKckQkcwNM2AYSNaEj4Vhn/vYOaGjp6fHYXKcOnXKOZdUQB/LRTKbpF2S6bR3714vQysNc3Nzjl1jY2NOHvV63bFLMjsku0emz8KekvUYGxtLZdp0M2AYdMuekjZNTU3F4qZer6f6TvpfspZ8bKtQGVNTU45/Zb0k1VW279zcXOxvvvi3y5D+l76RcVkqlYLsqVCcpQ0YSf6U/pb+lbNuWR0wPQAACztJREFU6QcZ26VSKVaGvMfkufSlfc+Y9g31VaE4kX3LZnyZddCgjbSPNprNJl+6dGm7zVAoFIodCyK6zMxhQaosI8t2H2Z6DGtUBdKfAENPy/IJYu/evalP/T6EZjPyiTA0k5BPZ/LpYW5uLvbEIZ8gpqamunrSlTOXer0eLEPuLwnNPGS9xsbGgk/58hrZPtJuOXNkjj81ypldFnXdtCdC3/4GmWcoBkJx6otlObMItbm0yecrCTm7sfcK+J5UZXoZA2NjY94ZTpovZD1DexVyuZx3dm4jtH8hNPuZmpqKleFT3c6yHyupH/Cll/71zUi7eYvhu++xk15PAcnrDUnvmnt7exPfy8sdrQcPHmQAXK1WgztH7Ya21xzku0j57jm0ZmEW0YvFovc95eLiYlR3825Tvqs8ceIEA+AXXngh0zt1uQvaXqtJKsPIeTcajUxrHHJXuv2ONmlNQ67VyPYZGRlhAPz0009716hMB2S/n5ZrSHJdxL6BLl++7AxqvnfP9tqM8ZV5aNi3b1+mGAitH/liWa5hhNpc2uTzlYRc40tTEvClN74tl8tOmYVCwVlLSfOFrKeMK9leZqEeQKKKghkwyuVybN0qyzqLTwVAru/IHd3yfpH3oOwHktLb/pWKFWbHd7FYzLRemnLfr+2YQWPPnj1RQJvAAcDMflaL1CGSbALTyDb7QLJvkjRqDCS7yTS0YSRIlovM03d9uVx2rvfpKdmMH8mKaDQafPLkSYfVksbeMYFjwwRoUhlE7idKQ2wqUy9ZD3lus6fkNbJ9jN12vWw2nLnGZsJItpoZ4O1z265du3Y5GlqS5WLbbZ+b76WYMtNiIMRUY47HsmRLhdpc2uTzlYTpoOwy5f1hs29kehMDdnozkNhI84WPFSbjyhdHsgxpp/1ZW5lHiNHFHNcbM/617weZR9InfU360CeAffWUrC/JNkxjZvrueytOd8agcejQIcdhabxnZn/DSt6y3AeQ9FnIJJgnUPvczkPy6WWevuttbrvkXps08twuQ34iU9abOc5bz/IJU7kvIHTeLWcfiO/TkL6Q3PeVlRWnXvJzr3K/idwXA8Q/IXvu3DmnDKkYLMvw1cPeexCKgdCeGJNGlmHvywi1ubTJ5ysJk4d9nqSOnJQ+dE9m8YXcfyLjym4v8zdZhrTz8uXLTno7j9DeEV8Z0r++86RP+prfQ58A9pUp92nI/ixpD5hdhg2rzJ0xaOhMw627bYPONDagMw2dafgGDZ1pxH3tu+933EzDBKWuaeiahq5p6JqGrmnomkbwUPaUsqeUPaXsKWVPPRrsKd2noVAoFIrM+zQeC2l0hUKhUDwa0EFDoVAoFJmhg4ZCoVAoMkMHDYVCoVBkhg4aCoVCocgMHTQUCoVCkRk6aCgUCoUiMx7LQSOfz4OIoiOfz8fSzM/PY3R0FPl8HqOjo5ienkaxWAQRoVgsxvIoFApO+tnZ2dTrZ2dnMTQ05ORRLBaRy+VARMjlchgaGnKumZ6edvKcn593bJ6ennaun56ejtVrdnbWyXNgYMCxYWhoKLUemylTllEul1N9Mz4+7pwPDQ3FyiiXy06e8hgaGkqNgfHxcSf9+Ph4ltBJrfvAwEBq+8l6zc7OBu2S7SH9LyHjNpQeiMeEjLNQDGTJ01dXGzJG5DEwMBAsU9Y9ZLexz77/QsgS72k2+Xwn8xwfH3euGR8fTy0zS71lGbL/KhaLD9zmmZFlB+B2HxMTE7EdnUYKwMgH2BpAIUmCkGSH3IYvr/d9elXKmYQkPuTW/tCnKs3O0W6kS0JyAlnKNLvcGw3/Zzqlb6TcRposwvDwMF+7di1qDyJyZA3q9Tr7IGUrskhjSMi6y890yvbzyYjIT2ZKu0IyIhK+T7F2K2cj4ywUA1nyDH1qVcaIuUeJKPPneEOyL9Jus4N6cHDQ+TSurdkkkSXe02zy+U7mKT9NHJLyyVJvKR8kP6fbrYxIErCTvqdhDxpmwLAhBfGyiJ+liQNKwS95vcnDLlMKJ4bEBJldETEi4pMnTzr1soXNTJ7diCSGhMuylGnKsH1rC7JJ30hhv6wCbLY4IDPHhP5smI7ZRkiET0LWnYi40Wg4QnJ2+/kEC20xPJ9dIcFCCRm3ofTGLjsmZJyFYiBLnr662pAx4mtPKXgoERKYlHabAcOGFEmUyBLvaTZJG3x5NhoNnpmZcQQ+00RDs9QbcIVKTf9l59GNYGESHvlBA0AewCcAzoXSykHDljdm5pj0dhaZ5TQZcp+Mtn29+Zvs+KR0c5psOXNcrnh1ddWpl0wPdCfHnkUiOUuZy8vLjm+l9LP0rS29Lf2Q5DtbhpyZY9fYMGXYCMl9+/Kw6y59Ke2W9WJ2Zbd9doWk0SVk3IbSmzLtmJBxFoqBLHn66irT2zHia08prS4RkrKXdpv7zYaUY/fZGYr3NJukDb48c7lcLP7TPk+Qpd6++0X2X91IoyfhcRg0fglgbjODhs407tugM40N6Ezjfh460/BDZxqP8UwDQA3AAoCj3Q4auqahaxq6pnEfuqahaxpbvaaxLSq3RPQegN8A6APwCjP/zJPm5wB+DgCDg4MTZ8+ejX47evQobLuJCIuLi871CwsLePvtt3H9+nUMDQ1h3759+PTTT3Hnzh0UCgV0Oh0nj3w+j3q9HqU/fPgwrly5knj98ePH8fHHH+PmzZtRHoVCAXfu3InOq9UqVldXo2sOHTqEr7/+OsrzxRdfxLFjx6L0r776Kmw132aziddff92p1xtvvIHz589HeRaLRXz33XdOmaVSKbEemylzZmbGKaNYLGL//v2JvqnVavjqq6+i8yeffNLxU7PZxOeff47bt28jCdVqFe+++27i7y+99BK+/PLL6HxkZARvvfVWYnofZN37+vpivrTbT9br+PHjePnll1Ptku0h/S8h4zaUHojHhIyzUAxkydNXVxsyRiT6+vrw/vvvp5Yp6x6ye2pqyrnfCoUCPvzww9QyssR7mk0+38k8R0ZGwMzRNUTkxIQsM0u9P/jgA6cMInL6r0KhgAMHDjxQmz/77LOZVG63fNAgop8B+Ftm/gUR/RQJg4YNlUZXKBSKHxaPsjT6JIAZIvojgLMAjhLR29tgh0KhUCi6xJYPGsz8T8xcY+ZhAH8PYJGZX9xqOxQKhULRPR7LHeEKhUKh2B70bGfhzPwRgI+20waFQqFQZIfONBQKhUKRGdtCue0WRHQTwPJ226FQKBQ7GD9i5moo0WMxaCgUCoXi0YC+nlIoFApFZuigoVAoFIrM0EFDobBARHeJ6Ip1/CMR/de9/18joj9Zv/0VEX1ERE3r+mEi+vze/39KRExEf2f9fu6eEgLsa4moTET/RkS/J6LfEtH/EtFPtrj6CkUQ20q5VSgeQfyZmQ/7fvDJ3hBRKL+vAJwG8N+BdP8B4EsAB5l5nYj+AsBfZjVaodgq6KChUPyw+BRAgYj+hpn/x5eAiH4M4CcATjDzOgAw8x8A/GHrzFQoskEHDYXCRS8RXbHOf8PM7wSu+U8i+vO9/z8BYF38/i/3Du+gAaAB4Aoz3+3aWoVii6GDhkLhIvH1VApOMPMlYGNNA8A5+0dm/j8iAhH99cMxUaHYPuhCuEKxNfg1NtY2fPgtgENEpPej4pGHBqlCsQVg5g8BVAAc8vz2ewCXAPwz3VtZJ6KDRPT81lqpUIShg4ZC4aJXUG7/9SHm/WtsfOrYh38AsB/ANSL6DMC/A1h5iGUrFA8FKiOiUCgUiszQmYZCoVAoMkMHDYVCoVBkhg4aCoVCocgMHTQUCoVCkRk6aCgUCoUiM3TQUCgUCkVm6KChUCgUiszQQUOhUCgUmfH/+IsNdIJbwRsAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEECAYAAADUGGjBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsvXuYVNWdLvyuXVVdRVc3dDfdNpeCLjJAogUqyiQRHBMVm2RiOmRiTFom0YNIaIV8T2QUpHPmZM5EVBLmi8McFdGOGqXnkkxMByVAbJERDDkaEy4SCY404SrQNJeCvtbv/FG1Nmuv2rv2ruq693qfZz9V+7bu63dfazMigoKCgoKCghNouS6AgoKCgkLhQDENBQUFBQXHUExDQUFBQcExFNNQUFBQUHAMxTQUFBQUFBxDMQ0FBQUFBcdQTEMhZTDGDjDGZuW6HJkAY+yzjLFDuS6HgkK+QTENBYUMgjF2HWPsLGPMJVxba3HtKeH8VsbYbxljYcbYKcbYS4yxgHD/LsbYAGPsfCytPzDGbhXuBxljxBhzx84ZY2w1Y+yPjLG62HufFJ6fG3tevvZH4fwKxlgbY+wMY+wcY+x1xtgMkzx/J7VBNWOslzF2YJDNqZAHUExDQSGzeBuAC8A1wrW/AnBEunYDgK0AwBi7DcA6AI8DqAYQAtAD4E3GWKXwzltEVAagAsATAP6VMVYhF4AxxgCsAfBZAJ8hog4AbwH4jJT/H02u8TL9BYBtAHYBmABgDICfA9jEGLtOytLPGJsinN8B4EO5XAqFCcU0FNICxpiXMfYjxtiR2PEjxphXuP8gY+xo7N78mEQ6MXbvOcbYE4yxDTEJeBtjbFQsjdMx6XiakNbljLEtjLEuxtgexlhD7PqnGWPHJAn+y4yxnbH/GmNsGWPsg5j0/u+MsSqbei1njJ2MmeLmxq79JWPsOJfiY9e+whj7vfw+EfUB+A2iBBiMscsAlAD4N+naZABbYwR+FYDvE9FLRHSRiI4BmA/gPIDvmOQRAfATAH4Ak6TbLgDPAZgO4LNEdDx2fSvPP4a/AvCYybWtsf/fQ5RJNRNRJxGdI6J/juX7mJTnTwDcKZx/E8ALcrkVChOKaSikC80APg3gagBXAfgkgO8CAGPscwDuBzALwEQYpVmO22PPVyMqVb8F4Hex858C+KdYWh4AvwSwCcBlABYDeIkx9nEi+g2AMICbhHTvQFRqB4BvA5gTy38MgNMA/k+COo2K5T8WUSL4dCyf/wvgFIBbhGf/FlFiaQaRQN8A4M3YIV77kIgOAfg4gPEA/kNMIMYYfiblCQCIMcn/AaAPQId0+yUAnwBwExGdkso0M8ZIqxFlOP8O4JPCtU/gEtO4RS5TDP8eS6dUuPYigK8zxlyMscsBlAPYYfKuQgFCMQ2FdGEugP9NRB8R0QkA/wDgG7F7twP4MRHtIaILsXsyfk5E7xBRN6Jmj24ieoGIBhCVyrmm8WkAZQAeJaJeImoHsB5AY+x+K//PGCsH8NexawDwLQDNRHSIiHoQlZ5vEzUGE/xPIuohojcAvBKrCwA8jyijQExbmY1LzEnGGwCuj2kRfwXgvxBlip8Wrr0Re7Y69nvUJJ2jwn3E3u8C0A3ghwD+log+kt6pB/DvRNQlXd8BoBTA1Fj+b8b65kPhWgcRHRTKZVUmDYBoNjsE4H1EhYQ7obSMooJiGgrpwhgYpdyO2DV+78/CPfE/x3Hh/0WT8zIxrZjkLeY1NvZ/HYC/iZnG/gbA72I2fACoA/DzmFmrC8BeAAMAai3qdJqIwhZ1ehHAFxljZYgykv8iIjOiCkTNU2UApiCqVfwXEZ1HtB34NS7Rn4z9jjZJZ7RwHwB+Q0QViBLsNkQJvYxbAfwvxtg88WKMOf82lvcNiDIy4JIGJJaJl8uqTBFEtTYRLwC4C1EG/qLJewoFCsU0FNKFI4gSZY7xsWtAVBoNCPfGDTKfcYwxceyOB3AYAIjoPUSJ++dhNE0BUSL9eSKqEA4fER22yKuSMeaX8jkSy+cwotrClxHVqKxMU5xA/19ECfhoIuIRSf8Vu3YlLhHo9xGV1L8qphGr71cAvGaS/nkA9wL4huj7iWE7gC8CeJwxdod0j5vNuPbDy8SviUzj13KZYrgdUV/HBen6zwB8AcB/C0xboRhAROpQR0oHgAMAZsX+fx9RAlWDqCnjTUSduUCUgB8FcDmiJpEXABCAibH7z/FnY+fzAWwRzicC6I/9LwHwAYBlADyIRgSdA/AJ4fmlANoR1VCqhevfAbAFQF3svAbAlyzq9lkA/YiafUoQJaJhKZ+5iEYTnQXgt2mrFYhqT/8pXPtK7Nph6dmvxdK8A8AwRH0rLQAOAhgZe+YuRE1K4ns/RNTMBwDBWBu7Y+e3IOpIv014vh5RDeI4ABa7NhLAiVjdJwnPTgLQBeBhAFWI+ikWx9pkpkWe0wH8Rez/LAAHcj1m1TH4Q2kaCunC9xENL92JKCH9XewaiGgDgH8G8DqA/YhK6EDU4Z0UiKgXQAOijOgkoqGm36RL0jsQ9WF8FkA7EYnmnMcRNeNsYoydQ9Rs9KkE2R1D1OxyBFGH8kIpn58jZvIioxnLDG8g6rh/U7j2ZuyaKNGDiP4NUe3lO7E6voco85hJRme2jB8B+GvG2JXyDSLajCgzeo4x9sXY5e0ARgDYQTHKHkv/BICPiOhPwvt/AnA9okEOBxAVAr4CYDYRbTMrDBG9TUQfJCivQgGCSxcKCllDLKJmNwAvEfXnujyDAWPsAwDfIqJf57osCgrZgNI0FLKC2HqJktjitMcA/LIIGMZXEDXHtOe6LAoK2YJiGgrZwrcQNXt8gGjEUlNuizM4MMa2AHgSwH1kjORSUChqKPOUgoKCgoJjKE1DQUFBQcExFNNQUFBQUHCMRNsn5A2qq6spGAzmuhgKCgoKRYt33nnnJBHV2D1XEEwjGAzi7bffznUxFBQUFIoWjDFHK/eVeUpBQUFBwTEU01BQUFBQcAzFNBQUFBQUHEMxDQUFBQUFx1BMQ0FBQUHBMYqWabS2tmLKlClwuVyYMmUKWltb7V9SUFBQUEiIggi5TRatra1obm7Gs88+i+uvvx5vvvkm7r77bgBAY2OjzdsKCgoKClYoiL2npk+fTsms05gyZQrmzJmDl19+GXv37sXll1+un+/evTuDJVVQUFAoTDDG3iGi6XbPFaWm8d577yEcDqOlpUXXNObNm4eODvXVSQUFBYXBoCiZRklJCWbOnInFixfrmsbMmTNx9OjRXBdNQUFBoaBRlEyjp6cHra2tqKmpARHh5MmTaG1tRSSiPnugoKCgMBgUZfSU2+3GsGHDMGzYMDDG9P9ud1HySAUFBYWsoSiZRn9/P8rLy9HS0oLu7m60tLSgvLwc/f0F/XVRBQUFhZyjKJkGANx1111YvHgxfD4fFi9ejLvuuivXRVJII9Q6HAWF3KAomUYgEMBzzz2H1atXo7u7G6tXr8Zzzz2HQCCQ66IlBGdyjDGd2SnEg6/DEfu3ublZMQ4FhWyAiPL+uPbaaykZrFu3joYNG0YA9GPYsGG0bt26pNLJJhYtWkRut5tWrVpF4XCYVq1aRW63mxYtWpTrouUdQqEQtbe3G661t7dTKBTKUYkUFAofAN4mB/S4KDWN7du3o6enB7W1tWCMoba2Fj09Pdi+fbvlO7k2d6xduxZf+9rXdP9LS0sLvva1r2Ht2rVZLUchYO/evbj++usN166//nrs3bs3RyVSUBhCcMJZcn0kq2l4vV5atWqV4dqqVavI6/WaPr9u3TqaMGECtbe3U29vL7W3t9OECROyqpkAoLq6OkMZ6urqKNpFQw/r1q2jUChEmqZRKBQy9EUoFKLm5mbDfX6erTIoKBQb4FDTyDlDcHIkyzQAUEtLi2HCt7S0WBLgfDB3MMaoqanJcK2pqYkYY1krQ77AjokvWrSINE2j2tpaYoxRbW0taZqWVlNePggSCgrZxJBmGm63m/x+PwWDQWKMUTAYJL/fT2632/R5TdOot7fXcK23t5c0TUsq38EAgKlPYyhqGnZMPBAIUEVFBQWDQdI0jYLBIFVUVFAgEMhaGRQUig1DimnIZgSv10sAqKmpibq6uqipqYkAkN/vN30/UwQiGfNGKBSiOXPm6GX3er00Z86cIUmk7Jg4ANq0aZPh/qZNm9LKYPNBkFBQyCaGDNNYt24d1dTUGKROAHTNNdcYCHBDQ4MlUTFLo6amZlCmiGTNG6mWoRjt7nZMPBtMQ2ka2UcxjuVCwpBhGoFAgEaPHm0gzgCourra8JxMVMQBGggEaNiwYeTxeAgAeTweGj58+KAGrRnRaW5uJq/XazopRKbBTWp2TCMTzC4fYNcWgUCARowYYaj3iBEj0mqeUj6N7EK1d+5R1Exj0aJFuhYBgBoaGgz3q6urCYCB6Ig273Xr1lF5ebnOJPhRU1OTNiKkaRq98MILBsZUU1NDjDHTSZGKZGvGMEePHp1W4pkL2DFD0REOICOOcF4OJflmB4Ws2RXLOClapiEvggNAjDEDweCmqFGjRpGmafovf6aqqkqPuhGZRnl5uU58R40aNShzh0zQg8EgVVVVGQi6OClkJhMKheiFF15IaEPPhpkmHUh2UtkREBVyW3woVB9SMWlIRcs0vF4vzZ07V5/MbrebfD4feTwevdPcbjd5PB5ijOlMZfr06QabeGVlpd7R3CQFQCcQjY2Ng2Yao0aN0vPgkrHINF544QU9T7fbTSNGjDAMvlGjRiXUGpwwDVEr83q9WV9hnsqksmOgqTDYbJRbIXVkSxBINwpZQ5JRtEyD+yu46aK6utrAHLgjnJst+C9jTF/zAIAeeeQRQ5o8DR7u6nK5BsU0ZMImOuO5uYqHjfb29lJ1dTW5XC5qbm52bGqSGVN7ezuNGDGC3G43aZpGVVVVpGla0luTpFPCTtXsxtvGzLxoVm87BpuOcifySQ111NfXG+ZhfX19Uu8X6jY6haohmaGomUZ5ebmBYIi+CS5Va5pmMD3xc56GqGlwBsGfs1vX4QQy0Vm0aBExxsjlcumaBQBD3pxI8no0NTUlHHxme2wxxnTG4/F4qLKy0kDc5s6dS4wxS8KXikM+EVKZVFVVVYa24b9VVVVElJ11GnK5ebuIYySVdilGk1d9fb1piHsyjKOYNY1C6fOiZhqi9Dx37lydYIrRU9xBfuLECV3C50yDS+BcAxGJLjdV+Xw+g7kqFeIgOnNdLhcxxgyaEQAaPnw4hcNhGjFiRFw9zDQNcQBy3wz32bjdboN/BwA9+OCDunQcCAT0IAErk0u6pfhUNA3O/ESmwduMKLp63oyxpXP1vFzuQCBAVVVVumaYStBBsUa7pWM3g2yYHDMBuz4tJDNnUTMN0QQlmqHEZ7hJiEvt4jNW0VNcGxEJfKKOllXyqVOnWobxcmYUCAT0fPjeUpzg82etiLU8AD0eD/n9fkOajY2N+h5bfGU8z4MzQ1GDkgl4up3rqUwaM22yvLxcL4Ps1wqFQjR37lzLvcXEsjiV+ORycwbP2zoUCtFDDz1k2y5inm63myoqKooi2k2sFwCaP3++oW2feeaZpMZMIBCg0tJSQ9h7aWlp3reNnWZeSIt2i4ppTJgwQR+QnEhzVVgk2nzAciJdWVlp+BUHsUjwZeYjSrhWqjJXyXnanDj7fD5dShZNRbyMnBGJ+YbD4biymJmnZBVedOCLjIkzCZ6mbKoTV8bLpqJ0Mw2i5NVzAFRaWmqYiKWlpQbzotWRqAwy86qpqTEwgURCAQAqKSmJ08CSyZOPMTGffIx2s4NZvcSxLjN5J+Dzx+kuDvkCO02a0wLRV8NpQ76hqJiG2+3W1T8+gbmZx8wfwc+534D/yhoFN+vw6+Xl5XEElk8CTsCEBiafz6dfF8vBJ5JoZ+dRXnyCieVwqmkwxuImq8h4Zs6caTiX6yvmbSX12DmhzZBKhFYiRsLLJ4ZMm9VFFgoSTUR5cq9bt45Gjx5tMDcl2hSR5zlnzhz9+crKSr38VrvxinmKmiB/ftmyZXnJNOx2GRbrxQm+3EfJEHwANGnSJIMQOGnSpLxsGxFmPjsxKhIA3XzzzYb7+boRaVExDZfLZXASy9K1OFhFAmN2hMNhvTPLy8sNaXKzjdfrpVtvvdUwYGUHMn9fZGacKcQ6gB555BFH0rHs07Ai1vKW74nS5GW68cYbdabAtSP5GdFhyYmlSLAZY7ofSCYgTqJeZAK0aNGihCYr0UwoMjq+MFIWHILBoC4YWGkNmqZRU1OTztwYY9TQ0GDQskQJ0e12U1VVlV5GWRP0eDx6WonqIRIU7oPiaXCGxB386cJgHa92Jhe5XmZ+QTsmLkNuE3ENVabqmQ7YCSNcaBW1MC7Y5huKimm43W7LSKdEhNPsiDWOZZSVSKC41N/c3KwTJdHZLpor+DnPgztO+TtcJeVmI3EdCT9cLhd5PB5dY+JEkYNPYDNNw6qecnSVeIgRXByyDdbtduumIjPCaPftEjOzkMfjoebmZsM78t5SsvYm97kVobLym1RVVRnMBDwEWzRBio5XAPTqq6/q7wcCAcMuBLz/5O1q5EWIIkHh40Hs73QzjVTMcDLsgiHMzKTTpk0zaKzJStO8TUThIxHTyBcHs1yOYDBIo0aNMsyPWbNmGbRLJ/63XKComMbYsWP1iomqcFdXVxxBETWNsrIyS2LK0+nt7dXtr/LBCYrX66WZM2caOp4/w00UIhHjjMaMsPGtSsQ8w+GwTsBFiV4eXGaTlWthfMByLUxsK5kx+nw+faJVVFQYJqYcmeTxeGjEiBEGAiAT+AULFhjMUwsWLNDTNLP5appGV1xxheGa6FsR25uXuaSkRF/AKdalq6vL1GfV3t5OgUDA0FZ+v1+f3Jwhc6lZdkoDoJUrV+rpiVqCSNQqKyst62Fm+xfHQDAYpOHDh6dV6jSTfCsqKnQm5yRiC0js1zLblQG4ZN7lAk8y9eKCgLy2yiqNXC6qM9OcxXHW1NQUF+HI2yhTW96kAzlnGgBaAHwEYLdw7QcA/ghgJ4CfA6hwkpaoaYgSvdkhqrVmIbWxxnF0cOLKGItTMRO9Jy465ASC3+PXPR6PXg8zjUkOMyWyjvqStSPOuLikLpaB+0845s+fb8hDNstomkaVlZWGd0TCyBmrKCHyEGMi81DKsWPHxkmh4sI5Xk6eJg8lNus/s/U4oVBId6SK40b2bfH2MZOmxa1mxHYVNRMzwpgoRh+I+jRE8J0H0mVikU1HXGsQ9zwb7E4DsjbK20VkTGVlZUmtcwKS82mksv7HDMmauOw0HHn7oObmZsOY83g8VF5erkJuTRMGbgBwjcQ06gG4Y/8fA/CYk7Rkn4aVaUIkBABMub0oGZkdsj2VaxGTJ082SNOyf8Xj8eh5c+1ENMG43W7dB8IHt5n5Ra6HOAmsnLNmDIQTqbFjx5o+JxJ4cWIC0dBS7qvhoY/iM/KeWSJx5b+83GabKlZUVJDL5TJMLE3TDMytpKTEEEos+iIS1VvcSkY0HfH7lZWVhqg7kWCL5ilxMaaYjygh8pDbRCYSmWkMGzbMsJuBWIZ0rNswc76vXLnSwMjsIrbsNsLkZjk+J2XGnYqvhmvFcnBDJr+Bk4qJy26nAHk7oGAwaGCuZsEnud7qhyPnTCNaBgRFpiHd+zKAl5ykYxY9lY5DljzFjh0zZoyB+ALx4YAicTfztYhqKnDJUZ7o8Hg8lgTdzGzD8zMLU5TDk+X3+CFObpFpcOKQiLABMGg/XJLi5bayj4v2fXn9QiKhQOyP0tJS6urqMpgsRU1QNGuKjCUcDhvMmByyP0KWpsW8PR4PDRs2jKqqqixNFYFAwBAswfPn5j4z5/pg1yaYaaPi+iAn60vsFqy53W7Djgpm/cUFK6eQ/T1mY1P+nEFNTU0cwRfbX+4PsygweRU67/NEARWJdq/mwoAo8JiZp3j7mwWe5Mp8VQhM45cA/tZJOuI6Dd74Zv4KuYPsiI68yy0QtZHPmjUr7nkuRfAJwe9bSY3yOg0+sLh5w66MoVCIrrvuOsM5Z06yLVk8nDAms4nJ8+BaEic6ZtrQsGHD9MlktxpY0zSaNWuWQUucNWuWLtHXLV1PgNEcYkVA+C7EidpPNIHJ40HUOLnmJzIaUcqUfTtyu5pFnsmSq2yitNIs+a4AVnueJWNCsdJGZ86cacjDTgtIJP0CMAgCoimVt2VVVVXS5ikzUyNvCycOfjkqjwewiGZluY/lfex4nol2TEi0e3UoFKJVq1YZfH4ej8cQ4CJGWYqfpub3B7uFkROYjSmnTMONHIAx1gygH8BLCZ5ZAGABANTW1qKlpQUAcOONN+Kqq67CmTNncOHCBUQiEfk9zpRMsXHjRtxyyy0AgJMnT8bdr6ioMH0vEonA5/Phl7/8Jdra2vDkk08CAC5evAgiwqlTp/Rnef5EhEceeQSPPPKIfk6XmGZCHDp0CGfOnNHPefrV1dVYvXo1HnjgAdP3uru7bdMGAE3TUF5ejjNnzqCrq0vPIxKJoKenB+Xl5RgYGMDAwID+zoYNG9DW1oY1a9bgW9/6FkaPHg0iwtNPPw0AaGhoQFtbG55++mkQEbZs2QK/34/29nYsXLhQv79mzRr4/X5s2bJFT/sPf/gDPB4PAOD06dN6P27YsAF//dd/DSLCuXPn4PP5EIlE4vpZ0zREIhG89tprAIDGxkYAwHXXXYcHHngAX/7yl9HZ2ak/39/fj76+PgBASUkJPB4PvvCFL2D06NHYsmULNE1Dd3c3HnroIUydOhWzZ882tB9jDB6PB5s3b8aECRNw8OBBuFwufPKTn8S8efNw8OBBfcxomoaNGzeivr7e8D4RQdM0nD17FuXl5Rg/fjyuvPJKvPvuu3rbvPbaa3j22WfxwAMPYOrUqdi1axeWLFmC9957DzfffHNcv/K+uf322wEAt99+Ozo7O7Ft2zb4/X643W643W64XC5D+4t47bXX8LOf/QyPPPKInucPfvADVFRU6HmWl5fjpptuMrQ/EcHr9eKyyy5DT08P+vv7LfPg+bz44os4ePAgABj6lTGmz+0tW7Zg+fLluP766/W2HT9+PCZPnozf/va3AIBwOIx/+7d/w+zZs/VnXC4XPvvZz+Kll17CrFmzwBjD4sWLsXz5cowePRqapqGnpwfLly/H1KlT8Y1vfANerxe9vb3Ytm1b3PMA0NPTg4GBAfz+97/HwMAAOjo6UFFRgZ6eHmzZsgVf/vKX8YMf/ADHjx/Hr3/9awBAX18f/H4/Ll68iDNnzuhzdMuWLejv74fX69XpyMWLF/XxmajtBgOrMQWgylECTjhLqgdMNA0AdwJ4C0Cp03RkTWPMmDGWphZRLRcl50996lOm0ozdwZ2o4nty6KXZO3Yaj/x8Ig2BOxf5OTc3JUrTShMRHcpyWDA367hcLkMduUTOpRJx23i7bRLcbjeVlZUZYv5FJ2nd0vVxJizEtBm+W6/X66VPf/rTlv0nX+N9EgqF9DEgPtPR0UGBQMCgvchSJQD964BmfcmlRwAGM40o2QIwRLDJ5j5+uFwuXQuQgx+Std3zvucQ8xSjp+wWQibqU9n/YHbYaUyyeYm/x/1nckScHG5uFQZfXV1tCOIYOXKkYezKYdVmny8Qyy0712XzlNfrpWXLlhmemTNnjiMTKy+DGNXX3t6ut2+mYDWmAFykfDNPAfgcgPcA1CSTjplPY+LEiXTkyJE4gmi2KIgxZutItTooWnD9sPJpJHPIZUjkbxCJmtX7qRy8Lb/2ta8Z2squ3HKYqJ3ZAID+vRNObEWfR93S9aZ2eE6AxbI6PfgYmD9/vmEM8PBifohrdeStYgAYPilrRRTFtuNbv5itN3ESgCGGTPMycVu5CJmQicSYMUZz5841lEkUOES/mBV4ma22vuB1l3dUAGDYIFRkTLKfhPuExHGSaKzK9eICgVgvTvQ5uE9J/NaO+OkAAHTNNdcYaIPo6/J6vTR9+nSDjyMQCMStY+Lh4NzEZRY1yZ8XzerifDPzjYpI50JGq8izWJ65YxoAWgEcBdAH4BCAuwHsB/BnAL+PHU85SYtHT6XqCBft6cmmIUcjiQMgFYKWzCFLa4nylK/ZESnxkB3hVnlYScPyHk3Dhg1LuABRlLQ40xg+fHic1paKf0b0/4iElU9wqz4OBoMGjcqub+XJT3RJGuaEPhmBgjGmM2PgkvTs8Xh0Kd+MuclMe86cOQREGZ5Y/lAoFCfwWBEgOz8VAHrggQcM2r/Y/3x3BbFtZF8ADwRw4uOz0uLEeojEXvQpiWHVzc3N5HK59P3feH/PnTuXwuEwTZ48mYBo5J7o25w+fbreH3xMcm1f9H+KfWlWTnkMivU2G3Mc6V7ImNeaRroOLpkkS0DkQ5yUyUzmRPfTUS4zwiefi9JiKtpNokNc7MevmZnA+OQUmYb8vW4ukYrbs/M8jhw5QjNmzDBMCjPzlJ2jO1Fd5Mnt5BDDfrkUZveOWWi3vAhUfNapdjh58mSD6YkzAattWuQIoEAgEMccGWO6RB8IBPS2sSJAAAwhtfJiPcC48NGsX8RFpvyZZcuWmUYTOtndQFzsyt8vKSkx7FTAr4tCHdckzExJgUCA/H6/YXcGt9ttMItybY8zWJfLRcOHD9frIe4Zx/MXI+B4OXk/iOZJcUyIW+KIjvJERD7VhYxWTAjAfyeiw/zIOUNwVEhh0jghrqJNG8w4wMzUaafEhUtHor3VSnpN9yESKSfbiCR7iH6Tyy67LG5Bm/isuHeOHH6paRpVVFToPgsANH78eP1dr9erbwlPdCl6qqGhwdJEJ5fTjsAQkS5Ry8/LBF08xG1gxLpb+TT4f26m4fuH8U0N+QJOszEimkzFcooMl4joiiuu0MeymabBmHETS+6vEOcHJ1Y82ke228sEyC6ix+57NPKc5Jqf7LcSI5Xs0pBDW/l1MTKKb5nDaYUcvqppGm3atMmwxqilpcVQlqefflpnKowxfazKQpW89kbsQ3nRrpWQJ9aba1xmq+kTmZPE55LBYKKncs4QnBycoDkxBXFbqUyUxEkwWAIrEoxEzsB0HaL6bRbfn8phZaoQB3Gid/haEMBoqvB6vQY/CX9WXC0+iZKUAAAgAElEQVTMiavYP5qmJQwl5oeT+1wal/Owajcz4UPsZ7MxI/a76K/hTEIk2Ga2f/lgjMW9z6XcsWPHGia46Mw128RS3k1ZPmpraw0+DW7+EYMGxP6Qw3QXLVpkWQd5QaQojIgOXyCeuCYa/3x7fLFtJ02aZHDWy8Sbj2Pub+DBC3xsMMZo5syZOhMRNQv+Pl+cx8HzNguQSGT+lu/xc97u4hycOXOmQbsJBAKWXzWsW7reAYtwBhQT07AiYmaH7EgSCUYqZh27/a2cSFtmAyjRudmkEQm6E0blxKchMj9h4NhOXlHq5OWRV3cDzswOvH/Ejy6JzySjCYoHj7gT87A6xDUVTsotjzNRzecMUWQ8TkyYmha/cwHf36q0tDQuD5F4ihFDcprymOfpjxs3Tu/z5uZm8ng8Bm1RNO/Ja2vkDybZtS2X0Pn44XPRaXvzABfGLq0yFyO4NE0zzAmzr3qKa238fj9pmqanwX0WMRNNnGlzwoQJej14mZ1EMIrt7eS+6NfiO3Bzc5XMxLmJMlWmUfSahjxJE3WA7KCsW7reNDLB6SF3Ogc/z4RPQz44rAag6KD82Mc+llIeMmOyOuQNCbm0JG40J6Ypt5MovfP+MZuogzk4AeEL7+yYBieuyTANs/5Zt26dToiSFSS46UgM0Q2FQlReXk7i3mt8I0xuzrCKQnIy1q2c7dyuL/adbKevra11vNsyEelmHtH3whmPE8IaDAZ1TYJrQmbPlpSU6HmGQiG65pprDGORM/FkrBdiOfgcMCuzlcaaiglb3NRS06IbnCbSNJL9KqXZ1vcoNp9GKmYlmWCky4GcDhNXMoeTTRIT7dbr9BAZoNW25CJhc9L+APQNCvnE46u1ef+k27EvmnmcMg0AdN1116UUYZcOwYG3j7wa2My5W1paqtv25YigRGNUDkkXBQXRLyIycCuTpOwIT9S2oVBID8Plh1lodqJxtG7dOsOaIrndxDTECC0xegq45K8jurS/mPw+l/Kt2kH+JIJ8iFGPokZo1jZmzIc71+UAGBFcI+TRh/K2L+Xl5Zbb4Vtt7QOgt6iYRiqHSDB4LLXdO6maQzJ5iHZhUcVPp3Quf8OAq8Jym4kbyYkEX/7KHt/lFgAtWbLEIAUtWbIkrn8A0IwZM+LW3phNNLv78loSO6Zh5jR1kpfTMjlNQw7HNNM0eB+I+1PxvaTEcphtkSNqFrxtiMz9IlwzAKIMi+84Kzp/rRY+yvXiEXd+v18PTpH3hbIb/x6Px7DoDbhEXMX5AVzSZhhjNG3aNN0nAUS/+yEKBokIOs9b7A9+blZ3OS07U6v8vGxS5v1ltlCSBy/w6EN5Z11RkDBbuPrQQw8Z5qSwH1nxMA2zT7GaHWbmqUTP80Z0esgO5GwcTk1H2cqDD2LetqJPo7293TQKSt4FV+6fMWPGpMXBzw+zPBIdbrebhg8fHidBWsXbJ/IriRE+Vof4DRWxD3j7Wvk0AMR90VHctVasu9lh9u0RTnStpOfBaIJm/gguHVt9utiqL4FLa4rMxpfZf+BSNJvdrgviuZkv08n8sGp7szbk9RaZuPgsF4ASfSHSbO+2UChEK1euNPSx/OkB/mE13vfCd3WKh2k4PcSJ6JRpBAKBlCdGNkxVHImeEevpxIYqTwpZWrM6xHbieXLpTX5WJIz8lzN1Lv3xNPggTnd0m1OmwRijqVOnxkm+ZpFPTvojWb+IvPMubyMgqtUlYgRm95xooVbROXblTGau8DzEb6HXLV0ft77ELg3+eV0rc49YJnmHXzEds/T5rgt2/SmaiJP1UziJoDPrV1HIMvNZmDENTdPowQcf1OvMV8bLbcAXgEprr4qHaaTDp2F2xK/qvDQBedRCogGaipPLzgQj19eJlCPWM5W2ku3dTo66pevjoklEtZ4TVvmjWZxxyP2TLgZsFUGXqK1Fs5toa5bL5HQhpP1hzgT4DsNytI64eNKuzoC1Zi76o0T7t/y9e15X+X3ep061Qg5RG+LjRtxhNtW+5uYp0cIgOtsrKiooGAzS+L97mYBLe5rJ6TiJNhTnh/jZYLN+cLlchnHHiX+yuwRwH6K4rkfcddhscSx3onPzFN+9V/Z7iWUuSqaRiiYgE4zKysqE6xzcbre+GDBRnuk0oyQaMPLkSPS8WM90+jrkQ0w7kRNb9GnwQzbtOSHoqbSbGGnjNA95bYHZxoLAJalfNPMM1pHPty2Xv1BIdCliziwPeYzIBMGJv4GvfxB9ZWbPygsfxc8lJ8pDdLRyk1rd0vVxX4hMlEY4HDaEMtsxGdHsogeHMKMvJhVGJc5BMxOs/B0cM4HIKt9gMEj79+9PODatQm7laCj5swyA0Q8GIC46Tujf4mEaVt/PSHSIBIM70+TO5wePW083EUvXYUeYslVuse2cRiXxBVacgIhfAky23KLEJR9i9JhoJ04lD854uCDhNGIs2YNvG8Lbii+ElLUZs/7nBODv//7vDed/8Rd/YWh/u/6UzR+Jnk/W7CaGdMomlUS7CJvlKe6OzNuK11M0rYq2f/5dj7ql63WGw4lvMsyeg59bLURljNHEiRMN88MqFNeprw2IMjsRq1atiu6uEAu5Fb9/AoBmzZpl6M8HHnhAD3O3qactPdZQIDh//nzctcC3/9Xx+0SE/v5+ANB/AaBu6XoQkb6n/1DEzTffjK6uLjQ1Ndk+y79B4QT8+xUDAwNwuVzw+XyYN28ehg0blnJZGWOorKw0vRcTMFBWVoa+vj54vd6U8wAAj8eD/v5+1D3YhvPnz6O+vl6/x39TRd3S9WCMobe3F6tXr0Z3dzeCwSAikQj6+vpQUlKCz3/+8/rzmzdvRm9vL4DotytEbNy4Uf8/depUfPDBBwCA48eP69cnTJigvy+iqqpKbzdejkQoKSlJqp6MMfj9fjz++OP6N044ent7cfjwYT1/K/h8PgDADTfcgP7+frhcLrjdbsuxOG/ePH2s9ff36/M9EonA6/Vi2bJl8Pv9hm/F2KGvrw+vv/66fr5kyRL4/X7T+u7fv99wLn/zh383RH5PRjgcxmOPPQYg+t0en88Hxhh8Ph/ef/999PT0AABaW1vxyiuvYMOGDejt7UUwGMTu3bvR3NyMgYEBBAIBPPvssxg/frxpm8njyQ4FwzS8Xi80TTMQgkP//PWk0uCD026Q5hs0TUNNTU16E2XRrne73fjggw9QVVWFDRs2pJzcjBkzcOTIEQND4B+0Kisr09vc7/fj6quvTpnoRiIRHDt2TD+vW7oe69atg8fj0QWL8+fPw+Px4Mc//rHhXaeTo7u7Gy0tLXC5XIbrGzduRCQSQd3S9XGEIBVcccUVmDt3LhYvXoySkhIcOHAA3d3der7iB8Heffdd9PX1wePx6HmfOXMGXq8XO3bsgMfjwYULF3DXXXfp74hj5sMPP4wj+OFwGA8++KB+fuONN+ofwhKRLFERMTAwgN27d8cxDC32AaRHH30U4XDYNh1N0/Dqq68CiI6BgYEB9Pb26h9/4nC73Thw4AAikYjeniKsxp1cR03T4HZf+kZdSUmJ4aNTVpBpCz+XhQ2r50SUl5ejpaVFf2fFihUIh8NYsWIFnnnmGX2cPPzww7jjjjuwePFi+Hw+9Pf3o7OzE3fccQcYYzh69ChOnz6N8+fPmwpSyY7lgmEaPT09+lflOOqWrs9hifIXTghy3YNtAKJalzjJUkF5eTneeustjBkzRv/ymIjz58+jp6cHnZ2duOGGG/Daa6/pX09MBxobG/H8888jFAoBTEMoFMLzzz9vIFRmEp8dBqNNOCG0zc3NWLduHVavXo3xf/eyTuSrqqqgaZqBAXPpWKwD/2IcEJ34fr8fy5YtQ3l5OdatW2c7P8rKyrB69Wr9/PXXXzeVRMU87erFGENtba3h3OfzYfHixXFpilK/FThTMPtCJwDdZHLgwAEwxtDf34/KykpomobKykr09vbqz7pcLly4cAEjR46Mq4eZNiBqIuP/7mW0t7cnrDsvjwyPx4O6ujpomoa6ujpTxmyGSCSC/fv362muXLkSfr8fK1euFE33eO+997BmzRqEw2EQEc6cOROnVRIRTp8+bSgfb4Oi1TRyAaedmyz451WdQmaWiVBaWpq0CWGwOHfunOlkkQlIRUUFnnrqKdTX1xtMKulAY2Mjdu/ejboH20wl2/vuu88xEygpKcHs2bMdfzpX1kgAZ9psY2MjHn74YSxevBgHV/0NTpw4gWnTpuHs2bOIRCI4evSoPgY5MZcJrMfjgc/n0wnc5MmTsWbNmrj6m0EktgDw+c9/3nbsmBEd+b5oFgOi/f7EE0/EMQ6Px4OxY8dC0zQEg0HT/olEInF5MsYwfvx4+P1+EJFuYubPnT59GpFIBKdPnzaUeWBgQP+crMwkTpw4kbCuB1f9jaH8TU1NlvNYrofX60VLS4uuwTo1m2qaZugP3q7Hjx9HSUmJXgeXy4WBgQG0tLSgp6cHFy5cMKTBzbm8/hz8/aLVNGpra+OIUKaRqk3cDlbfIecwsz2fO3fOUdoXLlzA7NmzTSdBtkFEcd9hJ6K0MwwnWL16Ne677z7HfdrX14cLFy6gqsr+s8lmtnGnJlCR2QHA7373O4PvjTMLzjzOnj0Lxhiam5vR29uLjRs3orKyEoFAAHVL15syTEswDaNGjdLLWlFRYctYReHFCbHhGtOwYcPw1FNP6dfdbjd6enpw+PBhRCIRHD58GCUlJXC73bqGxBiLY8iRSASRSAQffvghvvvd78ZXKUYjxF8RX//611FdXR3H8OzMv1wYAYCrrroKW7dutRwbct+fP38ed9xxB3w+H+644w5T/6wZIpGIgQG0t7ejt7cX7e3tBmbS39+PSCSi+3LE8cg1jHSiYJjGiRMnQESWxJAxhl/96lcJB32yTkynnZtumBE2cSDa1aOtrc10EvAJKEqrmqbpBCkTmlV1dbX+n0uEgwGfNKmAO3qTMWs61fDSCTPf2+TJk3U/1Be/+EW8/PLLutnnzjvvxKFDhyzTq6io0MeUaKcHRXDq1CkwxlBSUoLOzk7HTmknqKmp0aXrsrIyQwBKf38/enp6dAI3MDCAnp4ewzNEZMqQXS4XJkyYgH/8x380LV9rayt6enrQ2toaV95XX31VN+Okil27dmHevHmmgpw8J/lc++ijjxCJRPDRRx8ZrttB7K/GxkaUlJSgsbExjjYl8pWIbZiO8VwwTMNOlSIifO5zn0s4GArFEW5WPll6MHuuvr4+YboDAwPw+/2GAVdaWmoaVZYMrEwaXMpMJzPyer2YPXt22tIzgyilOnHSphsjRoyApmkYMWKEfk3URjZv3ox9+/YhEolg3759ePzxxxOm19XVpRMLQx8zDZMnTwYRobKyEhs3bjTVckWYmezMtP+SkhJcdtllOmMLhUJxz/h8PowfP143N5kxJLOxw/1vFy5ciCO+Fy9exE033YSSkhLccccdBh9bVVUVzpw5g0OHDqVMAzRNQyQSsYyecrvdBu1o7dq18Pl8Bvrl8/mwdu1aR3mNHj1aP+fRiJ2dnYa2crvd0DRNN0+J6OjoMJybtWcyggBQQEyD2xCdhIXmPViyzc4QDAZtn9q4cWNcWGh9fb3B7itLKOfPn0/ZIcZhRWgikQgOHjyYVJiuHYhIT28wUT2JwCO07r777oyknwhXX301xowZAwAYM2YMrr76asN9xhguXryI+fPno6urC/Pnz8fFixdTctqLJpclS5aYRk/JRMdMQBBNkFyL6+3txd69exGJRLB3715T7VBOyyxtKyGR973IBN1uN7xer16HU6dOwev1GrUrOBOOuPYl49577wVjLC7N8vJyMMYwduxYAxFubGxES0uLIUijpaXFkQmxs7PTEHbNx31fXx/6+vr0MvBIstmzZ8eVua6uznBuNmeSCT0GCohpPPnkk6ioqMCTTz6ZtTzNGljTonZgKzDGBh3Dz+H1emODjTlWZ+WwUCf+A9FEYIdktYZ0hKbKcLlcYIzh3nvvTXvaPP0JEyagtbU1bWlaESEZO3fuxLx58xCJRLBnzx7s3LnTcJ+I4Pf7sWHDBlRWVmLDhg26Q3gw+Kd/+ifT6CmnREckolbjX74eDodx4MAB3SFvptVZ1YuIMHbsWINkvXDhQvT19cV8DQxVVVXo6+vDwoULAVyS1J3AzJ8CXPKNyfd4MEh3d3dcPeyCNKxQUVGBZ555xlAm/iuuPxk7dqzp3OVBA2K7m60PSdZ3WxBMw+/36xXzer2YOXOmfu50gKYCM4InrxOQIUZxWKHuwTYsWrTI9N6iRYt0raC7u9sw2PIBybar1UK8wcDtduO+++4zhIumEzxsMRwOp00AICJb04/L5UIkEtHXTvBzmUDdeOONOHr0KIgIR48exY033pgwXXn+yAJIIBDA2bNnTSVVGWZzorKyEv39/bp5lIhQWlpqMD2VlpbGzYuBgQGUlZUBiIb/mhE+s/zC4TB++MMfxs3D1atX4957741FNRG6urpw7733Ohonct9EIhHT8HGeD/eN8TpzZsp9FnamYifQtKj5kIMzZm6O4rhw4QJ6e3tN17zY0SMz64NtuZJ6OkfgC1rGfeenWLFiBXbs2IF77rkHgPXqykxIuDLGjRunm36SxerVq7Fo0SLDZF60aFHGCGEilJWVgTGmT2BeHjPYET4ZXV1dmDRpUsJn5ImXCHVL16O7uztt7cQXJYqSshhxkgmmZ4WmpibTsSyaZF0uF9avX2/wQ61fv95UKubg80f8FTFnzhxcuHDBsRlR7qeurq64MOqamhqDFmEVnSQuyHQKvr7EjKGLBN1qnDQ0NMQF1KQaKclNwqKfMV0h5Vzb5BDNUyJ96+zsxIMPPoiWlhaUl5frdZFpIL8uCw1Cf551Uq6CYBo1NTVYvnw5/vz/34bly5dj4cKFhsHAY7m5hG7FMNK1BQQQZRji1iNO0xTD9JwMcDPwQd/Q0JBcoS1w/vz5OImDl8sqrFC+bjYRgegk+tOf/pQwf3niWSEd0puMHTt2YMyYMXF2bo/Hg7KysrSHKwLWzJGbPkSJUtaoRDu2+Cvb2GU8+OCD8Pv9WLJkSdw9vnKeL4ozEpVL45qXWxzrVmbQjo4OwziVfSODAWMMp06dSilww+VyYefOnbjssssM1xONvXHjxiVMMxWTsDM482UCUe1z9+7dGBgY0LekETFhwgR0d3cjEokgHA5j+vTp+j3O6AAknqgxFATTGD9+fErEVUY6oqes9qq67777bN+tqqrCqVOnUs6bg4fUtrW1DTotO5w6dSqOQZjVwyrMl8OOqYoTjw9i2aGf7vUdw4YNsyTgfX19cLlcg1ooKdfZ7Xbb+mLsBAmrkEmr65zgcUGKl0kkhOFwGAsWLEBnZycGBgZw/vz5S1tmCHXgUV3Dhw+3LL+IHTt24LLLLsOOHTssn0klwCUSieD8+fMIBAJJC4CcqDLG4vxzZmNBFg4zBdN6SL5MrhXPmDHD8FggEMA3v/lN3Sf1+uuvo7u7W1+7s27dOgDRFf98ZfupU6f0XQOSZXQFwTRyhWQ0Eytzk6gBpYNhZAI82sMq9O7UqVODrkeyjDpz0puxTGYmmY6ODoRCIZw5c2ZQce11dXUGDcDlcqXFF+NyuQxraxKZpg4ePKibUYFonc0I4aFDhwwb4vGxwMN8+d5enGDbBUTw6C4i0qO8zJBqgAsR4dixYykJgMeOHYvbJoSnKUcbZpphcN+mXI9FixbF+TK3b9+OMWPGYPv27YZnV65ciYGBAcybNw9erxfz5s3DwMAAVq5cCSB+54HFixfj4Ycfdr4IVIJiGgnAJ2OiSSkiVXOTU1hJxYMNPeWx9063zUgGmQqLHSzq6+vR3d0d57Pw+/2YMGECgKgElzqiobEDAwOoqqpK65gYGBgwmKfsot4OHjxoSwhfffVVg82cbw7IcSkqCXpUkhUYY/jwww8xceJEaJqGiRMn4sMPPzQVvlIN9/Z6vbj11ltN139YQTZvcu2rvr4+o8JJIjj1bXo8Hn2rlWAwaGDajY2NePzxx3UfktmuwqlGcJkhP2d0niCZUNRs4MUXXzR1lL744ospp1leXp7w3A5c9bVCNgISUgH3o4j7B7ndbvzyl79ME3EndHZ2oqysDP/yL/8yyLTikeq+QYNJU9z7KBGmTJmC1157DR0dHYhEIujo6MBrr72GKVOmxD1rtpDRDuP/7mVs2LABf/jDH9Dc3Oz4Pat1TLnY1kaEE2Gzr68PJ0+e1LfmkZl2Y2OjLhgMlinYQTGNBMi3FeSNjY146aWXDAuFXnrppZQHyNSpU3Hu3Dk0NDRg7H0voqGhAefOncPUqVOTKtO6dev0MhUSRBMYAASDQX17af7rBKbScmy1tdPNA5NFOoM60o3Tp0+DMWaIjGKMmQYVyJsLOsFgTCzZMHumG9yEJUeaWYXtZxqFNcsHCTEmPBESraHINdKpZu7cuRNTp05FW1sbDv+fv0VbWxumTp0at6AsmTIVKsaNG4f9+/djxIgReqjj/v37bSNnAHMJPR39YwX+ESIgftuKfADfB0s274r7YzHGDKYlvpDV6bb+mZam8wn5FJ4PDDGm4TQmPN86KZPYuXOnwd6dLMMoFnCHsehktIucyZSPyQ6RSMTgX8iWCXDUqFG2OyJwiBvlDQwMxGnrt9xyC/bs2YOmpiYEvv2vmDdvHvbs2ZPW76wUEzLtL00GQ4ppJIN86iSF7MCJw1iEvA+Rk5DawcLlchki2HhkW6a1Db42IhK5tDOuHRKtJ+L+haeeegqH/vnrGfvOikL6MSSYhtVqz0x9L0NhaEDehyhdIbWJwFeNi/42edV4JiCGJ/f19dn6+fgiutraWuzcudOUqSXyL2RyeyCFwWFIMI0f//jHcXHlZt+QVlBIFtnWSDmjEleCZ5pRpYKBgQFcvHhR38Mp2QhEq8WyThbRKmQWGWMajLEWxthHjLHdwrUqxthmxtifYr9Z2djHyTekFRQKBatXr9bNaPlsOuUmNLsQXTMMJb9ioSGTmsZzAD4nXVsG4DUimgTgtdh5VpDOqCMFBQVr8EV03EHPAwOS3TtM+RXzExljGkS0FYC8gf2XADwf+/88gDmZyl8hd5Dt1/kWEqpgDrvP/jrdISGTO78q5B7Z9mnUEtFRAIj9XmbzvEIBYmBgIBqWyaLhmfmyol4hMeyYQjKLXQtxEZ2CMyTeTzmHYIwtALAAiH6DeMuWLQCg/3LYnafyTj7mUSj1mj59Ot5+++2oHZtIt2dPnz4dJ9KUR7G0Vb7lYbcHmdU2I/lWj2LKI1f1Sgj+ZadMHACCAHYL5+8DGB37PxrA+07Sufbaa4mIqG7pehJhd57KO/mYR6HVq76+nhhjBIAYY1RfX1+Q9RgqedTX1xOAuKO+vp7qlq43vcePfKpHseWR7TwBvE0O6HG2zVNtAO6M/b8TwC+ynL9CFqBME4UFu438rD7wZPfhJ4XiRCZDblsBvAXg44yxQ4yxuwE8CuAWxtifANwSO1dQUMgxEjH6F154wTS44YUXXsh2MRXyAJmMnmokotFE5CGiABE9S0SniOhmIpoU+5WjqxQUFPIMjY2N+MlPfmJY5/STn/xEha0PUSj9UkFBwRaNjY1obGxEcNkr2P3oF3JdHIUcwrGmwRirY4zNiv0fxhhL7ms9CgoSrvqHTYZfBQWF/IcjpsEYuwfATwGsiV0KAHg5U4VSGBo4c7EPBx79As5ctP50qIKCgjlyJXQ51TTuAzATwFkAIKI/QS3MUygAKG1GoViRK6HLKdPoIaJefsIYcyMap11UUASm+KC0GQWF9MIp03iDMbYcwDDG2C0A/gPALzNXrNxAERgFBQWFxHDKNJYBOAFgF4BvAXgVwHczVahsQWkWCgoKuUAh0x6nTONLAF4goq8S0W1EtDa27LygoTQLhWRRyJM917jqHzYhuOwV/f9QRiHTHqdMowHAPsbYTxhjX4j5NPIaQ2mAKkKWPRTyZM81eNuls/3U2M8+HDENIvofACYi6su4A8AHjLFnMlkwO8iDRf7NxADNVyhCpiCjUIlpsuVWYz/7cLy4j4j6AGwA8K8A3kHUZJUzyINFDZ78RiaIWCppJvtOvpQ7WRTqfCjUcg8lOF3c9znG2HMA9gO4DcAziG5trlAAsNPKsoFMEINU0kz2nXwpt0JhoVA1PSdwqmnchegK8MlEdCcRvUpE/ZkrlsJgYGWqS6dWlo+TIh/LpDA0UcyCgVOfxtcR3eb8FsbYrYwxtRo8j5ENppCNSaHs24WFYmXaxVqvVOHUPPVVAL8F8FUAtwPYwRi7LZMFKxbYDbh8HZD5QIDzoQz5gkIYR/naX4Ntm3ytV67g1Dz1XQB/GTNNfRPAJwH8z8wVqzDgJKzXbsCpAXkJhUAYcwU1jlJHutsmlXD+fBy7vCzBZa8kVS6nTEMjoo+E81NJvFs0cBLWm4+DIx3Ih4gfRRizi3wcy9kok1PTbDLzXh675Zcvw9Tnp6L88mWO3jeDnEaySHVZglPC/yvG2EbG2F2MsbsAvIJo+O2QghOiZfdMstJ0qtJAuqEI9tBDPvZ5NsqUjai8c3sfxa47d+Hc3kdTzlNOI1tw6gh/AMDTAK4EcBWAp4nowUwWrFiRrDRdLNrMYKWiQkaqgkIh9W++YCjtBJErJLO472cAvgfgHxHd9bYqU4XKFmRCViiELR8lQDvkSirKB6QqKOR7/+YDc5Pn7FDaCcIOmeofp9FT32KMHQewE8DbiK4IfzutJckBZEI2lAlbLlAoTLoYkQ6Ckg/MLR1zNh+Yn4x0mKXl/klXPZ1qGn8HIEREQSL6GBFNIKKPDSrnNEMRoNwilQGZDSZtNy6SLXehjDO7cuYDwTdDLto3H9siFY0pW2urnDKNDwBcGFROGYbSEnKLfJx4gP24GKwDE8hPn4Rcznwokxnkcql5nDqyNQedMo2HAFB9S6AAACAASURBVGxnjK1hjP0zPzJZMBm5GPT5OtHSjXyJ0JKRCakzE2kWgk8iH8sE5KZcQ2VeZwpOmcYaAO0AfoOoP4MfWYNdnHM28sxX2LWFU1NFttvXDpmQOpUkmzvwMZXrcZXsvM6HuZBPcMo0+onofiL6MRE9z4+MlswGqUz+fJQw0jEg7doilbZSxDWKQiEYhVBOPqaSGVfynM1FPeW5kCvmly/0yynTeJ0xtoAxNpoxVsWPjJYsA8hHzSETxLkQCEgmkIl6FwrzzIdyZsP0l0o9ky2X3fNOmF8mwvnzhX45ZRp3IObXwCXTVMGH3GYDubDL202sbDCVXEhFxRp+WSjIB8ZlhmTLlY56FHM4v9MV4RNMjrwKuc0GnBBb+Zl8tMtnYwCnIhWlWyJMBdmQ5vJVE0y3KUgxYOfI1zFhBqeL+/7G5Lh5qH1XwwmxLSaJQkQ2BnUuJMJcIF/LnQ5TUKL0ihmDnR+5GBOp+mbcDp+7G8B1AF6PnX8W0UiqyYyx/01EP0mmsPmM4LJXMGKYx9Gz0UbnNksA+ELay5ONPJzg3N5HceDRL+j7+uQCvC3S2Q6ZSHOwMCuTfE2U4v/wv+pzVdS8Q67mSz7OD7uxzcsMIFbuWx3l49SnEQFwORF9hYi+AuAKAD0APgVgqcM0Mg6R4KfCRXkDOp2EqUSDJIts5JEK8iGKJV/THCzMypSOXVGHAvJ1vmQKIs3Llh/FKdMIEtFx4fwjRL8X3gkgL0atTPCH2uDJNvKR2OYKg10nU6golnrlYz2cCL3JCrnpqqdTpvFfjLH1jLE7GWN3AmgDsJUx5gfQlWymjLHvMMb2MMZ2M8ZaGWO+ZNNIF5IxR6UDQ5XAFDMysU4m3UjHuMrElh+5GO/ZCFZxgkS0JxNCb7rq6ZRp3AfgxwCuBjANwPMA7iOiMBHdmEyGjLGxAL4NYDoRTQHgAvD1ZNJIF5Ll1OlAIRCYYkO6BQO79PKR8adjXGXCJJaOciXbv/kwx3JBe9IFpyG3BOBNRLcS+TWArbFrqcINYBhjzA2gFMCRQaSlMEhka4Wr2eTOtKaX7snpJL18IEpDBYVMfAsVTkNubwfwWwC3AbgdwA7G2G2pZEhEhwH8EMBBAEcBnCGirARy56MEmC1kWhW2a1uzye1kwmeCqWTbJGmHTI3LRPXM57lgFtCSj+XMNvKlLZyG3DYD+Esi+ggAGGM1iGocP002Q8ZYJYAvAZiAqD/kPxhjf0tEL0rPLQCwAABqa2vhA7BlyxYgwa/d/3N7H8Vzn/Pjrl+FLZ+zSiOZvDP1m+q7vM6Pf6YkY3mYta1d/5hdS7XcifIUz9OVplX62Wi7dPS5WZ5iiOaWLf5B18vsl4ek+j3Oyp3KuEq1zVL5Tde7Tp5zQr8GUxbHICLbA8Au6VyTrzk9AHwVwLPC+TcBPJHonWuvvZbqlq4nIjL81i1dT1d+byNx8HtW/+Vf+b98PuW5KfrhNB27ciZ6Lp15OGkbuzzSUe5EbW1XrmTqb/W+3Xk66jHYthls3zspZybySEd/pLPcuahPuuZDKnmkuywA3iYHNNypI/xXjLGNjLG7GGN3AXgFwKvJsygAUbPUpxljpYwxBuBmAHuTTSQbtsx02KazYYKR80hH2ww2jWyp0tkwNeWbOWuoQ/VHbuHUEf4AgKcBXAngKgBPE1FKi/qIaAeiZq3fAdgVK8PTdu/liz3PCZIZ1Lly5GV64qXKcHPddvI4y1T/FCvhK7TAhnxCoYwJp5oGiOhnFP2mxneI6OeDyZSI/hcRfYKIphDRN4iox+6dfI1ICS57xdDZ2RrUgxlg+Trx0qGVDXbiZWOc5Wv7m2EwTLyQBD0ZTsZZOol8LoXHZOuRkGkwxs4xxs6aHOcYY2cHXeIChMwgctHZxaqd2MGu3oVEjAsBg23PfBX07OBknBXDWON1OPDoF5KqR0KmQUTlRDTc5CgnouGDK3LhoRgGSqoYynXPF2Ray1KwhpO2lZ+xOy9UODZPFSLSrUIqKKSKdAc7JHtfIXU4aVu7YJRi6p+iZRr5rEImS0AU8ytspDIO83GrkkL2USikD0XLNPIVyTp7U7U7ZgOKkV1Ctp2iufAXZCrPfBhH+VCGdCAbJjHFNPIM+aodyTArZ6FOvEybjooZ+dh2Zpp5onLma/8la2FwYhJLxxxVTEMhLcjXiWcHtQ4jdeRjn5uZpfOxnHbIhIUhXe0w5JhGKv6EYp/8CulFJnwY6YAaywrpwJBiGslO5kKUUFJFJpztikg5QzbGmdM88rHPhsJOx4WEIcU0FMyRz6qwQvaQj32WiTLlYz0LCYppKCgMUShpu/CQD31WUEwjHxpMQaEYUAh7pCkYkS8aUsEwjXxpMAUFBWdQc7Y4UTBMQ0EhW1DSsYKCNRTTUFAQoKRjBYXEUExDQUHBMZQWpqCYhoJCgSLbBFxpYQqAYhoKCgUJRcAVcgXFNBQUFBQUHEMxDQUFBQUFx1BMQ0FBQUHBMYqCaYwfPx6MMXQ8disYYxg/fnyui6SgoKBQlCh4pjF+/Hj8+c9/Nlz785//rBiHgoKCQgZQ8EyDM4wZM2bgyJEjmDFjhuG6goKCgkL64M51AdIBr9eL7du3Y8yYMfp5T09PjkuloKCgUHwoeE0DAHp6etDQ0IATJ06goaFBMQwFBQWFDKEomAYAnDx5En19fTh58mSui6KgoKBQtCgK8xQAg3kqFVx55ZXYtWsXAIA9BkydOhU7d+5MV/EUkkRZWRnC4TCAaH/4/X6cP38+x6VSUFAoGk1jMOAMQzRx7dq1C1deeWWuizYkwRlGMBjE/v37EQwGEQ6HUVZWluuiKSgMeQxZptHa2oopU6agY2WUQXi9XrS1taGmpgZtbW0oLy/XNY9UMXLkSMP6kZEjR6ap9IWFK6+80tAOdsw4HA5D0zQcOHAAEydOxIEDB6Bpmq55KAxNzJ49G5qmoeOxW6FpGsrKypIaVwrpwZBkGq2trWhubsaePXsAigCIOtOnTZumaxrnzp0bVB4jR45EZ2enfh4KhdDZ2TnkGIeoxXE40eIikYghjDoSiWS6qAp5jNmzZ2PTpk1YuHAhAICIEA6HUV1drT+jrAPZQVEwjWAwCCLSj2AwmPD5hx9+GM8++6z+PABUVlait7cX1dXV+MUvfoHa2tpBlamzsxOhUEjPY/fu3TrjGErgDOMXv/iF3hbc/JcIHo8H27Ztw+jRo7Ft2zZ4POobDkMZmzdvRlNTE5544gl9zgaDQZw6dSqpcaUweBQF0zhw4ACqqqrAGENVVRUOHDiQ8Pm9e/dixYoV0DQNjDEAwOnTp7Fnzx4wxsAYw/Hjx5Mux+zZs3V1GQD27dunp8cYywnDSNY0BKTfrPbss88mPDdDX18fJkyYgA8++AATJkxAX1/foMoApNYWIkTzCGMMs2fPHnSZMoHB1jNXWLx4sV5un8+HxYsX6/eICI888ojh+bFjx4KIwBiDpmk4c+ZMtoucEuRx5PF4kp5vidoq0ygKpqFpGk6fPg0gSvw1LXG1hg0bhl//+tdYuHAhurq60lIGrj43NTXpafb19WH48OG6ieXo0aNpycspUnHwc7NaKBRCR0dHWsxqd999d8JzMzDGDD4NztxTxWCDHUTzSFdXF5qamrBp06a8YxyFGtSxePFiPPXUU1i1ahXC4TBWrFiBp556SieGjDE89NBDhne2bdsGAOjq6sLChQvxxhtvZL3cyUIeR16vF/39/SgtLXU83+zaKtPICdNgjFUwxn7KGPsjY2wvY+y6VNPyer2IRCKGSRKJROD1ei3fCYfDKC8vx1e/+lWUlpYa7vE0koWoPo8YMUK/fvbsWfT19eVEChJNQ9zsZqfCc4axe/dujB8/ftBmtalTp6KtrQ1f+tKXcPLkSXzpS19CW1sbpk6davnOuHHjQEQGnwYRYdy4cSmVAUitLUTI/fvEE0+gqakJmzdvTrlMmcBg65krrF27Fo899hjuv/9+lJaW4v7778djjz2GtWvXAgBuueUWPPnkk7j33nsNc6m6uhp9fX04fPhwroqeFORx1NPTg8rKSly8eNHxfLNrq0wjV5rG4wB+RUSfAHAVgL2pJsTNFmLkk3jdCsOHD8dNN92EkpISANAlWZ7Gxz/+8aTKQUTYsmWLbooSUVdXhz179sRpQIsXL4bP59PVUieSgmgC0zQtTtIVTRMA8MorrxhMZG+//bZtHqdOnTK8s2/fPgCwzDMRdu7ciXHjxhn6Z9y4cXFrYER1+6OPPoKmafram+3bt8Pr9eLgwYOO8+UQ22Lz5s2GeiVD8IkI06ZNw5QpU+ByuTBlyhRMmzZNt6/nE7Zu3Wqo59atW1NKR2w7OwzWdNfT04NXXnlFNxlrmoZXXnlF391h48aNqKqqwpNPPomKigr9vZMnT+rjSryeKjJtgjQzs3m9Xt3MxhjTrSZW6Onpwfvvvw+fzwfGGHw+H95///2kdsIYTD2zzjQYY8MB3ADgWQAgol4iStlGxKNqamtrsXfvXt2BbRdtc/jwYV07iZVD/yWilMwxe/fuNaTJwc0ZYpm4irlixQqEw2GsWrXKVsWUTWALFy40mEhk0wQADAwMwOfz6RL7kSNHbOtx7Ngx/dkRI0boDNgsTzu0trbC7Xajvb0dvb29aG9vh9vtRmtra1xbcHW7rq4OkUgEoVBIb7uenp6UJrAY7HDx4kXD2o+LFy8mldaSJUuwevVqdHd3Y/Xq1ViyZEnS5ckGurq6DObFVE2wYtslQjpMd4wxtLe362ksXLgQ7e3tugA2e/ZsdHZ2Gsy/ADB58mR9/gzW1JwNE6SZme3YsWMA4HiOapqGZ555RqcdK1aswDPPPGNrluewqieASU7ez8WK8I8BOAHgx4yxqwC8A+D/IyJDED5jbAGABUCUIWzZsgUA9F8ZS5cuxaFDh7B06VLcf//9hmet3gGA3/zmN/D5fOju7gYA/PSnP8X3vvc97NmzBzU1NabvJ0qPpyli8+bNcdLemjVrcM899+Caa67Bb3/7W1xzzTW45557sGbNGoy5/3OmeW7atAkNDQ24/fbb8e677+L222/H4cOH0dbWhrpp38auXbswY8YMfOc738Hu3bv1d7u7u7Fjx464ciaq15EjR/DGG28YTAFmedq1zfLly/Htb38bjDFs27ZN16iWL1+O0aNHm7bFvn37EAqFsG/fvpTyTNQ/Y8aMwa5duzBmzBhDwIRdGj6fD+fOncOPfvQjhMNhrF27FufOnYPP57McZ+k+d/oMAIwYMQK/+93vDKbSVPOwu283Lp3kITKnt956K+66nAfHvn370N7ebvBnpNof6aiH3fm1116LJ598EocPH8Y999yjX/d6vXjjjTfiGIZVXxAR9u/fj61bt2L//v26pjLIeg43zcws82weAKYD6Afwqdj54wD+MdE71157LRER1S1dTyIAEABauXIlhUIh0jSNQqEQrVy5kqJVi3+nbul6AkCf+cxniDFGAIgxRiUlJXp6AGjcuHEJ85TP5TQBkMfjMdwfM2YMAdDLEA6HDWmHw2H9vlxmnldXV5fhXldXlyGPEydOGMo2ceJEw/1PfOITtnlUVFQY3ikvLzfUmedplYZ4rmka9fb2Gq739vaSpmmG/hDbAgAdOXLENE+r9rc6F69PnjzZkAY/t6sHf37WrFmGMTNr1izSNM00TzENu/tOzp2+A4AmTZpkqCc/d1rPRLDK02pcJjN/5s+fT16vlwCQ1+ul+fPnG+aLmAefb/xdxhjdfPPNCed9NuphlYdYz/r6egOdEP8DoBEjRpiOdbGcCxYsMLTVggULHM/JRPUkBzQ8Fz6NQwAOEREXfX8K4JpkEuD2OA5Z3fv+979vm8bZs2dxxRVXQNM0/VeEbB/lYajiOfcvcGzdutUgMcl+lTNnzujPe71e1NfXG+yS9fX1CR34jDFUV1cb7NVyOWtqagyhxPv37zfc/+CDDyzT54hEIoZ68YWOPM+xY8c6jma6/PLL9bbjx8iRI3H55Zfrz3i9XixYsED3FwDAtGnTwBjT/QdTpkwxPM/bjYObE/nABi6t+udpct8Mh9w2MvgXITnefPNN3QdWUlKCsrIyQ38zxuK2OhGjlrIV/trR0ZHw3Aytra0IhULQNA1TpkzB7NmzDWMzkdmU96ncx/IYEecLX9Et4tlnn9Xt8j09PfjP//xP/XnGGKZMmWIY29u3b9ffLSkpQXd3d8L5Y4dU6+Hz+QxpyB+Ak03db7zxhj6OzHDhwgUA1uZBvnuF2FZtbW2O684Yw8yZMw39O3PmTEfvAjnwaRDRMQB/ZoxxT/PNAN5z+r5sj2OMYWBgAH/84x/x+9//HkeOHMHZs2fhdltb3saNG4d3330XI0aMwKFDh/Df//3f6O7uhs/nMw1TtApDlctBRHC5XHFOXu5rCYfD+mCZPHkytm3bhtmzZ+PEiROYPXs2tm3bhsmTJ1uWmzGG/v5+lJWV4Z133jHc6+jo0AcyxVRXEe+88w7KysrQ19eX0Pbp9Xpx9uxZXHbZZdi71xifYFYPOxw4cADnzp0z+BLOnTtnMA195jOfwUsvvYQbbrgBnZ2dqKqqwvHjxzFy5EgcP34c4XAYhw4dwqhRo/QtRnjUiVWYIl/1z30QHC6XC2+++SY8Hk9Cvxf/IqTo2+nu7obb7UZXVxfmzZuHl19+WV9MarZHVi7CXzVNQ29vrz5GysrK0Nvbm7DP5baaNGkSNm3ahNtuu81RSCefg2KeAwMDBmIrz9vKykp9RfeJEyfgcrn0+cPbsrOzU49urKysxKFDh3DFFVego6MDXq8XfX19cLvdjuePHVKpR2lpKXp6egyh9eKXQ2XaUVVVhZ6eHsO2OLzeTueo3+/HsWPHDPTo2LFj8Pv9juoZCASwZ88eXHvttThy5Aiuvfba6O4YQK+jBJyoI+k+AFwN4G0AOwG8DKAy0fOieYoxRk1NTbpaFQqF4tQ7j8dDoVDIUj0LhUI0YcIEwzs+n09/h4iooaHBoBqL94jM1VOXy2VIUzwYYzR8+HA9Ta/XSzNnzjSomPw8kenI6/XG1ZeXgzFmek9uG14GszwYY+T3+x3XwywN8RyImuVE8yE304n9MWfOHL0tGGNxKnogEND7AADV1taS1+s1jAOxP0KhELW3txv6R24bfm5V7hkzZujXvF4vVVdXEwC9HvIYICIKBoOGcdPQ0GC4L44ru7aT4bS9ZbOoXZ/LbeX1eqmpqckw5letWmU5Nvn8EU13Pp/PkKc8bwFQMBgkxph+LpabMaa3N5/3gUDA0vwrzh+nbWVWD3F+Mcb0MZmoHrW1tXo9iIhmzJhhSTu8Xi/V1tbq48aMbvB6mYGnGQwGDbRDHHd29fR6vTR58mRDPWOm2gg5od9OHsr1ITINSPY4TdPoxIkThkaWbeYcvFNkOzsQtaHzd4hIT5MfHR0dhsY3Yxp79+41DIZ33nnH8Ay30/PDyqdhljY/9u/fb7i+ZcsWQ547d+40nItlMisDh5XfJFEaTu28ctt1dHQYyiD3h6ZpFA6H9f7gZRLP5TLxNMU05D7u6Ogw9LHYFiL4ODty5Ijh/f3795vWTwR/hh+ij4koflyJeTppS7mc/6+9q4ut68rK3z733t6bXDuMnVzFtHGwUacQ3Vz3BwtpHFCjxrJn0pEpUiSGNg+0lUbKyFHLaIooAQEv5aeyUBEPeUDzQkk6EsND1dGU0oYRpFMLak2TaWWYMRT3JypyO3IbMlRuosXD9TpZZ519zj7HceLWXp90lBzfs/f62Wuf/bPWXkf/nkcz64Xi05XUN1G+v03bpdRDnl1JffraVOtKl9d+L+ZR6yZ0n9W/pBx5fOT1D23/vveEtistl+Y7ZFcSWXaU9e6hAu/jz9yJcB2ytm/fPjz88MOpvWe5Z85gofft24ezZ88mfjty5EiiDJ9a7uoZOHz4cJC3gwcPJvi4++67UzS4znq9jpMnTyZ+P3nyZByzzXQl3wAwPj6eKHPo0KH4/865FE3Nk+RB0pB1aB9RVh0aPr6BtO74Pqs99u3bh5MnT8btUa/X8fjjjyfa5+DBg4k9XE3D18aHDx9O1CF14YOUs16vp3TvAz/DdWadhs/SPyPPBkLPlz2Br3Xl0zfbZha0bvS9z67Gx8cTdnXw4EEv30SUKl+v13HkyJFE+RCPWcjrX7I9fXww33n9Q9pmvV5PyTk+Pp7gO6t/SeTZVZZsfJ/17kF3QAmjyMiy0ZdcaUxMTMSzU+DqFgMvj4eGhqjVatGpU6fiMkSUu+WiL7lsCz0ro2fW+9JL5etBq7+/P6Enrd+sa3BwsJRu2+02LS4uxts6uv5KpUJDQ0MURRHt2rWLnHPUarUoiqI4equM3iYmJnK3C31Xp9OJdTE4OHjd2pXbtF6v0/T0dEL//f39qfapVquJv1Wr1UQZH6+sX/630+lkzrZPnTqVy2elUiHnHE1PT3vryGr/ZrOZsqvrdUkepWxaVn1f5r3AMpXpH7o9+dq2bRtdunQptQ2bVZfku9PpENDd+lxaWoq3PNfBJv+nyPv4M7fSuO222+Cci52YtDqKctIvH/RHffRz+p7rHBsbw6VLl1Kx7hJlU3azo09GXEiwQ41TDGzfvj0+7LRe6cGdc5kOZHYkFqWldcuRSs652DEIAG+88UbiZLxM/XLXXXfhypUrePfdd72za+nIzgMf9HriiSfwwgsvxAcb8xBFkddJHTpdHDpI5bMzRqPR8DqYswIuLl++jL6+Ppw/fx59fX24fPlynPVXO+wHBgYAXG0//levQCUefPBBAF3blHJxW4Qi5bJm99cSySTrWFhYuC5ZjrXtZkHaCDuvQ/2D88zdf//93t9XVlbQbDbx0UcfeX/PcqwD3SwLnJ5HZsHwyaHv5+fnU7qMoojbOr+zMK51FXAjLrnSqNfrNDMzE4+87Xabjh07lnCKnjlzJuEIB7qOIwZw1flElHZO1et1mpqaiuvk8pIGz8Lk/djYWKqMdPSxc5Cf7+npie+BpEPNOZfgiZ/R99qpJmloOYG0k41n/jzz0vr1ya4dfVq3mgY/L5+RDuJ2u514pt1u08zMTMLxPTY2Ft/zilK219jYWMIZ6dOV5Evriigd/CB51DSzaGh959kZUdLBDIQDLoiI+vr6Enxqh73mM8+JzTR2796dqEPaZqgOH9/arkIOZG3vAKinpyez/9Tr9VTwA/MoZdOyar617fIKwkeTiBK/y2dk/5Dto/uT5rOMY90nB5cJySHfVzJQgXHs2DG+D76PN3xAKHJpR7h04kRRJA+mEJH/8FjIgaydU9K5zuVDLwzpwNJlANDs7GziXjrKfTxoB5uPpi6jaWg5z549m6hDO6W1fn2ya0ef1q2moR17rF/ZhvIZnyNcBir4dOujoe8lX1pXREmHseaxqA1ofefZGVHSwQyEAy6IKA52KOqwzwqwkIPG/Px8og4dxCHr8PEXCnYA8h3IvnvdP7Rt6+CHLDmlrJJnn+2++OKLuTbia3P9DLePrz9JPrl8Uce6Ty4uE5Lj+eefz5WrzOG+DR8Qily20rjKt75fr5UGw1Yam3elobGWlYYPPr61Xd3olUaWrJrv67nSYD7Xc6XhQxE5tvRKY3p6mqrVKs3MzNClS5fogQceIAB033330crKCp05c4aGh4cTjnB2Xg0NDdHCwkLCwb24uBg7q9g5deDAAQJABw4cSDirdu/eTRcuXIgbEUDMB6ekaLfbtLy8HNe5a9cuWlpail8elUqFFhYW4karVCq0vLwc87hjxw66cOFCTLPZbNLy8nLcqPwyW1paih3EPT09XhpaThk8IJ3S7AwnopR+s2RnR5/WLfPgnEs9z9COvLvuuosA0PDwMK2srNCJEyeoWq3SiRMnaGVlJT5Tc+edd9LS0lIcv9/X10fLy8u0f/9+ArppQS5dukQzMzOx3GNjY3ThwoVYF1EU0cLCQjyAcMg2DxjsMNY8apqyPdjJL/VdxM5mZmaoWq3GDmb+XQcNMN3z58/HL6RqtZpw2LOcAwMDBHRTUWgaGnJLktt4fn6etm3bFttRqA4iyuRb2hU7wo8dO1bI3tn5X6/Xve3FA+PAwEAhHn2DhrZd1jW3X5aNyH7PbVyr1VLt4+tPms+QXnz9p6wc8n5+fj4hl7LlD2kzDhqsaBlVNDg4mDjoIg1HzqbyLnkwzjlH/f39iXsdSVWv1zMjI67XNTg4eF2jerjThuRqNpuldMsvFD4UlxWtI5+ZmJhItCn/X7aXbg/ZXhMTE6V1pffDdWSNptnpdApF2IXaVNL0RUr5ypXVv65TlieiNcmR1z98NK9Hf9H93hd9JmW91v5TrVZT75+QbvS7ZGJiIvHSD+mFo8Ky3nE+uyl7rfLw6qYcNE6dOkXDw8N05swZ76zUt9KQYbmzs7OJUEzfakXXOTo6SgDo0KFDhWf9ema6Z88eAronm4vc+2bPURTRjh07Ytl5xrBjxw7vDFGvfphvNlo9Q+HZm5Qrb0bnmx1LQ5ybm0uc8ub24d95ZsvbEvzS1m183333EQB64IEHvCvB0GpTvix4Rs66ajQa3pWGngGOj48TABodHY1psB1xnXKlt7i4GHdk9tlkrR4nJia8NKWd+XTlW+mxHdZqteBMWIfDMl29SpZtOjs7m3hR+mw1i6akUXaloVdtvtVM3orHtyrTq0+9Sub+VavVErP+SqUS2ybvGOzcudO7g+CzG2mbWvfcX7Zv355abWatVvRqRvd73mGo1Wpbc6WhUx7o/W8iv0+j0WjEv9fr9cRes/aL6DqdczQ1NZWgwQ0p7+WerN4Dd87FKU+K3Pv26QcGBqhWqyVo9vX1xXzpvWjtZyHq7l3KfWK5F+qTK2/v2LcPL18wrEu9f8oGKyF1F0proX1OIb8W05R7/6w7yZf0aei95na7TVNTUym/ibQrvuc69b3PT8Xt4aMpMOrXLQAADlhJREFU9enTlc+nVK/XE3IxD1nRPcxXKMWH3hOXe+baVn00s/pLGZ+G7LPcJrrOvCgunw1oP5e+174dnmxoOeS7Qpbx2Y20TZ/u+/r6Es9r/ylR0i+i/SY+/yqfY+Pft4xPgw0vL+UE0dXoKT1Dkg0jo1p0BJYvemdpaSlBw9cJ8tID8AypzL2OCPI54c6fP5/gU0ecZKUYlzxK+OQKRanoNAnPPfdcQpehCBQiSugulNaC2yOr/YiSEXRSF1p3skxe2gpfuhqfrnSEj77XkTE65btOWZ2nK7505IxOJROK7tF0fbaro290dI6OHCwSdVQ2ekr2WaJ06hhti/IZvrQN6Ig6fa+jyHx9cH5+PrMPhtIc+XSv7dJnAzoCK+/TAiG7JNrE0VNE6VloaKXBSrKVRhfrudLg5zfbSoN1dyNXGj6aUp9ZutJtWGalwdgKKw3+3VYaW2ylQZTe7w75NKTSzaexvj4NovQ+shw0Pqs+DaL0XvP19mn4aIZ8Gr42LOPTYGwFn4bPBsynsQV8GnLgkJE209PTqegcDV+Ug4xGmJiYyK1TRspwBASHZer6+Go2m7lRFKF7X1SYll1HTURRlCgzODiYG7mhI4SazWZKrv7+/tzIjSLRH7p9tK50fL2WU0dTdTqd3Pbz2YCOnNG64wGDoaNkOp1OioauU9tZkSivPJpS7ixd6TasVqsJ3Wge5ICRRbdITqY8W/XR1DR8csnfQ/md5ICRZYv6mbLRU5qHwcHBlG1qOaIoCtpNnu61Xfb39wejp/Tvut/77FLbGQpGTzkiwqcdo6Oj9Oqrr240GwaDwbBp4ZybI6LR4INFRpaNvnS20mazWXpWqWcMzWaz1MitZzCdTic1Qyi7cgitbvTsenp6OkVTy8U+iKw6NE3fCip0DkbPQvUMUf7GutfQqxk9y9fwzcDz2ivrkJdEaNVWrVaDK1pNV6+AQnblW51qGppPn47lNTg4mHg+NGPvdDqp/tLf31+Kpm4/34xfy6H7bWglqHXlsxlNQ/OhbVX3UV976PbUtqt3FEL9XMtdxIY0Td3G2jZ9q8+8leRq/ZvnnAZwdZ+S9/57e3sL71/rvcnQqVm9R8jPDw0NpU6G8l5kWR9FyI+i9/HlKWemqfd92Y/SaDS8dWiaeb4apqH51ifE9V60HCjm5uZip6AcOLJSO2cNHFl7/TxwhE7d+qD9Jto/xF8nrNVqmb6z3t5eiqIopqt9LSG7Yr9KX19fpm23Wi1qtVoxn9zx6/U6zc3NJV7mvtP1POHavn17HGknn5e2zP3l85//PAGgVqtViKZuvyzfQhRFsRy634Z8Ttpn6LMZ3aatVosA0K233uq1Vd1HtZ/F955gubMyBYT6uZZb24TPhjTNUAYF1tXNN99Mi4uLsVw33XST12clbOCnhd7HGz0gFLlkhEq73U7l1ikSKSMjGur1/Pw8OhqBO0BeNEjZaKhQxJaOGGKaOoxURpi02+1UDi1Zh6ZZJCrMFxkjc1H5ol742wYMHYHCHUBCRi5p+KKKZNSRbi+i/DxErAv9OVgZidZutxNRRr4ovVqtlsrZJKO6NB8+u5KfrfXZ9tDQUCqvkPw0MduE5FPmKmIbkc/rKCTd5u12OxV1lEeTKNl+3F8keOYsIfutr8/qKDAdeaZtxtemLAtR2lZ1H2Ua0q58+cZ0ZFNeHrRQZJ+2CZ8NaZq6jbVtch+Vcmtdyug4pcvNMWjI2QRHOsiGLBKTr2O+szKB8u867tkXE67vy5y7KHI2RH9y00dTx4TrWHdZh6bJM8UQjVD2Xk1Tx9PrWHemK6Fj2SVYDgktR14mUR98Z0HkmZcoihLx8r7zQD5daTlCdqXPp2i7ZKeqLDM7O5uwE3lmQmcMZhuRz+v20XJEUZSy3TyaRMn2Y9vX+tbtoc8r5J2j0brSNJlG3id+fbaq5Qx9itXX5nkZl0NniHw2EToPVCQr9MLCQuJe61LLJWhujkHDVhpXadpKowtbadhKw1YaftvkPrqlVxrc+ObTMJ+G+TTMp2E+DfNpBC+LnrLoKYuesugpi576dERP2TkNg8FgMBQ+pxGFHjAYDAaDgWGDhsFgMBgKwwYNg8FgMBSGDRoGg8FgKAwbNAwGg8FQGDZoGAwGg6EwbNAwGAwGQ2F8JgeN06dPY//+/ahUKti/fz+OHz+euD99+nSqTKVSgXMuvqIoCpaRmJycRBRFcdnJyckUH5OTk2g0GnDOodFoYHJyMpfGWuTQ6OnpScjVaDRK1xGC5rNWq6V0KXWzc+fOlK40jh8/ntDV8ePHS/GwFrlC+h4ZGUnwPTIyEqQ5MjKS0IXWTU9PzzXZxOnTp1O68tlynr7Xw0Z89r+ez/vKaF1quUdGRkrXuXfv3tz22LlzZ277HT9+PNXme/fuTdSh9b1z585cHnX7joyMpGiG9BmqQ8tZlscEipwA3OjrWj/3yidie3p6Mj9BqstIZKWx2LZtW+YnSUPpA9Yih4b+1KdOI1KkjhBC6Tb0pyN1agad8oOofNoPzcNa5ArpW6dUCX2mkyidDoU/9dloNLxpKMrahC9VCWdHaDQauZ/uzPqk71psJJTG5Vqf95XhPsqfPeX7arVaKPWMr85Qig+ddqRIGhGd0kOn8OAUKr6vDBKVSyNSNI1O6HPIWTwC+IQ2SxoROWjopGS+RHK+BIY9PT2JMvrD6rqMhC9hnkwARhRODqhprEUODX4ZyDp0UrdQHSGEEvs5l/xIvU4CR5RMLkhUPsGg5mEtcoX0rZM3ttttmpqaSvDtsyuZeJF1w7rQCe/K2gRROiki27JMGKltWep7PWwklDDyWp/3lWFdSjl04su8JJe+OkPJBIFkgsMiCQt9CSJlskB+JovPogkLdSqevISdug6fnDk8fnoHDQAVAD8A8FzoWTlo6PTHvpTVvlTpc3NziTKzs7OJhtRlJIB0am6d5ZOfyUpDrmmsRQ4fXwsLC4k6dProUB0hhFKIA0joEkinkdd6AMqlMtc8rEWukL6BZJr4KIpSKap9diVTvLNupC5kCuqyNsF1aN3pNP/alnXa+Gu1EZ/9azmu5XlfGZ8udYr9vHT6WXXmpS1n29UpxrX+5b0vFb1MS05Eqf6geSybGp0o/9MAug6fnDk8fqoHja8DOFV20LCVxlXYSsNWGrbSyB40bKWxiVYaAPYAeAnAPWUHDfNpXIX5NMynYT4N82ncaJ/GhmS5dc79HYA/AdAL4BtE9GXPM18F8FUA2L179y8988wz8W8vvfQSnn76abz11lvYu3cv7rjjDrz22mvx/dGjR3Ho0KFEfffccw+0rENDQ7llJB577DHITLujo6P44he/mOBj165dOHfuHD755BPUajXcfvvteP/99zNprEUOjS996Uv4+OOP4/tarYZbbrmlVB0haD7ffvttXLlyJfP53t5eXLx4Mb4fHR3Fk08+mXjmqaeewne+851YV/feey8eeeSRwjysRa6Qvp1zePPNN+Pnh4eHQUS5NB966KFEmUqlktBNo9HAlStX1mwTR48exeuvv57Q1eXLl1O2LKH1vR424rN/3abX8ryvjNalcy4h9/DwML75zW+WqrPVamF5eTmzPT744IOE7er2u/fee3Hu3LlEm7daLTSbzbiO9957L6Hv3t5ePPvss5k86r6wZ88evPPOOwma77zzTq4+Q3VoOX08Xrx4sVCW2xs+aDjnvgzgMBF9zTl3EBmDhoSlRjcYDIbri09zavQDAKacc/8N4BkA9zjnnt4APgwGg8FQEjd80CCix4loDxENAfgKgDNEdPRG82EwGAyG8vhMngg3GAwGw8agupHEieh7AL63kTwYDAaDoThspWEwGAyGwtiQkNuycM4tAVjcaD4MBoNhE+PniKgVeugzMWgYDAaD4dMB254yGAwGQ2HYoGEwGAyGwrBBw7Dp4Zz7C+fco+L+H5xzfy3uZ5xzX3fOtZ1zZ5xzP3LO/dg59wfOObf6zG8555acc6855/7dOffbovwfOee+sfr/hnPuH51zf1iU7ur/Q7TJOXdIlP311b8duT5aMxj8sEHDsBXwfQBjAOCciwDsAtAWv48BmAPwLIA/JaLbANy++veviee+RUR3oJvV4IRzblAScc7dBODbAOaI6I8L0n3ZObetAO0fAvhNcf8VAOfKqcFguHbYoGHYCngZqy9vdF/arwO46Jzrc87VAewD8IsAXiaiFwCAiH4KYBrA7+rKiOgDAAsAflb8uYpuWpwfExGXKUL3BwDuL0D7XwD8snOu5pzrAXArgNfWqA+DYc3Y0MN9BsONABFdcM5dds7tRfcl/gqAWwB8AcCHAM4D+AV0Vxuy3H8653qcczvk31fraayWY/wOgBeJ6FFRPkiXiFacc+0CtAnAiwAmAfwMuiuT4TUrxWBYI2ylYdgq4Fk/v7xfEfffB+DQfTH7wH//DefcGwD+C8BTRPSxeOYsgC84524rSRcFaQPdlcxXVq/TWYIaDNcTNmgYtgrYv9BBd5toFt0Z/xi6L/Y3ACTSQjvnfh7A/xIRf2DhW0TUBvCrAGaccwPi8X8G8CiA7zrnbi5BFwVpg4j+FcB+ALuI6Edr0IHBcM2wQcOwVfAygC8D+AkRXSGinwD4HLov8FcA/C2AX3HOjQPAqnP6LwH8ua6IiF4B8DcAHlF//zaAJwE875z7XEG6KEMbwOMAfm9NGjAY1gE2aBi2Cn6IbvTSrPrbh0T0PhH9H4BfA/D7zrn/WP3t3wD8VUZ9fwbgQedcr/wjEZ0E8PcAnnXONUJ0V8sUpk1E3yWifyolucGwjrA0IgaDwWAoDFtpGAwGg6EwbNAwGAwGQ2HYoGEwGAyGwrBBw2AwGAyFYYOGwWAwGArDBg2DwWAwFIYNGgaDwWAoDBs0DAaDwVAY/w92A349lL/2uQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Plot box plot of logmove vs. store demographic columns\n", - "for cl in storedemo.columns[1:]:\n", - " p = sales.loc[sales['logmove'] != 0].boxplot(column='logmove', by=cl)\n", - " p.set_title('logmove by {}'.format(cl), linespacing=3)\n", - " p.set_xlabel(cl)\n", - " p.set_ylabel('logmove')\n", - " p.get_xaxis().set_ticks([])\n", - " plt.suptitle('')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Km+99RbTpk3r33f06FHy8/N9zFXwjGVNjCAvPOZVG5oFDReUlpby1a9+lYcffri/nvHyyy93tcho/Cci3Hrrrdxzzz39+2699VZrEB9HtpZHuvr6eh544AHKy8v79+3atYuamhpWrVrlSprWpuGC8vJyNm7cSFVVFceOHaOqqoqNGzemfbAmeC655BI2bdrE+vXrOXr0KOvXr2fTpk1ccsklfmfNBFRbWxvLli1L27ds2TJXx2lY0HDBrl27qK2tZfPmzUydOpXNmzdTW1vLrl27/M6acdGOHTuoqKigsbGR/Px8GhsbqaioYMeOHX7wK52gAAAKjElEQVRnzQRUaWkpe/bsSdu3Z8+e4DWEi0g+8E2gDFCgSlV/7Ede3NDW1sZPf/pTbrvttv59PT093H777T7mynjBAoTxUl1dHWvWrKGpqal/cN+aNWuor693LU2/2jTuAh5X1StFJBcIVLeiZPRPrY5yO/qb8PJ7ffSwyoT3PdlukTpOo76+3rX2DPChekpE3gd8FGgCUNVTqtrpdT7clIz+qXPcr1mzhrq6Or+zZgJIVVm8eDEAlZWVtLe3U1lZCcDixYstYLhEVYccm+PV+75q1aq0cRpuBgzwp6TxO0A78C8ichbwLHCjqnalPklErgOuAygqKmL37t1e53PUZs+ezerVq6mqquLXv/418+fP55prrmH27Nmen4ff75vf6YfF/v37Oe+887jppps4cOAAN910E4cPH+bpp5/25TPw83P3Mu3e3l7OOOMMHnroId5++20eeughPvGJT3D8+PHAfvfF66sQEVkKPAOcr6p7ReQu4B1V/avTvWbp0qW6b98+z/IYFH53P/Q7/TAREdrb25kxY0b/vsOHDzNz5kzXr3iddCn26nfG6++ciPD888/3l/QgHsCXLFky4Up4IvKsqi4d7nl+9J46CBxU1b2J7QeBP/AhHyaAWlpaKCsrIysri7KyMlpaWvzOkmdKSkoQkf5bSUmJJ+km16Ye6WNBcdZZZ6W972eddZbfWXKV50FDVd8AfiMiH0jsugh40et8mOBpaWmhrq6uf3bjhoYG6urqQhE4otEox48fp6ioiLa2NoqKijh+/Lhni46lljYaGxsH3R9UqkpWVha7d+8mKysr8EHSr3EaNcBWEXke+BCwwad8mACpr6+nqamJ8vJycnJyKC8vp6mpydXu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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Plot box plot of logmove across different brands and stores\n", - "for by_cl in ['brand', 'store']:\n", - " p = sales.loc[sales['logmove'] != 0].boxplot(column='logmove', by=by_cl)\n", - " p.set_title('logmove by {}'.format(by_cl), linespacing=3)\n", - " p.set_xlabel(by_cl)\n", - " p.set_ylabel('logmove')\n", - " p.get_xaxis().set_ticks([])\n", - " plt.suptitle('')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Check seasonality and autocorrelation\n", - "\n", - "Overall, we don't find a strong seasonality in the data. It seems that there is a weak yearly-seasonality according to the seasonal-trend-level decomposition and the autocorrelation values around the lag of 52 weeks. As a rough estimate, autocorrelation beyond 20 weeks is usually very small. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Figure(432x288)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Check Seasonality \n", - "# Not much seasonality is found\n", - "d = sales.loc[(sales['store'] == 2) & (sales['brand'] == 1)].copy()\n", - "decom = sm.tsa.seasonal_decompose(d['move'].values, freq=52)\n", - "print(decom.plot())" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "# autocorrealtion: weekly, monthly, quarterly, yearly\n", - "def single_autocorr(series, lag):\n", - " \"\"\"\n", - " Autocorrelation for single data series\n", - " :param series: traffic series\n", - " :param lag: lag, days\n", - " :return:\n", - " \"\"\"\n", - " s1 = series[lag:]\n", - " s2 = series[:-lag]\n", - " ms1 = np.mean(s1)\n", - " ms2 = np.mean(s2)\n", - " ds1 = s1 - ms1\n", - " ds2 = s2 - ms2\n", - " divider = np.sqrt(np.sum(ds1 * ds1)) * np.sqrt(np.sum(ds2 * ds2))\n", - " return np.sum(ds1 * ds2) / divider if divider != 0 else 0" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\yiychen\\AppData\\Local\\Continuum\\Anaconda3\\envs\\tsperf\\lib\\site-packages\\numpy\\core\\fromnumeric.py:2920: RuntimeWarning: Mean of empty slice.\n", - " out=out, **kwargs)\n", - "C:\\Users\\yiychen\\AppData\\Local\\Continuum\\Anaconda3\\envs\\tsperf\\lib\\site-packages\\numpy\\core\\_methods.py:85: RuntimeWarning: invalid value encountered in double_scalars\n", - " ret = ret.dtype.type(ret / rcount)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEWCAYAAACaBstRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xd8HHeZ+PHPoy5bzUWWbcm23BPHKU6cAukNO92EAKETSuBCOLgEgwNcCPlRcphylNxBCIGjBUKK7RCD03tCYlsusR3XuEiyLbmoWW2lfX5/zKy8Wu1Ks9KudrV63q+XXtLOzM58Rzuzz3y7qCrGGGOMF2mJToAxxpihw4KGMcYYzyxoGGOM8cyChjHGGM8saBhjjPHMgoYxxhjPLGhEQUQmi0iTiKQnOi3RcNM8Lcb7PFdEtrv7XhTLfacyEfmkiLw8gPf/Q0Q+Ecs0ufvNFZHHRaReRP4W6/0PFSJSLiIqIhnD8fheWNDohYjsFpHLAq9Vda+q5qlqZyLTFS03zbtivNu7gV+4+14W431HRUTuEpE/JjIN8RDuvFT1ClX9vzgc7gagBBijqu+Pw/67hN5X8SYii0XkLRFpFJF3RGTxYB071kTkeRFpdR/WmkRk62CnwYJGCovz08oUYFN/3pjMT1FeiSOtr2VDyBRgm6p2RPvGwfw8+3ksAT4OjAIWAreKyI0JTM9A3eo+rOWp6uxBP7qq2k+YH+APgB9oAZqArwLlgAIZ7jbPA98BXnW3eRwYA/wJaADeBMqD9nkC8BRwBNgKfKCX438S2AU0Au8AHwla9ylgC3AUWAVMCVqnwBeA7cA7QctmuH9nAz8E9gIHgV8Cue66scDfgTo3jS8BaWHStjPkf5MNTARWuO/bAXw2aPu7gIeBP7r/l8+E2edVQIW7fh9wV9C6i4DKkO13A5fhfAm0Az43Levd9b2lJx34unsejcAaYJK77t3u51bv/n530PueB74LvOKe+4wIywqB3wD7gSr3GkkP+lxfDtrnT93zbXDTcb67PNJ5PR/4/+E89H0T2APUAL8HCt115e7n/gn3sz4EfCPCtfbtkGN92uO+P+3u+8Uw+wx7LRHmvnK3vxbnIaTOPccTQz7rrwEbgDYgw/18HwFqce6Pf4/i3v4Z8PMI6wLndjNQ7X6Gt/d2LQNnAa+5ad8P/ALICrknP49zTx4F7gUk6Fr8ofv57MK5d7u+Y8Kkr+vzT9h3YyIPnuw/7sV6WZgLKjho7ACm43xRbAa24XyZZbg32m/dbUfifDnc5K473b1QTgpz3JHuBTnbfT0hsB2wyD3mie5+vgm8GnKBPgWM5ngwCA4a/43zZToayMcJdN93130fJ4hkuj/nBy5uD/+bF4D/AXKA09yb+VJ33V04X0iLcL44csPs7yLgZHf9KTgBbVHQurBBI2j/fwxZ31t6FgMbgdk4T6Gn4gT70Tg39cfc/+2H3Ndjgj7vvcBJ7vrMCMuWAb9yP8dxwBvA59x9fJLuQeOj7rEzgNuBA0BOL+f1PMeDxqfca2EakAc8Cvwh5Fr9NZDrnmMbQV/GIfvtdiyP+/69e47hPs+I1xI9r51ZwDHgcnfbr7rHzgrafh0wyT2XNJwAeyeQ5aZxF7DAwz0tOA8nn4+wPnBuD7rndjLOtRN8rXW7loEzgHPcz7Ac54HuyyH35N+BImCyu7+F7rrPA2+75zYaeI6+g0YtznfHK8BFg/69ONgHHEo/YS7ucnoGjW8Erf8R8I+g19cA69y/Pwi8FLL/XwHfCnPckThPLe8LvSGBfwCfDnqdBjTj5jbc9F0S8h7FeQIW9+acHrTuXRzPkdwNLMcNMF7/N+4F3wnkB63/PvA79++7CPM02sf+/xv4ifv3RUQRNDykZytwXZhjfgx4I2TZa8Angz7vu0PWd1uGUy/QFvy54QSf59y/P0lQ0AiThqPAqeHOK+h4gaDxDHBL0LrZOF9ogS8vBcqC1r8B3BjhuKH/Qy/7ntbLeUS8luh5X/0n8FDINV2F+4Xobv+poPVnA3tD9nkH7gNaH9fVt4H1QHaE9YFzOyFo2Q+A33i9loEvA4+F3H/nBb1+CFji/v0sQQEMeA+9B42zcR72snFykY0E3c+D8TNUy1+TycGgv1vCvM5z/54CnC0idYEf4CPA+NAdquoxnCDzeWC/iDwhIicE7eenQfs4ghMMSoN2sS9CWouBEcCaoPf/010OsBTnCe9JEdklIks8nD84RQVHVLUxaNkej2kCQETOFpHnRKRWROpxzn2sx+NHm55JOEVT4d63J2SZl/MIXjYF52l5f9D/+Fc4OY4eROR2Ednitlqqw8mxej3v0PTuwflSLwladiDo72aOX4+x2Hdvn2k011K3Y6mq3913pP/7FGBiyL309ZC09SAit+LUbVylqm29bRtyvD1uGsOtQ0RmicjfReSAiDQA36PnZxjpc5gY5lgRqeq/VLVRVdvUaRDxCnBlH+cSUxY0eqcx3Nc+4AVVLQr6yVPVfwt7YNVVqno5TtHU2zjFDIH9fC5kP7mq+qqHdB/CCWQnBb23UFXz3GM2qurtqjoNJ5d0m4hc6uHcqoHRIpIftGwyztNiX2kK+DNOsdkkVS3EKdoQd90xnGAHgNvkuTjovaH77is9+3CKFMOdx5SQZV7OI3jZPpycxtig/3GBqp4U+iYROR+nrP4DwChVLcKpSwmcd1//s9D0TgY66P7g0l9e9h0xfX1cS+E+r65jiYjgBPZI//d9OLnj4HsgX1UjfnmKyKeAJThFlJWRtgsyKejvyW4aw6UF4H9x7tGZqlqAE8AEb/aHOVY0NIpjxYQFjd4dxCkvjYW/A7NE5GMikun+nCkiJ4ZuKCIlInKtiIzE+QJqwiluAefL9A4ROcndtlBEPDWRdJ/gfg38RETGue8vFZEF7t9Xi8gM96ZtcI/ZZ/NiVd2H0xjg+yKSIyKn4FSS/slLulz5OLmDVhE5C/hw0LptQI6IXCUimTj1ONlB6w8C5YGWSx7Scz/w/0Rkptvi6RQRGQOsxPmMPiwiGSLyQWAOzmfniaruB54EfiQiBSKSJiLTReTCCOfcgVNGnSEidwIFkc4rjAeB/xCRqSKSh/OE+1ftRwuoWO+7j2sp9L56CLhKRC51P9/bca774AehYG8ADSLyNXH6l6SLyFwROTNCWj7ipv9y9d70/D9FZIR7n90E/LWXbfPdc2xySwTCPghG8BDw7yJSJiKjcAJbWCJSJCIL3Gs6wz2vC3AawwwaCxq9+z7wTTcL/JWB7MgtKnkPcCPOU8sB4L/o/uUXkIZz41TjFD9dCNzi7ucx931/cbPCbwFXRJGUr+EUG7zuvv9pnPJqgJnu6yacsvz/UdXnPe73QzjlwdXAYzh1NU9Fka5bgLtFpBGngvOhwApVrXfX34/z9HkMCH5aDHRGOywiaz2k58fu/p/Eudl/g1MHcRi4Gud/fxinQvZqVT0UxXmAUwSShdMw4ihOa5sJYbZbhVNHtQ2nWKKV7kUV4c4r2AM4rZFexGlB1Ap8Mcq0RjLQffd2LXW7r1R1K06DgJ/j5IavAa5R1fZwO1ann9Q1OA0c3nHfcz9O0V4438FpbPCmHO/f8Ms+0v8Czn3yDPBDVX2yl22/gvOQ04jzUNZbgAn1a5zrYD2wFqfBQSSZOOcSqAj/Ik5jkUHtqxFozWCMMcb0yXIaxhhjPLOgYYwxxjMLGsYYYzyzoGGMMcazIT9wXKixY8dqeXl5opNhjDFDypo1aw6panFf26Vc0CgvL2f16tWJToYxxgwpItJrb/QAK54yxhjjmQUNY4wxnlnQMMYY45kFDWOMMZ5Z0DDGGOOZBQ1jjDGeWdAwxhjjWUKDhog8ICI1IvJWhPUiIj8TkR0iskFETh/sNBpjjDku0Z37fgf8AmeC+nCuwBmXfybO3Lj/6/6OuWUVVSxdtZXquhYmFuWyeMFsFs0r7fuNxhgzjCQ0p6GqL+JMMhTJdcDv1fE6UCQi4SazGZBlFVUseWQDVXUtKFBV18Idj25kWUVVn+81xpjhJNnrNErpPpNZJd0nm4+Jpau20trh77asxdfJ0lWDOiGWMcYkvWQPGuEmTO8x1aCI3Cwiq0VkdW1tbdQHqa5riWq5McYMV8keNCqBSUGvy3DmfO5GVe9T1fmqOr+4uM9BGnuYWJQb1XJjjBmukj1orAA+7raiOgeoV9X9sT7I4gWzycno/q/IzUxn8YLZsT6UMcYMaQltPSUiDwIXAWNFpBL4FpAJoKq/BFYCVwI7gGbgpnikY9G8UnydfhY/vAGAUms9ZYwxYSU0aKjqh/pYr8AXBiMt15w6kcUPb+CrC2dzy0UzBuOQxhgz5CR78ZQxxpgkYkHDGGOMZxY0jDHGeGZBwxhjjGcWNIwxxnhmQcMYY4xnFjSMMcZ4ZkHDGGOMZxY0jDHGeGZBwxhjjGcWNIwxxnhmQcMYY4xnFjSMMcZ4ZkHDGGOMZxY0jDHGeGZBwxhjjGcWNIwxxnhmQcMYY4xnFjSMMcZ4ZkHDGGOMZxY0jDHGeGZBwxhjjGcWNIwxxnhmQcMYY4xnCQ0aIrJQRLaKyA4RWRJm/WQReU5EKkRkg4hcmYh0GmOMcSQsaIhIOnAvcAUwB/iQiMwJ2eybwEOqOg+4EfifwU2lMcaYYInMaZwF7FDVXaraDvwFuC5kGwUK3L8LgepBTJ8xxpgQiQwapcC+oNeV7rJgdwEfFZFKYCXwxXA7EpGbRWS1iKyura2NR1qNMcaQ2KAhYZZpyOsPAb9T1TLgSuAPItIjzap6n6rOV9X5xcXFcUiqMcYYSGzQqAQmBb0uo2fx06eBhwBU9TUgBxg7KKkzxhjTQyKDxpvATBGZKiJZOBXdK0K22QtcCiAiJ+IEDSt/MsaYBElY0FDVDuBWYBWwBaeV1CYRuVtErnU3ux34rIisBx4EPqmqoUVYxhhjBklGIg+uqitxKriDl90Z9Pdm4NzBTpcxxpjwrEe4McYYzyxoGGOM8cyChjHGGM8saBhjjPHMgoYxxhjPLGgYY4zxzIKGMcYYzyxoGGOM8cyChjHGGM8saBhjjPHMgoYxxhjPLGgYY4zxzIKGMcYYzyxoGGOM8cyChjHGGM8saBhjjPHMgoYxxhjPLGgYY4zxzIKGMcYYzyxoGGOM8cyChjHGGM8saBhjjPHMgoYxxhjPMrxsJCLZwPuA8uD3qOrd8UmWMcaYZOQ1p7EcuA7oAI4F/QyIiCwUka0iskNElkTY5gMisllENonInwd6TGOMMf3nKacBlKnqwlgeWETSgXuBy4FK4E0RWaGqm4O2mQncAZyrqkdFZFws02CMMSY6XnMar4rIyTE+9lnADlXdpartwF9wcjPBPgvcq6pHAVS1JsZpMMYYEwWvQeM8YI1blLRBRDaKyIYBHrsU2Bf0utJdFmwWMEtEXhGR10UkbG5HRG4WkdUisrq2tnaAyTLGGBOJ1+KpK+JwbAmzTENeZwAzgYuAMuAlEZmrqnXd3qR6H3AfwPz580P3YYwxJkY85TRUdQ9QBFzj/hS5ywaiEpgU9LoMqA6zzXJV9anqO8BWnCBijDEmATwFDRH5EvAnYJz780cR+eIAj/0mMFNEpopIFnAjsCJkm2XAxW4axuIUV+0a4HGNMcb0k9fiqU8DZ6vqMQAR+S/gNeDn/T2wqnaIyK3AKiAdeEBVN4nI3cBqVV3hrnuPiGwGOoHFqnq4v8c0xhgzMF6DhuB8aQd0Er5OIiqquhJYGbLszqC/FbjN/THGGJNgXoPGb4F/ichj7utFwG/ikyRjjDHJylPQUNUfi8jzOE1vBbhJVSvimTBjjDHJp9egISIFqtogIqOB3e5PYN1oVT0S3+QZY4xJJn3lNP4MXA2soXsfCnFfT4tTuowxxiShXoOGql7t/p46OMkxxhiTzLz203jGyzJjjDGpra86jRxgBDBWREZxvJltATAxzmlLCssqqli6aivVdS1MLMpl8YLZLJoXOkSWMcYMD33VaXwO+DJOgFjD8aDRgDOseUpbVlHFHY9upMXndFGpqmvhjkc3AljgMMYMS70WT6nqT936jK+o6jRVner+nKqqvxikNCbM0lVbuwJGQIuvk6WrtiYoRcYYk1he+2n8XETmAnOAnKDlv49XwpJBdV1LVMuNMSbVeZ0j/Fs4w5PPwRn24wrgZSClg8bEolyqwgSIiUW5CUiNMcYkntdJmG4ALgUOqOpNwKlAdtxSlSQWL5hNZnr3IbZyM9NZvGB2glJkjDGJ5TVotKiqH+gQkQKghmHQsW/RvFKuOnlC1+vSoly+f/3JVglujBm2vA5YuFpEioBf47SiagLeiFuqksjk0SMAGDMyi1eWXJLg1BhjTGJ5rQi/xf3zlyLyT6BAVQc6R/iQUNfiA+DwsXaa2zsYkeU1zhpjTOrpq3Pf6b2tU9W1sU9Scqlr9nX9XXW0hZkl+QlMjTHGJFZfj80/6mWdAilfXlPf4iM9Tej0K5UWNIwxw1xfAxZePFgJSVZ1LT5mjsvj7QONVB5tTnRyjDEmobwOWDhCRL4pIve5r2eKyNXxTVpyqG9uZ8a4PLIy0qg8ap36jDHDm9cmt78F2oF3u68rge/EJUVJpq7Fx+iRWZQV5VrQMMYMe16DxnRV/QHgA1DVFo4PXpiy/H6locVHYW4mpaNyrXjKGDPseQ0a7SKSizt7n4hMB9rilqok0djWgV+hMDeTslGW0zDGGK+dDr4F/BOYJCJ/As4FPhmvRCWLere5bdGILMpGjbC+GsaYYa/Pbz8REeBt4HrgHJxiqS+p6qE4py3h6lraASjKzewag8r6ahhjhrM+i6dUVYFlqnpYVZ9Q1b/HKmCIyEIR2SoiO0RkSS/b3SAiKiLzY3Fcr+rd3uCFI5ziKYBKGxbdGDOMeS1neV1EzlTVN2N1YBFJx5n973Kc1lhvisgKVd0csl0+8O/Av2J1bK8CvcGLcjMpyM0EsHoNY0yvUn2KaK8V4RcDr4nIThHZICIbRWSgY0+dBexQ1V2q2g78BbguzHb/D/gB0DrA40WtLiinUZyXTVZ6mrWgMsZEFJgiuqquBeX4FNHLKqoSnbSY8ZrTuCIOxy4F9gW9rgTODt5AROYBk1T17yLylUg7EpGbgZsBJk+eHLME1jc7dRqFuZmkpYnb7NZyGsaY8HqbIjpVchteKsLTgCdUdW6Mjx2un4eGHPcneGilpar3AfcBzJ8/X/vY3LP6Fh+5melkZ6QDWLNbY0yvhsMU0V4qwv3AehGJ3SO8oxKYFPS6DKgOep0PzAWeF5HdOC23VgxmZXhds4+iEZnHEzgqlyornjLGRBBpKuhUmiLaa53GBGCTiDwjIisCPwM89pvATBGZKiJZwI1A1z5VtV5Vx6pquaqWA68D16rq6gEe17M6tzd4QNmoERxqaqelvbOXdxljhqvbL5/Vowgl1aaI9lqn8e1YH1hVO0TkVmAVkA48oKqbRORuYLWqDjQoDVh9c2jQcJ4WquqamTHO+moYY7oblZeF4pS9K84U0anWesrrzH0viEgJcKa76A1VrRnowVV1JbAyZNmdEba9aKDHi1Z9i4/ysSO6XgeCxr6jLRY0jDE9/OWNvYwZmcUFs4p5deehlJwi2uvQ6B/AmRP8/cAHgH+JyA3xTFgyqGtppyg3q+t12SgngFhluDEmVE1jK89sqeGGM8ooG5VLbWMbnf6YtctJGl6Lp74BnBnIXYhIMfA08HC8EpYMQivCra+GMSaSR9ZU0eFXPnjmJF7ZeRi/wqGmNkoKchKdtJjyWhGeFlIcdTiK9w5Jrb5O2jr8XT3BAeurYYwJS1X565t7OWvqaKYV5zHeDRQHGwa9T3Lcec1p/FNEVgEPuq8/CPwjPklKDoFxp4JzGuBUbMU7aKT6MATGpJrXdh1m9+FmvnTZTABKCrIBOFDfyilliUxZ7HmtCF8sItcD5+E0DLhPVR+La8oS7Pi4U1ndlpeNyuXpLQfjdtzAMASBXqWBYQgACxzGJKm/vLGPgpwMrpg7AeB4TqMx9aYd8loRPhVYqaq3qep/4OQ8yuOZsESrCxpCJFjZqNy49tXobRgCY0zyOXqsnX++dYD3zislJ9MZPWJMXjZpAgfrU694ymu9xN8Af9DrTndZyopUPBVoQVUVp2EBhsMwBMakkscqqmjv9HPjWccHzUhPE4rzs4d1nUaGOxItAKra7vbiTlldI9yGyWkAVB5tZsa4vJgfd2JRbtiAlErDEBiTCpZVVPGDf75NdX0rmenC1gONnDihoGv9+IIcDqRg0PCa06gVkWsDL0TkOiClZ+47PtVr+JxGvCrDv3TpzB7LUm0YAmOGukDdY7Vb/OTr1B5DoI8ryKGmYZjWaQCfB74uIvtEZB/wNdyhyFNVXUs76WlCXnb3zNi4/Gwy0yVuQaMg1znemJHHM3JLrjjBKsGNSSJe6h7HF+RwsDH1chpeW0/tBM4RkTxAVLUxvslKvHp3sEJnivTj0tLEbXYbnw5+j6/fz9i8LF6/41L2HGnm0h+9QFuHDZBoTDLxUvdYUpBNXbOPVl9nVwV5KvDaeqpQRH4MPA88JyI/EpHCuKYsweqafRSF1GcElI0aEZecRlNbB8+8fZArT55ARnoa04vzOG1SEY+sqcKZqt0Ykwy8DIEe6AmeakVUXounHgAaccad+gDQAPw2XolKBvUtPgpHRAoa8eng98yWg7T6/Fxz6sSuZe87vZStBxvZVN0Q8+MZY/pn8YLZZKV3//oMrXsMBI1Uqwz3GjSmq+q33Pm8d6nqt4Fp8UxYotWFDIsezOmr0UarL7bFRo+vr2ZCYQ5nTB7VteyaUyeSlZ7Go2tTZ45hY4a6RfNKuf704/WMpUW5fP/6k7vVPY4vTM2hRLwGjRYROS/wQkTOBVK640B9S+/FUxDbFlT1zT5e2FbL1adMIC3teD1K0YgsLj1xHMvXVeHr9PeyB2PMYCrIzSQ7I42d37uSV5Zc0qOxSkn+8A4anwfuFZHd7tSrvwA+F7dUJYG65naKRoTvihLcVyNWVm0+gK9TufqUiT3WXX96GYePtfPC1tqYHc8YMzA7apqYOnYk6Wmhc/U5CnIzyM5IG7ZBo0FVTwVOAU5R1Xk4dRwpqdOvNLR2dBvhNlg8chqPr69m8ugRnFLWs33BRbOLGT0yi0crKmN2PGPMwOysbWJ6Lx18RYTxhTkcGKYV4Y8AqGqDqgZqZFN2Lo2GwBAiEYJGrPtqHGpq49Wdh7nm1Ak9mvgCZKance2pE3l6c03XmFjGmMRp9XWy70gz04t7HxWiJD8n5XIavfbTEJETgJOAQneU24ACILVmFgkSadypgLQ0YWIM+2r8460DdPq1W6upUDecUcbvXt3NhUufp6HFZ0OmG5NAew4341eYXjyy1+1KCnPYWFk3SKkaHH117psNXA0UAdcELW8EPhuvRCVaXR9BA2Lb7Pbx9dXMHJfH7JLI845vP9iIcDyg2ZDpxiTOztomgD7HnyvJz+aphlZUNWwpwlDUa9BQ1eXAchF5l6q+NkhpSrhIw6IHLKuoomJvHc3tnZx7z7P9fuJfVlHFPf94mwMNreTnZLB8XXXE/fzwyW2Edu8LDFtgQcOYwbWjxgka08b2HjTGF+bQ6vPT0NoR8fskFgZz4javo9zeLCI9chaq+qkYpycp1HeNcNuz9VSsJkkK3U9ja0ev+7Eh041JHjtrmygtyiU3q/fhQcYFTfsar6Ax2BO3ea0I/zvwhPvzDE6dRlPMU5MkeqvTiNUkSdHux8uwBcaYwdFXy6mAknxn2td4VoYP9sRtXgcsfCT4tYg8CDwdlxQlgcBUr+GeDCI92VfVtUSVRYw257B4wexuTxOQ2CHTbR5zM1z5/crOmmOcedboPrcN9Ao/EMcZ/Aa7FMJr8VSomcDkPrfqg4gsBH4KpAP3q+o9IetvAz4DdAC1wKdUdc9Aj9uXumYfI7PSyUzvmRGLNEkSwO1/W0+n36l56CuLOGZkFoeO9Ww+GynnENjHNx7byLH2TiYW5vDVhfEfMj1ccABsHnMzbB1oaKXF1+lpErauQQvjOFf4YE/c5nWU20YRaXB/6oHHga8O5MAikg7cC1wBzAE+JCJzQjarAOar6ik4/UJ+MJBjelXXErk3+OIFs8kNGeY4JyON7Iy0roARECmL2Njqo1OV0LYUfeUcFs0r5asLTwBg2RfOHZSAccejG6mqa0FxgsNXH97Akkc22DzmZtgKtJzqq48GQE5mOoW5mXHNaXgZPDGWPAUNVc0HyoHLgWtxmtsOdOa+s4Ad7gCI7cBfgOtCjvucqgY6Q7wOlA3wmJ40tEQerHDRvFK+f/3JlBblIjgDld3zvlNo7wg/LlS4LOLdj2+mvsXHly6b2W0/oQOehRN4utleE/8qpXBlpe2dflqjOFdjUk2g5ZSXoAHOvBrxrNNYNK+UC2cXd732+l3SX56Kp0TkM8CXcL601wHnAK8Blwzg2KXAvqDXlcDZvWz/aeAfEdJ3M+5MgpMnD7jUzJlLo5c+Govmlfb4QJau2ho2ixjIngY8uekAf1tTyRcvmcGXL5vFly+bFVXaAkFjR00T584YG9V7oxWpGC4Sq5Q3w8HO2iYKcjIYmxe+NCJUSUEOB+NYPAVwrK2DuaUF/P2L58f1OOC9TuNLwJnA66p6sdtT/NsDPHa4ni5hZxoSkY8C84ELw61X1fuA+wDmz58/4NmK6lp8zPRQXhksXEU1OE/mv3h2Ow++sY+quhbSBMqKcvniJT3nAvdiXH42+dkZXU87sRJcdzGhMIfZ4yN3NCzKzaStw9/tXNPTxOYxN8PCzppjTB+X57mzXklBDtsPDrRgJrJOv7J+Xx3Xnz4oBTGem9y2qmorgIhkq+rbOL3FB6ISmBT0ugyoDt1IRC4DvgFcq6qDMvJXXzmNcMIVW/3HZTPp9Cs/fHJb11O7X6G2qY2VG/f3K20iwoySvJgGjdC6i+r6Vp7bWsvMcXnkZPQsK73r2pO6nevIrHT8fmVCYcqOLGNMl521TczwWDQFzlzhtU1tPeo8Y2V7TSPH2js5fUpRXPYfymtOo1JEioBlwFMicpQwX/BRehOYKSJTgSrgRuDDwRuIyDz2HI23AAAgAElEQVTgV8BCVa0Z4PE8UQ3UaXjLegYLV2z14Bv7uvp9BLR1+AfUk3tGcR7PxXCY9HB1FwDN7Z3c875TIjatDfw+1tbBFT99icUPb+AfXzqfkdn9bZRnTP8MVhPwhlYfNY1tnvpoBJQUZNPpVw43tXV19oulir3O2FbzJo3qY8vY8NpP473un3eJyHNAIfDPgRxYVTtE5FZgFU6T2wdUdZOI3A2sVtUVwFIgD/ibmxXcq6rXDuS4fWn1ddLe6Y9Z781IFWADqTSeMS6Pv62ppL458pS00eitnXe4QBhqZHYGP3z/qXzwvtf43B/W8M6hY9Z/wwyawewRvTPKSnAI7hUer6BxlFEjMpkyZkTM9x1O1I+EqvpCrA6uqiuBlSHL7gz6+7JYHcurQMe+aIunIolHG+quyvDaRs6Y0ncHo77EIo1nTR3NBTOLeWHb8RyQ9d8wg6G3HtExDxq1x4C+R7cNNj5orvCT6TlfzkCt3VvHvMmjBm1ARK91GsNGfR9zaUQrXL+OgbahDm5BFQuLF8zuMftYf9K47WDPebms/4aJt0it/OLRBHxnbROZ6cLk0d6f6ksK4jfta32Ljx01TZw+eXDqM8CCRg+BYdFjUewD4SvIB9qGumzUCLIz0th+MDZB46pTJpCTmUZuZvqA0hipA5P13zDxcvRYO5np4Z+w49EEfGdNE+VjRpIRZrSISMbmZZEmUBOHoLF+n1ufMXlw6jOg/8OIpKz6PoZF7w8v9QLRSE8TphXnsaM2NkHj1Z2HOdbWya8/Pp/L55T0ez+DPZyBGd4qjzbz8QfeQBWy0tNo7zze6TRePaJ31jYxc1zk5ujhZKSnMTYvmwNxCBoVe+sQIew00fFiQSPE8QmYom89NZhmjMujYu/RmOxrxbpq8nMyuGDWwDoLJtugiib1BFpJBfo8ZWWk8afPnM3++lbuXP4WDa0djC/IYckVsR+XzdfpZ8/hZhbOHR/1e8cX5nAwDnOFr917lFnj8snPid9cHaGseCpErOs04mVGcR5VdS00t3cMaD+tvk6e3HSAhSeNJzuj97kB+hIoihvnDgddmJsZ1+EMzPAS3J8InD5PqrC/vpVF80r51cfmA8TtmttzuJkOv0bVcipgXBzmCvf7lXX76gatf0aABY0Q9S0+MtOFEX1MrpJoM0vyUIVdbmuO/nphWy2NbR29zk8ejUXzSnnjG5cxuySf2SX5FjBMzIRrJRXo8wROEU2aQMW++MzJ7XWK13DiMf7UO4ePUd/iG7T+GQEWNEKoOk/IyT6fb6xaUD2+vprRI7N49/QxsUhWl4Vzx/PmniPUNMZvoDYzvPQ1b8TI7AxmleSzLs5BY1o/chrjC3I42uyjNUwn2v7q6tQ3iC2nwIJGWPGcyzdWyseMJD1NBhQ0mts7eGZLDVeePD6q1iBeXHHyeFThyU0HY7pfM3x5mb3ytElFrN9Xh2rsh+zYWXOM8QU55PVjxINAs9vaGA5cuHbvUfJzMvpVXDYQFjTCSPZKcHAqAKeMHjGgoPH0lhpafJ1cc0psiqaCzS7JZ9rYkfzzrQMx37cZnhYvmN2jeW1oQ4vTJhVR3+Jj9+Hm0LcP2I7aJqaP896pL1hJ4fEOfrFSsbeO0yYVkZY2uKUiFjTCGAo5DXCKqLbX9OxQ59Xj66spKcjmzPKB9yoPJSIsnDue13Yd5miYGQqNidaieaVcMXdC1+tw/YlOc4tq1u2LTcvCAFVlV01Tv5/qSwpiO1f4sbYOth5oGNT+GQEWNMJI9pZTATPG5bHncDO+zvCTIvWmvsXHC1trufqUiXF7Urli7gQ6/cpTm62IysTG6JFZ5GdnsPueq3hlySU9GlrMHJfPiKx01u2Nbb1GbWMbjW0d/aoEh+NDicSq2e2Gynr8Ovj1GWBBI6xY9QaPtxnj8ujwK3sOR9+C6slNB2jv9Mes1VQ4c0sLKBuVyz/e6t8w8MaEqnIHwowkPU04ubQw5pXhO6KY4jWcwtxMsjLSYpbTqHBzUvMmWdBICkX9GBY9EfrTgmpZRRXn3vMsix/eQHqa8E6MepWHIyJcMXc8L+84REOrr+83GNMHZ/Tk3keKPW1yEZv3N8SspdKyiir+7Y9rAbj9ofUsq6iKeh8iEtNmt2v31DGteGRC6l8taIRRmDs0OsoHnnq8jkEV2jmq0698/bG3+nUTeLVw7gR8ncqzWwZlOhST4vbXt/Y5LM28SUX4OpXN+xsGfLzAPRPo9HugoZU7Ht3Yr3tmfEFOxPHZoqGqrNt3dND7ZwRY0AhjKLSeAqddemlRrucxqHobQjpe5k0qoqQgu98zFRoT0NLeyZFj7X0GjdPcL9NY1GvE8p4ZV5BDzQCb3C6rqOKc7z3DoaZ2ntlyMK4PfJFY0AhjqNRpAEwf533q1746R8VDWpqw8KTxvLCtlmNtAxvyxAxv1fXOddpX8dT4whzGF+TEpF4jlvdMIKfR3z4kgVzPQTfw1LX4+p3rGQgLGmEMldZT4IxBtbO2Cb+H+Ye9dI6Kh/ycTNo6/Jz0rVWce8+zCXk6MkNf4It6YmHf1+tpk4piEjRiec/UNrbR4utk6h0r+3UfJKKkIBwLGmEMlX4a4IxB1erzR5yIJtjiBbPJyej+kcd7FNplFVXc/9KurteB2fwscJhodQUND1/Yp00uYu+RZg43Daw46CvvmUVog/T+3DPLKqq6tSLsz32QiJKCcCxohDFU6jQguhZUi+aV8oWLZ3S9jsWEUH1ZumorrR3d+5HYbH6mP6rqWhFxip/6cprbFHVDZf2Ajjl5zEgUp/RhIBOULV21FV9n99KAaO+DRJUUhBoazYQGWUHO0Pm3zCg+HjQuPmFcn9sHhjN49vYL+zXwWrSS5enIDH3VdS2U5OeQ6WGctJNLj4946+W+iOTRtZXkZKbx8pJL+jXmVEAs7oMvXDydrz/2VrdliZivxnIaIfJzMmI+eF88jRqZxZiRWZ4rwzdXNzAiK50pY/o3hk60kuXpyAx9XvpoBMRixNtWXyePr69m4UnjBxQwIDb3waEmZzie4rzsmE0d3R9D55F6kAyl+oyAaMag2ry/gdnj80kfpEHObDY/EyvVdS3MLfU+rem8yUWs3HgAVe3XVAfPvl1DQ2sH159eFvV7Qw30Pmhq6+CBV97hshPHcf8nzhxwegZi6DxSD5KiIdTcNiA9TajYV0f5kid6bZWhqmzZ38CcCQWDlrbAbH6l7hOVAN9ZNNcmZzJR8fuV6vrWruvIi8CIt+8c6t9EZY+uraSkIJtzZwxsGmQ4fh+Mcr9fivOyo8ol/PH1PdQ1+7j1kpkDTstAWdAIMVSGEAlYVlHFm+8cIdD0u7dWGZVHW2hs7WDOxMELGuDcMK8suYR7P3w6Sv9mPjPD2+Fj7bR3+KMqzunq5NePIqpDTW08v7WWRfNKY5YrXzSvlKduuxCAm84r9xwwWto7uf+lXZw/c2xXBX8iJTRoiMhCEdkqIjtEZEmY9dki8ld3/b9EpDxeabnqZy8C8PKOQ5QveYLLf/x8vA4VU0tXbcXn99YqIzCswomDmNMINr/cuYnf3H0kIcc3Q9f+eu/NbQNmjMtjZFZ6v4LGinXVdPiV98WgaCrY2LxsZpXk8drOw57f8+AbeznU1M4XkyCXAQkMGiKSDtwLXAHMAT4kInNCNvs0cFRVZwA/Af4rHmm5/MfPs7O2+6Qt22uODYnAEU2rjC37GxCBE8bnxztZYZUU5FA2Kpc1e2I714FJfYHreYKH5rYBj6+vxudXfv/anqg70z1aUcnJpYXMKon9vfLu6WNZvfso7R19T2nQ1tHJr17cydlTR3PW1NjPe9MfiawIPwvYoaq7AETkL8B1wOagba4D7nL/fhj4hYiIxngux+014cs8Iy1PJhOLcsN27Av3RLa5uoGpY0cyIitxH/uZ5aN5ecehfldOmuGpqs4Z6M9rnUZgyI3AF3Og2DZg6aqtbmusXBYvmN2tqGjrgUbeqmrgW9eEPsPGxjnTxvC7V3ezvrIu4gRoyyqqWLpqa9e9ff282OZ4BiKRQaMU2Bf0uhI4O9I2qtohIvXAGOBQ8EYicjNwM8DkyZPjld6kFE2rjM37Gzg1wWWiZ0wZxWMVVew90hx1s9/AjRTpZjepq7quhdzMdM8NVSINufH1RzfiV+3qcBoumAS+qDPT4lMQc8600YjAazsPhw0agYAXnP7fvvIOs8fnJ8X1nsg6jXCPmaE5CC/boKr3qep8VZ1fXFwck8QNFYFWGWPznAr80SOywrbKqG/xUXm0ZVBbToUTuElW746uiCp4WHfFhiOJh8BcK1P7aIWXCIE+Gl5zp5GKbZt9nWFHKLhrxaZu0wYAfHfllrj8D4pGZDFnQgGv7jwUdn24gNfa4U+aURQSGTQqgUlBr8uA6kjbiEgGUAjEvBZ1ZoTJ4iMtTzaL5pXy2h2XkpedwYK548M+jbztVoIPdsupUDPH5VGQk8HqPdF9jMkyWFuq6i0oJ0MwCeQuvYq282hdi29Qr693TRvD2r11YSeKSvZRFBIZNN4EZorIVBHJAm4EVoRsswL4hPv3DcCzsa7PAHjqtot6BIiZ40by1G0XxfpQcZOZnsY508bw0vbasEMvB1pOnZTgnEZamnD6lFFR5zQiDciYLDfSUBcpKAc/gScyh1dVF10fjcULZpObmd5tWW5melc/Ca/idX29a/oY2jv8rN3b8z5I9lEUElan4dZR3AqsAtKBB1R1k4jcDaxW1RXAb4A/iMgOnBzGjfFKz1AKEJGcP3MsT285yJ7DzZSP7R4Et+xvYMzILIrzsxOUuuPOLB/N81u3Utfc7nlwyLzsDJrCzMcR7xspVvUosdhPPOt0In051rX0nKY38AQ+WOXrrb5ODjW1RfVZB9IW+v8CwtYB5mSmcbS557nG6/o6a+po0tOE13Ye5t3Tu3ceXLxgNrc9tI7glvTJNIpCQocRUdWVwMqQZXcG/d0KvH+w0zVUnT/Tufhe2nGoR9DYvL+BORMLkqLF0hlTnP4aa/Yc5dITS/rc/tcv7qKprYN0ETqDclECfPmy+LVdD62QDK40jeYLMxb7iVVaIonUCi+SwczhBaZIjfYLfNG80oj/G6/BJF5f1Pk5mcwtLQzbX+OkiQX41RkHr6m1I+kafdjYUylk6tiRlBbl8vL2Wj52zpSu5b5OP9sONHHTueWJS1yQU8uKyEwXVkcIGsFP1IW5mdS1+Ljq5AlcesI4fvTUNqrrWhg9MovDx9p5+4C3Mbf6o7d6lGhu4FjsJ1ZpieQr75nFbQ+t79bKJBFP4OEcn0fDex+N3kQTTOL5Rf2uaWO4/6VdNLd3dGsG/8Ar75CdkcYLiy9m9MjkG6HCgkYKERHOmzGWlW/tp6PT3zVa767aY7R3+hPWEzxUblY6J00sZHWYnuGhT9R1LT7SBC6eXcz1Z5Rx/RnH26t/a/lb/Obld7hwVjEXzOrZam6gxTmxqpCM9ARfVdcSMY3ByycU5lDtPm0PNC2RzJlYiOIM2NnQ4kvYE3g4gf9fNHUa/dFbMImHd08fwy9f2Mmbu49yoXv9Hm5q45G1VdxwRllSBgywoJFyzps5lr+u3seGqnpOn+wUA23e70xEk+iWU8HOLB/F/722h7aOTrIzjldYhnui9iv85Ont3DB/Urfld1x5Iq/uPMytf17LiKwMDja0Rvyy609xTjQdJ3tTmJNJfWvPp3UR+OrDG2jv7N5nYPWeIzyypqor7ZECRn/SEskTG6pJE3j6tgvD1nsF91/42sLBLSqpdjv2eZl8aSiZXz6KzHSnXiMQNP74+l7aO/x86typCU5dZDZgYYo5d8ZYRODl7cfbgG+ubiArI41pY5OnCfEZU0bT3uHnraruM6tF83Sfk5nOotNKaWjt4EBDa1frniWPbOCbyzYOuAnlzRdM63nMjLSonrIr9h6lsc3JLQXLSk8jDboCRnAa//T63h5pDyddJCZP/KrK3zfu55xpY8IGjMCAky9/7WIy04WtB73N3RIr++tbGJuX3e3hIhWMyMrg1LIiXtvl1Gu0+jr5w+u7ueSEcUk9qKcFjRQzemQWJ00s6BY0tuxvZHZJflJNLhWoDA9tehttc8M/v7G3x7LWDj9NbeG/dKMpzlm79ygZaUJJ0BfpB86c5Pkpu665nVv/XMGEwly+s2gupUW5XZPn/OCGU+iM0Hi8tzblgX3kZWfgV41JkePbBxrZVXuMK0+e0Ot2ZaNG8OGzJvPQ6n3s7udw4/1RVddCaYzqM5LNu6ePYWNlHQ2tPlasq+ZQUzufOS95cxlgQSMlnTejmLV7j9LU1oGqOi2nkqQ+I6A4P5upY0fyZkjQuCTM1Jy9laFHW6bvtTjn1Z2HWL6umlsunsG/vnEZu753JRMKc9h3pLnX9wU6wpUveYJzvvcMBxpaufcjp/Phs6fwypJLeOeeq3hlySUsmlcasYw+0k1ZWpTbtY+Xv3YxedkZ/OjJgXc+W7lxP2kCC+eO73PbL1wyg8x04b+f3jbg43oVbce+oeSc6WPwK7yx6wj3v7yLEycU8K7pYxKdrF5Z0EhB588cS4dfeX3nYWoa2zhyrD2p6jMCzpgyijV7jnR1Rtxf38LydVWUjxnBxMIcT1NaRvoyKcrN7NG5y2vRkq/Tz53LNzFpdC63XDQdcDolLppXyovbD1Hb2Bb2fcG9qsHJ8aRBxKfySB3QPnzO5LDLg9NeNCKLz14wjSc3HxzQlKaqyhMb9vOu6WMYm9d3H55x+Tl84t3lLF9fzdY4tlwLTl91XWvKBo2qo8618pnfr2bbwSbmTSpKimbxvbGgkYLOmDKKnMw0Xt5xiM3ViZ1Dozdnlo/iaLOPnbXH8PuVrz68gQ6/8rubzuLVOy7t9lQeSaQv3ruuPanbjIEA7zkp/BAroR54+R121DRx1zUnkRO07+vnldLpV1asDx3txhGuEt/n14j1KMGzGgYHyO8sOjns8tC0f+q8qYwemcUPBzDUxZb9jew6dIyrTp7o+T2fv2A6eVkZ/Pip+A/hUtfsDO+RikFjWUUVdy7f1G3Zo2srk2rMr3Cs9VQKyslM56ypzpAigYrNEyYkZg6N3pwxxRm8cM2eI7yy4xAvbT/Ed987t0fHxN5E6vkbWB74fdNv3+C5rTUcOdYetilj8FDUAsydWNCjD8nMknxOLi3ksYpKPh2m3Lk/TXQjNfP00vwzLzuDWy6aznee2MKrOw/16FnsxRMbq0lPExac1Hcny4BRI7P4zPnT+MnT2zjzO0939dburUlzf5s/H29um3p1Gr0NTJgsHfnCsZxGijp/xlh21h7j2bdrmDx6BAU5yTf3+cbKOtIEvvbIRu5asYk5Ewr48FnRD20faN3TW87k61eeSHN7Jz97ZnuPdaHFSgpsr2kK+8T33nmlvFXVELZoJhFjBn30nCkU5WbyyQfe7HOO+FBdRVPTxjDGQ9FUsJICZ/vaprY+x6QayAjFxzv2pV5OI9kHJozEgkaK8rlNOdfsOUpNY2vSZXmXVVTx9cfe6hpfR4FdtU0sXxe+6GegZpbkc+OZk/jj63vYVdu9yWi4J762CENRX3vaRNLThEcrKnusu/qUnq2P4t0R7p9vHeBYe0ePvh5ePu/N+xvYfbiZq8Kkuy8/f3ZHj2WRmjQPZITiVA4ayT4wYSQWNFLQsoqqbk/UrT5/0s09kYg5A7582SyyM9L4/j/e7rY8mhF0x+Zlc+GsYpZXVNMZNKJcfYuP5euqKSnI9lyJHwtLV23F1+ltjvhQT2zY7xZN9d1qKlQ0T8kDeaKurm8lKyONMUnaO3ogItXHJcvAhJFYnUYKWrpqa9iJZpKprDQRWfPi/GxuuXgGS1dtZf53nuJQUzv52ZFvgUhPfNefXsqzb9fw2s7DnOcOEvntxzdR29TGY7e8m1PKBm92xP78H5dVVPGDf75NdX0r2RlpvLitNurrIpre8gPpWe/00chN+hZF/dFXfVyysqCRgoZCWWmshuiIVnFeNgIcamoHoLGtAwHS0yA4zvb2xHfZiSXkZ2fwaEUl580cy6pNB3h0bRX/funMQQ0YEP3/MXRsr7YOf79Gyw03zXCkJs3XnTaR/3l+Z7dlXnuzB8beSlWDPd5VLFjxVAoaCmWlicqa//SZ7T16XCuQl53ZZxPXgJzMdE4qLeCxtVWUL3mCf/vjGsqKcrn14hlxTXs44f6PQMQGBbGaATG4uXBAuFkjVZWXdxyiaERmV7HdyKx0FPU0X30qd+wbqiynkYLCPQUmW1lporLmkXJb9S0+1n3rPZ72sayiirV76rqCj1+dVkQrN+4f9KfG0P9jSUEOLb5O/rp6Hx89ZwqFITPVxXIGxOCn5I/95l88v7WW+mZft2Ou3HiADZX1LL3hFN7vDjhZ29jGBT94jp88tY2ffWhexP37Ov3UNEY3+ZKJPwsaKWiolJUmImsei2Kxpau29hhosC2B7etD/49r9hzlxvte47aH1vHrj88nzR0tcc/hY2Slp/VIOww8F3rHFSdy1c9f4t7nd/D1K08EnC/9paveZlZJHteffnxI++L8bG46t5z/fWEnt1w8nRPGh+94eqC+FdXU7KMxlFnQSFFDsax0MMQiF5bsdUZnTBnFf149hzuXb+LUu5+ksbWDotxMmn2dpKcJmUi3FlexyIXOmVjA9fPK+N0ru/nYOVOYNHoEf3lzH7sPN/ObT8wnPWSY389dMJ0/vL6HHz25jV9/fH7YfaZyc9uhzIKGGVZikQtLVCV+NPKzM0gXobHVmVc9MJnVHVfPYdSIrLjkQr+yYBYr1lfxnp+8SIuvkzSBacUjww5CWTgik5vPn8aPntrGun11nBamfqO63oJGMrKgYYadgebChkKd0Q+f3NZtPnVw6l7uf+mdPsfz6q9/7TqCKl3/F79C5ZEWlq+rDnu8m86byi9f3MkHf/Ua7R3+HgEsMPnSxEILGsnEWk8ZE6VIAw0mU3FgIorQlq7aSoe/e6Bq74zcYfPpzQdp8/lp6/D3GF5kWUUV9z7n9Dq/7McvJFXH1OHOchrG9EOy1xkloggt2kAVLsi0+DpZ8sgG/EqPoVEgur4kJj4sp2FMCkpEP5ho+wdFCiatHf6w0+DGc4gZ450FDWNSUCKK0KINVNHmepKlddpwl5DiKREZDfwVKAd2Ax9Q1aMh25wG/C9QAHQC31XVvw5uSo0Zuga7CC3almmRGhTkZKZxtNnXY3trRZUcElWnsQR4RlXvEZEl7uuvhWzTDHxcVbeLyERgjYisUtX+z21pjImraAJVpCADJH3rtOEsUUHjOuAi9+//A54nJGio6ragv6tFpAYoBixoGJMiegsyyT6iwXCVqKBRoqr7AVR1v4j07P0TRETOArKAnRHW3wzcDDB5cvQzvxljkkuyt04bzuIWNETkaSDc7C7fiHI/E4A/AJ9Q1Z6D5gCqeh9wH8D8+fNDBzE1xhgTI3ELGqp6WaR1InJQRCa4uYwJQE2E7QqAJ4BvqurrcUqqMcYYjxLV5HYF8An3708Ay0M3EJEs4DHg96r6t0FMmzHGmAgSFTTuAS4Xke3A5e5rRGS+iNzvbvMB4ALgkyKyzv05LTHJNcYYAyCqqVUFMH/+fF29enWik2GMMUOKiKxR1fDj1AexHuHGGGM8s6BhjDHGs5QrnhKRWmDPAHYxFjgUo+Qks+FynjB8znW4nCcMn3MdzPOcoqrFfW2UckFjoERktZdyvaFuuJwnDJ9zHS7nCcPnXJPxPK14yhhjjGcWNIwxxnhmQaOn+xKdgEEyXM4Ths+5DpfzhOFzrkl3nlanYYwxxjPLaRhjjPHMgoYxxhjPLGi4RGShiGwVkR3ubIIpQ0QeEJEaEXkraNloEXlKRLa7v0clMo2xICKTROQ5EdkiIptE5Evu8lQ81xwReUNE1rvn+m13+VQR+Zd7rn91B/4c8kQkXUQqROTv7utUPc/dIrLRHWtvtbssqa5fCxo4FyRwL3AFMAf4kIjMSWyqYup3wMKQZYEpd2cCz7ivh7oO4HZVPRE4B/iC+zmm4rm2AZeo6qnAacBCETkH+C/gJ+65HgU+ncA0xtKXgC1Br1P1PAEuVtXTgvpnJNX1a0HDcRawQ1V3qWo78BecKWlTgqq+CBwJWXwdzlS7uL8XDWqi4kBV96vqWvfvRpwvmVJS81xVVZvcl5nujwKXAA+7y1PiXEWkDLgKuN99LaTgefYiqa5fCxqOUmBf0OtKd1kq6zblLtDrlLtDjYiUA/OAf5Gi5+oW2azDmcTsKZzpkOtUtcPdJFWu4/8GvgoEZu4cQ2qeJziB/0kRWeNOYw1Jdv0mao7wZCNhlllb5CFKRPKAR4Avq2qD82CaelS1EzhNRIpwJiw7Mdxmg5uq2BKRq4EaVV0jIhcFFofZdEifZ5BzVbVaRMYBT4nI24lOUCjLaTgqgUlBr8uA6gSlZbAcdKfaDczDHnbK3aFGRDJxAsafVPVRd3FKnmuAqtYBz+PU4xSJSOBhMBWu43OBa0VkN06x8SU4OY9UO08AVLXa/V2D8yBwFkl2/VrQcLwJzHRbZGQBN+JMSZvK+pxyd6hxy7p/A2xR1R8HrUrFcy12cxiISC5wGU4dznPADe5mQ/5cVfUOVS1T1XKc+/JZVf0IKXaeACIyUkTyA38D7wHeIsmuX+sR7hKRK3GeYNKBB1T1uwlOUsyIyIPARTjDLB8EvgUsAx4CJgN7gferamhl+ZAiIucBLwEbOV7+/XWceo1UO9dTcCpF03Ee/h5S1btFZBrOE/looAL4qKq2JS6lseMWT31FVa9OxfN0z+kx92UG8GdV/a6IjCGJrl8LGsYYYzyz4iljjDGeWdAwxhjjmQUNY4wxnlnQMMYY45kFDWOMMZ5Z0DAmxkSkqe+tjBmaLGgYY4zxzIKGMXEiInki8oyIrHXnSLguaN1/isjb7vwID4rIV/DP2P8AAAD2SURBVBKZVmO8sgELjYmfVuC97qCJY4HXRWQFcAbwPpxReDOAtcCaxCXTGO8saBgTPwJ8T0QuwBnWpBQoAc4DlqtqC4CIPJ64JBoTHQsaxsTPR4Bi4AxV9bkjteYQfmhvY4YEq9MwJn4KceaC8InIxcAUd/nLwDXuPN95OLPSGTMkWE7DmPj5E/C4iKwG1gFvA6jqm27dxnpgD7AaqE9YKo2Jgo1ya0wCiEieqjaJyAjgReDmwPzmxiQzy2kYkxj3icgcnDqO/7OAYYYKy2kYY4zxzCrCjTHGeGZBwxhjjGcWNIwxxnhmQcMYY4xnFjSMMcZ49v8BqWtUdrxRijUAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "sample_store = 2\n", - "brand_list = sales['brand'].unique()\n", - "l_range = list(range(1, 53))\n", - "\n", - "for j in range(len(brand_list)):\n", - " brand = brand_list[j]\n", - " d = sales.loc[(sales['store'] == sample_store) & (sales['brand'] == brand)].copy()\n", - " cor = []\n", - " for l in l_range:\n", - " cor.append(single_autocorr(d['logmove'].values, l))\n", - " l_range.insert(0, 0)\n", - " cor.insert(0, 1)\n", - " plt.scatter(list(l_range), cor)\n", - " plt.plot(list(l_range), cor)\n", - " plt.title('time series for autocorrelation for store {} brand {}'.format(sample_store, brand))\n", - " plt.xlabel('lag')\n", - " plt.ylabel('autocorrelation')\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Impact of promotional information: deal and feat\n", - "\n", - "We find that deal column has a very significant impact on sales. The impact of feat column also looks strong although the pattern shown in the scatter plot is a bit noisy." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'logmove')" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Check the impact of deal, feat by plotting logmove vs feat and deal\n", - "# These two features significantly impact the sales\n", - "plt.scatter(sales['feat'], sales['logmove'])\n", - "plt.title('logmove vs feat')\n", - "plt.xlabel('feat')\n", - "plt.ylabel('logmove')\n", - "p = sales.boxplot(column='logmove', by='deal')\n", - "plt.suptitle('')\n", - "p.set_title('logmove by deal', linespacing=3)\n", - "p.set_xlabel('deal')\n", - "p.set_ylabel('logmove')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Impact of price\n", - "\n", - "We find that the sales does typically decrease when the absolute price or the relative price of the product increases." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# correlation between the sales and price, sales and relative price\n", - "sales['price'] = sales.apply(lambda x: x.loc['price' + str(int(x.loc['brand']))], axis=1)\n", - "price_cols = ['price1', 'price2', 'price3', 'price4', 'price5', 'price6', 'price7', 'price8', \n", - " 'price9', 'price10', 'price11']\n", - "sales['avg_price'] = sales[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols))\n", - "sales['price_ratio'] = sales.apply(lambda x: x['price'] / x['avg_price'], axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.scatter(sales['price'], sales['logmove'])\n", - "plt.title('logmove vs price')\n", - "plt.xlabel('price')\n", - "plt.ylabel('logmove')\n", - "plt.show()\n", - "plt.scatter(sales['price_ratio'], sales['logmove'])\n", - "plt.title('logmove vs price_ratio')\n", - "plt.xlabel('price ratio')\n", - "plt.ylabel('logmove')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Impact of holidays \n", - "\n", - "It seems that the holidays don't have a significant and consistent impact on the sales of orange juices." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# read in the holiday information\n", - "week_decoder = pd.read_csv('week_decoder.csv', index_col=False)\n", - "sales = sales.merge(week_decoder, how='left', left_on='week', right_on='Week #')\n", - "sales['Start'] = pd.to_datetime(sales['Start'])\n", - "sales['End'] = pd.to_datetime(sales['End'])\n", - "sales['Special Events'] = sales['Special Events'].map(lambda x: x.strip())" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "logmove count mean std min 25% 50% \\\n", - "Special Events \n", - "4th of July 2739.0 7.483900 2.708179 0.0 7.272398 8.166216 \n", - "Christmas 1826.0 8.389864 1.492928 0.0 7.685244 8.515592 \n", - "Easter 1826.0 8.414611 1.824091 0.0 7.560080 8.462948 \n", - "Halloween 1826.0 8.146464 1.465622 0.0 7.685244 8.166216 \n", - "Labor Day 2739.0 7.883681 2.250098 0.0 7.655391 8.317766 \n", - "Memorial Day 1826.0 8.049624 2.094664 0.0 7.560080 8.363576 \n", - "New-Year 1826.0 8.182360 2.069277 0.0 7.491088 8.499431 \n", - "Non-holiday 92213.0 8.094138 1.965484 0.0 7.608871 8.348538 \n", - "Presidents Day 1826.0 8.014657 2.123442 0.0 7.377759 8.184235 \n", - "Thanksgiving 1826.0 8.275527 1.373684 0.0 7.742402 8.435549 \n", - "\n", - "logmove 75% max \n", - "Special Events \n", - "4th of July 8.868413 11.859178 \n", - "Christmas 9.281355 11.639875 \n", - "Easter 9.276877 12.932577 \n", - "Halloween 8.680672 11.578863 \n", - "Labor Day 8.995165 11.417999 \n", - "Memorial Day 9.135617 11.603716 \n", - "New-Year 9.351840 11.638747 \n", - "Non-holiday 9.010913 13.482016 \n", - "Presidents Day 8.877382 13.047916 \n", - "Thanksgiving 9.041685 11.253947 \n" - ] - }, - { - "data": { - "text/plain": [ - "(array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),\n", - " )" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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Kowrr7ySLbfcknfffZcePXpw5ZVXAjBx4sSM07nMpGnDyvrWFq5p5CFLcxmy2jd9+vRpUHafPn2ilm9m1qVLFwOsR48eVlFRYT169DDAunTpEj2LmdnkyZNt4MCBVlFRYQMHDrTJkydnkqOystJ69uxp06dPtwceeMCmT59uPXv2tMrKymgZ8vZ+zUuOYrGvafg0Iu1I4z/+tmdPbaoDQzTz5s1rkGXevHlRywdYsmQJVVVVbLLJJpgZm2yyCVVVVSxZsiR6lurqasaNG8fEiRO57777mDhxIuPGjcukuayuro6bbrqJoUOHUllZydChQ7npppuoq6tr+YdbSZr3rIvLpxFxDth444257rrr6ldjO/roo1m+fHn0HOPHj+e4445jzJgxzJkzhwEDBnDccccxfvz4TJrKZs6cySGHHNLgvmvfvNKIrKKigtWrV9d/dfmwaNEiDjrooPrprrM6gp09ezbz5s1j2bJlrF69mn//+99cccUVLF68OFqG4g4aZ511FmeddVbJ5/hRfrbGjBnD73//+/q1yk866aQo15q8eSqy0aNHc/fddzN69Oiso7gidXV1rFy5EgjTXcdsgilWUVHBokWL6j+QzYxFixZRURHvX7XQ7DN58mS6d+9ev1Jdx44d6d69O5MnT/YKI2OFTgqbbhqm79t000258soro/Ru8zONyK666iquuuqqrGO4nFq1ahVAfaVV+FrYHlOhOWz8+PHMmj2H7bffnnHjxrXrHmV5cfXVV7PJJptQXV3doEn16quvLvvZhlcaZZZmLIaf6ru8OvbYYzn22GPpN/YeZv7ysKzjuERdXR177bUXhxxySH3z1AEHHMDUqVPLXrY3T5VZ4VR/8ODBJR8fPHiwVxhuDQMHDqS6upqBAwdmHcXl1L333ssvfvELpk2bxi9+8QvuvffeKOW22UojzTQVMUdkP/fcc2tUHIMHD+a5556LlsFtOObPn8/xxx/P/Pnzs47iSPd5EXuGh8YHm7EOPtts85SZNftHzOLovlBB9Bt7D3P9VN8147333mP16tW89957WUdxfPJ50bdv3yZnMYg9xqhLly6MHTu2vsdfly5dovSya7NnGs5taIoPcgoXvosvgLfnucryYt68eWtMcxO7wii8DxYvXtygx1+hwih3K0qbrjSaOpvwawguj8ysyXm3+vTp4+/bnMh6FgMz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7md8RHh55CWHWX6y5CWHmWcpJS85zPKTpc2PCDezc8xsGzPrB4wAppvZt2LncM45t/ba/OA+55xzrSerC+EAmFktUJtlBuecc+n5mYZzzrnUvNJwzjmXmlcazjnnUvNKwznnXGpeaTjnnEvNKw3nnHOpeaXhnHMuNa80nHPOpeaVhnPOudS80nDOOZeaVxrOOedS80rDOedcal5pOOecS80rDeecc6l5peGccy41rzScc86l5pWGc8651LzScM45l5pXGs4551LzSsM551xq0SsNSX0k1UiaI2mWpNNjZ3DOObduKjMosw44w8yekdQNeFrSA2Y2O4Mszjnn1kL0Mw0ze8vMnkm+XwTMAT4VO4dzzrm1l+k1DUn9gF2BJ7LM4ZxzLh2ZWTYFS12Bh4HxZvaXEo+PAkYB9OrVa8gtt9yyXuUtXryYrl27rtdrtJa8ZMlLDshPlrzkAM+S5xyQnyytlWPo0KFPm9luLT7RzKLfgI7AfcCP0zx/yJAhtr5qamrW+zVaS16y5CWHWX6y5CWHmWcpJS85zPKTpbVyAE9Zis/jLHpPCZgEzDGzy2KX75xzbt1lcU1jL+DbwFckPZvcDs0gh3POubUUvcutmT0KKHa5zjnn1p+PCHfOOZeaVxrOOedS80rDOedcal5pOOecS80rDeecc6l5peGccy41rzScc86l5pWGc8651LzScM45l5pXGs4551LzSsM551xqXmk455xLzSsN55xzqXml4ZxzLjWvNJxzzqXmlYZzzrnUvNJwzjmXmlcazjnnUvNKwznnXGpeaTjnnEstk0pD0sGS/iXpRUljs8jgnHNu7VXGLlBSB+B3wAHA68DfJU0xs9llKm+NbWZWjqJalJcseckB+cmSlxzgWfKcA/KTJascWZxp7A68aGYvm9kK4BbgyHIUVGqnNre9nPKSpbi8M844I7McjcscMWJEZlnykqO5MrPO0r1798yyFJe39dZbZ5YjT1my/D/OotL4FPBa0f3Xk21lY2bU1NRkdmSSxyxmxuGHH555jkKW0aNHZ54lLzkKWfLwPilkueuuuzLPYmZMnjw58xx5ypLF/3H05imgVFW4xm8saRQwCqBXr17U1tauc4G1tbUsXry4wWusz+utjzxkOeOMMxrkOOOMM5gwYUIm+2TEiBENsowYMYJbbrklepa85CjIw/sEwhlGcZbu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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# the logmove statistics for all holidays\n", - "sales_copy = sales.copy()\n", - "sales_copy.loc[sales_copy['Special Events'] == '', 'Special Events'] = 'Non-holiday'\n", - "print(sales_copy.groupby(by='Special Events').apply(lambda x: x['logmove'].describe()))\n", - "\n", - "# box plot for logmove across all holidays\n", - "p = sales.boxplot(column='logmove', by='Special Events')\n", - "plt.suptitle('')\n", - "p.set_title('logmove by Special Events', linespacing=3)\n", - "p.set_ylabel('logmove')\n", - "plt.xticks(rotation=90)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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9iERlUUte9v0dj3i9EHncDhjixX7VuDhTQ+j0duIwtRC3HTCTTh34rkjPSxOP3lm/cHspatqilvcAWue0xa8ccHkuiVzStsHu9977723oLy83OfxeERj2V/+8peCa6+9tt3pdKqD3f/atWtTQqEQ7dy5c/tg9zUaGEkf/3cAvDmCx+dwOEcBK/atwN1r70aDtwEMDA3eBty99m6s2LdipIfG6QfPrD+Y/avl20ub3QErA9DsDlh/tXx76TPrD2YPZr979+61rFy5MuPaa68NN+66995785ubmy2nnXZaxcknn1xhLP/hD39YXFlZObW6urrq8OHDvRTbpqYm8fTTT59UUVExtbq6uurjjz921NXVSVdfffWEnTt3OqqqqqZu27YtblOo4uLiGQ0NDRIAfPjhhyknnXRSpfnzjo4Oobi4eEYgECAAaG9vj3h/tDAigp+IfgZAhqlzWox1riOiDUS0oaWl5cgNjsPhHFEe3vQw/IofipQP2XIcAMCv+PHwpodHeGSc/rB0VU1xQFYjZEpAVoWlq2qKB7Pf73//+yUPPvhgrSD07PrOO+9szs/PD33wwQe7P/74490A4PP5hLlz53p27dq1fe7cuZ4//vGPveoX3HrrrUXV1dXdu3fv3v6rX/2q7sorr5xQXFwsP/roowdnz57t2blz5/Zp06Yl6iCakKysLHXu3Lnul156KQMAHn/88eyvf/3rHTab7agKkDzigp+IrgSwEMDiRHXbGWN/ZYzNZozNzssbcP0JDodzlNPobQQAeDIvhzv7u72Wc0YHLe6AtT/Lk+H555/PyM3NlU899dTuvta1WCzs0ksvdQHArFmzvAcPHux13E8++cR5zTXXtAHAeeed5+7s7JTa2trE6PUGw3XXXdfy5JNP5gDAM888k3vddde19rXNkeaICn4iOhtaL/HzGGN9fpEcDufYpzC1EACgCmlQhbReyzmjgzynLdif5cnw0Ucfpb3zzjuZxcXFM6666qqJ69evd55//vkTYq0rSRIzrAKSJEGW5V7m9Vi6JhElrY2LoshUVQsp8Pl8MeXnmWee6a2trbWtWLEiTVEUOvHEE/3J7v9IMZzpfM8DWAegkohqiegaAI8AcAJ4h4g+J6LHhuv4HA5ndHDTCTfBLtrBBDuY4AAA2EU7bjrhphEeGac/3Lhgcp1NEiIC7WySoN64YHLd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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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8TOhRnLyhDOBUvRz5851tJ/NzMys27dv3y7l86xZs04q76dPn146ffr0JqlgH3/88UH156qqqh8AYNSoURWjRo2qAID09PS6/fv37wKAq6++2qXSfeONN47GxMRIJ06cMF5++eXZffv2rQKA7777bo96u6+++mq/876uxgSA999//7DyfuTIkRW33377LkmScNddd6X27dvX78q/zSv+hjlY7fs0N3dvIUKdJM8DexvA5VyrvyG4j5WEHnAu4KPFo2M2UCOPUh17cRimzTJ8+PD08+fPG61WKz311FPHU1NTbf48/quvvhq/ePHieKvVSrm5uVXTpk077c/jA6Gg+B2V1dyWDGhCc9H6jg5uPlj8zrX62dWvL0xEEGiI0tfiiWlyTpXAQHb1M0ybw9my9zczZ848NXPmzFOBHKPNB/f50pbX1kyddYtBdu1aPVT4cyuPgfP49Yxy3qskSXONBue4jTovvAUMwzDBps0r/obKatr3aa6zmlLW1VOFP3c41+rnOX59oTyAVddLmhW32U3cBit+hmH0SNtX/D406Wlujt+smgdueVS//Jctfn1gtp+GaknS7Kp3TtG0Olz9bf7fi2GYi5A2f2fypUlPc3P8Sr19n/L4DY0jwOvZOtQVaotfqzfHeY6/odyv/+VjGIZpKW1e8RuIYIB3c/xWSXjMwW6ZxS9H8isVmji4T18o57OmmekeNc5xGw7FzxY/w7QYpbEN4z9C4s7kPAfbHJosfl/z+MngGAPg4D69oTzweW3xu3L18zllGEaHhITid86d90S9EBDwbIErx/Mpj9+phDAH9+kLk8Pi93KO34XFz+eUYfyHJEm4//77k9PT03MzMjJyFi5cGAvI7XndtcpNSkrKf+SRR5IuvfTSrLy8vOxvv/028sorr0xPSUnJe/nllxM8HXfkyJGXLF26NEYZf8yYMd3ee++9DjabDffff39yXl5edkZGRs4rr7wS70pePdPm8/iBpjdmT2ix1pTqe77l8avGMTYE97GrXx8o573K26h+Fxa/hV39TBvisaLDKcUXaiKb31I7We3Cq17NTj2iZdv333+/w86dOyOKiop2HT9+3FRQUJB97bXXVv73v/+NUlrlHjt2zJSXl5c3adKkMmW/lJSUuu3btxffc889KZMnT+62efPm4urqakNeXl7u008/XeruuLfddtuZpUuX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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf4AAAEjCAYAAADTz2PUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnXd4VFX6x79nek3vISQhPQGigAoIIgJiAXHFgsqCLLZlV1TWtugqKrsLru2HZbGsiLpYFhUEbIiIFBGpgZCeEEjvk5nMZNo9vz/uvZNJMjMJ6cD5PE+eZG4559w7N/c9bznvSyilYDAYDAaDcWEgGewBMBgMBoPBGDiY4GcwGAwG4wKCCX4Gg8FgMC4gmOBnMBgMBuMCggl+BoPBYDAuIJjgZzAYDAbjAoIJfgajhxBCfiKE3H2h9s9gMM5NmOBnDFkIISsIIR8NYH/jCSHbCSENhJBaQsj/CCGRA9V/X0IIWUsIMbn9WAkhxsEeF4PBGHyY4GectxBCZGd5SiCAtwHEAYgFYASwbpDG0isopfdTSnXiD4CPAfxvIMfAYDCGJkzwMwYdQsjjhJByQoiREJJHCJlGCLkGwHIAtwka6zHh2ChCyFeCVl5ICLnHrZ0VhJCNhJCPCCHNAO4ihEgIIU8QQooIIfWEkM8IIUGexkEp/YZS+j9KaTOl1AzgdQCXdzH8BELIAUKIgRCyWWybEBJHCKGEkMWEkNMAfhS2/48QUiUc/zMhJMNt/O8TQt4ghGwT7sWvhJAEt/0zCCG5wrmvAyDdvL9aAHMBrO/O8QwG4/yGCX7GoEIISQHwZwCXUEr1AGYCOEUp/RbAPwB8KmitmcIpHwMoAxAF4GYA/yCETHNrcg6AjQACAPwXwFIANwKYIpzTCOCNbg7vCgDZXRyzAMAfhLYdANZ02D8FQJpwXQDwDYAkAGEADgtjdOd2AM+Ctz4UAvg7ABBCQgB8DuApACEAitD1pERkLoBaAD9383gGg3EewwQ/Y7BxAlACSCeEyCmlpyilRZ4OJITEAJgE4HFKaSul9CiAdwH83u2wXyilmyilHKXUAuA+AE9SSssopVYAKwDc3JXpnRAyGsDTAB7tYvwfUkpPUEpbAPwNwK2EEKnb/hWU0hZhLKCUvkcpNbqNJZMQ4u92/BeU0gOUUgf4ScFFwvbrAJyklG6klNoBvAqgqouxiSwE8AFlhTkYDAaY4GcMMpTSQgAPgReCNYSQTwghUV4OjwLQQCl1D1IrBRDt9vlMh3NiAXxJCGkihDQByAE/2Qj3NiZCSCJ4zfxBSunuLi7Bvb9SAHLwGnmn/YQQKSFkleB2aAZwStjlfry7MDcD0Al/R7m3JQjxjtfq6VpiwFsdPujqWAaDcWHABD9j0KGUbqCUTgIvpCmA1eKuDodWAAgihOjdtg0HUO7eXIdzzgC4llIa4PajopSWwwOEkFgAPwB4nlL6YTeGH9NhLHYAdV7Gcwd4V8R0AP7ggwiB7vnqK937IoSQDn17YwGAfZTS4m4cy2AwLgCY4GcMKoSQFELIVYQQJYBWABbwGjkAVAOII4RIAIBSegbAPgD/JISoBHP8YnT2k7uzFsDfBYEOQkgoIWSOl7FEgw/Ce4NSurablzCfEJJOCNEAeA7ARkqp08uxegBWAPUANOBjGLrLNgAZhJCbBDfFUgAR3ThvAYD3z6IfBoNxnsMEP2OwUQJYBV5LrgIf9LZc2CcuP6snhBwW/r4dvKZcAeBLAM9QSrf7aP//AHwF4HthHft+AJd5OfZuACMAPOO+Br6L8X8IXrBWAVCBF8je+AC8O6AcwElhLN2CUloH4Bbw96oefIDgXl/nEEImABgGtoyPwWC4QVi8D4PBYDAYFw5M42cwGAwG4wKCCX4Gg8FgMC4gmOBnMBgMBuMCggl+BoPBYDAuIJjgv0AghEwmhOT14vzhQpS7tOujBw4hH37iYI/jbCGEXE4IKRDu6Y2EkG8IIQuFfXcRQva4Hdvja+yL+0MIySaEXOljPysPzGCcQwxoxTDG4CFkoEvpxfmn0ZZFjtF7ngPwOqX0/4TPmwZzML6glLoXEloBIJFSOn/wRsRgMHoD0/gZjF7Sw5K7sei6ABDDC0PN8sRgnEswwX8OI5hxlwgmYyMh5HlCSAIh5BdCSLNQglYhHHslIaTM7dxOpXCF7ZcSQg4K51cTQl4WtotlZmXC55+E/vYKbXwvVJAT219ACCklfCncvxFCThFCpnu4hvFCmVqp27bfEUKy3Mbzi5Brv5IQ8rp4TR7aamdy9mAyTyWEbCd8Sd88QsitPu7tIkJIjnBtxYSQ+9z2XUkIKRPuYRWAdcL2WYSQo8JY9wmZBT21XQQ+UdAWwdSv7K65XDj2RULIaeH7WUsIUbvtf1S4TxWEkD/4aGcqIeS42+cfCCEH3D7vIYTcKPx9ihAynXgplSwQ6+1Z6NCveM3iD0cIuUvY5/X7IXzJ4n8TQr4mhLQAmEoI8SeEfEAIqRWetaeIkOWRwWD4gFLKfs7RH/B54L8C4AcgA3w62B3ghYo/+OxwC4VjrwRQJvydAj6HfZTwOQ5AgvD3LwB+L/ytAzDe7RgKQCZ8/gl8adhkAGrh8yphXzoAE/hKegoAL4LPYT/dy3UUAZjh9vl/AJ4Q/h4LYDx4t1Qc+CI7D3W4B4luY7rbbd9dAPYIf2uFa14ktDUGfLbADC9juh5AAvg8+lPAF8wZ43YvHeBrCiiF6x8DoAZ8VkAp+Ip4pwAovbR/yv1+uI/dfdwervFV4TsPAp8CeAuAfwr7rgGf5nikcL0b3M/t0L8KfHrkEOF+VIHPhqgXrscCILjjWMEXU/qoQ1ten4Uunt9rhD5juvp+wGdHNIAvRSwRxv8BgM3CmOMA5ANYPNj/l+yH/Qz1HzY7PvdZTSltppRmAzgB4HtKaTGl1AC+wtzFHs7xVQrXDiCREBJCKTVRSn2llV1HKc2nfMnZz9BWQvZmAFsopXsopTbw5W19pYj8GHwqXhC+AM91wjZQSg9RSvdTSh2U0lMA3gIviM+WWQBOUUrXCW0dBl/f/mZPB1NKt1FKiyjPLgDfA5jsdggHPl2wVbj+ewC8RSn9lVLqpJSuBz8RG9+DsXqEEEKEfh6mlIpVCv8BYJ5wyK3gvxOxTPAKb21RSlsBHARwBYBxALIA7AEvWMcDKKCU1p/F8Lw9C96uJRm84L6N8jUYuvP9bKaU7qWUcuCf09sA/JXyZY5PAXgJ7Us0MxgMDzDBf+5T7fa3xcPnTgF51Hcp3MXgNbdcQshvhJBZPvrubglZM/j88t7YAOAmwhfquQnAYUppKcALCELIVsEd0Axe0Hk0I3dBLIDLBDO8WKL3TngpdEMIuZYQsl8wOzeBn4y491srCE/39v/Sof0Y8PeirwgFX9znkFsf3wrbgQ73HXxdAF/sAm+9uEL4+yfwk6opwuezwduz0AlCiD94Tf1vtK3scXe+H/drCwFvTXK/xo4lmhkMhgeY4L9AoV5K4VJKCyilt4MvlrMawEZCiPYsm68EXxwGACD4oIN9jOUk+Jf2teBL125w2/1vALkAkiilfuB9zN7K2LaAF4wiHYXGLtq+PK+OUvrHjo0IE5DPwbsowimlAQC+7tCvp/K/f+/QvoZS+rG36+4BdeAncxluffhTSkUh2650L/gywb7oKPh3oWvB36viHoIPfgOAnZTSt9x2def7ce+7DrzWH+u2rWOJZgaD4QEm+C9AiI9SuISQ+YSQUMGc2iSc4q3MrDc2AphNCJkoBOI9i65rzm8AX9nuCrSvJqcH0AzARAhJBdBJULtxFLzlQEP4teuL3fZtBZBMCPk9IUQu/FxCCEnz0I4CvCukFoCDEHItgKu7GP87AO4nhFxGeLSEkOsF10WfIHwn7wB4hRASBvClhAkhM4VDPgNwF2krE/xMF03uAx/vcSmAA4K7KBZ8nMLPXs5pVyq5B/wdvD//wQ7bz+b7AeVLH38GvuSynvBll5cB+KiH42IwLhiY4L8w8VUK9xoA2YQvR/t/AOZ1MGl3iSBAHgDwCXgt1Ag+8M3q47SPwWufP1K+BK3II+CtAEbwQu9TH228AsAGXjitB/BftzEZwQvveeADyqrQFpzXcfxG8JOQzwA0Cv1/5aNfUEoPgve/vy6cUwg+SK+veVxoe7/g+vgBQn4GSuk34IP/fhSO+bGLMbcAOAwgW4jFAPjgzlJKaY2X0zyVSj4bbgcfQ9DoFtl/59l8P248AN7KUww+PmEDgPd6MCYG44KCleVl9DuEEB1460ESpbRksMfDYDAYFzJM42f0C4SQ2YLJXQveV34c/LIwBoPBYAwiTPAz+os54E22FQCSwLsMmHmJwWAwBhlm6mcwGAwG4wKCafwMBoPBYFxAnBPV+UJCQmhcXNxgD4PBYDDOKQ4dOlRHKQ3t+kiv54fJZLJ3waeBZoriuQMH4ITD4bh77NixnVbonBOCPy4uDgcPHhzsYTAYDMY5BSGkq+yNPpHJZO9GRESkhYaGNkokEuYXPkfgOI7U1tamV1VVvQvgho772QyOwWAwGN4YGRoa2syE/rmFRCKhoaGhBvCWms77B3g8DAaDwTh3kDChf24ifG8eZTwT/AwGg8FgXEAwwc9gMBiMIY3D4UBaWlr61KlTE8Vtzz33XJjRaHTJMI1G46kEebewWCxk4sSJyampqenvvPNOoPu+uXPnxq1bty7Q27kAsGbNmuAFCxZ0VRRryHBOBPcxGAwGY+jz0f7SoDU7CqJrjVZFqF5pWzotqXz++NiG3ra7cuXK8MTERIvJZJKK2956663we+65p0Gv13O9bX/fvn0au91OcnNzT/a2rXMBpvEzGAwGo9d8tL806PmtJ2NrjFYFBVBjtCqe33oy9qP9pUG9abeoqEj+3Xff+d9zzz2u4l0rV64Mq6mpkU+ZMiX5sssuSxa3P/DAA9EpKSnpmZmZqWfOnOmk2FZXV0unT5+ekJycnJ6ZmZn666+/qsvLy2WLFi2Kz83NVaempqZnZ2d7LQwVHR09qrKyUgYAP//8s+bSSy9Ncd/f2NgoiY6OHmW1WgkANDQ0tPs8VGCCn3FecrTZjIpWW9cHMhiMPmHNjoJoq4NrJ1OsDk6yZkdBdG/a/dOf/hTzwgsvlEkkbU0/9dRTNWFhYfZdu3bl//rrr/kAYLFYJBMmTDDl5eWdnDBhgum1117rlL/gsccei8rMzDTn5+effP7558sXLlwYHx0d7XjzzTdLx40bZ8rNzT2ZkZHhq4qoTwIDA7kJEyYYP/vsM38AeO+994Kuu+66RqVSOaQCJJngZ5yX3J1dgpdPVQ/2MBiMC4Zao1VxNtu7w8cff+wfEhLimDx5srmrY+VyOZ03b54BAMaOHdtSWlraqd8DBw7oFy9eXA8AN9xwg7GpqUlWX18v7Xhcb7j33ntr33///WAA+Oijj0Luvffeuq7OGWiY4GeclzTZnWiwOwZ7GAzGBUOoXunRxOZte3fYs2ePbvv27QHR0dGj7rrrrhH79+/Xz5kzJ97TsTKZjIpWAZlMBofD0cm87qk2DSGk29q4VCqlHMeHFFgsFo/y8+qrr24pKytTbtu2Ted0Oskll1zS2t32Bwom+BnnHZRSmJ0cmh3OwR4Kg3HBsHRaUrlSJmkXaKeUSbil05LKe9rmG2+8UV5dXZ1VXl5+/P333y8eP368cfPmzSUAoNVqnQaD4axk2Pjx443r1q0LBoCtW7fqAwMDHUFBQd0ODhw2bJht7969GgD47LPPvEb6z5s3r37RokUj5s+fP+S0fYAJfsZ5SCtHwQFodjLBz2AMFPPHxzb8bVZ6aZheaSMAwvRK299mpZf2RVS/JxYuXFh37bXXJrkH93XF6tWrKw4fPqxJTk5Of/LJJ6Pff//9kq7OcTgcRKlUcgDw9NNPVzz22GPDx44dmyKVSr1aChYvXlzf3NwsW7x4cb9ce285J8ryjhs3jrJc/YzuUm9zIGPvCcSrFfhlfPpgD4fBGDQIIYcopeN6ev6xY8dOZWZmDkmtdSBwOp0YPXp02vr160vGjRvXbZP9unXrAjdv3hywadOmLicW/cmxY8dCMjMz4zpuZ+v4GecdZsEH1+zo9fJeBoNxgXLq1Cn5tGnTkidOnGg8G6G/cOHCmJ07d/pv3bq1oD/H1xuY4Gecd7QIJn4j8/EzGIweEhcXZy8qKso+2/PWr19/BsCZfhhSn8F8/IzzDrOT1/RtlMLKMa2fwWAw3GGCn3HeIQp+ACyyn8FgMDrABD/jvMNd8BuZn5/BYDDawQQ/47yjhWn8DAaD4RUm+BnnHe01fib4GYxzndOnT8tmzZo1IiYmZmRCQkLGlClTEl988cUQ9zK9vnjooYeiNm3apPe2/8MPPww4dOiQqu9GPLRhUf2M844Wt8Q9LIkPgzGA/PafIOxaHQ1TjQK6MBumPF6OS3qXxIbjONxwww2Jd9xxR/3WrVuLAWDfvn3qL7/8MqA75zscDrz66qsVvo7ZtGlTgMPhMIwdO3bIpdftD5jGzzjvYMF9DMYg8Nt/gvDdX2NhqlYAFDBVK/DdX2Px2396VZZ369ateplMRh977LFacdvEiRMtU6ZMMbW0tEivueaaEfHx8Rk33HBDvJhHPzo6etQjjzwSOXbs2JT33nsvcO7cuXHr1q0LBIAlS5ZEJyQkZCQnJ6ffe++9w7Zv36794YcfAp566qlhYlneSy+9NGXx4sUx48aNSxkxYkTGrl27NFdffXVCbGzsyKVLl0aJ45g+fXpCRkZGWmJiYsaLL74YAvATjblz58YlJSVlJCcnpz/77LNhvbn+/qDfNH5CyHsAZgGooZSOFLYFAfgUQByAUwBupZQ29tcYGBcmLczUz2AMPLtWR8Nhba9MOqwS7Fod3RutPysrS52ZmemxOl9OTo766NGjxXFxcfaxY8embt++XTdz5kwTAKhUKu7QoUN5APDdd9/5A0B1dbX066+/DiwuLj4hkUhQV1cnDQkJcU6fPr1p1qxZhkWLFrnkkUKh4A4ePJj3/PPPh91yyy2Jv/32W05YWJgjLi5u1PLly6sjIiKc//3vf0+Fh4c7TSYTufjii9Pnz5/fWFBQoKysrJQXFBRkA0BdXV2fVv/rC/pT438fwDUdtj0BYAelNAnADuEzg9GnmJ0ctFL+0WbZ+xiMAcJU47n8rrftfcCoUaNaEhIS7FKpFBkZGeaioiJXXwsWLOikVAYFBTmVSiU3b9682PXr1wfodDqvL4jf/e53TQCQmZlpSUxMtMTGxtrVajWNiYmxFhcXKwBg9erV4SkpKeljx45Nq6qqkmdnZ6tSU1OtZ86cUS5cuDBm48aNfoGBgUNO++g3wU8p/RlAx1neHADrhb/XA7ixv/pnXLiYOQ7+MinUEgmMzMfPYAwMujDP5Xe9be8mo0aNshw7dkzjaZ9SqXQVm5FKpe1K8er1+k5CXS6X4+jRozlz585t2rRpU8CVV16Z5K1flUpFAUAikbTrRyKRwOFwkK1bt+p37dqlP3jwYG5eXt7JtLQ0i8VikYSGhjpPnDhxcurUqcY333wzbN68eXE9vPR+Y6B9/OGU0koAEH579X0QQu4lhBwkhBysra31dhiD0YkWQeP3k0mYqZ/BGCimPF4OmbK9sJUpOUx5vMdleQFg9uzZRpvNRl566aUQcduuXbs0O3fu1J1tWwaDQdLQ0CC97bbbDGvXrj2Tk5OjAQCdTudsbm4+K3nY1NQk9ff3d+r1eu7IkSOqY8eOaQGgsrJS5nQ6cddddzWtXLmy/Pjx4x4nLYPJkI3qp5S+DeBtgK/ON8jDYZxDmJ0c1C5TPxP8DMaAIPrx+ziqXyKR4KuvvipasmRJzKuvvhqhVCrpsGHDrLNnz246fPjwWbXV1NQknTVrVqLVaiUAsHLlyjMAcOeddzb88Y9/jFu7dm34xo0bi7rT1ty5cw1vv/12aHJycnpCQkJrZmZmC8AX91m8eHEcx3EEAJ577rmysxrkANCvZXkJIXEAtroF9+UBuJJSWkkIiQTwE6U0pat2WFlextnwuyMFoJTP1a+XSvHpRQmDPSQGY1BgZXkvbLyV5R1oU/9XABYKfy8EsHmA+2dcAPDBfVL4SaVM4+9jbBzXLk8Cg8E49+g3wU8I+RjALwBSCCFlhJDFAFYBmEEIKQAwQ/jMYPQpZicHjVQCvUzKgvv6mBWFFbj1aLcsoQwGY4jSbz5+SuntXnZN668+GQygbTmflDAff19TZLYi22QBpRSEkK5PYDAYQw6WuY9x3tHirvGfR4L/zdM1WHS8ZFDH0Gh3oJWjqLE5BnUcDAaj5zDBz+gTylptWFVcCa4fg0W7i6jx66VSWDgKOzf4Y+oL9jeZ8FNDM/ozILcrGhy8wD/T2qul2QwGYxBhgp/RJ3xTa8CrpdUosVgHdRx2jsJGKTRSCfxkfKbM88XPX2tzwMJRNA2iFaPRzvfNBD+Dce7CBD+jT6i385pgldU+qOMwC0JeK5VAL+Mf7/PF3F9r5+9txSDdYyvHueognLYMTcFfa7NjyoFc/NTQPNhDYfQRUql0bGpqarr4s3z58oizbWPr1q367du3a/tjfOciQzaBD+PcokEQ/NWD7Ps1C9W5NFKpS+M/HwL8KKWoE+5tRasNGTr1gI9B1PaBoavxryyqRF5LK440m3FlkN9gD+eC49O8T4PWHlsbXW+pVwSrg233Z95fflvKbb1K4KNUKrnc3NyTvWnjxx9/1Ot0OueMGTNaunuO3W6HXC7vTbdDFqbxM/qEoaLxixqp1s3Ufz4IfpOTQ6sQq1A5SPe40d42qRuKgv+goQWfVvEypsHOgg8Hmk/zPg164bcXYussdQoKijpLneKF316I/TTv016V5fXGI488Ejly5Mi0pKSkjNtvvz1WLMm7cuXKMLHs7qxZs0bk5eUpPvjgg9C1a9eGp6ampn/77be6iooK2cyZMxNGjhyZNnLkyLTvv/9eCwDLli2Luv3222Mvv/zypJtuuim+P8Y9FGAaP6NPqBe00epBN/WLGj8f1Q8AxvOgQl+tmyVlsEz9ojANkkuHnOB3Uorl+WWIUMhBQdFgP/cne+caa4+tjbY5be2USZvTJll7bG10b7R+q9UqSU1NTRc//+Uvf6m85557Gh999NGaF198sRIAbrzxxvhPPvnE/4477jCsWbMmorS09LharaZi2d0FCxbU6nQ653PPPVcNALNnz45ftmxZ9cyZM00FBQWKmTNnJhUXF2cDQFZWlubXX3/N1el050dUsAeY4Gf0CeKLtso2NDR+jUQCP6mg8Q/x4L5dDUbICHB5oN7rMXVu97XCOjhCVzT1Z+o12NtoAkcpJENkLf+nlQ3IMlmwNj0Wb52pZRr/IFBvqfdYftfb9u7izdT/zTff6F9++eWI1tZWSVNTkyw9Pd0CwJCSkmL53e9+F3/DDTc03XnnnU2e2ty7d69fQUGBy19mMpmkjY2NEgC45pprms5noQ8wUz+jj3D5+IeIxq910/iHuql/ZVEFVhVX+TymVri/Gqlk0Ez94nd8kV4DG6WoHuRJnjs/NxoRrZRjTlgAguQyl+uJMXAEq4M9zki9be8NZrOZ/OUvf4n94osvivLz80/Onz+/rrW1VQIAO3fuLPjTn/5Ue+jQIW1mZma63d75OaWU4uDBgzm5ubknc3NzT9bU1GQFBgZyAKDVas99E2EXMMHP6DUcpWgU1ncPFY1ffQ5F9dfZHSjrQosXTf0jdWpUtA6Wj5+/j6P1vKJ0ZghF9tfZHIhSKkAIQZBCyjT+QeD+zPvLFVJFO6GpkCq4+zPv71VZXk+YzWYJAERERDgMBoNky5YtgQDgdDpRVFSkmD17tvHNN98sMxqNUoPBINXr9U6j0SgVz580aVLz6tWrXWXh9+3bN/DRsoMIE/wXOA6OYnVxpStivCcYHE44KaCSEFRb7YOaYMZ9OZ9SIoFSQnrs46eU4uPK+n61GIjR+lVWu89EQ7XChGqUTo2KQbrHDQ4H1BIJEjUqAMDpIeTnr7c7EKLgPZdBclm7FQiMgeG2lNsaHrvksdIQdYiNgCBEHWJ77JLHSnsb1S/6+MWfJUuWRIeEhDjvvPPO2vT09Ixrr702USyJ63A4yB133BGfnJycPnLkyPT77ruvOiQkxDl37tymbdu2BYjBfW+//faZw4cPa4WSuhmvv/56aN/chXMD5uO/wMkymfFKaTUilXIsiA7pURuidpWsVSHLaIHB4USAfHAeLZePX/Dv66VthXp+bjDCXy5Fpl7TrbZOt9rwcO4ZlFpseGJEZL+Mt9nhhJ2K0fo2DFcrPR5Xa3MgSC7FcLUCFo4blHvcaOfHMEzFu2yHUoBfnd2Bcf78Mu1guQwtTg6tTg4qKdNtBpLbUm5r6K2g74jT6TzkafuaNWsq1qxZU9Fx+6FDh/I6bhs9erQ1Pz+/XZzAtm3bijse9/LLL3dq73yE/Vdc4JQK5treaG9iRH+6lreWDaa5393HDwB+Mr40r5NS3H/yFFYWdf//2iZo4J9WNcDZTxp2nZtJutyH777O5kCIXI5IJS90Pfn5N9c0orIfA/8a7U4EymVQSyUIU8iGjODnKEW9zYFgeZvGD8DlfmIwGO1hgv8Cp1RIsdubl7gY0S8mlam2Dt4L1+zkQMC7HQBAL5Og2eHE0WYzGuxOFJu7n1LYQdvWzf/UYOyP4bZzsZT5+A7q7A6EKmSIUvIJRTpOEmptdtyXXYo/Zpf2mxugQdD4ASBGpRgygr/R7gQHuJn6+TGyJX0MhmeY4L/AKRVe3r1JwSqa+tN0vO93MJP4iAV6xJKxfkKFvh/q+RSu5Va7yyrQFXY3AfpxZX3fDxYdNH4fgrTWZkeIQoZIQfB31OyPGS0AgP2GFmysbuyHkbZp/AAv+IdK2l7xHoZ00PgbWAVBBsMjTPBf4JwSNP5emfqFF2+6qPEPpqmf40vyivCmfg47GpohFZacn+pmISFR40/UKPFdXbPLpWHj+m61j6jxS4lvU3+tjdf4wxVySIBOkf1Hm80g4IP/ni2sgKEfotob7Y52gr/caus3F8jZIOY4EDV+cYxsSR+D4Rkm+IcIvzSZ8O/TNX3aZncElKiBwOshAAAgAElEQVS11dsdaOlhopt6Ox/tHSSXwV8mHVSNv8XZXvDrpVKUW23IMlpwXUgAAKCom+Z+h+Dj/31UMOyUYs3pajycexoJPx/Ha6XVfTJeUfCnaFReTf0WJweTk0OoXA6ZhCBcKe+Uve+o0YwkjQovpcagwe7A6pL2eQFsHIcck6XH43RSvipgoJAbYbhaAQcd/BTNQJvG3+bjF039TPAzGJ5ggn+I8HlVI54vqkBLHy0dO9BkQuLPx32+7K0chwqrHYkaPpK8pz5bd99vuEI+uBq/0+kK7AN4H78Y6X/PMH7VQnf9/A5Bmc3QqXGxXoO3ztTiy+pGJGiUWFVSicOGbtf78Eqd3YEAmRTxGqVXwS8u5QsVNNpIpbydqZ9SiqPNZlzkp8ZovQbzo4KxvqKu3bP0SWUDpv6Wh2zxecj6DHhlJLAigP+d9ZnPcTbZnaBoM6PHCJH9Q2FJn2iJcWn8MsHUz3z8DIZHmOAfItgpBQfgiNHcJ+39UN8MG6XYXOMxYyUAPpiMApgkpIrtqc+23uZEsPDSjVDKBi2zHCBo/BJXng5X9r4IhRyX+GsRqZSj0NLarbZEU7+cEPw9ORpPjojEbxPSsfniREQo5PhTTmmvJ2p1Nn79ebRSgXIv6/NdPux2gr/tHpdb7aizO3CRsEzxyiA9nBTIM7dd53FB4L9XVssL+S1LAcMZAJT/vWWpT+EvRsi7B/cB3XtmfjO0uIRzf1Bnd4CgbVIikxAEyFgSn/MFjUZzsfvnNWvWBC9YsGC4r3Pcj1m2bFnU008/Hd6fYzzXYIJ/iCD6Sg8Z+kbwHxC00W213gX/KeGlPTlQB6Dn2luDvW0pVYRSPqhpe8XgPhExX/+0YD0IIRihVp6Fxs9/JzJCMMZPiwdiwxGqkMNfLsNrabE4ZbHhmcLeLfuts9sRIpchWiWH2cmhycNEQnQHhCr4wL6Ok4Sjzfwzc5EfL/hThWWVeS1tgl/8+/PqRjT89DJgt6BAPRzLkh+FRaIA7BZgx3NexykmxHH38UvQdbyEjeNw89FCvHjKd0ri3lBncyBQLoXUrW5AkFzGBP8g0PDxJ0EFk68YlZOWPrZg8hWjGj7+pF8q8zF6x3kv+Aczi9zZIEaQH2zuvfnYynE4YjQjSC5FgdmK/BbPGq64lG+snxZqiaSXpn5B8Aumfm6Q7ntHH79YmndaMF+bPUHTA8Ev6VyIZmKgDrdHBuGzqt7lKqmzORAsaPyA58j+Wltnjd/s5FwZBY8azZAT4lpOGatWQCUhyBW+d0opclssGO+vRStHsUF7EVokavwhYyU2RM7CSW0i35GhzOs4xZK8ouBXSCQYplKgpAvBf8pig5Wj+K0P3CLeqLfzOQ7cCZIzjX+gafj4k6CaVatiHbW1ClAKR22tombVqtj+FP4bNmzwHz16dGpaWlr6xIkTk8+cOeMzq9W+ffvUmZmZqcnJyekzZsxIqK2tlZaXl8syMjLSAOCXX35RE0LGFhQUKAAgJiZmpNFolHgr49vc3Cy55ZZb4kaOHJmWlpaW/tFHHwUAvMXh6quvTpg8eXJSbGzsyPvvv39Yf92DnnBeC/47jxXjukMFPTrXwdF29cf7G1HIHGpu6fVkJctogZWj+EtcBADgm1qDx+NKW21QSQjCFTJ+XXZPTf1uGn+4Ug4HHbyIanMHwT85SI87IoNwZVCb4G90OLslFNw1fk9EKOWwUdqr74sXWjJXNrwyD3n4XT5+4R4HZGcBAPbOvA4FV03DoeLTSNOqoJTw1y0lBIkalWvCV2Wzo9nB4YawAEwM0GHdsJvxePIyFGhjAQDVimC+I3/v7yb3krwiI9RKFHch+AsFd8NJkwWmXrhF9jWaMH7/SRzz4AoT3SXu8Bo/8/EPJPVvvhlNrdZ2MoVarZL6N9+M7k27HVP2/vOf/4wS982YMcN09OjR3JycnJM333xzw3PPPRfhq6277ror/h//+EdZfn7+yYyMDMvjjz8eFR0d7bBarZKGhgbJzp07dRkZGeYffvhBl5+frwgODnbo9Xruvvvui1m2bFn1iRMncr788sui+++/Pw4Ali9fHjl16tTmEydO5OzevTvvqaeeGtbc3CwBgJMnT2o2bdpUnJOTk/3VV18FFhYWyn2NbSA5r1P2Skjby/ts+aiyHquKK3F0YsaApP0Ux9lgd6LEYsMIjefUrd1hf5MJADAnLBCfVzdiW10THozr7OI6bbFhuEoJQgi/LrsHGr+V4yPORYEQIawzr7baXabpgaSjxh+jUuDl1DZ34AghJW6x2Yogf9+Pv70LwS8XtjsoIO9BdVp+cunkffwq/l55KtZTa3NAL5VAJZXAsGULZO99ACx9EjWBQYg9mYUsO4dZjbUAUlznpGpV2Cc8B6KZP1WrRrhSjsVNJmwMvxoLKjbjg6g5qFYGA3I1MO1pr2Nt6GDqB4A4jRKHq/mJKvFyj8QVFByAw81mXBHkvfSwN8pabbg7uwQNdifeOlOLN9Nj2+2vszmQoW9fYyVILmsLZGQMCI66Oo/ld71t7y4dy/KuWbMm+ODBg1oAKCkpUdx4443Damtr5TabTRITE+N1JlpfXy81Go3S66+/3gQA99xzT/0tt9wyAgDGjRtn+uGHH3R79uzRP/bYY5XffvutP6UU48ePNwHey/j+9NNPft99913AmjVrIgDAarWSwsJCBcAXAgoODnYCQGJiYmtRUZEyMTFx8JfBYJA0fkLIw4SQbELICULIx4QQVX/0IyekXRKWs6HaakeTw+kyl/Y3do66fNO9NYseMLQgUaNEiEKG60L8kWW0eDTjn7JYEafm/yeHqxU43dr9rHYiou/X3dQPAFWDlDylo4+/IwlCgZlCc9ffq1N4dGRehLo4IejpM9bocIACCFHIESKXQSkhnk39dodrElXzyqsIr+TjCrZdfhUKh8WiRa1B3Lfb2p2TolWhwmqHwe5ArqnVtW1msD+SNEpMlbdgZe0XkFAnavTxwOw1wOhbvY/V7oCMAHq3eztCrUCzg0O9D826wNyKAJkUBD17rs1ODouOl8DOUVwd7IetNU2dAgXrBKuJO8zHP/DIQkI8ag7etvcFf/7zn4cvWbKkJj8//+Trr79eau1gcegukyZNMv3888/6srIyxZ133tmUnZ2t3rNnj27KlClGwHsZX0opNm7cWChur6ysPD5mzJhWAFAoFK4Xg1QqpXa7vQfqQf8w4IKfEBINYCmAcZTSkQCkAOb1R18yCemxxi++zI+b+ibYrisclCJFq4JeKsGhXvj5Ocr7Uy8TCpZcH8qvXf+mQ5AfpRSlrTbEioJfxb/Ezzbxi2jSF6P6w900/oGGoxSWDgl8OhKjUkBGurekT6yW503jF7f3NImNGLQXLJeBEOIK2vN0nLiUz1FZidCmBize/An2Zo7Dg8ueAQAkZR1ud06Klp/g5JutyDO3IkQuQ7BCBpmE4PtxKdhw+UQoHjqGUKUS1Rf/wafQB9qy9rlr9vGC9cSXn7/IbMVInRopWpXP+JVtxdtw9carMXr9aFy98WpsK+YnMs8VVeCEyYI302Px1xGRsFGKT93iKmxCwaLOpn4pLBztdpZGRu8JXrKknCiV7W44USq54CVL+rwsr4jRaJQOHz7cDgDvv/9+sM/xBQc7/fz8nN9++60OAP7zn/8ET5gwwQQAM2bMMH7++edB8fHxVqlUioCAAMfOnTv9p0+fbgK8l/GdOnVq80svvRTOCTlT9u7de06U9x0sH78MgJoQIgOgAdAvFZHkhPgsdeoLccJw3Dgw5kI7pVAI0eMHe6Hx55tb0eRw4lJ/PlI/XqNEulaFL6rbC/46uwNmJ4dY4eXd03XZYlpUUeMPE17Ag5HYxdKhMp8n5BKCOLUSRd3I3ufsytQv6Z3GLwp+UVuNVsk9ruUX0/UCgCySrxI4/9vNeOnVldC1mqEzm5BA2ws4UfDntbQir6UVqdo2o5raLaVxuELere+q0eFwrY8Xidf4FvyUUhSarUjQKHGJP/9cdwz6rLXZ8cCRXXjq1zdQ2VIJCorKlkqs2LcC24q34fs6A2aFBmBGiD/SdGpc6q/FRxX1rrgK0QUR7EHj5/czrX+gCLp9XkPYE0+UykJDbSAEstBQW9gTT5QG3T6vT6v1ufPkk09W3H777Qljx45NCQ4O7vLLXrduXcnjjz8+LDk5OT0rK0u9atWqCgBISUmxAcDkyZONADBhwgSTXq93hoaGOgHAWxnfVatWVTgcDpKampqelJSU8dRTT/UqnmGgGHAfP6W0nBDyIoDTACwAvqeUft/xOELIvQDuBYDhw30u2fSKjPRc4xfPOzFAfkInBRSEYKy/Bq+eqobJ4YRO1ibA7Bx1CRpfHGjiJw2XBWhd2+ZHBWN5QTkOG1owRrAEiOuvh6vaTP0AL/hHdbNsLdCm8Qe5RXsHy2Wo6Mcqcd5o6VCZzxvdXdInCnR5Fxq/o4eTy47r84epFPhRqCnQ7jibAxMDhInVww+h8m9Pg7a24qKCHKx79hGYgoIR9fDSdufEqBRQSyTIMVmQ19KKeRGeA6vDlN0T/O5JmkSGC0v6Srzcyzq7AwaHE0laFfxkUnxYUY+8llakCasPnJTivuxS7GvyB8JXQtF6HNqmjyGzl6PV2YqXjryLiqBncI9f2/P4+6hgPJBzGnubTJgUqO+UrlfEXfCLgZOM/ifo9nkNfS3ozWbzEffPS5curQdQDwDz589vmj9/fqc1y+7HuJfanThxouXYsWO5nvqprKw8Lv69atWqqlWrVrnWoEZGRjo8lfHV6XR0w4YNpb76B4CdO3cW+rzIAWYwTP2BAOYAiAcQBUBLCJnf8ThK6duU0nGU0nGhoaE96qs3Pn7RUpBjsgxIPnJRsI/z0/KJfJrbXAy5LRZctC8bq4sr251TZG51LekS+dXQgjCFDLFuL7tbI4Kgl0rwbnkdAKDlSA2OfpYDANB+lIeWIzWuCYC3yP5GuwNP5Jd1ska4TP1uGlemXo3djSaf0e7eTLu9wcyJGn8Xgl+jRInF2uWSQ3HyJ+0iuK/XGr8gtKKVClTbHLC6pVq2cxSNDqfLx+8/ezYin38OsqgogBAEBAVizMNL4T97dru2JYQgRavCjw3NaHFySNV5DqOJ6GamxQa70yVMRRQSCWJUCq+R/YXChCBBrcQlfvyE093c/8qpauxrMkHXuAGa5k2wKxNhClzg2l/u4AX+aLfAvVmhAQiUSfFBBf9O7VigR4Sl7WUwvDMYUf3TAZRQSmsBgBDyBYCJAD7q646kvYjqF8+zcLy5MkXrO/4w/9cq/LK5CKYGK3RBSkyYk4Dky3yuLOnUn5QQjPXTQC0heOJILv7+5r8gKS/Hn59YiXr/QLx2uho3hgciRatCjsmCaw7lY6ROjS1jkiAhBDVWO7bXGzAtyK+dL1Ynk+L2yGC8V1aDR7b9C8r6OTgzwg+ADOE1VjR9UQB/mgi9VOLR1J9jsuCu4yUobbVhV0Mzdl2aCoWwdKxByJoW4GadmBUWgGW5Z5BlsiBTsB5YnBx+bGjGtloDfq6rhdlYBhkXDQWpc5l2AeD6Edd3+551xNxNjT9Bo0QrR1FutbtcHJ5wZe7zYmkRi/54esa68zzU2R2QkrZ7J0b2V1ntLheMaDkJddNo/WfP7iToPZGiVbn84Skaz89vmFKGOpsDDo56zFcg0mh3INCvsyUoXq30auoXI/oTtSoMU8oRLJfhN0MLfh8Vgr2NRrx8qgo3hwcir/4oqoyVoEQNi24aKGQgcEClGwUD0M4CpZZKMDssAJ9XN8LO0U6TJ5EgxcCl7TU7OagkBBIvE0QGY6gxGD7+0wDGE0I0hJdO0wDk9EdH8l4G94n/xse7SKOb/2sVdv43F6YG/kVnarBi539zkf9r97OVOSiFnBD4y2VY21KNWosV9971AB5d+lcYlSq8+O9/Qcs58VRBGcxODvdll0IC4FCzGc/sfhI7fkzE/fs/RKvTib/Ed55wLDIdgJNSvB9wE8xSFY4GShHaykHFAdTOwfh9KYarFSg2W/FdnQEP5ZzG4hMlWHyiBNcfLkArx2H5iEiUWGx4t6zO1W6D3YkAmbSd0Lg2xB8yAmwR0gVzlOLmo4VYfOIUfmpohs2SB4syHc2hD6IxfAUoUaLV2Yr/O/x/aHE6XevWzxbR1K+R+H6sx/ppQQCsKq70aZUQc/VLvbzP25bztW+ju89Dnc2OYLnMJTDiBGG/PL8cOSYL9jQacdORQkgA1wTqbIjiilx/N524CZVVmzsdE66QgwKotXu/55TSdiV53YnXKFFitnq8jwXmVqglBNFKOQghuMRfg10NRiw6XoI7sooRr1ZiVfIwPDTmQaikKsiteYBEAYciHiqpCtEhUxCvVriSMIlMDtSjxcnhSHNLpzgJkYHy8ZdarEjZfRyJu4/jmoP5PS60VWK24vmiih67jRiMs2HABT+l9FcAGwEcBnBcGMPb/dGXjBDYexjU66C8BqaSEFeec2/8srkIDhuHZjVBi1IQBjYOv2wu8nle+/6oy2c84sXVeHPVkwg0GlAWFoFn334FY7MOY/E3m7C70YQbjxQg39yKl6KrMBLH8aFjFn7EdOzjxmAO3Qht83ed2o//6W+Y3rAfn8QG4HeTtNgfIsO1lW0ve2eTFcNVSvzUaMTC4yX4rs6AQrMVhWYrJgXo8N24FCyNDceMYD+8fKoKNYJfuN7ucEX0iwTKZZgcqMeWmiZQSvF1rQGHms14NjEKWRNHQlW1GsHlf4a+7g045cNgDLoLFEB5qx0zfsvH5F9zu7XcriPd1fjTdWo8Hh+Bz6sb8U5ZrdfjxJewVx+/l+A+8XnYOVKN/Chei/f0PHRchjbeX4vlIyJxwGDCVb/l4eajRVBKJNgyJsmVjre7VFZthqLmHQBAIK2H1FaE3NwnOwn/cIW4CsO7gGxxcrBT6lHwj1ArYXRyLpO7O4UtVozQKF0Tm8sD9Ki2OXC4uQULooLxceYI6GRSXD/ieqyYuALDpPxEUaW/BCsmrkAN54fRHiY8lwfqQADsaTKhzu6AnJBOkwN/mRQSoF9rBADA/qYW2CnFrFB/WDgO/yiuhLEHiYreK6/FG6drsKvR2A+jZDDaMygJfCilzwB4pr/7kfciuM/OUaglEqRq1TjRRWS/qcEKpwRYN80PTgnBgp3NCDFyLo2vW/1R6lov7qisRDSlWPvPJ1HvH4DoOl6LuG7bF/j+1vnIMlqwJCYM4dUP4A/UiSfwCv5D7scwehqzsBHFRT8jMmJO+w4MZbiPfIbtmRORaXJg1bFWXNTU9oKSBigxPyoYQXIprgsNwBWBeo8m7hWJUbjyQB7+XlyJP9gacay0AVaOwyuvfItp06Zh9OjRAIDZoQFYlncGx4wWvFBShSSNEncPC4WUEERoI1DZUgmVeT+csnCYA26G1FEPu+4K2Gx2KCQS3HmsGNvGJrcz4VqcHB7KPY15EUGYKqTgFcnZvRNf/rwXmDgL37zwLPTXXoe0yVO93u+lseE4ZrTg2aIKpGnVqC9txr++y0NFkwVRAWo8OjMFjgBemHSZwKeDliZ+7wcTlSgxyZFcYW+3XaRjxjlCCJbGhmN+VDDeOlMLB6VYFhcOrY9VCt4oLnoR0dQKEGAYzgAAOM6C4qIX2z0b4vLLGh9WFjGOI1DeeRxiHohTFlunhE1FltZ2gnthdDAmBuqQqlV1ipu4fsT1uH7E9bjyQC4ig27FhJhYlJWewKLozoI/SC7DSJ0auxuNiFPz+So6JhCSEoIAt7S9x41mxKuV7QJm+4IjRjN0UgleSR2OA4YW/O5IIX5qMGJ2WMBZtfNTAy/wN1Y1uNJLMxj9xXmdslcmBPf1JKWqqIGP0qtxwmTx2YYuSInsGAWatVLY5AQfTvVDvU4CXVD3s+85aJuPVVyypbLbXEIfAJQREXg9fTgejA3HEyMi0GqtRDiqcSs2QEbtWIy1kMGBVmtl5w78h2FS0xH8svsF/OdAYzuhT+QS+M2Mw7RgP7yUOhzTgv28+rUTNCrcGxOKT6sacF9hFRpkCqjsNhgMBmzZsgVZWXw62WtC/SElwIO5p5FvbsWj8ZGul/2DgmkXADTNX0FhOQqz/xwo5X74/OJEfDgqHtU2O+46XuxaogcAb5+pxeaaJvwpp9Rl4gV4of/926+j2cJP0Oy11fj+7deRs3un1/stIQRr0oZjhFqJ244V4cFjJShrbuUtD00W/PWL48iubIZEONYTbQl82m8Xv3dOQlAeLINRRdptF+EFf+fshkFyGf46IhJ/S4jqkdAHgFZrJYJQj2BaiyTkttvuTrgw8fAV4FchWHfCPIxVzDDZcZWEleNw2mJzlXwG+GDADJ3aa7AkAIwP0OGAocUV3Dpa53lZ9KRAHQ4ZzDhjsXVayicSLKTtPdpsxsyD+VhV4uH/opccaW5Bpl4DKSG4xE+LQJkU39d7TpHtjTOtNhSYrfCXSfFtnaFXqY0ZjO5wXgt+UXg5e6D020XBr1PD4HD6LGAz/oYR+DVVjRCDA3/4oRkcAT68yg/Rs2O9ntMRB9emQYY9/BCIqn0wFlGpEPbwQ0jVqvHXEZFQSCRQKfkJwrXYin9jEZKRBwCu7e2Y9jQgVyOe24ZA2WuQogYAB6nGgYCbkqC9OKzzOV74a3wkriovQJl/MIxqLVR2/qVvt9uxY8cOALzwmhygR15LKzJ0KswK9XedL5p2I7WRkABItHyJaXoTto3LwGi9BmP8tXg9LRaHms1YmnMaHKWosdqx5nQ1xvppYHRweLKgraDM7k8+gMNmhU3OCxm5wwaHzYrdn3zg8zr0Mik2j0mCtsYKa6wOtsvDQOX8v4TF7sS+knqv2j7g3cc/YU4CZAoJnMJ/V0GUAjKFBBPmJLQ7zlPGub5CpYwEAbAaD2EOvmi33Z1QhRwEvk39YgroMR7cDcNVSkhJ+7X8WVlZePatd8ABKPjpR9dksDuM99eixclhQyUftT9K71nwTw7Uw0Yp9htMHu9hzu6dsJ4uxpGso7hrx15w4GNO+rJ4lJXjcNLUiouF+yKTEEwL9sOO+uazWgn0UwO/hPOZhChYOIqtPipqXoh0LMvri74uwRsdHT0qOTk5XVy/v3Tp0iiLxXLOR3Ge34K/F8utnILgHym8eHz5+auTdagKkOLKMifCDE7cd7gVMrUMDzqbcKKLwEARu5uPv+OSLVlUFCKff65TJPeIhEcgkfDj04Afn0SixoiERzp3MPpWPi2rfwy0sp8RGf4Mht1Rjcinp56V0Af4F1xyYTZu+20H0ipKkFTTJoQNhjZtZ044b+58PD6yk9Z8/Yjr8f3N3yNrYRZ+nLsZ/x03qd3KiVlhAfhbQhS21Dbhn8WVWFVSCRtH8VpaLJbFhWNzTRO+Fl6Qxno+2PBMVDzUlhZoLOZ2230RJJfBcaQO8mMNoBoZuIC2KH+T1eEz0l3mRfAnXxaBqXemghP+u4rilJh6Z2q7qH6zk0OLk+sUjd5XiM+GGq2QgdcgPT0bcglBkFzmU+P/pcmEdK2q03I+8fwYtyp9WVlZ2LJlC8qc/L1R1Ne0swR1xfgAPvHUN7UGxKoUCPAyMbosQCu48jpH9IsWIIXRgLLIOFQFhCK96ASqbQ5Xueq+INtkgZ1SXOTmzrg6xB8NdudZJeH6qcGIaKUct0cGIV6twMaqxj4b40BzfFdZ0LrH94x64/4fx657fM+o47vKzpmyvA6H58nvrl278vPz808ePnw4p6SkRHnnnXd2X6MbopzXgl/q5cXcHcR19WlaNaTEd57xf5+pQahChpeWXII/rb0Kjz85EVsuS4ZSQnDT0cJuvQTcg/sAXvgn/bgDaTknkfTjDo/LtyIj5iA19e9QKaMAEKiUUUhN/Xtn/77I6FuBh08AK5r4312kafWFv78/9FYLphQcQ3RTXbvtIrdGBOHrMUm4OsTfUxNd8seYUCyICsZrp2uwobIBfxgWghEaJf48PBwjdWo8kV+GFqcT+uAQtCpUKIxLRVphFiRCFjt9cEi3+okKUIOYBMHn9h+hVcm95ukH2oL7PEViJ1waDkoIZAQoCZcjemz7XBT1Xtaf9xVn82xEKGVeUyzbOA6/GVowMVDnta94tdKVxGfHjh2w2+2o1/J+6gCzqZ0lqCsilHLEqxXg4F3bBwCtVIqxgqbdMbhUtACpW/kJYFJxNmbs/AIypwNf1fRcm85racXYfdmu4j+iO+JiN0vI1CA95ITgu7rOiZg84eAodjcacWWQHoQQzA0Pwt4mEyp6WCJ7MDm+qyxo7/8KY80GmwIAzAabYu//CmP7Q/j7KseblZWlGT9+fHJsbOzIl156KQQAOI7DfffdNywpKSkjOTk5/Z133gkEgK1bt+ovu+yy5NmzZ8enpKRk+OrT39+fW79+fen27dsDqqurpQaDQTJhwoTk9PT0tOTkZFdJ3gcffDDq+eefd2lTDzzwQPTKlSvPTrvqZ85rwe/NFNsdREGslkpwTYg//ltRjyYPkct5La3Y2WDE4ugQV1lUAEjUqLB5TBKC5TIsPF7S5RI1cTnf2RIZMQeXX74b064qxOWX7/Yu9PuYadOmQd6hBrpcLse0adNcn6WEuDIF9gRCCP6RNAzTg/0QrpBhWSxvwZNLCP6ZPAw1NgfeL6/H5HkLkJ9yMZwyOTLy+CRfMoUSk+ct8NW8i0dnprRVYBS+A7VciotiA7pl6vdkURITQE0K0MPKUfzUIVrb2/rzvqS7z0aYjyQ+R5vNsHAUEwK8C/4UrQp55lbU2uwwGAzgQJAXMRxRTbWQc7y1wd0S1BWi1t/VEsZJgXylv46TJ9HSE2ioh6rVjOl7tkLhsCG+NA/baps6meHzW1rxVEFZl9H4H1bUodxqdy3ZO9JsRphChihl2/+BXibFhAAttnvx8+f/WoX1y/fijft/xPrle7F5/xk0OzhX2eX2w+EAACAASURBVOibIwJBAXxefe5p/Qe/PhXtdHDtZIrTwUkOfn2qz9PY+irHm5OTo/7hhx8K9u/fn/uvf/0r6tSpU/IPPvgg4Pjx4+qcnJzsHTt25D/99NPDSktL5QCQlZWl/de//lVeVFSU3VW/QUFBXHR0tC07O1ul0Wi4bdu2FZ48eTJn165d+cuXLx/GcRyWLFlS9/HHHwcDgNPpxKZNmwLvvvvu+q7aHkjOa8Hv0sh6ovG7CeK/xEXA6OTwtoelX6Ip/7rQzlG8MSoF3h81Ai1OJx7KOdPFmnHfCVSGGqNHj8bs2bNdGr6/vz9mz57tiurvK2QSgg9HxWPf+DT4u73gL/HX4spAPd44XY3hE67AmctnIsxQh/D6SuhDQnH1vX/2GdXvzo0XR+PRGUJJWwkQHaDGP28aheEhWp+C35up333b5YE6BAhBW+5kCc9Nfwr+7hKukKNGmIicNFkwau8JV937X4QU0OP9vQv+30cFw8ZRvH2mFv7+/igNjoBJpcGosrYMp+6WoK4Q+/K0lM+dKwQrRMegQ9HSc+nRPbjvvy9CZ+YnXRfVlHYy91s5Dvdln8K7ZXW4N/uU19oeNo7DF9WNkBJgc00Tam12HDWacbGfptOKgqtD/FFgtnYKePSU3+GzYxWQAJgsXEucWolEjRJHu+kiHEqImn53t/eGkpISxeTJk5OSk5PT16xZE5Gbm+syD1177bVNOp2ORkZGOiZMmNC8e/du7e7du/W33nprg0wmQ0xMjOOyyy4z7dmzRwMAo0ePbklNTe22iUV8j3McRx566KFhycnJ6VOnTk2uqalRlJWVyVJSUmwBAQGOvXv3qr/88ku/jIwMc0RExJCK2DyvBb9LI+tBUgx3n3u6To3rQ/3xzpnaTlq/TXgIVF6EdopWhacSorCjoRnrK7xP+uwc9SlkhiKjR4/Gww8/jBUrVuDhhx/uc6EvQgjxGN3+SHwEGuxO/K2wHCchw/1jRuORT7bg3jfWdVvoi1w7klcYVt+cib1PXIUbL47m3T2+NH4fRXrEbWqpBNOD/fBDXbOr8mGW0YwVheW4xE+L0bqzT8zT14Qr5aix2eGkFBurGlFrc+AfRXwE/L4mE9K0qk7mdHcSNCrMDgvAuvI6XDr1KpyISYSu1YzYej5hUUdLUFfcGB6AV1JjMMmHewHgJ3+vpQ1vFzgKAJPnLYBMoQQBhcLOv89lCiUWXT4BaglpZ+5/5VQ1coRaBjsbjHiyoMzjBP3HeiP/rI2Igp1SvH66BoVmKy72MDmZGeIPAuDlU1Xt2hLzO1QESrFjtBo/jFbj2DA5hjU528UyDFMqUN46JMq2nxUaf4VH4elte2/wVY6340SMEOJT6dJoNN3O9tLY2CipqKhQjBo1qvWtt94Kqq+vlx0/fjwnNzf3ZHBwsN1isUgAYNGiRXXvvvtuyLp160IWLVo0pLR94DwX/KJ/tifBfQ6OQu52d0St/60z7bV+UbNT+MgWtzg6BFOD9Hi2sBynPaQ35SgF5zZeRvcY56/F1CA9NlQ2QAJgbnhgj9vyZLYX0yh7w1fKXnGbjBDcFhEEg8OJKw7kYkNlPe46XoIguQzvjYobElaeMIUMTspnufu6rgkqCcGuRiN2NRhxwNDi08wv8mBsOExODh/I/VHuH4xxDZWQgPbIEqSUSHB7ZLDPew/wL/RbIoKg7bA2P23yVFx975+hDwkFCHFZgMZcMRVXBfthc00jPqyow4/1zXjtdDXmRQTh1bTheGB4GD6oqPdo2fusqgEhchkWDwvF1CA93hHeAxf7dXZlxagUeDQ+AhurG7Gu3C3LZbMV312swXvT/bA/RYXfklRoUUkwsrB9sqoolXxQilz1lnHXxZVLZZJ2QlQqk3Djrovr87K8vsrxfvPNNwFms5lUVVVJ9+/fr580aVLLlClTjBs3bgxyOByoqKiQHThwQDd58uSzivQ0GAySRYsWxc6YMaMpNDTUaTAYpCEhIXalUkm3bNmir6iocFk2fv/73zft3LnT/9ixY9q5c+ee3frOAWDw7Yz9SG98/PYOwXbpOjVmhfrjnbJaPBgb7vIJ27qo2Q7wL6jH4iNx7aF8ZJssGK5uv57blRP+HNP4hwKPxEVgZwMfHBWu7LzOvLt40t67irvwlsAHaHsu5IRgcpAe34xLxiO5Z7As9wzUEgm2jEnslPBmsIgQ7tuuBiNOWWx4LjEKb56uxdKcUlg4DhO7IfgzdGrMCPbD5pomqCUE/751DgLlc/t76F5JmzzVo9VnaWw4TposeDSPX4kSpZTjuSTeBf3XEZEoMluxsqgSEwJ0LldDg92B7fXN+EN0COQSgruHhWKnkHAn00sA4kOx4TjSbMbTheXQSqU42WLBhlkBMCoIxhX+f3vnHR5Vmf3x75mWQkJI6AkJIKQnIoIRURZREVmxAgqiwlqwru6iiO7PFQvrWhZWWSzIuoqrAoodQRYbIigCSgkkNKX3kkbalPf3x713cjNMudNvMufzPPNk5rb3JPdmznvKe04DhmyqQ7xcAMK1vkN6nAVHG21odDi8GhR6o3hwtxOAFOuvrWy0JKZYGvv/vsd+ZXug1NfXGzp37uycOd51112HlXa8nTt3buzfv/+pPXv2OP+Iffv2PXXxxRdnHzhwwPLggw8e7NGjhzUrK6ti1apVSfn5+YVEJJ544ol9WVlZNi2rTQYPHpwjhCCHw4Hf//73Fc8+++wBALjttttODB8+vHdRUVF+YWFhbc+ePZ0zuPj4eDFw4MCqdu3a2U0m/alZ/UkUQjyVVNWCuy/936UmY9HRSlTa7E7F32Txe1faCUb3xV7U8vmycJjT6ZfSBv/IzXRmeAeKu7CQL4vf5CW5z7XBT5/kRCzpl4N3Dx7HGYlxKAqg9n64UMr2vrn/GAjA1Z1SEWcwYMo2STkO0KD4AcnqX3a8Ctd2TnVb3lcP9ElOxKpz87HlVD2WHavEhWltneV+DUT4R14mzlu5BZevKIPx+8PIaBuP/hdmwSoErusqJacPSUvGGQlxUnMqD7+ngQiz8rMwbN023F++B2YinJOQgPxvjiH9UJMb3119h/R4qX/CQVWzppZC8eBuJ4JV9K44HI517ra7a8erbsGrxmAwYPbs2fsA7FNvHzFiRPWIESM81knev3//Jk/7unbtalu/fr3bFr92ux0///xz0vvvv6+9bnsE0ed/Z4gIpl+61c2XvjurUIvFDwAWkiYKVsfp4SSlwBBb/IFxY3p73wf5wF2ink00D/e40uRROn2f1Y0Xx2Qg3JyhbYlhJOkkx+/XVtXinLZt0EleU/7yniNINBo0JyD2T2mDN4t64pwgVnJEAiJCYVICCt1UBfyu9DDsPx+DtW8a7EXtsMshsLOmCpkWi/N4AxH+U9wDDT6+V1LMJizo0wtrK0/h4vZt0c5swrZ4310bM+Ikj/H++pan+Blg3bp18VdddVX28OHDTxYXF2uv2x5BWrXi9/bF7Au7OL0dqyerEAAsPpS2cq1GN9ahcj09xHtjFcVj09js3nr3wnhN7tM4IdQDSWVNhtMFmypxynAEbfp2wntn9fK76uVlHQOr2aAXnl+6FbaKOhh31cDeIwmwOWA8UAc6XgX8rum4vDaeawyo6Z4Q10x555zbxWe7bmV5YEuM8zNAv3796vft2+fRU6AHWrXi97bcyhfuMrrdKW9FUXhq3eo8V8PSr5agJForRiIQXCx+H1n9yqTAXXlWdxa/Hjn1yxHUfbQDKRckotJCGLy7HhU7twMAuvtZ0bE1cKBCKs5j2lYJw7F6GCoaQXYBzz0cQ096vKL4W15mP9MyaDmZIwEQTMle10p6QJNV7+oOthCdtoTEkyyNbtyDnNynD8xyUycFd8+A6/GA++Wizpa+OvfiVC3dBWF1oGODA72r7ehWJyCsDlQt3RVt0aJCejvJkicBGI83gGSXh7I9ErQxGtHOZMT+Fli9j2kZtGrF762kqi+sbpL7TG6Ud6PGwjsWL8WE2OLXB2YDnRbGCbSAT0ux+O0VUgjykS31eHxT/WnbY43Jw3KR4NJ+OMFsxORhuRGVIz3OzBY/EzZatas/aIvfRaErS2vUCXo2h/AZ3wfcTxoUnEpC59Zha8edxR/nZTmV15K9LWQyZ2wXB3tFA/pUOE7bHotc3Vda2vf80q04UFGH9HYJmDws17k9UqTHWzjGz4QNzRY/EXUnokvk9wlElBw+sUJDyGP8br7oXdf7e8KiIRHMV54AE15MRM2eFV/3Vrlf7lz91hbi6m87rAfIZekCmQ1oO6xHdATSAVf3zcDKhy/Cb89c7qziGGnS48w40AKr94UDIup39dVX91Q+W61WpKam9hkyZEjvSMrx3HPPdZw1a5bXJUSe2gJPmjQpvVOnTmfm5eUVdO/evejSSy/ttW7dunh314gEmix+IrodwEQAaQB6AegG4FUA2utwRoFAK/c1VdLzvZzPKoTPNfxAU/KYOyVhbyFu4daOxUDNPDJ2AZi8TI1J7r7nLblP7xa/0pK5auku2CsaYGwXh7bDevjdqpkJLRlxFpy02VFrdyDR2HIisuuXLU77ceG8jFMVJy1t2qU2Dhg1dv9ZQ38f1Lr+hIQEx9atWxNqamooKSlJfPTRR207d+4c0VmR1WrFQw89FFSO55133nn4ySefPAwAc+bMSR02bFjuxo0bN6enp7vvBxxGtD5R9wA4H0AVAAghtgPQ/TdDoE16PMVn3SXo+VNj32IgD25hWV6dK4nWjr8WP3B6eEBBa2EnPdCmbyd0fbgE3Z4ZhK4Pl7DS1wFNmf0tx92/ftnitG/nzul+quKkBQBOVZy0fDt3Tvf1yxYH3Zb34osvrnz//ffbAcC8efPSRo4c6ZxMVFVVGUaPHt2jqKgoPz8/39ked+bMme0vueSSXhdddFHvjIyM4qeffrrj448/3jk/P7+gT58+eYcPHzYCwKpVqxL69OmTl5OTUzB06NBeR48eNQJASUlJ7r333ptxzjnn5E6bNq2z2pqfPn16h6Kiovzc3NyCYcOG9aqurvZrdnb77befHDRoUOXrr7+eBgAPPvhg16Kiovzs7OzCsWPHdnc4HNi8eXNcQUFBvnLOpk2b4goLC/M9X1U7WoVtEEI4n0AiMgEIYHV8ZPFWUtUbNg+ud3cJelotfkUetxngLcQ6bO1YDNRsqaZdg+J3nSwotBSLn9EnzrX8Lcjd/+PCeRl2q7V5W16r1fDjwnlBx0puuummEwsWLEitra2lsrKyxPPOO89ZZ/8vf/lL1yFDhlSVlpaWrVixYuujjz7araqqygAA27ZtS/jggw9+XbNmTdnf//73jMTEREdZWdmW/v37n5o9e3Z7AJgwYULPp59+et+2bdu2FBYW1k2ZMiVduXZFRYVxzZo1W5944onDannGjRt3srS0tGzr1q1bcnNz62bOnOl3Za6+ffvWlpeXxwPA5MmTj5SWlpZt3759c11dnWH+/PkphYWFDcnJyfZVq1YlAMDs2bM73HDDDSFp+KM1uW85Ef0FQAIRDQVwN4DPQiFAOPFWUtUbruVWXa8XqMXvyzpkV390MRE1myT66s4HyCsB3DxezuV8fE+ZAMiIl6v3tSCLX7H0tW73h3PPPbdu3759cXPmzEm75JJLmjW9+fbbb9suXbq03cyZM7sAQENDA+3YscMCAAMHDqxOTU11pKamOpKSkuyjR4+uAIDi4uLajRs3Jh4/ftxYXV1tvPzyy2sA4Pbbbz8+evToM5Rrjx071m2YYt26dQmPPfZYRnV1tfHUqVPGwYMH+92IR90xcMmSJckzZszoUl9fb6ioqDAVFBTUAaicMGHCsTlz5nQoKSnZ+8knn6SuWbOmzN9x3KHV4n8YwFEAmwDcAWAxgEdDIUA4CbRynyfXu7sEPXfL/jzK48HVb+PKfbrAXVa/r/4JrpMFhUanxR9aGZnYoGsLtPjbtEt1O0vxtN1fLrvssoqpU6dm3nzzzc2UsRACCxcu3FFeXr6lvLx8y8GDBzedffbZ9QBgsVic/5wGgwHx8fFCeW+z2Xz+dyYnJ7tt2Ttx4sSes2bN2rNt27YtU6ZMOaBuC6yV9evXJ+bn59fX1tbSAw880P3DDz/cuW3bti033njjsfr6egMAjB8//uQ333yTMn/+/HbFxcW1Xbp0sfs7jju0CnsVgLeEEKOFEKOEEHOEtwbHOsFbSVVveLLAPbVu1Zq5bSbyupyP3cLRxd06fl+TOk+ufi3tmhnGE3EGAzqYTS0qxj9g1Nj9RrO5eVtes9kxYNTYkLTlveuuu4498MADB0pKSurU24cMGVI1ffr0zg55mfXKlSs1V1tq3769vW3btvYvvvgiCQBef/319uedd16Nr/Nqa2sNWVlZ1oaGBpo/f77fOQxvvvlmuxUrVqTccsstJ2praw0A0KVLF1tlZaXhs88+c/YXT0xMFIMHD66cNGlS1oQJE455vqJ/aHX1XwngBSL6DsB8AEuFEAFnIhJROwD/BlAEKVfgFiHED4FezxOBNulxKmINtfobNbiDnecbvCsJVvzR5XSL3/cSS48x/hZUq5/RJ+nxLauIj5K9H+qsfoVevXpZ//rXvx5x3f7MM88cmDhxYlZeXl6BEIK6devW8M033+zQet033njjt7vuuqv7fffdZ8jKymqYN2/eLl/nPPzwwwdKSkryMzIyGvPz82tramqMvs559dVXO7/33nvt6+rqDDk5OXVLly7dqmT0jxs37mhBQUFht27dGvv06XNKfd7NN998YsmSJanXXnttldbfyReaFL8Q4g9EZAYwHMANAF4momVCiNsCHPdFAF8IIUYRkQVAWHqUBlrAx1N8NpCe7a7yeC/Z65eYTIhxVeJavDm+8zZCKyMTO2TEWbCztmVVUDxr6O9PhErRK9TW1v7iuk3dTjcpKUm8++67u12Pue+++44DcCbDqVvsqvcNHDiwbsOGDae11/3pp5+2qj+rW/5OmTLl6JQpU05b3uepLfCMGTMOeNoHADNnzjwwc+ZMt/uXL1+eNHbs2GMmU+jq7Wm+khDCSkRLIFnoCZDc/34rfiJqC6nP1QT5uo0AwuLPMjpj/KFZzmfxYPEneuvdqsLsKwOcY/xRxWIg1FpVVRm1xPg9eHEaOW+DCZL0ODNWnPTYKp6JAYYOHdpr9+7dccuXL98WyutqLeBzGYAxAIYA+BaSm/66AMc8A1Ki4BtE1AfAOgD3CyFOeT/Nf7x1xPOGJ9e7KViL3+DB4me3sC5wa/FrWcfPjZeYMJAeb0GN3YEqmx1tTT49yUwrZNmyZTvDcV2tmUcTAHwMIEcIMV4IsTiIGL8JwNkAXhFC9AVwCtKqgWYQ0UQiWktEa48eDaxgkreSqt7wVDvfXQGfRj+S+yxkgFWcniSqrDpgJRFd/O3OB0jPWEtu0sPolww5s5+79DGhRpPiF0KMAfADgKFENIKIginttQ/APiHEavnzQkgTAdcxXxNC9BdC9O/YsWNAAxGRR/e6N5oK+DT/0jbIJVr96dmuxmRwn2/AyX36QJ3VL4SQSvZqsPjdJ2xKS/l8tWtmGE8MSUvGipI89EqMzYZJTPjQpPiJaDSAnwCMhuTiX01EowIZUAhxCMBeIlL6XF4MYEsg19KCyUPylTe8WWuuCXqNGpv0ALLFz8v5dIva4le8ML7W4Xt6vrQU/2EYb6SYTchuE89LQpmQozW571EA5wghjgAAEXUE8CUkaz0Q/gjgHTmj/1cAfwjwOj4xG4KJ8bu7HjVz19v8KdlrIDS6qSbEFr8+UMf4tU7GzAZCvd3dZM7B95NhGF2idSppUJS+zHE/zj0NIcR62Y1/phDiaiHEyUCv5QuTh+Qrb3hLzDKTobnF72fJXnc1BZzLBzkDPKqou/PZNSp+jxa/4PvJMKGAiPrdfvvt3ZTPjz32WOdJkyalezvHH5555pmOV155pbPt77Fjx4zdunUr3rZtW9ClhvWKVov/CyJaCmCe/Pl6AEvCI1Jo8VRgxRtWL0uxXGO6/lr87pWE+6ZATGRxa/H7uLcmIrdtef3J/WCY1kLNjwfSqr7am+GobrQYki2NbS/O3J80ID2odf0Wi0UsXrw49eDBg4e6du0a8ha2kydPPnr22We3/+yzz5KvuOKK6kmTJmWMHz/+aE5OTlBZlVarFWazOVRihhStyX2TAbwG4EwAfQC8JoR4KJyChQpJUft3jleL36WDm78WvzvFb/cyHhM51PdHq8Xv6Z5qaenLMK2Jmh8PpFUs+q27o7rRAgCO6kZLxaLfutf8eCCotrxGo1HcfPPNR59++unOrvsOHDhgGjZsWK+ioqL8oqKi/P/9739tACAnJ6fg2LFjRofDgXbt2p01a9as9gBw9dVX9/z444+TXa6Pl19+efcDDzyQ+c033ySuXr066bHHHjsMABs3bow7//zzswsLC/NLSkpyS0tL4wBg7ty57c4888y8vLy8gkGDBmUfPHjQBAB33313xrhx47IGDhyYM2bMmB7B/N7hRLO7XgjxAYDHATwFqVtf0D2WI0FAFr+HJj2AVMTHtZ67xR/F7yW5jxV/dFFn9Vs9VG90xVMBH6sfyzwZpjVQ9dXeDNgczXWKzWGo+mpv0G15J0+efOTDDz9MO378eLOCBnfccUfmpEmTDpeWlpZ99NFHO++8884eANC/f/+aL7/8MmndunXx3bp1a/j++++TAOCXX35pM2TIkNNqxpx//vl1559/fvWVV16Z8+KLL+6Ji4sTAHDrrbf2+M9//rN78+bNZVOnTt1/zz33ZALAZZddVr1+/fry8vLyLcOHD69QT0o2b96c+NVXX23/4IMPdgX7e4cLrQV87gDwJIA6AA4ABKmC3xneztMDntzr3vDUlheQvuiV6wkhJMtO6zp+F29B03iSm5+XfkUXxXoXQjifAV/hF4+TOXb1MzGGYulr3e4PaWlpjtGjRx9/5plnOiUkJDizq1euXNl2+/btzqY8NTU1xpMnTxoGDRpUs3z58qRdu3ZZbrvttiNvvPFGx99++82ckpJiS0lJcdtx789//vORlStXJl922WU1AHDw4EFTaWlp4lVXXdXb9dgdO3ZYrrnmmsxjx46ZGhoaDNnZ2c7GQZdffnlFQkKCrpvYaY3xPwigUAgRsu5AkcJT21RveLP21Ba/EkLQavF7kkVLoRgm/JiIIADYhfaiSt6687HiZ2IJQ7Kl0Z2SNyRbQlKB6JFHHjl89tlnF4wZM8aph4QQWLt2bVlSUlKzf8KhQ4dWv/baa5327dvX8Oyzz+7/9NNPU99+++3UAQMG1ADAqFGjepSWliZ27ty5cfny5TsAqVWvQbV0UgiBtLQ0W3l5+WnLze++++7uU6dOPXDttddWLVy4sO2LL77otPjbtGkTkta54USrq38ngNpwChIuPMVgvdFk7bmP8SvXa5SX9WmO8Xuy+P3IE2DCh0VVktnbM6DGtaCTgj+eIIZpDbS9OHM/TIbm1rTJ4Gh7cWZI2vJ27tzZfsUVV5x89913OyjbLrjggqpnn33WWVBu1apVCQDQu3dv68mTJ02//fZbfEFBQeN5551X89JLL3X53e9+VwMACxcu3FVeXr5FUfruSE9Pt6WkpNjeeeedFACw2+1YvXp1AgBUV1cbs7KyGh0OB+bOnds+FL9fJNGq+B8BsIqIZhPRTOUVTsFCRWAxfu8FfJwWv0Ppua61gI/nGD9bh9HH2cZZpfh9xek9LefjrH4m1kgakH6i3YieuxUL35BsaWw3oufuYLP61fzf//3foYqKCqen+rXXXtv7888/t8nJySno1atX4axZs5xlXs8666xTPXv2rAeACy+8sPrIkSPmSy65xK+uR++9996vL7/8cqfc3NyCnJycwk8++SQFAB599NEDV111VXZJSUluly5dWk7vZBmtrv7ZAL4GsAlSjL/FEMw6fndWuNqD0OjlOI+yyDFkdTxfSxc4JvwoSr7RITQXVTJ76s7HkzkmBkkakH4ilIoeaN6WNzMz01ZXV+f83LVrV9vnn3/+q7vzPv7449+U90OHDj3lcDjWeRunqKiowdWtX1RU1LBy5crtrsfecsstJ2+55ZbT6s+8/PLLIfFuhButit8mhJgUVknChCmQyn1eCuqYDYRTcutW5bpaS2paDE0xZHVVQI4H6wN1N0etHROlieXp2/1Z7cEwDBNJtLr6v5G75XUlojTlFVbJQkQgTXq8lWtVX8/Zc13j97tyPdc4vxQP9ktEJgwoil8d4w+0SY/Vwcv5GIbRJ1ot/hvkn4+otrWI5XyBNOnRWsAnEItffZ5zPE7u0wWKorY6hGry5/0czupnGKaloUnxCyF6+j5Kn3iKwXrD25e+OkGvUaM72CkLNcWQ1dgEF+/RA2qLX+m7o8XVL4VvmudpNHIBH4ZhdIrWAj7XutlcCWCTS/Me3eEpBusNyQJ3X1BHXcDHafH7sZxPfZ5zPF7HrwvUWf1aqymqvQRGVbUf9uIwDKNXtLr6bwVwHoBv5M8XAvgRQA4RPSmE+G8YZAsJgcb4PX3hqy1+b818PMkCAI2O5jMRruuuDyyqrH6lVr9Rw3I+4PTJHC/RZBhGr2hNKXMAyBdCjBRCjARQAKABwLkApoRLuFAQaIzf0/I6s8HgLNxj9dPiV3IBXOWxs+LXBQFZ/KrwgBobu/oZJiQYjcZ+eXl5BdnZ2YXDhw8/o7q6OuhU6Oeee66j0rhHzdatWy3Z2dmFgV73ySef7OSPfJMmTUrv1KnTmXl5eQXdu3cvuvTSS3utW7cuPtDxtaJVwB5CiMOqz0cA5AghTgDQdfGCQJv0ePrCN6sqtXnL/vcki/o853icAa4L3GX1+6zc5yF8wxY/E4usWbMm7R//+Efx448/3u8f//hH8Zo1a4Je/RUXF+coLy/fsn379s1ms1lMnz69o3q/w+GA3e5fldyHHnroAtEShgAAIABJREFU6L333ns8WNlcmT17dueamhq/JiZ33nnn4fLy8i27d+8uHT169Ilhw4blHjhwQKs3PiC0CriCiBYR0XgiGg/gUwDfEVEbABXhEy94Aknus3spt2omw2mufn8q96nPU+AYvz5Qx+ttXvo1qFESQE9T/BzjZ2KMNWvWpC1durR7TU2NBQBqamosS5cu7R4K5a9wwQUX1OzYsSNu69atljPOOKPwxhtvzCosLCzYuXOn5cMPP2x71lln5RUUFOQPHz78jMrKSgMgtcrt1atXYU5OTsHEiRO7AZKl/dhjj3UGgBUrViTm5uYWnHXWWXkzZsxwlv+12Wy44447uhUVFeXn5OQUPP/88x0AYNGiRcklJSW5l1122Rk9e/YsvPLKK3s6HA5Mmzat05EjR8yDBw/OOffcc3NsNhtGjhzZIzs7uzAnJ6fgiSee6OTud1Jz++23nxw0aFDl66+/ngYADz74YNeioqL87OzswrFjx3Z3OBzYvHlzXEFBQb5yzqZNm+IKCwvzPV/1dLQq/nsAvAHgLAB9AcwFcI8Q4pQQYog/A0aaQJv0eIzxq5bz+WvxqxVLs/GE0FwLgAkfzS1+aZuv7nwmD5M5tviZWGP58uUZNputmU6x2WyG5cuXB92WFwCsViuWLl3atri4uA4Adu3aFf+HP/zheFlZ2Zbk5GTH008/3fW7777btmXLlrKzzz679qmnnup8+PBh4+LFi1O3b9++edu2bVuefvrpg67XvfXWW3vMmDFjz/r168vV21944YUOKSkp9tLS0rINGzaUzZ07t2N5ebkFAMrKyhJeeumlvTt27Ni8Z8+euGXLliU9+uijRzp16mRdvnz5ttWrV2/74YcfEg8ePGhWxr7nnns0eRj69u1bW15eHg9I7YhLS0vLtm/fvrmurs4wf/78lMLCwobk5GS70pdg9uzZHW644Qa/vBdal/MJIvoeQCOk9fs/CeGnGR0lAm3S40mZm4hgF4BDFQfWavF7iwezdRh91G57b7Uc1DRV+2u+nWP8TKyhWPpat2uloaHBkJeXVwAA5557bvX9999/bPfu3eauXbs2XnzxxacA4Ntvv22zc+fO+JKSkjwAsFqt1K9fv5q0tDR7XFycY8yYMd0vv/zyyuuvv75Sfe3jx48bq6urjZdffnkNANxyyy3Hv/766xQA+PLLL9uWl5cnfvrpp6mA1Jhny5Yt8RaLRRQXF5/q1auXFQAKCwtrd+7cedrvmJeX17B379648ePHZ15xxRWV11xzTZWW31etWpcsWZI8Y8aMLvX19YaKigpTQUFBHYDKCRMmHJszZ06HkpKSvZ988knqmjVryvz5m2pdzncdgOcBfAuAAPyLiCYLIRb6M1g0CLRJjzeLXznG6u86foNnxc9KIvoooRh/avV7zdvgyRwTQyQlJTW6U/JJSUlBteVVYvyu2xMTE53Lo4QQuOCCC6o+++yz31yPW79+fdmnn37adv78+amvvPJKpx9//HGb+jx3y7blfTR9+vQ9I0eObKawFy1alBwXF+f8hzcajbDZbKddpGPHjvbS0tItH330UduXX36504IFC9Lef//9Xb5+3/Xr1yf269evtra2lh544IHuq1ev3tK7d2/rpEmT0uvr6w0AMH78+JPPPvts+vz586uLi4tru3Tp4leSg1ZX//8BOEcIMV4IcTOAEgB/9WegaKFuo6sVm9cY/+nV3fy1+F0L+Fgd2icPTPhwl9Xva6mmMmGzq54xuxBwgO8pE1sMHjx4v8lkarZW2WQyOQYPHhz2xjUXXnjh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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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48raMwrUro4/GDF+bvF3Ps4NlrQ18GldVw1X/JyeRu26I8mwiW11ik0UatcdCXgs76OPPnpqxYoVCZWVlW16nt59992pM2fOPFlcXFz66aefHrjnnnsGAsCoUaPqv/76a/P27dsjUlJSWn744QczAPz888/REyZMaHDe/3nnndd03nnn1V155ZWZr7766mGTycQA4Pbbbx/4v//7v4dKSkpKZ8+efeyPf/xjKgBccskldTt27CgrKyvbPWnSpGr1Q0lJSUnUunXr9i1fvvxgoL93qNCa1X83gGcANAEQIWX2M0jWu68cBXCUMbZF/rwMLhR/sAionM9d5z51y15fsvrdxoMZGLS1/eWEDufzo6UJj3PtvwL34HB6Goqlr3W5LyQkJIjXXXdd5fPPP983MjLSkV29cePGXvv27XMMIamvr9dVVVUJ48aNq1+/fr354MGDxjvuuOPUu+++m/jbb78ZYmNjbbGxsS47uzz00EOnNm7cGHPJJZfUA8Dx48f1xcXFUVddddUQ53X3799vvPrqq1NPnz6tb2lpETIyMhyDgy677LLqyMjIsB5ipzXG/wiAPMZYwNOBGGMniOgIEWUxxvYAmAhgd6D7dYeU1e/bNnYPnftcWfwRGtO3HRalUzzY4qF8kNNxuKrj99fVb2fM5YMjh9NdEWKMFldKXogxBiWH689//vPJs88+O3fKlCkOPcQYw7Zt20rNZnObf8CioqK6t956q+/Ro0dbXnjhhWNffPFF/AcffBA/ZsyYegC49tprBxYXF0f169fPsn79+v2ANKpXEFodFowxJCQk2MrKytrpp3vvvTd99uzZ5ddcc03tsmXLer366qsOiz86Ojooo3NDiVZX/wEAjUE87p8AfEhEOwEMB/BcEPfdBoMQ5Ol8zg18fGi8Y3DjFlaO15Va9nZHnBP1rD4k9zn367eKrh8cOZzuSq+JqcegF9pa03pB7DUxNShjefv162e/4oorqj766KM+yrLzzz+/9oUXXuirfN60aVMkAAwZMsRaVVWl/+233yJyc3Mt5557bv1rr73W/7/+67/qAWDZsmUHy8rKditK3xUDBgywxcbG2j788MNYALDb7diyZUskANTV1enS0tIsoihi8eLFvYPx+3UkWhX/nwFsIqKFRDRfefl7UMbYDjl+P5Qx9nvGWJW/+/KGwck1rwVPyX0Gcmrg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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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uG3btihHue6+++5zK1eubKV8X7p0adydd955znE7Z619Kyoq6LHHHktetWrVvq1bt+45c+aMT7zyQaD4pXerxgI+ijXuqoAPUOfql27weuVxnsfPwX3GQFHiepS3hepnjXDTJSYYqa4+5bT9rqvlTSU+Pr6qX79+lYDUw/7gwYNhALB169aInj17pqWmpmYuW7as9e7du2vn3W+99dYSs9mMnj17Xjxz5kyIsnz//v3hkydP7vz111/vT0lJqQaAPn36lD/11FOJM2bMaHf69GlzSEgI1q1bF3X77befM5vNSEpKsvbp06fMUa5OnTpZExMTq7799tsWx48fN//yyy/hgwcPLnfcTmntazaba1v7bt++PTwxMbEqPT29GgBGjx7tkz4HQaD4G0Zdu0OLBW6uVfz6LfWGefzSu94pA8Y3KE2U9Chvs6qxDwDYwQ9yTPARGtrWaftdV8ubPl6oujWuUFrjTpw4scu8efN+27t3b8HUqVOLq6rqvBDh4eG1+6j71LRr164mLCzMvnHjxtoOejNnzjz+7rvvHqqsrDT169cvY9u2beFaetsAwIgRI84tWrQo9qOPPoodMmTIOZOTeCFnrX21Hr+pBI3i11q5T4vir2/x63X1N0z9amw8xn8oD2Z6+ieEUMOATT6fTLDRpfMjR02msHpteU2mMHuXzo/4vC2vmoqKClNSUlJNVVUVLV68WFN8QcuWLW2rVq3aN3369PgVK1ZEA8Du3bvDcnNzK//yl78cz8nJuZCfnx/ev3//8s8//zzWZrPh8OHDlk2bNjktcnfXXXed+/e//x376aefxt15552arfbu3btfPHz4cNiePXtCAWDJkiU+iY9o9lH9euf46xSx623MTVD8jk16bHYu72okFCVu0XFuHc8pu/qZYESJ3vdmVL8nPPvss8W5ubkZ8fHx1RkZGRXl5eVmLfslJiZaV6xYsX/IkCEpkZGRBxcuXBi3YcOGliaTSaSmplaOGDGiNDQ0VHzzzTfRqampWV26dLnYvXv3C61atbI5Hqtt27a2lJSUyn379kUMHDiwQqvsUVFRYs6cOYduuummlLi4OGuPHj0uNL6Xfpq94ndWUtUdWmrnh5hQp/h1puFZiCAA2IWASXYrNzYe4z/M8ny9RYfydozbsHE6HxOkJCSMPesrRT9nzpza9rNpaWnV+/bt2618f/HF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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# plot the time series with holiday information marked\n", - "max_store_limit = 1\n", - "store_list = sales['store'].unique()\n", - "brand_list = sales['brand'].unique()\n", - "l_range = range(1, 53)\n", - "\n", - "for i in range(min(max_store_limit, len(store_list))):\n", - " for j in range(len(brand_list)):\n", - " store = store_list[i]\n", - " brand = brand_list[j]\n", - " d = sales.loc[(sales['store'] == store) & (sales['brand'] == brand)]\n", - " d_holiday = d.loc[d['Special Events'] != '']\n", - " groups = d_holiday.groupby('Special Events')\n", - "\n", - " # Plot\n", - " for name, group in groups:\n", - " plt.plot(group['Start'], group['logmove'], 'o', label=name)\n", - " plt.plot(d['Start'], d['logmove'])\n", - " plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\n", - " plt.gcf().autofmt_xdate()\n", - " plt.title('store {} brand {} \\n missing value are filled with zero'.format(store, brand))\n", - " plt.xlabel('week')\n", - " plt.ylabel('logmove')\n", - " plt.show()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "tsperf", - "language": "python", - "name": "tsperf" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/make_features.py b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/make_features.py deleted file mode 100644 index a22a4602..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/make_features.py +++ /dev/null @@ -1,77 +0,0 @@ -# coding: utf-8 - -# Create input features for the Dilated Convolutional Neural Network (CNN) model. - -import os -import sys -import math -import datetime -import numpy as np -import pandas as pd - -# Append TSPerf path to sys.path -tsperf_dir = '.' -if tsperf_dir not in sys.path: - sys.path.append(tsperf_dir) - -# Import TSPerf components -from utils import * -import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs - -def make_features(pred_round, train_dir, pred_steps, offset, store_list, brand_list): - """Create a dataframe of the input features. - - Args: - pred_round (Integer): Prediction round - train_dir (String): Path of the training data directory - pred_steps (Integer): Number of prediction steps - offset (Integer): Length of training data skipped in the retraining - store_list (Numpy Array): List of all the store IDs - brand_list (Numpy Array): List of all the brand IDs - - Returns: - data_filled (Dataframe): Dataframe including the input features - data_scaled (Dataframe): Dataframe including the normalized features - """ - # Load training data - train_df = pd.read_csv(os.path.join(train_dir, 'train_round_'+str(pred_round+1)+'.csv')) - train_df['move'] = train_df['logmove'].apply(lambda x: round(math.exp(x))) - train_df = train_df[['store', 'brand', 'week', 'move']] - - # Create a dataframe to hold all necessary data - week_list = range(bs.TRAIN_START_WEEK+offset, bs.TEST_END_WEEK_LIST[pred_round]+1) - d = {'store': store_list, - 'brand': brand_list, - 'week': week_list} - data_grid = df_from_cartesian_product(d) - data_filled = pd.merge(data_grid, train_df, how='left', - on=['store', 'brand', 'week']) - - # Get future price, deal, and advertisement info - aux_df = pd.read_csv(os.path.join(train_dir, 'aux_round_'+str(pred_round+1)+'.csv')) - data_filled = pd.merge(data_filled, aux_df, how='left', - on=['store', 'brand', 'week']) - - # Create relative price feature - price_cols = ['price1', 'price2', 'price3', 'price4', 'price5', 'price6', 'price7', 'price8', \ - 'price9', 'price10', 'price11'] - data_filled['price'] = data_filled.apply(lambda x: x.loc['price' + str(int(x.loc['brand']))], axis=1) - data_filled['avg_price'] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) - data_filled['price_ratio'] = data_filled['price'] / data_filled['avg_price'] - data_filled.drop(price_cols, axis=1, inplace=True) - - # Fill missing values - data_filled = data_filled.groupby(['store', 'brand']). \ - apply(lambda x: x.fillna(method='ffill').fillna(method='bfill')) - - # Create datetime features - data_filled['week_start'] = data_filled['week'].apply(lambda x: bs.FIRST_WEEK_START + datetime.timedelta(days=(x-1)*7)) - data_filled['month'] = data_filled['week_start'].apply(lambda x: x.month) - data_filled['week_of_month'] = data_filled['week_start'].apply(lambda x: week_of_month(x)) - data_filled.drop('week_start', axis=1, inplace=True) - - # Normalize the dataframe of features - cols_normalize = data_filled.columns.difference(['store', 'brand', 'week']) - data_scaled, min_max_scaler = normalize_dataframe(data_filled, cols_normalize) - - return data_filled, data_scaled \ No newline at end of file diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/train_score.py b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/train_score.py deleted file mode 100644 index bc7041eb..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/train_score.py +++ /dev/null @@ -1,199 +0,0 @@ -# coding: utf-8 - -# Train and score a Dilated Convolutional Neural Network (CNN) model using Keras package with TensorFlow backend. - -import os -import sys -import keras -import random -import argparse -import numpy as np -import pandas as pd -import tensorflow as tf - -from keras import optimizers -from keras.layers import * -from keras.models import Model, load_model -from keras.callbacks import ModelCheckpoint - -# Append TSPerf path to sys.path (assume we run the script from TSPerf directory) -tsperf_dir = '.' -if tsperf_dir not in sys.path: - sys.path.append(tsperf_dir) - -# Import TSPerf components -from utils import * -from make_features import make_features -import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs - -# Model definition -def create_dcnn_model(seq_len, kernel_size=2, n_filters=3, n_input_series=1, n_outputs=1): - """Create a Dilated CNN model. - - Args: - seq_len (Integer): Input sequence length - kernel_size (Integer): Kernel size of each convolutional layer - n_filters (Integer): Number of filters in each convolutional layer - n_outputs (Integer): Number of outputs in the last layer - - Returns: - Keras Model object - """ - # Sequential input - seq_in = Input(shape=(seq_len, n_input_series)) - - # Categorical input - cat_fea_in = Input(shape=(2,), dtype='uint8') - store_id = Lambda(lambda x: x[:, 0, None])(cat_fea_in) - brand_id = Lambda(lambda x: x[:, 1, None])(cat_fea_in) - store_embed = Embedding(MAX_STORE_ID+1, 7, input_length=1)(store_id) - brand_embed = Embedding(MAX_BRAND_ID+1, 4, input_length=1)(brand_id) - - # Dilated convolutional layers - c1 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=1, - padding='causal', activation='relu')(seq_in) - c2 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=2, - padding='causal', activation='relu')(c1) - c3 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=4, - padding='causal', activation='relu')(c2) - - # Skip connections - c4 = concatenate([c1, c3]) - - # Output of convolutional layers - conv_out = Conv1D(8, 1, activation='relu')(c4) - conv_out = Dropout(args.dropout_rate)(conv_out) - conv_out = Flatten()(conv_out) - - # Concatenate with categorical features - x = concatenate([conv_out, Flatten()(store_embed), Flatten()(brand_embed)]) - x = Dense(16, activation='relu')(x) - output = Dense(n_outputs, activation='linear')(x) - - # Define model interface, loss function, and optimizer - model = Model(inputs=[seq_in, cat_fea_in], outputs=output) - - return model - -if __name__ == '__main__': - # Parse input arguments - parser = argparse.ArgumentParser() - parser.add_argument('--seed', type=int, dest='seed', default=1, help='random seed') - parser.add_argument('--seq-len', type=int, dest='seq_len', default=15, help='length of the input sequence') - parser.add_argument('--dropout-rate', type=float, dest='dropout_rate', default=0.01, help='dropout ratio') - parser.add_argument('--batch-size', type=int, dest='batch_size', default=64, help='mini batch size for training') - parser.add_argument('--learning-rate', type=float, dest='learning_rate', default=0.015, help='learning rate') - parser.add_argument('--epochs', type=int, dest='epochs', default=25, help='# of epochs') - args = parser.parse_args() - - # Fix random seeds - np.random.seed(args.seed) - random.seed(args.seed) - tf.set_random_seed(args.seed) - - # Data paths - DATA_DIR = os.path.join(tsperf_dir, 'retail_sales', 'OrangeJuice_Pt_3Weeks_Weekly', 'data') - SUBMISSION_DIR = os.path.join(tsperf_dir, 'retail_sales', 'OrangeJuice_Pt_3Weeks_Weekly', 'submissions', 'DilatedCNN') - TRAIN_DIR = os.path.join(DATA_DIR, 'train') - - # Dataset parameters - MAX_STORE_ID = 137 - MAX_BRAND_ID = 11 - - # Parameters of the model - PRED_HORIZON = 3 - PRED_STEPS = 2 - SEQ_LEN = args.seq_len - DYNAMIC_FEATURES = ['deal', 'feat', 'month', 'week_of_month', 'price', 'price_ratio'] - STATIC_FEATURES = ['store', 'brand'] - - # Get unique stores and brands - train_df = pd.read_csv(os.path.join(TRAIN_DIR, 'train_round_1.csv')) - store_list = train_df['store'].unique() - brand_list = train_df['brand'].unique() - store_brand = [(x,y) for x in store_list for y in brand_list] - - # Train and predict for all forecast rounds - pred_all = [] - file_name = os.path.join(SUBMISSION_DIR, 'dcnn_model.h5') - for r in range(bs.NUM_ROUNDS): - print('---- Round ' + str(r+1) + ' ----') - offset = 0 if r==0 else 40+r*PRED_STEPS - # Create features - data_filled, data_scaled = make_features(r, TRAIN_DIR, PRED_STEPS, offset, store_list, brand_list) - - # Create sequence array for 'move' - start_timestep = 0 - end_timestep = bs.TRAIN_END_WEEK_LIST[r]-bs.TRAIN_START_WEEK-PRED_HORIZON - train_input1 = gen_sequence_array(data_scaled, store_brand, SEQ_LEN, ['move'], start_timestep, end_timestep-offset) - - # Create sequence array for other dynamic features - start_timestep = PRED_HORIZON - end_timestep = bs.TRAIN_END_WEEK_LIST[r]-bs.TRAIN_START_WEEK - train_input2 = gen_sequence_array(data_scaled, store_brand, SEQ_LEN, DYNAMIC_FEATURES, start_timestep, end_timestep-offset) - - seq_in = np.concatenate([train_input1, train_input2], axis=2) - - # Create array of static features - total_timesteps = bs.TRAIN_END_WEEK_LIST[r]-bs.TRAIN_START_WEEK-SEQ_LEN-PRED_HORIZON+2 - cat_fea_in = static_feature_array(data_filled, total_timesteps-offset, STATIC_FEATURES) - - # Create training output - start_timestep = SEQ_LEN+PRED_HORIZON-PRED_STEPS - end_timestep = bs.TRAIN_END_WEEK_LIST[r]-bs.TRAIN_START_WEEK - train_output = gen_sequence_array(data_filled, store_brand, PRED_STEPS, ['move'], start_timestep, end_timestep-offset) - train_output = np.squeeze(train_output) - - # Create and train model - if r == 0: - model = create_dcnn_model(seq_len=SEQ_LEN, n_filters=2, n_input_series=1+len(DYNAMIC_FEATURES), n_outputs=PRED_STEPS) - adam = optimizers.Adam(lr=args.learning_rate) - model.compile(loss='mape', optimizer=adam, metrics=['mape']) - # Define checkpoint and fit model - checkpoint = ModelCheckpoint(file_name, monitor='loss', save_best_only=True, mode='min', verbose=0) - callbacks_list = [checkpoint] - history = model.fit([seq_in, cat_fea_in], train_output, epochs=args.epochs, batch_size=args.batch_size, callbacks=callbacks_list, verbose=0) - else: - model = load_model(file_name) - checkpoint = ModelCheckpoint(file_name, monitor='loss', save_best_only=True, mode='min', verbose=0) - callbacks_list = [checkpoint] - history = model.fit([seq_in, cat_fea_in], train_output, epochs=1, batch_size=args.batch_size, callbacks=callbacks_list, verbose=0) - - # Get inputs for prediction - start_timestep = bs.TEST_START_WEEK_LIST[r] - bs.TRAIN_START_WEEK - SEQ_LEN - PRED_HORIZON + PRED_STEPS - end_timestep = bs.TEST_START_WEEK_LIST[r] - bs.TRAIN_START_WEEK + PRED_STEPS - 1 - PRED_HORIZON - test_input1 = gen_sequence_array(data_scaled, store_brand, SEQ_LEN, ['move'], start_timestep-offset, end_timestep-offset) - - start_timestep = bs.TEST_END_WEEK_LIST[r] - bs.TRAIN_START_WEEK - SEQ_LEN + 1 - end_timestep = bs.TEST_END_WEEK_LIST[r] - bs.TRAIN_START_WEEK - test_input2 = gen_sequence_array(data_scaled, store_brand, SEQ_LEN, DYNAMIC_FEATURES, start_timestep-offset, end_timestep-offset) - - seq_in = np.concatenate([test_input1, test_input2], axis=2) - - total_timesteps = 1 - cat_fea_in = static_feature_array(data_filled, total_timesteps, STATIC_FEATURES) - - # Make prediction - pred = np.round(model.predict([seq_in, cat_fea_in])) - - # Create dataframe for submission - exp_output = data_filled[data_filled.week >= bs.TEST_START_WEEK_LIST[r]].reset_index(drop=True) - exp_output = exp_output[['store', 'brand', 'week']] - pred_df = exp_output.sort_values(['store', 'brand', 'week']).\ - loc[:,['store', 'brand', 'week']].\ - reset_index(drop=True) - pred_df['weeks_ahead'] = pred_df['week'] - bs.TRAIN_END_WEEK_LIST[r] - pred_df['round'] = r+1 - pred_df['prediction'] = np.reshape(pred, (pred.size, 1)) - pred_all.append(pred_df) - - # Generate submission - submission = pd.concat(pred_all, axis=0).reset_index(drop=True) - submission = submission[['round', 'store', 'brand', 'week', 'weeks_ahead', 'prediction']] - filename = 'submission_seed_' + str(args.seed) + '.csv' - submission.to_csv(os.path.join(SUBMISSION_DIR, filename), index=False) - print('Done') - - - - diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/train_validate.py b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/train_validate.py deleted file mode 100644 index 0588096f..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/DilatedCNN/train_validate.py +++ /dev/null @@ -1,200 +0,0 @@ -# coding: utf-8 - -# Perform cross validation of a Dilated Convolutional Neural Network (CNN) model on the training data of the 1st forecast round. - -import os -import sys -import math -import keras -import argparse -import datetime -import numpy as np -import pandas as pd - -from utils import * -from keras.layers import * -from keras.models import Model -from keras import optimizers -from keras.utils import multi_gpu_model -from azureml.core import Run - -# Model definition -def create_dcnn_model(seq_len, kernel_size=2, n_filters=3, n_input_series=1, n_outputs=1): - """Create a Dilated CNN model. - - Args: - seq_len (Integer): Input sequence length - kernel_size (Integer): Kernel size of each convolutional layer - n_filters (Integer): Number of filters in each convolutional layer - n_outputs (Integer): Number of outputs in the last layer - - Returns: - Keras Model object - """ - # Sequential input - seq_in = Input(shape=(seq_len, n_input_series)) - - # Categorical input - cat_fea_in = Input(shape=(2,), dtype='uint8') - store_id = Lambda(lambda x: x[:, 0, None])(cat_fea_in) - brand_id = Lambda(lambda x: x[:, 1, None])(cat_fea_in) - store_embed = Embedding(MAX_STORE_ID+1, 7, input_length=1)(store_id) - brand_embed = Embedding(MAX_BRAND_ID+1, 4, input_length=1)(brand_id) - - # Dilated convolutional layers - c1 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=1, - padding='causal', activation='relu')(seq_in) - c2 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=2, - padding='causal', activation='relu')(c1) - c3 = Conv1D(filters=n_filters, kernel_size=kernel_size, dilation_rate=4, - padding='causal', activation='relu')(c2) - - # Skip connections - c4 = concatenate([c1, c3]) - - # Output of convolutional layers - conv_out = Conv1D(8, 1, activation='relu')(c4) - conv_out = Dropout(args.dropout_rate)(conv_out) - conv_out = Flatten()(conv_out) - - # Concatenate with categorical features - x = concatenate([conv_out, Flatten()(store_embed), Flatten()(brand_embed)]) - x = Dense(16, activation='relu')(x) - output = Dense(n_outputs, activation='linear')(x) - - # Define model interface, loss function, and optimizer - model = Model(inputs=[seq_in, cat_fea_in], outputs=output) - - return model - -if __name__ == '__main__': - # Parse input arguments - parser = argparse.ArgumentParser() - parser.add_argument('--data-folder', type=str, dest='data_folder', help='data folder mounting point') - parser.add_argument('--seq-len', type=int, dest='seq_len', default=20, help='length of the input sequence') - parser.add_argument('--batch-size', type=int, dest='batch_size', default=64, help='mini batch size for training') - parser.add_argument('--dropout-rate', type=float, dest='dropout_rate', default=0.10, help='dropout ratio') - parser.add_argument('--learning-rate', type=float, dest='learning_rate', default=0.01, help='learning rate') - parser.add_argument('--epochs', type=int, dest='epochs', default=30, help='# of epochs') - args = parser.parse_args() - args.dropout_rate = round(args.dropout_rate, 2) - print(args) - - # Start an Azure ML run - run = Run.get_context() - - # Data paths - DATA_DIR = args.data_folder - TRAIN_DIR = os.path.join(DATA_DIR, 'train') - - # Data and forecast problem parameters - MAX_STORE_ID = 137 - MAX_BRAND_ID = 11 - PRED_HORIZON = 3 - PRED_STEPS = 2 - TRAIN_START_WEEK = 40 - TRAIN_END_WEEK_LIST = list(range(135,159,2)) - TEST_START_WEEK_LIST = list(range(137,161,2)) - TEST_END_WEEK_LIST = list(range(138,162,2)) - # The start datetime of the first week in the record - FIRST_WEEK_START = pd.to_datetime('1989-09-14 00:00:00') - - # Input sequence length and feature names - SEQ_LEN = args.seq_len - DYNAMIC_FEATURES = ['deal', 'feat', 'month', 'week_of_month', 'price', 'price_ratio'] - STATIC_FEATURES = ['store', 'brand'] - - # Get unique stores and brands - train_df = pd.read_csv(os.path.join(TRAIN_DIR, 'train_round_1.csv')) - store_list = train_df['store'].unique() - brand_list = train_df['brand'].unique() - store_brand = [(x,y) for x in store_list for y in brand_list] - - # Train and validate the model using only the first round data - r = 0 - print('---- Round ' + str(r+1) + ' ----') - # Load training data - train_df = pd.read_csv(os.path.join(TRAIN_DIR, 'train_round_'+str(r+1)+'.csv')) - train_df['move'] = train_df['logmove'].apply(lambda x: round(math.exp(x))) - train_df = train_df[['store', 'brand', 'week', 'move']] - - # Create a dataframe to hold all necessary data - week_list = range(TRAIN_START_WEEK, TEST_END_WEEK_LIST[r]+1) - d = {'store': store_list, - 'brand': brand_list, - 'week': week_list} - data_grid = df_from_cartesian_product(d) - data_filled = pd.merge(data_grid, train_df, how='left', - on=['store', 'brand', 'week']) - - # Get future price, deal, and advertisement info - aux_df = pd.read_csv(os.path.join(TRAIN_DIR, 'aux_round_'+str(r+1)+'.csv')) - data_filled = pd.merge(data_filled, aux_df, how='left', - on=['store', 'brand', 'week']) - - # Create relative price feature - price_cols = ['price1', 'price2', 'price3', 'price4', 'price5', 'price6', 'price7', 'price8', \ - 'price9', 'price10', 'price11'] - data_filled['price'] = data_filled.apply(lambda x: x.loc['price' + str(int(x.loc['brand']))], axis=1) - data_filled['avg_price'] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) - data_filled['price_ratio'] = data_filled.apply(lambda x: x['price'] / x['avg_price'], axis=1) - - # Fill missing values - data_filled = data_filled.groupby(['store', 'brand']). \ - apply(lambda x: x.fillna(method='ffill').fillna(method='bfill')) - - # Create datetime features - data_filled['week_start'] = data_filled['week'].apply(lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x-1)*7)) - data_filled['day'] = data_filled['week_start'].apply(lambda x: x.day) - data_filled['week_of_month'] = data_filled['week_start'].apply(lambda x: week_of_month(x)) - data_filled['month'] = data_filled['week_start'].apply(lambda x: x.month) - data_filled.drop('week_start', axis=1, inplace=True) - - # Normalize the dataframe of features - cols_normalize = data_filled.columns.difference(['store', 'brand', 'week']) - data_scaled, min_max_scaler = normalize_dataframe(data_filled, cols_normalize) - - # Create sequence array for 'move' - start_timestep = 0 - end_timestep = TRAIN_END_WEEK_LIST[r]-TRAIN_START_WEEK-PRED_HORIZON - train_input1 = gen_sequence_array(data_scaled, store_brand, SEQ_LEN, ['move'], start_timestep, end_timestep) - - # Create sequence array for other dynamic features - start_timestep = PRED_HORIZON - end_timestep = TRAIN_END_WEEK_LIST[r]-TRAIN_START_WEEK - train_input2 = gen_sequence_array(data_scaled, store_brand, SEQ_LEN, DYNAMIC_FEATURES, start_timestep, end_timestep) - - seq_in = np.concatenate((train_input1, train_input2), axis=2) - - # Create array of static features - total_timesteps = TRAIN_END_WEEK_LIST[r]-TRAIN_START_WEEK-SEQ_LEN-PRED_HORIZON+2 - cat_fea_in = static_feature_array(data_filled, total_timesteps, STATIC_FEATURES) - - # Create training output - start_timestep = SEQ_LEN+PRED_HORIZON-PRED_STEPS - end_timestep = TRAIN_END_WEEK_LIST[r]-TRAIN_START_WEEK - train_output = gen_sequence_array(data_filled, store_brand, PRED_STEPS, ['move'], start_timestep, end_timestep) - train_output = np.squeeze(train_output) - - # Create model - model = create_dcnn_model(seq_len=SEQ_LEN, n_filters=2, n_input_series=1+len(DYNAMIC_FEATURES), n_outputs=PRED_STEPS) - - # Convert to GPU model - try: - model = multi_gpu_model(model) - print('Training using multiple GPUs...') - except: - print('Training using single GPU or CPU...') - - adam = optimizers.Adam(lr=args.learning_rate) - model.compile(loss='mape', optimizer=adam, metrics=['mape', 'mae']) - - # Model training and validation - history = model.fit([seq_in, cat_fea_in], train_output, epochs=args.epochs, batch_size=args.batch_size, validation_split=0.05) - val_loss = history.history['val_loss'][-1] - print('Validation loss is {}'.format(val_loss)) - - # Log the validation loss/MAPE - run.log('MAPE', np.float(val_loss)) - - diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/train_score.py b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/train_score.py deleted file mode 100755 index 7b3faa27..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/train_score.py +++ /dev/null @@ -1,128 +0,0 @@ -# coding: utf-8 - -# Train and score a boosted decision tree model using [LightGBM Python package](https://github.com/Microsoft/LightGBM) from Microsoft, -# which is a fast, distributed, high performance gradient boosting framework based on decision tree algorithms. - -import os -import sys -import argparse -import numpy as np -import pandas as pd -import lightgbm as lgb - -import warnings -warnings.filterwarnings('ignore') - -# Append TSPerf path to sys.path -tsperf_dir = os.getcwd() -if tsperf_dir not in sys.path: - sys.path.append(tsperf_dir) - -from make_features import make_features -import retail_sales.OrangeJuice_Pt_3Weeks_Weekly.common.benchmark_settings as bs - -def make_predictions(df, model): - """Predict sales with the trained GBM model. - - Args: - df (Dataframe): Dataframe including all needed features - model (Model): Trained GBM model - - Returns: - Dataframe including the predicted sales of every store-brand - """ - predictions = pd.DataFrame({'move': model.predict(df.drop('move', axis=1))}) - predictions['move'] = predictions['move'].apply(lambda x: round(x)) - return pd.concat([df[['brand', 'store', 'week']].reset_index(drop=True), predictions], axis=1) - -if __name__ == '__main__': - # Parse input arguments - parser = argparse.ArgumentParser() - parser.add_argument('--seed', type=int, dest='seed', default=1, help='Random seed of GBM model') - parser.add_argument('--num-leaves', type=int, dest='num_leaves', default=124, help='# of leaves of the tree') - parser.add_argument('--min-data-in-leaf', type=int, dest='min_data_in_leaf', default=340, help='minimum # of samples in each leaf') - parser.add_argument('--learning-rate', type=float, dest='learning_rate', default=0.1, help='learning rate') - parser.add_argument('--feature-fraction', type=float, dest='feature_fraction', default=0.65, help='ratio of features used in each iteration') - parser.add_argument('--bagging-fraction', type=float, dest='bagging_fraction', default=0.87, help='ratio of samples used in each iteration') - parser.add_argument('--bagging-freq', type=int, dest='bagging_freq', default=19, help='bagging frequency') - parser.add_argument('--max-rounds', type=int, dest='max_rounds', default=940, help='# of boosting iterations') - parser.add_argument('--max-lag', type=int, dest='max_lag', default=19, help='max lag of unit sales') - parser.add_argument('--window-size', type=int, dest='window_size', default=40, help='window size of moving average of unit sales') - args = parser.parse_args() - print(args) - - # Data paths - DATA_DIR = os.path.join(tsperf_dir, 'retail_sales', 'OrangeJuice_Pt_3Weeks_Weekly', 'data') - SUBMISSION_DIR = os.path.join(tsperf_dir, 'retail_sales', 'OrangeJuice_Pt_3Weeks_Weekly', 'submissions', 'LightGBM') - TRAIN_DIR = os.path.join(DATA_DIR, 'train') - - # Parameters of GBM model - params = { - 'objective': 'mape', - 'num_leaves': args.num_leaves, - 'min_data_in_leaf': args.min_data_in_leaf, - 'learning_rate': args.learning_rate, - 'feature_fraction': args.feature_fraction, - 'bagging_fraction': args.bagging_fraction, - 'bagging_freq': args.bagging_freq, - 'num_rounds': args.max_rounds, - 'early_stopping_rounds': 125, - 'num_threads': 4, - 'seed': args.seed - } - - # Lags and categorical features - lags = np.arange(2, args.max_lag+1) - used_columns = ['store', 'brand', 'week', 'week_of_month', 'month', 'deal', 'feat', 'move', 'price', 'price_ratio'] - categ_fea = ['store', 'brand', 'deal'] - - # Get unique stores and brands - train_df = pd.read_csv(os.path.join(TRAIN_DIR, 'train_round_1.csv')) - store_list = train_df['store'].unique() - brand_list = train_df['brand'].unique() - - # Train and predict for all forecast rounds - pred_all = [] - metric_all = [] - for r in range(bs.NUM_ROUNDS): - print('---- Round ' + str(r+1) + ' ----') - # Create features - features = make_features(r, TRAIN_DIR, lags, args.window_size, 0, used_columns, store_list, brand_list) - train_fea = features[features.week <= bs.TRAIN_END_WEEK_LIST[r]].reset_index(drop=True) - - # Drop rows with NaN values - train_fea.dropna(inplace=True) - - # Create training set - dtrain = lgb.Dataset(train_fea.drop('move', axis=1, inplace=False), - label = train_fea['move']) - if r %3 == 0: - # Train GBM model - print('Training model...') - bst = lgb.train( - params, - dtrain, - valid_sets = [dtrain], - categorical_feature = categ_fea, - verbose_eval = False - ) - - # Generate forecasts - print('Making predictions...') - test_fea = features[features.week >= bs.TEST_START_WEEK_LIST[r]].reset_index(drop=True) - pred = make_predictions(test_fea, bst).sort_values(by=['store','brand', 'week']).reset_index(drop=True) - # Additional columns required by the submission format - pred['round'] = r+1 - pred['weeks_ahead'] = pred['week'] - bs.TRAIN_END_WEEK_LIST[r] - # Keep the predictions - pred_all.append(pred) - - # Generate submission - submission = pd.concat(pred_all, axis=0) - submission.rename(columns={'move': 'prediction'}, inplace=True) - submission = submission[['round', 'store', 'brand', 'week', 'weeks_ahead', 'prediction']] - filename = 'submission_seed_' + str(args.seed) + '.csv' - submission.to_csv(os.path.join(SUBMISSION_DIR, filename), index=False) - - - diff --git a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/train_validate.py b/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/train_validate.py deleted file mode 100755 index 76622fa8..00000000 --- a/retail_sales/OrangeJuice_Pt_3Weeks_Weekly/submissions/LightGBM/train_validate.py +++ /dev/null @@ -1,219 +0,0 @@ -# coding: utf-8 - -# Perform cross validation of a boosted decision tree model on the training data of the 1st forecast round. - -import os -import sys -import math -import argparse -import datetime -import itertools -import numpy as np -import pandas as pd -import lightgbm as lgb -from azureml.core import Run -from sklearn.model_selection import train_test_split -from utils import week_of_month, df_from_cartesian_product - -def lagged_features(df, lags): - """Create lagged features based on time series data. - - Args: - df (Dataframe): Input time series data sorted by time - lags (List): Lag lengths - - Returns: - fea (Dataframe): Lagged features - """ - df_list = [] - for lag in lags: - df_shifted = df.shift(lag) - df_shifted.columns = [x + '_lag' + str(lag) for x in df_shifted.columns] - df_list.append(df_shifted) - fea = pd.concat(df_list, axis=1) - return fea - -def moving_averages(df, start_step, window_size=None): - """Compute averages of every feature over moving time windows. - - Args: - df (Dataframe): Input features as a dataframe - start_step (Integer): Starting time step of rolling mean - window_size (Integer): Windows size of rolling mean - - Returns: - fea (Dataframe): Dataframe consisting of the moving averages - """ - if window_size == None: # Use a large window to compute average over all historical data - window_size = df.shape[0] - fea = df.shift(start_step).rolling(min_periods=1, center=False, window=window_size).mean() - fea.columns = fea.columns + '_mean' - return fea - -def combine_features(df, lag_fea, lags, window_size, used_columns): - """Combine different features for a certain store-brand. - - Args: - df (Dataframe): Time series data of a certain store-brand - lag_fea (List): A list of column names for creating lagged features - lags (Numpy Array): Numpy array including all the lags - window_size (Integer): Windows size of rolling mean - used_columns (List): A list of names of columns used in model training (including target variable) - - Returns: - fea_all (Dataframe): Dataframe including all features for the specific store-brand - """ - lagged_fea = lagged_features(df[lag_fea], lags) - moving_avg = moving_averages(df[lag_fea], 2, window_size) - fea_all = pd.concat([df[used_columns], lagged_fea, moving_avg], axis=1) - return fea_all - -def make_predictions(df, model): - """Predict sales with the trained GBM model. - - Args: - df (Dataframe): Dataframe including all needed features - model (Model): Trained GBM model - - Returns: - Dataframe including the predicted sales of a certain store-brand - """ - predictions = pd.DataFrame({'move': model.predict(df.drop('move', axis=1))}) - predictions['move'] = predictions['move'].apply(lambda x: round(x)) - return pd.concat([df[['brand', 'store', 'week']].reset_index(drop=True), predictions], axis=1) - - -if __name__ == '__main__': - # Parse input arguments - parser = argparse.ArgumentParser() - parser.add_argument('--data-folder', type=str, dest='data_folder', default='.', help='data folder mounting point') - parser.add_argument('--num-leaves', type=int, dest='num_leaves', default=64, help='# of leaves of the tree') - parser.add_argument('--min-data-in-leaf', type=int, dest='min_data_in_leaf', default=50, help='minimum # of samples in each leaf') - parser.add_argument('--learning-rate', type=float, dest='learning_rate', default=0.001, help='learning rate') - parser.add_argument('--feature-fraction', type=float, dest='feature_fraction', default=1.0, help='ratio of features used in each iteration') - parser.add_argument('--bagging-fraction', type=float, dest='bagging_fraction', default=1.0, help='ratio of samples used in each iteration') - parser.add_argument('--bagging-freq', type=int, dest='bagging_freq', default=1, help='bagging frequency') - parser.add_argument('--max-rounds', type=int, dest='max_rounds', default=400, help='# of boosting iterations') - parser.add_argument('--max-lag', type=int, dest='max_lag', default=10, help='max lag of unit sales') - parser.add_argument('--window-size', type=int, dest='window_size', default=10, help='window size of moving average of unit sales') - args = parser.parse_args() - args.feature_fraction = round(args.feature_fraction, 2) - args.bagging_fraction = round(args.bagging_fraction, 2) - print(args) - - # Start an Azure ML run - run = Run.get_context() - - # Data paths - DATA_DIR = args.data_folder - TRAIN_DIR = os.path.join(DATA_DIR, 'train') - - # Data and forecast problem parameters - TRAIN_START_WEEK = 40 - TRAIN_END_WEEK_LIST = list(range(135,159,2)) - TEST_START_WEEK_LIST = list(range(137,161,2)) - TEST_END_WEEK_LIST = list(range(138,162,2)) - # The start datetime of the first week in the record - FIRST_WEEK_START = pd.to_datetime('1989-09-14 00:00:00') - - # Parameters of GBM model - params = { - 'objective': 'mape', - 'num_leaves': args.num_leaves, - 'min_data_in_leaf': args.min_data_in_leaf, - 'learning_rate': args.learning_rate, - 'feature_fraction': args.feature_fraction, - 'bagging_fraction': args.bagging_fraction, - 'bagging_freq': args.bagging_freq, - 'num_rounds': args.max_rounds, - 'early_stopping_rounds': 125, - 'num_threads': 16 - } - - # Lags and used column names - lags = np.arange(2, args.max_lag+1) - used_columns = ['store', 'brand', 'week', 'week_of_month', 'month', 'deal', 'feat', 'move', 'price', 'price_ratio'] - categ_fea = ['store', 'brand', 'deal'] - - # Train and validate the model using only the first round data - r = 0 - print('---- Round ' + str(r+1) + ' ----') - # Load training data - train_df = pd.read_csv(os.path.join(TRAIN_DIR, 'train_round_'+str(r+1)+'.csv')) - train_df['move'] = train_df['logmove'].apply(lambda x: round(math.exp(x))) - train_df = train_df[['store', 'brand', 'week', 'move']] - - # Create a dataframe to hold all necessary data - store_list = train_df['store'].unique() - brand_list = train_df['brand'].unique() - week_list = range(TRAIN_START_WEEK, TEST_END_WEEK_LIST[r]+1) - d = {'store': store_list, - 'brand': brand_list, - 'week': week_list} - data_grid = df_from_cartesian_product(d) - data_filled = pd.merge(data_grid, train_df, how='left', - on=['store', 'brand', 'week']) - - # Get future price, deal, and advertisement info - aux_df = pd.read_csv(os.path.join(TRAIN_DIR, 'aux_round_'+str(r+1)+'.csv')) - data_filled = pd.merge(data_filled, aux_df, how='left', - on=['store', 'brand', 'week']) - - # Create relative price feature - price_cols = ['price1', 'price2', 'price3', 'price4', 'price5', 'price6', 'price7', 'price8', \ - 'price9', 'price10', 'price11'] - data_filled['price'] = data_filled.apply(lambda x: x.loc['price' + str(int(x.loc['brand']))], axis=1) - data_filled['avg_price'] = data_filled[price_cols].sum(axis=1).apply(lambda x: x / len(price_cols)) - data_filled['price_ratio'] = data_filled['price'] / data_filled['avg_price'] - data_filled.drop(price_cols, axis=1, inplace=True) - - # Fill missing values - data_filled = data_filled.groupby(['store', 'brand']).apply(lambda x: x.fillna(method='ffill').fillna(method='bfill')) - - # Create datetime features - data_filled['week_start'] = data_filled['week'].apply(lambda x: FIRST_WEEK_START + datetime.timedelta(days=(x-1)*7)) - data_filled['year'] = data_filled['week_start'].apply(lambda x: x.year) - data_filled['month'] = data_filled['week_start'].apply(lambda x: x.month) - data_filled['week_of_month'] = data_filled['week_start'].apply(lambda x: week_of_month(x)) - data_filled['day'] = data_filled['week_start'].apply(lambda x: x.day) - data_filled.drop('week_start', axis=1, inplace=True) - - # Create other features (lagged features, moving averages, etc.) - features = data_filled.groupby(['store','brand']).apply(lambda x: combine_features(x, ['move'], lags, args.window_size, used_columns)) - train_fea = features[features.week <= TRAIN_END_WEEK_LIST[r]].reset_index(drop=True) - - # Drop rows with NaN values - train_fea.dropna(inplace=True) - - # Model training and validation - # Create a training/validation split - train_fea, valid_fea, train_label, valid_label = train_test_split(train_fea.drop('move', axis=1, inplace=False), \ - train_fea['move'], test_size=0.05, random_state=1) - dtrain = lgb.Dataset(train_fea, train_label) - dvalid = lgb.Dataset(valid_fea, valid_label) - # A dictionary to record training results - evals_result = {} - # Train GBM model - bst = lgb.train( - params, - dtrain, - valid_sets = [dtrain, dvalid], - categorical_feature = categ_fea, - evals_result = evals_result - ) - # Get final training loss & validation loss - train_loss = evals_result['training']['mape'][-1] - valid_loss = evals_result['valid_1']['mape'][-1] - print('Final training loss is {}'.format(train_loss)) - print('Final validation loss is {}'.format(valid_loss)) - - # Log the validation loss/MAPE - run.log('MAPE', np.float(valid_loss)*100) - - - - - - - - diff --git a/retail_sales/README.md b/retail_sales/README.md deleted file mode 100644 index b3e03226..00000000 --- a/retail_sales/README.md +++ /dev/null @@ -1,18 +0,0 @@ -### Problem descriptions - -Each entry below describes a forecasting problem for the retail sales forecasting domain. - -| **Problem** | **Description** | -| ----------- | --------------- | -|[OrangeJuice_Pt_3Weeks_Weekly](./OrangeJuice_Pt_3Weeks_Weeklyy)| Sales forecasting on Orange Juice data from R package `bayesm`
Forecast weekly values for 3 weeks ahead
Orange juice sales data and store demographic information | - - -### Abbreviations in problem names -**Forecast type** -- Prob: Probabilistic -- Pt: Point - -**Forecast horizon type** -- ST: short-term, <= 2 days ahead -- MT: medium-term, 2 days ~ 3 months ahead -- LT: long-term, more than three months ahead diff --git a/tests/ci/component_governance.yml b/tests/ci/component_governance.yml new file mode 100644 index 00000000..3d25838b --- /dev/null +++ b/tests/ci/component_governance.yml @@ -0,0 +1,49 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# Pull request against these branches will trigger this build +pr: + - master + - staging + +# no CI trigger +trigger: none + +jobs: +- job: Component_governance + timeoutInMinutes: 20 # how long to run the job before automatically cancelling + pool: + vmImage: 'ubuntu-16.04' + + steps: + - bash: | + python tools/generate_requirements_txt.py + displayName: 'Generate requirements.txt file from generate_conda_file.py' + + - task: ComponentGovernanceComponentDetection@0 + inputs: + scanType: 'Register' + verbosity: 'Verbose' + alertWarningLevel: 'High' + + - task: notice@0 + inputs: + outputformat: 'text' + + - bash: | + ls -la + cat NOTICE.txt + git status + result=$(git status | grep NOTICE.txt) + if [[ $result ]]; then + echo "Notice file modified: $result" + echo `git diff NOTICE.txt` + BRANCH=NOTICE/`date +%s` + git checkout -b $BRANCH + git add NOTICE.txt + git commit -m "Notice file modified." + git push origin $BRANCH + else + echo "Notice file not modified." + fi + displayName: 'Check in notice file if modified.' \ No newline at end of file diff --git a/tests/ci/cpu_integration_tests_linux.yml b/tests/ci/cpu_integration_tests_linux.yml new file mode 100644 index 00000000..d5244345 --- /dev/null +++ b/tests/ci/cpu_integration_tests_linux.yml @@ -0,0 +1,60 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# Pull request against these branches will trigger this build +pr: +- master +- staging + +# Any commit to these branches will trigger the build. +trigger: +- staging +- master + + +jobs: +- job: cpu_integration_tests_linux + timeoutInMinutes: 60 # how long to run the job before automatically cancelling + pool: + # vmImage: 'ubuntu-16.04' # hosted machine + name: $(Agent_Name) + + steps: + - bash: | + echo "##vso[task.prependpath]/data/anaconda/bin" + export PATH="/data/anaconda/bin:$PATH" + conda env list + displayName: Add conda to PATH + + - bash: | + echo "Initializing setup ..." + pwd + ls + uname -ra + echo "Running cleanup ... " + conda env remove -n forecasting_env + echo "Cleanup done." + displayName: 'Cleanup existing conda environment' + + - bash: | + echo "Running conda env setup ..." + yes | conda env create -n forecasting_env -f tools/environment.yml + eval "$(conda shell.bash hook)" && conda activate forecasting_env + pip install -e fclib + pip install ray>=0.8.2 + echo "Conda env installed." + displayName: 'Creating conda environment with dependencies' + + - bash: | + sudo ln -sf /usr/lib/R/modules/lapack.so /usr/lib/libRlapack.so + eval "$(conda shell.bash hook)" && conda activate forecasting_env + python -m ipykernel install --user --name forecasting_env + pytest --durations=0 tests/integration -m "not gpu and not azureml" --junitxml=report/test-integration.xml + displayName: 'Run integration tests' + + - task: PublishTestResults@2 + inputs: + testResultsFiles: '**/test-integration.xml' + testRunTitle: 'Test results for PyTest' + + diff --git a/tests/ci/cpu_unit_tests_linux.yml b/tests/ci/cpu_unit_tests_linux.yml new file mode 100644 index 00000000..23bc51be --- /dev/null +++ b/tests/ci/cpu_unit_tests_linux.yml @@ -0,0 +1,60 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# Pull request against these branches will trigger this build +pr: +- master +- staging + +# Any commit to these branches will trigger the build. +trigger: +- staging +- master + + +jobs: +- job: cpu_unit_tests_linux + timeoutInMinutes: 10 # how long to run the job before automatically cancelling + pool: + # vmImage: 'ubuntu-16.04' # hosted machine + name: $(Agent_Name) + + steps: + - bash: | + echo "##vso[task.prependpath]/data/anaconda/bin" + export PATH="/data/anaconda/bin:$PATH" + conda env list + displayName: Add Conda to PATH + + - bash: | + echo "Initializing setup ..." + pwd + ls + uname -ra + echo "Running cleanup ... " + conda env remove -n forecasting_env + echo "Cleanup done." + displayName: 'Cleanup existing conda environment' + + - bash: | + echo "Running conda env setup ..." + yes | conda env create -n forecasting_env -f tools/environment.yml + eval "$(conda shell.bash hook)" && conda activate forecasting_env + pip install -e fclib + pip install ray>=0.8.2 + echo "Conda env installed." + displayName: 'Creating Conda Environment with dependencies' + + - bash: | + sudo ln -sf /usr/lib/R/modules/lapack.so /usr/lib/libRlapack.so + eval "$(conda shell.bash hook)" && conda activate forecasting_env + python -m ipykernel install --user --name forecasting_env + pytest --durations=0 fclib/tests -m "not notebooks and not gpu and not azureml" --junitxml=junit/test-unitttest.xml + displayName: 'Run Unit tests' + + - task: PublishTestResults@2 + inputs: + testResultsFiles: '**/test-unitttest.xml' + testRunTitle: 'Test results for PyTest' + + diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..81e930f4 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,30 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os +import pytest +from fclib.common.utils import git_repo_path + + +@pytest.fixture(scope="module") +def notebooks(): + """Get paths of example notebooks. + + Returns: + dict: Dictionary including paths of the example notebooks. + """ + repo_path = git_repo_path() + examples_path = os.path.join(repo_path, "examples") + usecase_path = os.path.join(examples_path, "grocery_sales", "python") + quick_start_path = os.path.join(usecase_path, "00_quick_start") + model_path = os.path.join(usecase_path, "02_model") + + # Paths of the notebooks + paths = { + "lightgbm_quick_start": os.path.join(quick_start_path, "lightgbm_single_round.ipynb"), + "lightgbm_multi_round": os.path.join(model_path, "lightgbm_multi_round.ipynb"), + "dilatedcnn_multi_round": os.path.join(model_path, "dilatedcnn_multi_round.ipynb"), + "autoarima_quick_start": os.path.join(quick_start_path, "autoarima_single_round.ipynb"), + "autoarima_multi_round": os.path.join(model_path, "autoarima_multi_round.ipynb"), + } + return paths diff --git a/tests/integration/test_notebooks_python.py b/tests/integration/test_notebooks_python.py new file mode 100644 index 00000000..cca7481b --- /dev/null +++ b/tests/integration/test_notebooks_python.py @@ -0,0 +1,79 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os +import pytest +import papermill as pm +import scrapbook as sb + +ABS_TOL = 5.0 +KERNEL = "forecasting_env" + + +@pytest.mark.integration +def test_lightgbm_quick_start(notebooks): + notebook_path = notebooks["lightgbm_quick_start"] + output_notebook_path = os.path.join(os.path.dirname(notebook_path), "output.ipynb") + pm.execute_notebook(notebook_path, output_notebook_path, kernel_name=KERNEL) + nb = sb.read_notebook(output_notebook_path) + df = nb.scraps.dataframe + assert df.shape[0] == 1 + mape = df.loc[df.name == "MAPE"]["data"][0] + assert mape == pytest.approx(35.60, abs=ABS_TOL) + + +@pytest.mark.integration +def test_autoarima_quick_start(notebooks): + notebook_path = notebooks["autoarima_quick_start"] + output_notebook_path = os.path.join(os.path.dirname(notebook_path), "output.ipynb") + pm.execute_notebook( + notebook_path, output_notebook_path, kernel_name=KERNEL, parameters=dict(STORE_SUBSET=True), + ) + nb = sb.read_notebook(output_notebook_path) + df = nb.scraps.dataframe + assert df.shape[0] == 1 + mape = df.loc[df.name == "MAPE"]["data"][0] + print(mape) + assert mape == pytest.approx(75.6, abs=ABS_TOL) + + +@pytest.mark.integration +def test_lightgbm_multi_round(notebooks): + notebook_path = notebooks["lightgbm_multi_round"] + output_notebook_path = os.path.join(os.path.dirname(notebook_path), "output.ipynb") + pm.execute_notebook( + notebook_path, output_notebook_path, kernel_name=KERNEL, parameters=dict(N_SPLITS=1), + ) + nb = sb.read_notebook(output_notebook_path) + df = nb.scraps.dataframe + assert df.shape[0] == 1 + mape = df.loc[df.name == "MAPE"]["data"][0] + assert mape == pytest.approx(36.0, abs=ABS_TOL) + + +@pytest.mark.integration +def test_dilatedcnn_multi_round(notebooks): + notebook_path = notebooks["dilatedcnn_multi_round"] + output_notebook_path = os.path.join(os.path.dirname(notebook_path), "output.ipynb") + pm.execute_notebook( + notebook_path, output_notebook_path, kernel_name=KERNEL, parameters=dict(N_SPLITS=2), + ) + nb = sb.read_notebook(output_notebook_path) + df = nb.scraps.dataframe + assert df.shape[0] == 1 + mape = df.loc[df.name == "MAPE"]["data"][0] + assert mape == pytest.approx(37.7, abs=ABS_TOL) + + +@pytest.mark.integration +def test_autoarima_multi_round(notebooks): + notebook_path = notebooks["autoarima_multi_round"] + output_notebook_path = os.path.join(os.path.dirname(notebook_path), "output.ipynb") + pm.execute_notebook( + notebook_path, output_notebook_path, kernel_name=KERNEL, parameters=dict(N_SPLITS=2, STORE_SUBSET=True), + ) + nb = sb.read_notebook(output_notebook_path) + df = nb.scraps.dataframe + assert df.shape[0] == 1 + mape = df.loc[df.name == "MAPE"]["data"][0] + assert mape == pytest.approx(74.35, abs=ABS_TOL) diff --git a/tests/pytest.ini b/tests/pytest.ini new file mode 100644 index 00000000..501fa424 --- /dev/null +++ b/tests/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +markers = + notebooks + integration diff --git a/tools/environment.yml b/tools/environment.yml new file mode 100644 index 00000000..1d490ddb --- /dev/null +++ b/tools/environment.yml @@ -0,0 +1,43 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# To create the conda environment: +# $ conda env create -f environment.yml +# +# To update the conda environment: +# $ conda env update -f environment.yml +# +# To register the conda environment in Jupyter: +# $ conda activate forecasting_env +# $ python -m ipykernel install --user --name forecasting_env + +name: forecasting_env +channels: + - defaults + - conda-forge +dependencies: + - python=3.6.10 + - pip>=19.0.3 + - jupyter>=1.0.0 + - ipykernel>=4.6.1 + - jupyter_nbextensions_configurator=0.4.1 + - scipy=1.1.0 + - numpy=1.16.2 + - pandas=0.23.4 + - scikit-learn=0.20.3 + - pytest>=3.6.4 + - pylint + - papermill>=1.0.1 + - matplotlib>=3.1.2 + - r-base>=3.3.0 + - pip: + - black>=18.6b4 + - flake8>=3.3.0 + - jupytext>=1.3.0 + - lightgbm==2.3.0 + - tensorflow==2.0 + - tensorboard==2.1.0 + - nteract-scrapbook==0.3.1 + - statsmodels>=0.11.1 + - pmdarima>=1.1.1 + - azureml-sdk[automl,notebooks]==1.0.85 diff --git a/tools/environment_setup.bat b/tools/environment_setup.bat new file mode 100644 index 00000000..3eb7a824 --- /dev/null +++ b/tools/environment_setup.bat @@ -0,0 +1,24 @@ +REM Copyright (c) Microsoft Corporation. +REM Licensed under the MIT License. + +REM Please follow instructions in this link +REM https://docs.conda.io/projects/conda/en/latest/user-guide/install/windows.html +REM to install Miniconda before running this script. + + +echo Update conda +call conda update conda --yes + +echo Create conda environment +call conda env create -f tools/environment.yml + +echo Activate conda environment +call conda activate forecasting_env + +echo Install forecasting utility library +call pip install -e fclib + +echo Register conda environment in Jupyter +call python -m ipykernel install --user --name forecasting_env + +echo Environment setup is done! \ No newline at end of file diff --git a/tools/environment_setup.sh b/tools/environment_setup.sh new file mode 100755 index 00000000..0aea2289 --- /dev/null +++ b/tools/environment_setup.sh @@ -0,0 +1,21 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +# Update conda +conda update conda + +# Create conda environment +conda env create -f tools/environment.yml + +# Activate conda environment +eval "$(conda shell.bash hook)" && conda activate forecasting_env + +# Install forecasting utility library +pip install -e fclib + +# Install ray (available only on Linux and MacOS) +pip install ray>=0.8.2 + +# Register conda environment in Jupyter +python -m ipykernel install --user --name forecasting_env diff --git a/tools/generate_conda_file.py b/tools/generate_conda_file.py new file mode 100644 index 00000000..fdd7349f --- /dev/null +++ b/tools/generate_conda_file.py @@ -0,0 +1,165 @@ +#!/usr/bin/python + +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# This script creates yaml files to build conda environments +# For generating a conda file for running only python code: +# $ python generate_conda_file.py +# +# For generating a conda file for running python gpu: +# $ python generate_conda_file.py --gpu + + +import argparse +import textwrap +from sys import platform + + +HELP_MSG = """ +To create the conda environment: +$ conda env create -f {conda_env}.yaml + +To update the conda environment: +$ conda env update -f {conda_env}.yaml + +To register the conda environment in Jupyter: +$ conda activate {conda_env} +$ python -m ipykernel install --user --name {conda_env} \ +--display-name "Python ({conda_env})" +""" + + +CHANNELS = ["defaults", "conda-forge"] + +CONDA_BASE = { + "python": "python==3.6.10", + "pip": "pip>=19.1.1", + "ipykernel": "ipykernel>=4.6.1", + "jupyter": "jupyter>=1.0.0", + "jupyter_nbextensions_configurator": "jupyter_nbextensions_configurator>=0.4.1", + "numpy": "numpy>=1.16.2", + "pandas": "pandas>=0.23.4", + "pytest": "pytest>=3.6.4", + "scipy": "scipy>=1.1.0", + "xlrd": "xlrd>=1.1.0", + "urllib3": "urllib3>=1.21.1", + "scikit-learn": "scikit-learn>=0.20.3", + "tqdm": "tqdm>=4.43.0", + "pylint": "pylint>=2.4.4", + "matplotlib": "matplotlib>=3.1.2", + "r-base": "r-base>=3.3.0", + "papermill": "papermill>=1.0.1", +} + + +CONDA_GPU = {} + +PIP_BASE = { + "azureml-sdk": "azureml-sdk[explain,automl]==1.0.85", + "black": "black>=18.6b4", + "nteract-scrapbook": "nteract-scrapbook>=0.3.1", + "pre-commit": "pre-commit>=1.14.4", + "tensorboard": "tensorboard==2.1.0", + "tensorflow": "tensorflow==2.0", + "flake8": "flake8>=3.3.0", + "jupytext": "jupytext>=1.3.0", + "lightgbm": "lightgbm==2.3.0", + "statsmodels": "statsmodels==0.11.1", + "pmdarima": "pmdarima==1.1.1", + "gitpython": "gitpython==3.0.8", +} + +PIP_GPU = {} + +PIP_DARWIN = {} +PIP_DARWIN_GPU = {} + +PIP_LINUX = {} +PIP_LINUX_GPU = {} + +PIP_WIN32 = {} +PIP_WIN32_GPU = {} + +CONDA_DARWIN = {} +CONDA_DARWIN_GPU = {} + +CONDA_LINUX = {} +CONDA_LINUX_GPU = {} + +CONDA_WIN32 = {} +CONDA_WIN32_GPU = {} + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=textwrap.dedent( + """ + This script generates a conda file for different environments. + Plain python is the default, + but flags can be used to support GPU functionality.""" + ), + epilog=HELP_MSG, + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument("--name", help="specify name of conda environment") + parser.add_argument("--gpu", action="store_true", help="include packages for GPU support") + args = parser.parse_args() + + # set name for environment and output yaml file + conda_env = "forecasting_cpu" + if args.gpu: + conda_env = "forecasting_gpu" + + # overwrite environment name with user input + if args.name is not None: + conda_env = args.name + + # add conda and pip base packages + conda_packages = CONDA_BASE + pip_packages = PIP_BASE + + # update conda and pip packages based on flags provided + if args.gpu: + conda_packages.update(CONDA_GPU) + pip_packages.update(PIP_GPU) + + # update conda and pip packages based on os platform support + if platform == "darwin": + conda_packages.update(CONDA_DARWIN) + pip_packages.update(PIP_DARWIN) + if args.gpu: + conda_packages.update(CONDA_DARWIN_GPU) + pip_packages.update(PIP_DARWIN_GPU) + elif platform.startswith("linux"): + conda_packages.update(CONDA_LINUX) + pip_packages.update(PIP_LINUX) + if args.gpu: + conda_packages.update(CONDA_LINUX_GPU) + pip_packages.update(PIP_LINUX_GPU) + elif platform == "win32": + conda_packages.update(CONDA_WIN32) + pip_packages.update(PIP_WIN32) + if args.gpu: + conda_packages.update(CONDA_WIN32_GPU) + pip_packages.update(PIP_WIN32_GPU) + else: + raise Exception("Unsupported platform. Must be Windows, Linux, or macOS") + + # write out yaml file + conda_file = "{}.yaml".format(conda_env) + with open(conda_file, "w") as f: + for line in HELP_MSG.format(conda_env=conda_env).split("\n"): + f.write("# {}\n".format(line)) + f.write("name: {}\n".format(conda_env)) + f.write("channels:\n") + for channel in CHANNELS: + f.write("- {}\n".format(channel)) + f.write("dependencies:\n") + for conda_package in conda_packages.values(): + f.write("- {}\n".format(conda_package)) + f.write("- pip:\n") + for pip_package in pip_packages.values(): + f.write(" - {}\n".format(pip_package)) + + print("Generated conda file: {}".format(conda_file)) + print(HELP_MSG.format(conda_env=conda_env)) diff --git a/tools/generate_requirements_txt.py b/tools/generate_requirements_txt.py new file mode 100644 index 00000000..2c6a6e51 --- /dev/null +++ b/tools/generate_requirements_txt.py @@ -0,0 +1,43 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# This file outputs a requirements.txt based on the libraries defined in generate_conda_file.py +from generate_conda_file import ( + CONDA_BASE, + CONDA_GPU, + PIP_BASE, + PIP_GPU, + PIP_DARWIN, + PIP_LINUX, + PIP_WIN32, + CONDA_DARWIN, + CONDA_LINUX, + CONDA_WIN32, + PIP_DARWIN_GPU, + PIP_LINUX_GPU, + PIP_WIN32_GPU, + CONDA_DARWIN_GPU, + CONDA_LINUX_GPU, + CONDA_WIN32_GPU, +) + + +if __name__ == "__main__": + deps = list(CONDA_BASE.values()) + deps += list(CONDA_GPU.values()) + deps += list(PIP_BASE.values()) + deps += list(PIP_GPU.values()) + deps += list(PIP_DARWIN.values()) + deps += list(PIP_LINUX.values()) + deps += list(PIP_WIN32.values()) + deps += list(CONDA_DARWIN.values()) + deps += list(CONDA_LINUX.values()) + deps += list(CONDA_WIN32.values()) + deps += list(PIP_DARWIN_GPU.values()) + deps += list(PIP_LINUX_GPU.values()) + deps += list(PIP_WIN32_GPU.values()) + deps += list(CONDA_DARWIN_GPU.values()) + deps += list(CONDA_LINUX_GPU.values()) + deps += list(CONDA_WIN32_GPU.values()) + with open("requirements.txt", "w") as f: + f.write("\n".join(set(deps)))