diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 9b3aa436..00000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "image": "gquant/gquant:10.1_10.2-runtime-ubuntu18.04_0.14.1_dev", - "workspaceFolder": "/workspace/", - "workspaceMount": "source=${localEnv:GQUANT_ROOT},target=/workspace,type=bind,consistency=cached", - "extensions": [ - "ms-python.python", "dbaeumer.vscode-eslint" - ], - "settings": { - "terminal.integrated.shell.linux": "/bin/bash", - "python.pythonPath": "/home/quant/miniconda3/bin/python", - "python.linting.enabled": true, - "python.linting.pylintEnabled": true, - "python.formatting.autopep8Path": "/home/quant/miniconda3/bin/autopep8", - "python.linting.flake8Path": "/home/quant/miniconda3/bin/flake8", - "python.linting.pylintPath": "/home/quant/miniconda3/bin/pylint", - "python.testing.pytestPath": "/home/quant/miniconda3/bin/pytest" - }, - "forwardPorts": [8080, 8888], - "remoteUser": "quant", - "containerUser": "quant", - "runArgs": ["--runtime=nvidia"] -} diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index ea4aa471..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,183 +0,0 @@ -# Changelog - -## [v1.0.1](https://github.com/rapidsai/gQuant/tree/v1.0.1) (2021-01-20) - -[Full Changelog](https://github.com/rapidsai/gQuant/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- \[REVIEW\] Simple external plugin example [\#113](https://github.com/rapidsai/gQuant/pull/113) ([yidong72](https://github.com/yidong72)) - -## [v1.0.0](https://github.com/rapidsai/gQuant/tree/v1.0.0) (2020-12-30) - -[Full Changelog](https://github.com/rapidsai/gQuant/compare/0.5...v1.0.0) - -**Closed issues:** - -- \[FEA\]We need Plugin file support [\#106](https://github.com/rapidsai/gQuant/issues/106) -- \[FEA\]Migrate to the new input/output port API [\#97](https://github.com/rapidsai/gQuant/issues/97) -- \[FEA\]Add the gQuant Web UI [\#95](https://github.com/rapidsai/gQuant/issues/95) -- \[DOC\] Add CHANGELOG.md [\#48](https://github.com/rapidsai/gQuant/issues/48) - -**Merged pull requests:** - -- \[REVIEW\]gQuant plugin implementation [\#112](https://github.com/rapidsai/gQuant/pull/112) ([yidong72](https://github.com/yidong72)) -- Gpuciscripts clean and update [\#111](https://github.com/rapidsai/gQuant/pull/111) ([msadang](https://github.com/msadang)) -- \[REVIEW\] gQuant 1.0 [\#110](https://github.com/rapidsai/gQuant/pull/110) ([yidong72](https://github.com/yidong72)) -- Streamz gQuant example 2 [\#109](https://github.com/rapidsai/gQuant/pull/109) ([yidong72](https://github.com/yidong72)) -- Revert "Streamz gQuant example" [\#108](https://github.com/rapidsai/gQuant/pull/108) ([yidong72](https://github.com/yidong72)) -- Streamz gQuant example [\#107](https://github.com/rapidsai/gQuant/pull/107) ([yidong72](https://github.com/yidong72)) -- Bump node-fetch from 2.6.0 to 2.6.1 in /gquantlab [\#104](https://github.com/rapidsai/gQuant/pull/104) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Nemo and xgboost integration [\#103](https://github.com/rapidsai/gQuant/pull/103) ([yidong72](https://github.com/yidong72)) -- FIX Update change log check [\#102](https://github.com/rapidsai/gQuant/pull/102) ([mike-wendt](https://github.com/mike-wendt)) -- \[REVIEW\] Update CI scripts to remove references to master \[skip ci\] [\#99](https://github.com/rapidsai/gQuant/pull/99) ([dillon-cullinan](https://github.com/dillon-cullinan)) -- \[skip ci\] Update master references for main branch [\#98](https://github.com/rapidsai/gQuant/pull/98) ([ajschmidt8](https://github.com/ajschmidt8)) -- \[REVIEW\]gQuant UI, first version [\#89](https://github.com/rapidsai/gQuant/pull/89) ([yidong72](https://github.com/yidong72)) - -## [0.5](https://github.com/rapidsai/gQuant/tree/0.5) (2020-07-10) - -[Full Changelog](https://github.com/rapidsai/gQuant/compare/0.4.1...0.5) - -**Implemented enhancements:** - -- \[FEA\] csvStockLoader.py and stockNameLoader.py - Use cudf.read\_csv\(\) insteand of pandas.read\_csv\(\) [\#24](https://github.com/rapidsai/gQuant/issues/24) - -**Fixed bugs:** - -- \[BUG\] Using a UDF via Series.rolling.apply\(\) results in KeyError in numba [\#88](https://github.com/rapidsai/gQuant/issues/88) -- \[BUG\] download\_data.sh seems to do not be in containers anymore [\#66](https://github.com/rapidsai/gQuant/issues/66) - -**Closed issues:** - -- \[FEA\] Conda resolves too slow in the latest versions of the container [\#67](https://github.com/rapidsai/gQuant/issues/67) -- \[FEA\] Comprehensive refactoring of indicator\_demo.ipynb notebook [\#46](https://github.com/rapidsai/gQuant/issues/46) -- \[FEA\] Rename viz\_graph\(\) to viz\(\), save\_taskgraph\(\) to save\(\) [\#34](https://github.com/rapidsai/gQuant/issues/34) - -**Merged pull requests:** - -- \[REIVEW\]gQuant 0.5 release [\#94](https://github.com/rapidsai/gQuant/pull/94) ([yidong72](https://github.com/yidong72)) -- \[REVIEW\] Fix mortgage e2e example for rapids 0.14. [\#93](https://github.com/rapidsai/gQuant/pull/93) ([avolkov1](https://github.com/avolkov1)) -- \[REVIEW\] Update RAPIDS to version 0.14 [\#92](https://github.com/rapidsai/gQuant/pull/92) ([yidong72](https://github.com/yidong72)) -- \[REVIEW\]Multiple gpu xgboost - Dask performance fix [\#91](https://github.com/rapidsai/gQuant/pull/91) ([yidong72](https://github.com/yidong72)) -- \[REVIEW\]Mutliple GPU xgboost [\#90](https://github.com/rapidsai/gQuant/pull/90) ([yidong72](https://github.com/yidong72)) - -## [0.4.1](https://github.com/rapidsai/gQuant/tree/0.4.1) (2020-05-26) - -[Full Changelog](https://github.com/rapidsai/gQuant/compare/0.4...0.4.1) - -**Merged pull requests:** - -- \[REVIEW\] hot fix for 0.4 release [\#86](https://github.com/rapidsai/gQuant/pull/86) ([yidong72](https://github.com/yidong72)) -- \[REVIEW\] fix the cuIndicator notebook and RSI perf notebook [\#85](https://github.com/rapidsai/gQuant/pull/85) ([yidong72](https://github.com/yidong72)) -- Add cuda102 docker support and update version against development branch [\#84](https://github.com/rapidsai/gQuant/pull/84) ([jbaron](https://github.com/jbaron)) - -## [0.4](https://github.com/rapidsai/gQuant/tree/0.4) (2020-05-19) - -[Full Changelog](https://github.com/rapidsai/gQuant/compare/v0.2...0.4) - -**Implemented enhancements:** - -- \[REVIEW\]Feature adding fractional differencing computation [\#56](https://github.com/rapidsai/gQuant/pull/56) ([yidong72](https://github.com/yidong72)) - -**Fixed bugs:** - -- \[BUG\] Dask computation fails with 0.8 build script [\#28](https://github.com/rapidsai/gQuant/issues/28) - -**Closed issues:** - -- \[FEA\] Add cuda 10.1.2 support [\#64](https://github.com/rapidsai/gQuant/issues/64) -- \[FEA\] Use RAPIDS 0.9 container in build.sh [\#54](https://github.com/rapidsai/gQuant/issues/54) -- \[FEA\] Rename notebook to notebooks [\#50](https://github.com/rapidsai/gQuant/issues/50) -- \[FEA\] Add Jupyterlab extension to display GPU usage [\#49](https://github.com/rapidsai/gQuant/issues/49) -- \[FEA\] Merge develop branch to master [\#47](https://github.com/rapidsai/gQuant/issues/47) -- \[FEA\] implement the fractional difference operation [\#42](https://github.com/rapidsai/gQuant/issues/42) - -**Merged pull requests:** - -- \[REVIEW\] merge develop to master and release it as 0.4 [\#82](https://github.com/rapidsai/gQuant/pull/82) ([yidong72](https://github.com/yidong72)) -- \[REVIEW\]update to latest version of RAPIDS 0.13 [\#81](https://github.com/rapidsai/gQuant/pull/81) ([yidong72](https://github.com/yidong72)) -- fixed the gamma computation error [\#79](https://github.com/rapidsai/gQuant/pull/79) ([doyend](https://github.com/doyend)) -- \[REVIEW\]asian barrier option tutorial [\#77](https://github.com/rapidsai/gQuant/pull/77) ([yidong72](https://github.com/yidong72)) -- \[REVIEW\] upgrade to RAPIDS 0.11 [\#76](https://github.com/rapidsai/gQuant/pull/76) ([yidong72](https://github.com/yidong72)) -- \[skip ci\] Merge CI Scripts [\#75](https://github.com/rapidsai/gQuant/pull/75) ([avolkov1](https://github.com/avolkov1)) -- \[REVIEW\] Add CI scripts and conda recipe [\#74](https://github.com/rapidsai/gQuant/pull/74) ([raydouglass](https://github.com/raydouglass)) -- \[WIP\] CUQ-36: fix typechecking nodes multi input dataframes [\#68](https://github.com/rapidsai/gQuant/pull/68) ([avolkov1](https://github.com/avolkov1)) -- \[REVIEW\] Upgrade to RAPIDS 0.10 [\#63](https://github.com/rapidsai/gQuant/pull/63) ([yidong72](https://github.com/yidong72)) -- \[REVIEW\] stable master merge [\#62](https://github.com/rapidsai/gQuant/pull/62) ([yidong72](https://github.com/yidong72)) -- \[REVIEW\]upgrade to RAPIDS 0.9, FIX the rebase problem [\#61](https://github.com/rapidsai/gQuant/pull/61) ([yidong72](https://github.com/yidong72)) -- Revert "\[REVIEW\]upgrade to RAPIDS 0.9" [\#59](https://github.com/rapidsai/gQuant/pull/59) ([yidong72](https://github.com/yidong72)) -- Revert "\[REVIEW\]upgrade to RAPIDS 0.9" [\#58](https://github.com/rapidsai/gQuant/pull/58) ([avolkov1](https://github.com/avolkov1)) -- \[REVIEW\]upgrade to RAPIDS 0.9 [\#57](https://github.com/rapidsai/gQuant/pull/57) ([yidong72](https://github.com/yidong72)) -- \[REVIEW\] change the text for notebook 05 [\#55](https://github.com/rapidsai/gQuant/pull/55) ([yidong72](https://github.com/yidong72)) -- Fix \#50b - Rename notebook folder to notebooks [\#52](https://github.com/rapidsai/gQuant/pull/52) ([miguelusque](https://github.com/miguelusque)) -- Fix \#50 - Rename notebook folder to notebooks [\#51](https://github.com/rapidsai/gQuant/pull/51) ([miguelusque](https://github.com/miguelusque)) - -## [v0.2](https://github.com/rapidsai/gQuant/tree/v0.2) (2019-08-16) - -[Full Changelog](https://github.com/rapidsai/gQuant/compare/v0.1...v0.2) - -**Implemented enhancements:** - -- \[FEA\] Refactor 04\_portfolio\_trade.ipynb notebook [\#39](https://github.com/rapidsai/gQuant/issues/39) -- \[FEA\] Refactor notebook 01\_tutorial.ipynb [\#35](https://github.com/rapidsai/gQuant/issues/35) -- \[FEA\] Add error message \(or warning\) if replace node does not exist [\#32](https://github.com/rapidsai/gQuant/issues/32) -- \[FEA\] Add new issue templates [\#26](https://github.com/rapidsai/gQuant/issues/26) -- \[FEA\] cuIndicator notebook plot widget is too complicated [\#17](https://github.com/rapidsai/gQuant/issues/17) - -**Fixed bugs:** - -- \[BUG\] Remove debug info from barPlotNode.py and cumReturnNode.py [\#40](https://github.com/rapidsai/gQuant/issues/40) -- \[BUG\] 04\_portfolio\_trade.ipynb - Number of filtered stocks differs from text [\#23](https://github.com/rapidsai/gQuant/issues/23) - -**Merged pull requests:** - -- Fix \#17 - cuIndicator notebook plot widget is too complicated \(WIP\) [\#45](https://github.com/rapidsai/gQuant/pull/45) ([miguelusque](https://github.com/miguelusque)) -- Fix \#39 - Refactor 04\_portfolio\_trade.ipynb notebook [\#44](https://github.com/rapidsai/gQuant/pull/44) ([miguelusque](https://github.com/miguelusque)) -- Merge develop to master [\#43](https://github.com/rapidsai/gQuant/pull/43) ([yidong72](https://github.com/yidong72)) -- Fix \#40 - Remove debug info [\#41](https://github.com/rapidsai/gQuant/pull/41) ([miguelusque](https://github.com/miguelusque)) -- Update mortgage example using TaskGraph API. [\#38](https://github.com/rapidsai/gQuant/pull/38) ([avolkov1](https://github.com/avolkov1)) -- fixed the issue 32 [\#37](https://github.com/rapidsai/gQuant/pull/37) ([yidong72](https://github.com/yidong72)) -- Fix \#35 - Refactor 01\_tutorial.ipynb notebook [\#36](https://github.com/rapidsai/gQuant/pull/36) ([miguelusque](https://github.com/miguelusque)) -- Fix \#26b - Add new issue templates [\#30](https://github.com/rapidsai/gQuant/pull/30) ([miguelusque](https://github.com/miguelusque)) -- Revert "fix \#26 - Add new issues template" [\#29](https://github.com/rapidsai/gQuant/pull/29) ([yidong72](https://github.com/yidong72)) -- Fix \#26 - Add new issues template [\#27](https://github.com/rapidsai/gQuant/pull/27) ([miguelusque](https://github.com/miguelusque)) -- added workflow class [\#22](https://github.com/rapidsai/gQuant/pull/22) ([yidong72](https://github.com/yidong72)) -- Fix \#19b - Combine OS/Cuda versions user input [\#21](https://github.com/rapidsai/gQuant/pull/21) ([miguelusque](https://github.com/miguelusque)) -- Fix \#19 - build.sh - Move pip dependencies to conda dependencies [\#20](https://github.com/rapidsai/gQuant/pull/20) ([miguelusque](https://github.com/miguelusque)) -- Fix \#13, \#14, \#16 in cuIndicator.ipynb notebook [\#18](https://github.com/rapidsai/gQuant/pull/18) ([miguelusque](https://github.com/miguelusque)) -- update the build.sh [\#15](https://github.com/rapidsai/gQuant/pull/15) ([yidong72](https://github.com/yidong72)) -- Feature xgb notebook [\#11](https://github.com/rapidsai/gQuant/pull/11) ([yidong72](https://github.com/yidong72)) -- CUQ-5: Mortgage example using gQuant. [\#10](https://github.com/rapidsai/gQuant/pull/10) ([avolkov1](https://github.com/avolkov1)) -- CUQ-5: Mortgage example using gQuant. [\#9](https://github.com/rapidsai/gQuant/pull/9) ([avolkov1](https://github.com/avolkov1)) -- Feature indicator node [\#8](https://github.com/rapidsai/gQuant/pull/8) ([yidong72](https://github.com/yidong72)) -- Feature mulit assets indicator [\#7](https://github.com/rapidsai/gQuant/pull/7) ([yidong72](https://github.com/yidong72)) -- Update build.sh [\#6](https://github.com/rapidsai/gQuant/pull/6) ([phogan-nvidia](https://github.com/phogan-nvidia)) -- Feature environment [\#5](https://github.com/rapidsai/gQuant/pull/5) ([yidong72](https://github.com/yidong72)) - -## [v0.1](https://github.com/rapidsai/gQuant/tree/v0.1) (2019-08-13) - -[Full Changelog](https://github.com/rapidsai/gQuant/compare/e4a967fc9e3289fdbfa37e7a7b84887579332b42...v0.1) - -**Implemented enhancements:** - -- \[FEA\] build.sh - Move pip dependencies to conda dependencies [\#19](https://github.com/rapidsai/gQuant/issues/19) - -**Fixed bugs:** - -- \[BUG\] Update build.sh to 0.7 until issue \#28 is fixed [\#31](https://github.com/rapidsai/gQuant/issues/31) -- \[BUG\] cuIndicator.ipyng - Wrong series names [\#16](https://github.com/rapidsai/gQuant/issues/16) -- \[BUG\] cuIndicator.ipynb - Runtime error in cell \#3 - Missing file [\#14](https://github.com/rapidsai/gQuant/issues/14) -- \[BUG\] cuIndicator.ipynb - Incorrect path to dataset [\#13](https://github.com/rapidsai/gQuant/issues/13) - -**Merged pull requests:** - -- Revert "gQuant34 - Update build.sh to make use of RAPIDS v0.8 container" [\#33](https://github.com/rapidsai/gQuant/pull/33) ([yidong72](https://github.com/yidong72)) -- gQuant34 - Update build.sh to make use of RAPIDS v0.8 container [\#12](https://github.com/rapidsai/gQuant/pull/12) ([miguelusque](https://github.com/miguelusque)) -- Synch master with develop [\#4](https://github.com/rapidsai/gQuant/pull/4) ([avolkov1](https://github.com/avolkov1)) -- added unit tests for the cuindicator [\#3](https://github.com/rapidsai/gQuant/pull/3) ([yidong72](https://github.com/yidong72)) -- CUQ-21: Improving tutorials for gQuant [\#2](https://github.com/rapidsai/gQuant/pull/2) ([avolkov1](https://github.com/avolkov1)) -- Add download script and instructions in the readme [\#1](https://github.com/rapidsai/gQuant/pull/1) ([yidong72](https://github.com/yidong72)) - - - -\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* diff --git a/README.md b/README.md index a25cc9f2..9ad180b9 100644 --- a/README.md +++ b/README.md @@ -1,125 +1,6 @@ -# gQuant - GPU Accelerated Graph Computation for Quantitative Analyst Tasks +# FSI Examples -**NOTE:** For the latest stable [README.md](https://github.com/rapidsai/gquant/blob/main/README.md) ensure you are on the `main` branch. +Repo Index -## What is gQuant? -gQuant is a collection of open-source GPU accelerated Python tools and examples for quantitative analyst tasks, built on top of the [RAPIDS AI](https://rapids.ai/) project, [Numba](https://numba.pydata.org/), and [Dask](https://dask.org/). +1. [gGuant](gQuant) - A graph computation toolkit that helps you to organize the workflows in graph computation. -The examples range from simple accelerated calculation of technical trading indicators through defining workflows for interactively developing trading strategies and automating many typical tasks. - -The extensibility of the system is highlighted by examples showing how to create a dataframe flow graph, which allows for easy re-use and composability of higher level workflows. - -The examples also show how to easily convert a single-threaded solution into a Dask distributed one. - -These examples can be used as-is or, as they are open source, can be extended to suit your environments. - -## gQuant jupyterlab extension -![Tuturial](tutorial.gif "Tutorial") -![Quick Demo](gquantlab_demo.gif "Demo") -The gQuant Juyterlab extension provides the user interface to build the dataframe flow TaskGraph easily. It takes advantage of the open sources projects like [jupyterlab](https://github.com/jupyterlab/jupyterlab), [ipywidget](https://github.com/jupyter-widgets/ipywidgets), [React](https://reactjs.org/) and [D3](https://d3js.org/). It features: -1. Takes full advantage of the JupyterLab project that the extension adds commands to Jupyterlab context menu, command palette and bind them with keyboard shortcuts to speed up the productivity. -2. Define a new TaskGraph file format `.gq.yaml` that can be edited in the Jupyterlab. -3. Visually presents the TaskGraph as a DAG graph. Users can zoom in and out, freely move the nodes around, and make connections between nodes. -4. Use the special `Ouput Collector` to gather the results and organize them in a tab widget. The IPython [rich display](https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display) is fully supported. -5. Visually shows the progress of graph evaluation and computation dependence. -6. Automatically generate the UI elements to edit and validate the Node configuration given the configuration JSON schema. It exposes the function API in a user-friendly way. User can change the configuration and re-run the computation to test out the hyperparameters easily. -7. Dynamically compute the input-output ports compatibility, dataframe columns names and types, ports types to prevent connection errors. -8. Nodes can have multiple output ports that can be used to generate different output types. E.g. some data loader Node provides both `cudf` and `dask_cudf` output ports. The multiple GPUs distributed computation computation is automatically enabled by switching to the `dask_cudf` output port. -9. Provides the standard API to extend your computation Nodes. -10. The composite node can encapsulate the TaskGraph into a single node for easy reuse. The composite node can be exported as a regular gQuant node without any coding. - -### Binary pip installation - -To install the gQuant graph computation library, first install the dependence libraries: -```bash -pip install dask[dataframe] distributed networkx -conda install python-graphviz ruamel.yaml numpy pandas -``` -Then install gquant lib: -```bash -pip install gquant -``` - -To install JupyterLab plugin, install the following dependence libraries: -```bash -conda install nodejs ipywidgets -``` -Then install the gquantlab lib: -```bash -pip install gquantlab==0.1.2 -``` -Build the ipywidgets Jupyterlab plugin -```bash -jupyter labextension install @jupyter-widgets/jupyterlab-manager@2.0 -``` -If you launch the JupyterLab, it will prompt to build the new plugin. You can -explicitly build it by: -```bash -jupyter lab build -``` - -Note, the gQuant node plugins are defined in the `gquantrc` file. Check the `System environment` for details - - -### Prerequisites -- NVIDIA Pascal™ GPU architecture or better. -- [CUDA 9.2](https://developer.nvidia.com/cuda-92-download-archive) with driver v396.37+ or [CUDA 10.0](https://developer.nvidia.com/cuda-10.0-download-archive) with driver v410.48+. -- Ubuntu 16.04 or 18.04. -- [NVIDIA-docker v2+](https://github.com/nvidia/nvidia-docker/wiki/Frequently-Asked-Questions#how-do-i-install-20-if-im-not-using-the-latest-docker-version). - - -### Download data files - -Run the following command at the project root diretory -```bash -bash download_data.sh - -``` - -### Install - -gQuant source code can be downloaded from [GitHub](https://github.com/rapidsai/gquant). - -- Git clone source code: - -```bash -$ git clone https://github.com/rapidsai/gQuant.git -``` - - -- Build and run the container: - -```bash -$ cd gQuant/docker && . build.sh -``` -When building the container, you can run gQuant in two modes: dev or prod. In the dev mode, please check the README file in `gquantlab` directory to install the plugins and Python libraries. - -In the production mode, you can launch the container by following command and start to use it -```bash -$ docker run --runtime=nvidia --rm -it -p 8888:8888 -p 8787:8787 -p 8786:8786 gquant/gquant:[tag from the build] -``` - -### Example notebooks - -Example notebooks, tutorial showcasing, can be found in __notebooks__ folder. - - -### System environment - -There are a few system environment that the user can overwrite. - -The custom module files are specified in the `gquantrc` file. `GQUANT_CONFIG` enviroment variable points to the location of this file. By default, it points to -`$CWD\gquantrc`. - -In the example `gquantrc`, system environment variable `MODULEPATH` is used to point to the paths of the module files. -To start the jupyterlab, please make sure `MODULEPATH` is set properly. - -For example, if you want to start the jupyterlab in the gQuant root directory. -```bash -MODULEPATH=$PWD/modules jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='' -``` - -Or, if you want to start the jupyterlab in the gquantlab directory. -```bash -GQUANT_CONFIG=../gquantrc MODULEPATH=$PWD/../modules jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='' -``` diff --git a/.gitignore b/gQuant/.gitignore similarity index 100% rename from .gitignore rename to gQuant/.gitignore diff --git a/gQuant/CHANGELOG.md b/gQuant/CHANGELOG.md new file mode 100644 index 00000000..9c4b070d --- /dev/null +++ b/gQuant/CHANGELOG.md @@ -0,0 +1,191 @@ +# Changelog + +## [v1.0.2](https://github.com/NVIDIA/fsi-samples/tree/v1.0.2) (2021-02-11) + +[Full Changelog](https://github.com/NVIDIA/fsi-samples/compare/v1.0.1...v1.0.2) + +**Merged pull requests:** + +- \[REVIEW\]Upgrade the plugin to JupyterLab 3 [\#114](https://github.com/NVIDIA/fsi-samples/pull/114) ([yidong72](https://github.com/yidong72)) + +## [v1.0.1](https://github.com/NVIDIA/fsi-samples/tree/v1.0.1) (2021-01-20) + +[Full Changelog](https://github.com/NVIDIA/fsi-samples/compare/v1.0.0...v1.0.1) + +**Merged pull requests:** + +- \[REVIEW\]gquant 1.0.1 [\#115](https://github.com/NVIDIA/fsi-samples/pull/115) ([yidong72](https://github.com/yidong72)) + +## [v1.0.0](https://github.com/NVIDIA/fsi-samples/tree/v1.0.0) (2020-12-30) + +[Full Changelog](https://github.com/NVIDIA/fsi-samples/compare/0.5...v1.0.0) + +**Closed issues:** + +- \[FEA\]We need Plugin file support [\#106](https://github.com/NVIDIA/fsi-samples/issues/106) +- \[FEA\]Migrate to the new input/output port API [\#97](https://github.com/NVIDIA/fsi-samples/issues/97) +- \[FEA\]Add the gQuant Web UI [\#95](https://github.com/NVIDIA/fsi-samples/issues/95) +- \[DOC\] Add CHANGELOG.md [\#48](https://github.com/NVIDIA/fsi-samples/issues/48) + +**Merged pull requests:** + +- \[REVIEW\]gQuant plugin implementation [\#112](https://github.com/NVIDIA/fsi-samples/pull/112) ([yidong72](https://github.com/yidong72)) +- Gpuciscripts clean and update [\#111](https://github.com/NVIDIA/fsi-samples/pull/111) ([msadang](https://github.com/msadang)) +- \[REVIEW\] gQuant 1.0 [\#110](https://github.com/NVIDIA/fsi-samples/pull/110) ([yidong72](https://github.com/yidong72)) +- Streamz gQuant example 2 [\#109](https://github.com/NVIDIA/fsi-samples/pull/109) ([yidong72](https://github.com/yidong72)) +- Revert "Streamz gQuant example" [\#108](https://github.com/NVIDIA/fsi-samples/pull/108) ([yidong72](https://github.com/yidong72)) +- Streamz gQuant example [\#107](https://github.com/NVIDIA/fsi-samples/pull/107) ([yidong72](https://github.com/yidong72)) +- Bump node-fetch from 2.6.0 to 2.6.1 in /gquantlab [\#104](https://github.com/NVIDIA/fsi-samples/pull/104) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Nemo and xgboost integration [\#103](https://github.com/NVIDIA/fsi-samples/pull/103) ([yidong72](https://github.com/yidong72)) +- FIX Update change log check [\#102](https://github.com/NVIDIA/fsi-samples/pull/102) ([mike-wendt](https://github.com/mike-wendt)) +- \[REVIEW\] Update CI scripts to remove references to master \[skip ci\] [\#99](https://github.com/NVIDIA/fsi-samples/pull/99) ([dillon-cullinan](https://github.com/dillon-cullinan)) +- \[skip ci\] Update master references for main branch [\#98](https://github.com/NVIDIA/fsi-samples/pull/98) ([ajschmidt8](https://github.com/ajschmidt8)) +- \[REVIEW\]gQuant UI, first version [\#89](https://github.com/NVIDIA/fsi-samples/pull/89) ([yidong72](https://github.com/yidong72)) + +## [0.5](https://github.com/NVIDIA/fsi-samples/tree/0.5) (2020-07-10) + +[Full Changelog](https://github.com/NVIDIA/fsi-samples/compare/0.4.1...0.5) + +**Implemented enhancements:** + +- \[FEA\] csvStockLoader.py and stockNameLoader.py - Use cudf.read\_csv\(\) insteand of pandas.read\_csv\(\) [\#24](https://github.com/NVIDIA/fsi-samples/issues/24) + +**Fixed bugs:** + +- \[BUG\] Using a UDF via Series.rolling.apply\(\) results in KeyError in numba [\#88](https://github.com/NVIDIA/fsi-samples/issues/88) +- \[BUG\] download\_data.sh seems to do not be in containers anymore [\#66](https://github.com/NVIDIA/fsi-samples/issues/66) + +**Closed issues:** + +- \[FEA\] Conda resolves too slow in the latest versions of the container [\#67](https://github.com/NVIDIA/fsi-samples/issues/67) +- \[FEA\] Comprehensive refactoring of indicator\_demo.ipynb notebook [\#46](https://github.com/NVIDIA/fsi-samples/issues/46) +- \[FEA\] Rename viz\_graph\(\) to viz\(\), save\_taskgraph\(\) to save\(\) [\#34](https://github.com/NVIDIA/fsi-samples/issues/34) + +**Merged pull requests:** + +- \[REIVEW\]gQuant 0.5 release [\#94](https://github.com/NVIDIA/fsi-samples/pull/94) ([yidong72](https://github.com/yidong72)) +- \[REVIEW\] Fix mortgage e2e example for rapids 0.14. [\#93](https://github.com/NVIDIA/fsi-samples/pull/93) ([avolkov1](https://github.com/avolkov1)) +- \[REVIEW\] Update RAPIDS to version 0.14 [\#92](https://github.com/NVIDIA/fsi-samples/pull/92) ([yidong72](https://github.com/yidong72)) +- \[REVIEW\]Multiple gpu xgboost - Dask performance fix [\#91](https://github.com/NVIDIA/fsi-samples/pull/91) ([yidong72](https://github.com/yidong72)) +- \[REVIEW\]Mutliple GPU xgboost [\#90](https://github.com/NVIDIA/fsi-samples/pull/90) ([yidong72](https://github.com/yidong72)) + +## [0.4.1](https://github.com/NVIDIA/fsi-samples/tree/0.4.1) (2020-05-26) + +[Full Changelog](https://github.com/NVIDIA/fsi-samples/compare/0.4...0.4.1) + +**Merged pull requests:** + +- \[REVIEW\] hot fix for 0.4 release [\#86](https://github.com/NVIDIA/fsi-samples/pull/86) ([yidong72](https://github.com/yidong72)) +- \[REVIEW\] fix the cuIndicator notebook and RSI perf notebook [\#85](https://github.com/NVIDIA/fsi-samples/pull/85) ([yidong72](https://github.com/yidong72)) +- Add cuda102 docker support and update version against development branch [\#84](https://github.com/NVIDIA/fsi-samples/pull/84) ([jbaron](https://github.com/jbaron)) + +## [0.4](https://github.com/NVIDIA/fsi-samples/tree/0.4) (2020-05-19) + +[Full Changelog](https://github.com/NVIDIA/fsi-samples/compare/v0.2...0.4) + +**Implemented enhancements:** + +- \[REVIEW\]Feature adding fractional differencing computation [\#56](https://github.com/NVIDIA/fsi-samples/pull/56) ([yidong72](https://github.com/yidong72)) + +**Fixed bugs:** + +- \[BUG\] Dask computation fails with 0.8 build script [\#28](https://github.com/NVIDIA/fsi-samples/issues/28) + +**Closed issues:** + +- \[FEA\] Add cuda 10.1.2 support [\#64](https://github.com/NVIDIA/fsi-samples/issues/64) +- \[FEA\] Use RAPIDS 0.9 container in build.sh [\#54](https://github.com/NVIDIA/fsi-samples/issues/54) +- \[FEA\] Rename notebook to notebooks [\#50](https://github.com/NVIDIA/fsi-samples/issues/50) +- \[FEA\] Add Jupyterlab extension to display GPU usage [\#49](https://github.com/NVIDIA/fsi-samples/issues/49) +- \[FEA\] Merge develop branch to master [\#47](https://github.com/NVIDIA/fsi-samples/issues/47) +- \[FEA\] implement the fractional difference operation [\#42](https://github.com/NVIDIA/fsi-samples/issues/42) + +**Merged pull requests:** + +- \[REVIEW\] merge develop to master and release it as 0.4 [\#82](https://github.com/NVIDIA/fsi-samples/pull/82) ([yidong72](https://github.com/yidong72)) +- \[REVIEW\]update to latest version of RAPIDS 0.13 [\#81](https://github.com/NVIDIA/fsi-samples/pull/81) ([yidong72](https://github.com/yidong72)) +- fixed the gamma computation error [\#79](https://github.com/NVIDIA/fsi-samples/pull/79) ([doyend](https://github.com/doyend)) +- \[REVIEW\]asian barrier option tutorial [\#77](https://github.com/NVIDIA/fsi-samples/pull/77) ([yidong72](https://github.com/yidong72)) +- \[REVIEW\] upgrade to RAPIDS 0.11 [\#76](https://github.com/NVIDIA/fsi-samples/pull/76) ([yidong72](https://github.com/yidong72)) +- \[skip ci\] Merge CI Scripts [\#75](https://github.com/NVIDIA/fsi-samples/pull/75) ([avolkov1](https://github.com/avolkov1)) +- \[REVIEW\] Add CI scripts and conda recipe [\#74](https://github.com/NVIDIA/fsi-samples/pull/74) ([raydouglass](https://github.com/raydouglass)) +- \[WIP\] CUQ-36: fix typechecking nodes multi input dataframes [\#68](https://github.com/NVIDIA/fsi-samples/pull/68) ([avolkov1](https://github.com/avolkov1)) +- \[REVIEW\] Upgrade to RAPIDS 0.10 [\#63](https://github.com/NVIDIA/fsi-samples/pull/63) ([yidong72](https://github.com/yidong72)) +- \[REVIEW\] stable master merge [\#62](https://github.com/NVIDIA/fsi-samples/pull/62) ([yidong72](https://github.com/yidong72)) +- \[REVIEW\]upgrade to RAPIDS 0.9, FIX the rebase problem [\#61](https://github.com/NVIDIA/fsi-samples/pull/61) ([yidong72](https://github.com/yidong72)) +- Revert "\[REVIEW\]upgrade to RAPIDS 0.9" [\#59](https://github.com/NVIDIA/fsi-samples/pull/59) ([yidong72](https://github.com/yidong72)) +- Revert "\[REVIEW\]upgrade to RAPIDS 0.9" [\#58](https://github.com/NVIDIA/fsi-samples/pull/58) ([avolkov1](https://github.com/avolkov1)) +- \[REVIEW\]upgrade to RAPIDS 0.9 [\#57](https://github.com/NVIDIA/fsi-samples/pull/57) ([yidong72](https://github.com/yidong72)) +- \[REVIEW\] change the text for notebook 05 [\#55](https://github.com/NVIDIA/fsi-samples/pull/55) ([yidong72](https://github.com/yidong72)) +- Fix \#50b - Rename notebook folder to notebooks [\#52](https://github.com/NVIDIA/fsi-samples/pull/52) ([miguelusque](https://github.com/miguelusque)) + +## [v0.2](https://github.com/NVIDIA/fsi-samples/tree/v0.2) (2019-08-16) + +[Full Changelog](https://github.com/NVIDIA/fsi-samples/compare/v0.1...v0.2) + +**Implemented enhancements:** + +- \[FEA\] Refactor 04\_portfolio\_trade.ipynb notebook [\#39](https://github.com/NVIDIA/fsi-samples/issues/39) +- \[FEA\] Refactor notebook 01\_tutorial.ipynb [\#35](https://github.com/NVIDIA/fsi-samples/issues/35) +- \[FEA\] Add error message \(or warning\) if replace node does not exist [\#32](https://github.com/NVIDIA/fsi-samples/issues/32) +- \[FEA\] Add new issue templates [\#26](https://github.com/NVIDIA/fsi-samples/issues/26) +- \[FEA\] cuIndicator notebook plot widget is too complicated [\#17](https://github.com/NVIDIA/fsi-samples/issues/17) + +**Fixed bugs:** + +- \[BUG\] Remove debug info from barPlotNode.py and cumReturnNode.py [\#40](https://github.com/NVIDIA/fsi-samples/issues/40) +- \[BUG\] 04\_portfolio\_trade.ipynb - Number of filtered stocks differs from text [\#23](https://github.com/NVIDIA/fsi-samples/issues/23) + +**Merged pull requests:** + +- Fix \#50 - Rename notebook folder to notebooks [\#51](https://github.com/NVIDIA/fsi-samples/pull/51) ([miguelusque](https://github.com/miguelusque)) +- Fix \#17 - cuIndicator notebook plot widget is too complicated \(WIP\) [\#45](https://github.com/NVIDIA/fsi-samples/pull/45) ([miguelusque](https://github.com/miguelusque)) +- Fix \#39 - Refactor 04\_portfolio\_trade.ipynb notebook [\#44](https://github.com/NVIDIA/fsi-samples/pull/44) ([miguelusque](https://github.com/miguelusque)) +- Merge develop to master [\#43](https://github.com/NVIDIA/fsi-samples/pull/43) ([yidong72](https://github.com/yidong72)) +- Fix \#40 - Remove debug info [\#41](https://github.com/NVIDIA/fsi-samples/pull/41) ([miguelusque](https://github.com/miguelusque)) +- Update mortgage example using TaskGraph API. [\#38](https://github.com/NVIDIA/fsi-samples/pull/38) ([avolkov1](https://github.com/avolkov1)) +- fixed the issue 32 [\#37](https://github.com/NVIDIA/fsi-samples/pull/37) ([yidong72](https://github.com/yidong72)) +- Fix \#35 - Refactor 01\_tutorial.ipynb notebook [\#36](https://github.com/NVIDIA/fsi-samples/pull/36) ([miguelusque](https://github.com/miguelusque)) +- Fix \#26b - Add new issue templates [\#30](https://github.com/NVIDIA/fsi-samples/pull/30) ([miguelusque](https://github.com/miguelusque)) +- Revert "fix \#26 - Add new issues template" [\#29](https://github.com/NVIDIA/fsi-samples/pull/29) ([yidong72](https://github.com/yidong72)) +- Fix \#26 - Add new issues template [\#27](https://github.com/NVIDIA/fsi-samples/pull/27) ([miguelusque](https://github.com/miguelusque)) +- added workflow class [\#22](https://github.com/NVIDIA/fsi-samples/pull/22) ([yidong72](https://github.com/yidong72)) +- Fix \#19b - Combine OS/Cuda versions user input [\#21](https://github.com/NVIDIA/fsi-samples/pull/21) ([miguelusque](https://github.com/miguelusque)) +- Fix \#19 - build.sh - Move pip dependencies to conda dependencies [\#20](https://github.com/NVIDIA/fsi-samples/pull/20) ([miguelusque](https://github.com/miguelusque)) +- Fix \#13, \#14, \#16 in cuIndicator.ipynb notebook [\#18](https://github.com/NVIDIA/fsi-samples/pull/18) ([miguelusque](https://github.com/miguelusque)) +- update the build.sh [\#15](https://github.com/NVIDIA/fsi-samples/pull/15) ([yidong72](https://github.com/yidong72)) +- Feature xgb notebook [\#11](https://github.com/NVIDIA/fsi-samples/pull/11) ([yidong72](https://github.com/yidong72)) +- CUQ-5: Mortgage example using gQuant. [\#10](https://github.com/NVIDIA/fsi-samples/pull/10) ([avolkov1](https://github.com/avolkov1)) +- Feature indicator node [\#8](https://github.com/NVIDIA/fsi-samples/pull/8) ([yidong72](https://github.com/yidong72)) +- Feature mulit assets indicator [\#7](https://github.com/NVIDIA/fsi-samples/pull/7) ([yidong72](https://github.com/yidong72)) +- Update build.sh [\#6](https://github.com/NVIDIA/fsi-samples/pull/6) ([phogan-nvidia](https://github.com/phogan-nvidia)) +- Feature environment [\#5](https://github.com/NVIDIA/fsi-samples/pull/5) ([yidong72](https://github.com/yidong72)) + +## [v0.1](https://github.com/NVIDIA/fsi-samples/tree/v0.1) (2019-08-13) + +[Full Changelog](https://github.com/NVIDIA/fsi-samples/compare/e4a967fc9e3289fdbfa37e7a7b84887579332b42...v0.1) + +**Implemented enhancements:** + +- \[FEA\] build.sh - Move pip dependencies to conda dependencies [\#19](https://github.com/NVIDIA/fsi-samples/issues/19) + +**Fixed bugs:** + +- \[BUG\] Update build.sh to 0.7 until issue \#28 is fixed [\#31](https://github.com/NVIDIA/fsi-samples/issues/31) +- \[BUG\] cuIndicator.ipyng - Wrong series names [\#16](https://github.com/NVIDIA/fsi-samples/issues/16) +- \[BUG\] cuIndicator.ipynb - Runtime error in cell \#3 - Missing file [\#14](https://github.com/NVIDIA/fsi-samples/issues/14) +- \[BUG\] cuIndicator.ipynb - Incorrect path to dataset [\#13](https://github.com/NVIDIA/fsi-samples/issues/13) + +**Merged pull requests:** + +- Revert "gQuant34 - Update build.sh to make use of RAPIDS v0.8 container" [\#33](https://github.com/NVIDIA/fsi-samples/pull/33) ([yidong72](https://github.com/yidong72)) +- gQuant34 - Update build.sh to make use of RAPIDS v0.8 container [\#12](https://github.com/NVIDIA/fsi-samples/pull/12) ([miguelusque](https://github.com/miguelusque)) +- CUQ-5: Mortgage example using gQuant. [\#9](https://github.com/NVIDIA/fsi-samples/pull/9) ([avolkov1](https://github.com/avolkov1)) +- Synch master with develop [\#4](https://github.com/NVIDIA/fsi-samples/pull/4) ([avolkov1](https://github.com/avolkov1)) +- added unit tests for the cuindicator [\#3](https://github.com/NVIDIA/fsi-samples/pull/3) ([yidong72](https://github.com/yidong72)) +- CUQ-21: Improving tutorials for gQuant [\#2](https://github.com/NVIDIA/fsi-samples/pull/2) ([avolkov1](https://github.com/avolkov1)) +- Add download script and instructions in the readme [\#1](https://github.com/NVIDIA/fsi-samples/pull/1) ([yidong72](https://github.com/yidong72)) + + + +\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* diff --git a/LICENSE b/gQuant/LICENSE similarity index 100% rename from LICENSE rename to gQuant/LICENSE diff --git a/gQuant/README.md b/gQuant/README.md new file mode 100644 index 00000000..6cb0cc90 --- /dev/null +++ b/gQuant/README.md @@ -0,0 +1,100 @@ +# gQuant - Graph Computation Tool + +**NOTE:** For the latest stable [README.md](https://github.com/rapidsai/gquant/blob/main/README.md) ensure you are on the `main` branch. + + +## What's Inside This Repo + +There are a few projects inside this repo: + +1. [gquant](gquant) - A graph computation toolkit that helps you to organize the workflows in graph computation. +2. [gquantlab](gquantlab) - A JupyterLab plugin that provides the UI interface for `gquant`. +3. [plugins](plugins) - A few gquant plugins with example notebooks. + 1. [simple_example](plugins/simple_example) - A simple external plugin example for gQuant. + 2. [rapids_plugin](plugins/rapids_plugin) - An external plugin with a set of nodes for quantitative analyst tasks, built on top of the [RAPIDS AI](https://rapids.ai/) project, [Numba](https://numba.pydata.org/), and [Dask](https://dask.org/). + 3. [nemo_plugin](plugins/nemo_plugin) - An external plugin with a set of nodes that wraps the [NeMo library](https://github.com/NVIDIA/NeMo) . + +These projects are all released as independent Python projects with their own `setup.py` files. + +## Screenshots +![Tuturial](tutorial.gif "Tutorial") +![Quick Demo](gquantlab_demo.gif "Demo") + + +## Binary installation + +### Install the gGuant +To install the gQuant graph computation library, run: +```bash +pip install gquant +``` +Or install `gquant` at the gQuant directory: +```bash +pip install . +``` + +### Install the gQuantLab JupyterLab plugin +To install `gquantlab` JupyterLab plugin, make sure `nodejs` of version [12^14^15] is installed. E.g.: +```bash +conda install -c conda-forge nodejs=12.4.0 +``` +Then install the `gquantlab`: +```bash +pip install gquantlab +``` +Or install `gquantlab` at the gquantlab directory: +```bash +pip install . +``` + +### Install the gQuant plugins + +Under the plugin root directory, install the plugin as normal python packages. +```bash +pip install . +``` + +Note, gQuant node plugins can be registered in two ways: + + 1. (Recommended)Write a external plugin using 'entry point' to register it. Check the `plugins` directory for details + 2. Register the plugin in `gquantrc` file. Check the `System environment` for details + + +## Docker Install + +- Build and run the container: + +```bash +$ cd gQuant/docker && . build.sh +``` +When building the container, you can run gQuant in two modes: dev or prod. In the dev mode, please check the README file in `gquantlab` directory to install the plugins and Python libraries. + +In the production mode, you can launch the container by following command and start to use it +```bash +$ docker run --runtime=nvidia --rm -it -p 8888:8888 -p 8787:8787 -p 8786:8786 gquant/gquant:[tag from the build] +``` + +## Example notebooks + +Example notebooks, tutorial showcasing, can be found in __notebooks__ folder in the plugin directory. + + +## System environment + +There are a few system environment that the user can overwrite. + +The custom module files are specified in the `gquantrc` file. `GQUANT_CONFIG` enviroment variable points to the location of this file. By default, it points to +`$CWD\gquantrc`. + +In the example `gquantrc`, system environment variable `MODULEPATH` is used to point to the paths of the module files. +To start the jupyterlab, please make sure `MODULEPATH` is set properly. + +For example, if you want to start the jupyterlab in the gQuant root directory. +```bash +MODULEPATH=$PWD/modules jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='' +``` + +Or, if you want to start the jupyterlab in the gquantlab directory. +```bash +GQUANT_CONFIG=../gquantrc MODULEPATH=$PWD/../modules jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='' +``` diff --git a/ci/checks/changelog.sh b/gQuant/ci/checks/changelog.sh similarity index 100% rename from ci/checks/changelog.sh rename to gQuant/ci/checks/changelog.sh diff --git a/ci/checks/style.sh b/gQuant/ci/checks/style.sh similarity index 100% rename from ci/checks/style.sh rename to gQuant/ci/checks/style.sh diff --git a/ci/common/prebuild.sh b/gQuant/ci/common/prebuild.sh similarity index 100% rename from ci/common/prebuild.sh rename to gQuant/ci/common/prebuild.sh diff --git a/ci/cpu/build.sh b/gQuant/ci/cpu/build.sh similarity index 100% rename from ci/cpu/build.sh rename to gQuant/ci/cpu/build.sh diff --git a/ci/cpu/prebuild.sh b/gQuant/ci/cpu/prebuild.sh similarity index 100% rename from ci/cpu/prebuild.sh rename to gQuant/ci/cpu/prebuild.sh diff --git a/ci/cpu/upload.sh b/gQuant/ci/cpu/upload.sh similarity index 100% rename from ci/cpu/upload.sh rename to gQuant/ci/cpu/upload.sh diff --git a/ci/gpu/build.sh b/gQuant/ci/gpu/build.sh similarity index 100% rename from ci/gpu/build.sh rename to gQuant/ci/gpu/build.sh diff --git a/ci/gpu/prebuild.sh b/gQuant/ci/gpu/prebuild.sh similarity index 100% rename from ci/gpu/prebuild.sh rename to gQuant/ci/gpu/prebuild.sh diff --git a/ci/release/update-version.sh b/gQuant/ci/release/update-version.sh similarity index 100% rename from ci/release/update-version.sh rename to gQuant/ci/release/update-version.sh diff --git a/conda/recipes/gquant/build.sh b/gQuant/conda/recipes/gquant/build.sh similarity index 100% rename from conda/recipes/gquant/build.sh rename to gQuant/conda/recipes/gquant/build.sh diff --git a/conda/recipes/gquant/meta.yaml b/gQuant/conda/recipes/gquant/meta.yaml similarity index 100% rename from conda/recipes/gquant/meta.yaml rename to gQuant/conda/recipes/gquant/meta.yaml diff --git a/docker/build.sh b/gQuant/docker/build.sh similarity index 98% rename from docker/build.sh rename to gQuant/docker/build.sh index 39980f60..b2b75ef0 100755 --- a/docker/build.sh +++ b/gQuant/docker/build.sh @@ -91,7 +91,6 @@ esac mkdir -p gQuant cp -r ../gquant ./gQuant -cp -r ../task_example ./gQuant cp -r ../modules ./gQuant cp -r ../taskgraphs ./gQuant cp ../setup.cfg ./gQuant @@ -153,12 +152,12 @@ RUN wget \ RUN conda install -y -c rapidsai -c nvidia -c conda-forge \ -c defaults rapids=$RAPIDS_VERSION cudatoolkit=$CUDA_STR python=3.7 -RUN conda install -y -c conda-forge jupyterlab'<3.0.0' +RUN conda install -y -c conda-forge jupyterlab RUN conda install -y -c conda-forge python-graphviz bqplot nodejs ipywidgets \ pytables mkl numexpr pydot flask pylint flake8 autopep8 -RUN jupyter labextension install @jupyter-widgets/jupyterlab-manager@2.0 --no-build +RUN jupyter labextension install @jupyter-widgets/jupyterlab-manager --no-build RUN jupyter labextension install bqplot --no-build #RUN jupyter labextension install jupyterlab-nvdashboard --no-build RUN jupyter lab build && jupyter lab clean @@ -169,7 +168,7 @@ RUN pip install jupyterlab-nvdashboard RUN jupyter labextension install jupyterlab-nvdashboard ## install the dask extension -RUN pip install "dask_labextension<5.0.0" +RUN pip install dask_labextension RUN jupyter labextension install dask-labextension RUN jupyter serverextension enable dask_labextension diff --git a/gquantlab/LICENSE b/gQuant/gquant/LICENSE similarity index 100% rename from gquantlab/LICENSE rename to gQuant/gquant/LICENSE diff --git a/gQuant/gquant/README.md b/gQuant/gquant/README.md new file mode 100644 index 00000000..4763e9c5 --- /dev/null +++ b/gQuant/gquant/README.md @@ -0,0 +1,40 @@ +# gQuant - Graph Computation Toolkit + +## What is gQuant? + +gQuant is a tool that helps you to organize the workflows. + +1. It define a TaskGraph file format `.gq.yaml` that describes the workflow. It can be edited easily by `gquantlab` JupyterLab plugin. +2. Dynamically compute the input-output ports compatibility, dataframe columns names and types, ports types to prevent connection errors. +3. Nodes can have multiple output ports that can be used to generate different output types. E.g. some data loader Node provides both `cudf` and `dask_cudf` output ports. The multiple GPUs distributed computation computation is automatically enabled by switching to the `dask_cudf` output port. +4. Provides the standard API to extend your computation Nodes. +5. The composite node can encapsulate the TaskGraph into a single node for easy reuse. The composite node can be exported as a regular gQuant node without any coding. +6. gQuant can be extended by writing a plugin with a set of nodes for a particular domain. Check `plugins` for examples. + +These examples can be used as-is or, as they are open source, can be extended to suit your environments. + +## Binary pip installation + +To install the gQuant graph computation library, run: +```bash +pip install gquant +``` +Or install `gquant` at the root directory: +```bash +pip install . +``` + +gQuant node plugins can be registered in two ways: + + 1. (Recommended)Write a external plugin using 'entry point' to register it. Check the `external` directory for details + 2. Register the plugin in `gquantrc` file. Check the `System environment` for details + +## System environment + +There are a few system environment that the user can overwrite. + +The custom module files are specified in the `gquantrc` file. `GQUANT_CONFIG` enviroment variable points to the location of this file. By default, it points to +`$CWD\gquantrc`. + +In the example `gquantrc`, system environment variable `MODULEPATH` is used to point to the paths of the module files. +To start the jupyterlab, please make sure `MODULEPATH` is set properly. diff --git a/docs/Makefile b/gQuant/gquant/docs/Makefile similarity index 100% rename from docs/Makefile rename to gQuant/gquant/docs/Makefile diff --git a/docs/README.md b/gQuant/gquant/docs/README.md similarity index 100% rename from docs/README.md rename to gQuant/gquant/docs/README.md diff --git a/docs/make.bat b/gQuant/gquant/docs/make.bat similarity index 100% rename from docs/make.bat rename to gQuant/gquant/docs/make.bat diff --git a/docs/source/_static/.gitkeep b/gQuant/gquant/docs/source/_static/.gitkeep similarity index 100% rename from docs/source/_static/.gitkeep rename to gQuant/gquant/docs/source/_static/.gitkeep diff --git a/docs/source/_templates/.gitkeep b/gQuant/gquant/docs/source/_templates/.gitkeep similarity index 100% rename from docs/source/_templates/.gitkeep rename to gQuant/gquant/docs/source/_templates/.gitkeep diff --git a/docs/source/conf.py b/gQuant/gquant/docs/source/conf.py similarity index 100% rename from docs/source/conf.py rename to gQuant/gquant/docs/source/conf.py diff --git a/docs/source/index.rst b/gQuant/gquant/docs/source/index.rst similarity index 100% rename from docs/source/index.rst rename to gQuant/gquant/docs/source/index.rst diff --git a/gquant/__init__.py b/gQuant/gquant/gquant/__init__.py similarity index 100% rename from gquant/__init__.py rename to gQuant/gquant/gquant/__init__.py diff --git a/gquant/_common.py b/gQuant/gquant/gquant/_common.py similarity index 100% rename from gquant/_common.py rename to gQuant/gquant/gquant/_common.py diff --git a/gquant/dataframe_flow/__init__.py b/gQuant/gquant/gquant/dataframe_flow/__init__.py similarity index 100% rename from gquant/dataframe_flow/__init__.py rename to gQuant/gquant/gquant/dataframe_flow/__init__.py diff --git a/gquant/dataframe_flow/_node.py b/gQuant/gquant/gquant/dataframe_flow/_node.py similarity index 100% rename from gquant/dataframe_flow/_node.py rename to gQuant/gquant/gquant/dataframe_flow/_node.py diff --git a/gquant/dataframe_flow/_node_flow.py b/gQuant/gquant/gquant/dataframe_flow/_node_flow.py similarity index 98% rename from gquant/dataframe_flow/_node_flow.py rename to gQuant/gquant/gquant/dataframe_flow/_node_flow.py index 236b8738..d4586f00 100644 --- a/gquant/dataframe_flow/_node_flow.py +++ b/gQuant/gquant/gquant/dataframe_flow/_node_flow.py @@ -85,6 +85,7 @@ class NodeTaskGraphMixin(object): load save delayed_process + infer_meta METHODS ------- @@ -465,10 +466,12 @@ def get_pout(out_dict, port): # Otherwise process will run several times. for inputs_ in inputs_dly.values(): output_df_dly = dask.delayed(self.decorate_process())(inputs_) - output_df_dly_per = output_df_dly.persist() + # output_df_dly_per = output_df_dly.persist() + output_df_dly_per = output_df_dly for oport in self._get_output_ports(): oport_out = dask.delayed(get_pout)(output_df_dly_per, oport) - outputs_dly.setdefault(oport, []).append(oport_out.persist()) + # outputs_dly.setdefault(oport, []).append(oport_out.persist()) + outputs_dly.setdefault(oport, []).append(oport_out) # DEBUGGING # print('OUTPUTS_DLY:\n{}'.format(outputs_dly)) @@ -489,7 +492,12 @@ def get_pout(out_dict, port): # self.uid, oport, port_type)) if any([issubclass(p_type, DaskDataFrame) for p_type in port_type]): - output_df[oport] = from_delayed(outputs_dly[oport]) + if self.infer_meta: + output_df[oport] = from_delayed(outputs_dly[oport]) + else: + meta_data = self.meta_setup().outports + output_df[oport] = from_delayed(outputs_dly[oport], + meta=meta_data[oport]) else: # outputs_dly[oport] is currently a list. Run compute on each # partition, and keep the first one. diff --git a/gquant/dataframe_flow/cache.py b/gQuant/gquant/gquant/dataframe_flow/cache.py similarity index 100% rename from gquant/dataframe_flow/cache.py rename to gQuant/gquant/gquant/dataframe_flow/cache.py diff --git a/gquant/dataframe_flow/node.py b/gQuant/gquant/gquant/dataframe_flow/node.py similarity index 99% rename from gquant/dataframe_flow/node.py rename to gQuant/gquant/gquant/dataframe_flow/node.py index 4f147cdc..778f482c 100644 --- a/gquant/dataframe_flow/node.py +++ b/gQuant/gquant/gquant/dataframe_flow/node.py @@ -92,6 +92,8 @@ def __init__(self, task): self.save = task.get(TaskSpecSchema.save, False) self.delayed_process = False + # eargerly infer the metadata, costly + self.infer_meta = True # customized the column setup self.init() self.profile = False # by default, do not profile diff --git a/gquant/dataframe_flow/portsSpecSchema.py b/gQuant/gquant/gquant/dataframe_flow/portsSpecSchema.py similarity index 100% rename from gquant/dataframe_flow/portsSpecSchema.py rename to gQuant/gquant/gquant/dataframe_flow/portsSpecSchema.py diff --git a/gquant/dataframe_flow/task.py b/gQuant/gquant/gquant/dataframe_flow/task.py similarity index 100% rename from gquant/dataframe_flow/task.py rename to gQuant/gquant/gquant/dataframe_flow/task.py diff --git a/gquant/dataframe_flow/taskGraph.py b/gQuant/gquant/gquant/dataframe_flow/taskGraph.py similarity index 99% rename from gquant/dataframe_flow/taskGraph.py rename to gQuant/gquant/gquant/dataframe_flow/taskGraph.py index 71da064e..dfb0ef9f 100644 --- a/gquant/dataframe_flow/taskGraph.py +++ b/gQuant/gquant/gquant/dataframe_flow/taskGraph.py @@ -1,5 +1,4 @@ from collections import OrderedDict -import networkx as nx import ruamel.yaml from .node import Node from ._node_flow import OUTPUT_ID, OUTPUT_TYPE, _CLEANUP @@ -317,6 +316,7 @@ def viz_graph(self, show_ports=False): ----- nx.DiGraph """ + import networkx as nx G = nx.DiGraph() # instantiate objects for itask in self: @@ -650,6 +650,7 @@ def run(self, outputs=None, replace=None, profile=False, formated=False): formated=formated) def to_pydot(self, show_ports=False): + import networkx as nx nx_graph = self.viz_graph(show_ports=show_ports) to_pydot = nx.drawing.nx_pydot.to_pydot pdot = to_pydot(nx_graph) diff --git a/gquant/dataframe_flow/taskSpecSchema.py b/gQuant/gquant/gquant/dataframe_flow/taskSpecSchema.py similarity index 100% rename from gquant/dataframe_flow/taskSpecSchema.py rename to gQuant/gquant/gquant/dataframe_flow/taskSpecSchema.py diff --git a/gquant/dataframe_flow/util.py b/gQuant/gquant/gquant/dataframe_flow/util.py similarity index 52% rename from gquant/dataframe_flow/util.py rename to gQuant/gquant/gquant/dataframe_flow/util.py index 0d332551..a48932d1 100644 --- a/gquant/dataframe_flow/util.py +++ b/gQuant/gquant/gquant/dataframe_flow/util.py @@ -1,24 +1,30 @@ import os import cloudpickle import base64 +import pathlib -def get_file_path(path): +def get_file_path(path: str) -> str: + """ + @path: the relative or absolute file path + returns: absolute file path + """ if path.startswith('/'): return path if 'GQUANTROOT' in os.environ: - ROOT = os.environ['GQUANTROOT'] + ROOT = pathlib.Path(os.environ['GQUANTROOT']) else: - ROOT = os.getcwd() + ROOT = pathlib.Path(os.getcwd()) if os.path.exists(path): return path - elif os.path.exists(ROOT+'/'+path): - return ROOT+'/'+path + path = pathlib.Path(path) + if (ROOT/path).absolute().parent.exists(): + return str(ROOT/path) else: print('current path', os.getcwd()) print('input path', path) print('cannot find the file') - raise Exception("File cannnot be found") + raise FileNotFoundError("File path cannnot be found") def get_encoded_class(classObj): diff --git a/gquant/flow.py b/gQuant/gquant/gquant/flow.py similarity index 100% rename from gquant/flow.py rename to gQuant/gquant/gquant/flow.py diff --git a/gquant/plugin_nodes/__init__.py b/gQuant/gquant/gquant/plugin_nodes/__init__.py similarity index 100% rename from gquant/plugin_nodes/__init__.py rename to gQuant/gquant/gquant/plugin_nodes/__init__.py diff --git a/gquant/plugin_nodes/util/__init__.py b/gQuant/gquant/gquant/plugin_nodes/util/__init__.py similarity index 100% rename from gquant/plugin_nodes/util/__init__.py rename to gQuant/gquant/gquant/plugin_nodes/util/__init__.py diff --git a/gquant/plugin_nodes/util/compositeNode.py b/gQuant/gquant/gquant/plugin_nodes/util/compositeNode.py similarity index 97% rename from gquant/plugin_nodes/util/compositeNode.py rename to gQuant/gquant/gquant/plugin_nodes/util/compositeNode.py index d99f260b..401c4106 100644 --- a/gquant/plugin_nodes/util/compositeNode.py +++ b/gQuant/gquant/gquant/plugin_nodes/util/compositeNode.py @@ -77,8 +77,11 @@ def _compute_hash_key(self): input_node = "" task_graph_obj = None if 'taskgraph' in self.conf: - task_graph = get_file_path(self.conf['taskgraph']) - if os.path.exists(task_graph): + try: + task_graph = get_file_path(self.conf['taskgraph']) + except FileNotFoundError: + task_graph = None + if task_graph is not None and os.path.exists(task_graph): with open(task_graph) as f: task_graph = hashlib.md5(f.read().encode()).hexdigest() task_graph_obj = TaskGraph.load_taskgraph( @@ -159,7 +162,7 @@ def ports_setup(self): return CACHE_PORTS[cache_key] inports = {} outports = {} - if 'taskgraph' in self.conf: + if task_graph: task_graph.build(replace=replacementObj) def inputNode_fun(inputNode, in_ports): @@ -191,7 +194,7 @@ def meta_setup(self): return CACHE_META[cache_key] required = {} out_meta = {} - if 'taskgraph' in self.conf: + if task_graph: task_graph.build(replace=replacementObj) def inputNode_fun(inputNode, in_ports): @@ -267,7 +270,7 @@ def conf_schema(self): "taskgraph": {"ui:widget": "TaskgraphSelector"}, "subnodes_conf": {} } - if 'taskgraph' in self.conf: + if task_graph: task_graph.build(replace=replacementObj) def inputNode_fun(inputNode, in_ports): @@ -295,7 +298,7 @@ def outNode_fun(outNode, out_ports): json['properties']['input']['items']['enum'] = in_ports json['properties']['output']['items']['enum'] = out_ports json['properties']['subnode_ids']['items']['enum'] = ids_in_graph - if 'subnode_ids' in self.conf: + if 'subnode_ids' in self.conf and task_graph: for subnodeId in self.conf['subnode_ids']: if subnodeId in task_graph: nodeObj = task_graph[subnodeId] diff --git a/gquant/plugin_nodes/util/contextCompositeNode.py b/gQuant/gquant/gquant/plugin_nodes/util/contextCompositeNode.py similarity index 100% rename from gquant/plugin_nodes/util/contextCompositeNode.py rename to gQuant/gquant/gquant/plugin_nodes/util/contextCompositeNode.py diff --git a/gquant/plugin_nodes/util/data_obj.py b/gQuant/gquant/gquant/plugin_nodes/util/data_obj.py similarity index 100% rename from gquant/plugin_nodes/util/data_obj.py rename to gQuant/gquant/gquant/plugin_nodes/util/data_obj.py diff --git a/gquant/plugin_nodes/util/json_util.py b/gQuant/gquant/gquant/plugin_nodes/util/json_util.py similarity index 100% rename from gquant/plugin_nodes/util/json_util.py rename to gQuant/gquant/gquant/plugin_nodes/util/json_util.py diff --git a/setup.cfg b/gQuant/gquant/setup.cfg similarity index 100% rename from setup.cfg rename to gQuant/gquant/setup.cfg diff --git a/setup.py b/gQuant/gquant/setup.py similarity index 82% rename from setup.py rename to gQuant/gquant/setup.py index 13a95c71..d2aa5894 100644 --- a/setup.py +++ b/gQuant/gquant/setup.py @@ -8,12 +8,13 @@ # Get the long description from the README file long_description = (here / 'README.md').read_text(encoding='utf-8') -install_requires = ['dask', 'configparser', 'cloudpickle', 'PyYaml', - 'jsonpath_ng'] +install_requires = ['dask[distributed]', 'dask[dataframe]', 'configparser', + 'cloudpickle', 'PyYaml', + 'jsonpath_ng', 'ruamel.yaml', 'pandas'] setup( name='gquant', - version='1.0.1', + version='1.0.2', description='gquant - RAPIDS Financial Services Algorithms', long_description=long_description, long_description_content_type='text/markdown', diff --git a/notebooks/cuIndicator/viz/__init__.py b/gQuant/gquant/tests/__init__.py similarity index 100% rename from notebooks/cuIndicator/viz/__init__.py rename to gQuant/gquant/tests/__init__.py diff --git a/tests/__init__.py b/gQuant/gquant/tests/unit/__init__.py similarity index 100% rename from tests/__init__.py rename to gQuant/gquant/tests/unit/__init__.py diff --git a/gQuant/gquant/tests/unit/custom_port_nodes.py b/gQuant/gquant/tests/unit/custom_port_nodes.py new file mode 100644 index 00000000..db7e9f6d --- /dev/null +++ b/gQuant/gquant/tests/unit/custom_port_nodes.py @@ -0,0 +1,220 @@ +import math +import numpy as np +import dask +import pandas as pd +from gquant.dataframe_flow import Node, MetaData +from gquant.dataframe_flow import NodePorts, PortsSpecSchema +from gquant.dataframe_flow import ConfSchema +import os +import warnings + + +class _PortTypesMixin(object): + + def load_cache(self, filename=None) -> dict: + """ + Defines the behavior of how to load the cache file from the `filename`. + Node can override this method. Default implementation assumes cudf + dataframes. + + Arguments + ------- + filename: str + filename of the cache file. Leave as none to use default. + returns: dict + dictionary of the output from this node + """ + cache_dir = os.getenv('GQUANT_CACHE_DIR', self.cache_dir) + if filename is None: + filename = cache_dir + '/' + self.uid + '.hdf5' + + output_df = {} + with pd.HDFStore(filename, mode='r') as hf: + for oport, pspec in \ + self._get_output_ports(full_port_spec=True).items(): + ptype = pspec.get(PortsSpecSchema.port_type) + if self.outport_connected(oport): + ptype = ([ptype] if not isinstance(ptype, + list) else ptype) + key = '{}/{}'.format(self.uid, oport) + # check hdf store for the key + if key not in hf: + raise Exception( + 'The task "{}" port "{}" key "{}" not found in' + 'the hdf file "{}". Cannot load from cache.' + .format(self.uid, oport, key, filename) + ) + if pd.DataFrame not in ptype: + warnings.warn( + RuntimeWarning, + 'Task "{}" port "{}" port type is not set to ' + 'cudf.DataFrame. Attempting to load port data ' + 'with cudf.read_hdf.'.format(self.uid, oport)) + output_df[oport] = pd.read_hdf(hf, key) + return output_df + + def save_cache(self, output_data: dict): + '''Defines the behavior for how to save the output of a node to + filesystem cache. Default implementation assumes cudf dataframes. + + :param output_data: The output from :meth:`process`. For saving to hdf + requires that the dataframe(s) have `to_hdf` method. + ''' + cache_dir = os.getenv('GQUANT_CACHE_DIR', self.cache_dir) + os.makedirs(cache_dir, exist_ok=True) + filename = cache_dir + '/' + self.uid + '.hdf5' + with pd.HDFStore(filename, mode='w') as hf: + for oport, odf in output_data.items(): + # check for to_hdf attribute + if not hasattr(odf, 'to_hdf'): + raise Exception( + 'Task "{}" port "{}" output object is missing ' + '"to_hdf" attribute. Cannot save to cache.' + .format(self.uid, oport)) + + dtype = '{}'.format(type(odf)).lower() + if 'dataframe' not in dtype: + warnings.warn( + RuntimeWarning, + 'Task "{}" port "{}" port type is not a dataframe.' + ' Attempting to save to hdf with "to_hdf" method.' + .format(self.uid, oport)) + key = '{}/{}'.format(self.uid, oport) + odf.to_hdf(hf, key, format='table', data_columns=True) + + +class PointNode(_PortTypesMixin, Node): + + def ports_setup(self): + input_ports = {} + output_ports = { + 'points_df_out': { + PortsSpecSchema.port_type: pd.DataFrame + } + } + return NodePorts(inports=input_ports, outports=output_ports) + + def conf_schema(self): + json = { + "title": "PointNode configure", + "type": "object", + "properties": { + "npts": { + "type": "number", + "description": "number of data points", + "minimum": 10 + } + }, + "required": ["npts"], + } + + ui = { + "npts": {"ui:widget": "updown"} + } + return ConfSchema(json=json, ui=ui) + + def init(self): + pass + + def meta_setup(self): + columns_out = { + 'points_df_out': { + 'x': 'float64', + 'y': 'float64' + }, + 'points_ddf_out': { + 'x': 'float64', + 'y': 'float64' + } + } + return MetaData(inports={}, outports=columns_out) + + def process(self, inputs): + npts = self.conf['npts'] + seed = self.conf.get('nseed') + if seed is not None: + np.random.seed(seed) + df = pd.DataFrame() + df['x'] = np.random.rand(npts) + df['y'] = np.random.rand(npts) + output = {} + if self.outport_connected('points_df_out'): + output.update({'points_df_out': df}) + return output + + +class DistanceNode(_PortTypesMixin, Node): + + def ports_setup(self): + port_type = PortsSpecSchema.port_type + input_ports = { + 'points_df_in': { + port_type: [pd.DataFrame] + } + } + + output_ports = { + 'distance_df': { + port_type: [pd.DataFrame] + }, + 'distance_abs_df': { + PortsSpecSchema.port_type: [pd.DataFrame] + } + } + input_connections = self.get_connected_inports() + if 'points_df_in' in input_connections: + types = input_connections['points_df_in'] + # connected, use the types passed in from parent + return NodePorts(inports={'points_df_in': {port_type: types}}, + outports={'distance_df': {port_type: types}, + 'distance_abs_df': {port_type: types}, + }) + else: + return NodePorts(inports=input_ports, outports=output_ports) + + def conf_schema(self): + return ConfSchema() + + def init(self): + self.delayed_process = True + + def meta_setup(self): + req_cols = { + 'x': 'float64', + 'y': 'float64' + } + required = { + 'points_df_in': req_cols, + } + input_meta = self.get_input_meta() + output_cols = ({ + 'distance_df': { + 'distance_df': 'float64', + 'x': 'float64', + 'y': 'float64' + }, + 'distance_abs_df': { + 'distance_abs_df': 'float64', + 'x': 'float64', + 'y': 'float64' + } + }) + if 'points_df_in' in input_meta: + col_from_inport = input_meta['points_df_in'] + # additional ports + output_cols['distance_df'].update(col_from_inport) + output_cols['distance_abs_df'].update(col_from_inport) + return MetaData(inports=required, outports=output_cols) + + def process(self, inputs): + df = inputs['points_df_in'] + output = {} + if self.outport_connected('distance_df'): + copy_df = df.copy() + copy_df['distance_df'] = np.sqrt((df['x'] ** 2 + df['y'] ** 2)) + output.update({'distance_df': copy_df}) + if self.outport_connected('distance_abs_df'): + copy_df = df.copy() + copy_df['distance_abs_df'] = np.abs(df['x']) + np.abs(df['y']) + output.update({'distance_abs_df': copy_df}) + return output diff --git a/tests/unit/test_node_api.py b/gQuant/gquant/tests/unit/test_node_api.py similarity index 90% rename from tests/unit/test_node_api.py rename to gQuant/gquant/tests/unit/test_node_api.py index 18b80d1d..ae6b0053 100644 --- a/tests/unit/test_node_api.py +++ b/gQuant/gquant/tests/unit/test_node_api.py @@ -62,16 +62,6 @@ def setUp(self): self.distance_task = Task(distance_task_spec) - points_noports_task_spec = { - TaskSpecSchema.task_id: 'points_noport_task', - TaskSpecSchema.node_type: 'PointNoPortsNode', - TaskSpecSchema.filepath: custom_module, - TaskSpecSchema.conf: {'npts': 1000}, - TaskSpecSchema.inputs: {} - } - - self.points_noports_task = Task(points_noports_task_spec) - def tearDown(self): pass diff --git a/tests/unit/test_node_taskgraph_typechecking.py b/gQuant/gquant/tests/unit/test_node_taskgraph_typechecking.py similarity index 100% rename from tests/unit/test_node_taskgraph_typechecking.py rename to gQuant/gquant/tests/unit/test_node_taskgraph_typechecking.py diff --git a/tests/unit/test_taskgraph_api.py b/gQuant/gquant/tests/unit/test_taskgraph_api.py similarity index 88% rename from tests/unit/test_taskgraph_api.py rename to gQuant/gquant/tests/unit/test_taskgraph_api.py index 6aa5902f..4864e45c 100644 --- a/tests/unit/test_taskgraph_api.py +++ b/gQuant/gquant/tests/unit/test_taskgraph_api.py @@ -27,7 +27,7 @@ from io import StringIO import warnings import unittest - +import pandas as pd from gquant.dataframe_flow import (TaskSpecSchema, TaskGraph) from gquant.dataframe_flow.task import DEFAULT_MODULE # noqa: F401 from gquant.dataframe_flow import Node @@ -44,7 +44,7 @@ conf: npts: 1000 inputs: [] -- id: distance_by_cudf +- id: distance_by_df type: DistanceNode conf: {} inputs: @@ -55,10 +55,9 @@ class TestTaskGraphAPI(unittest.TestCase): def setUp(self): import gc # python garbage collector - import cudf # warmup - s = cudf.Series([1, 2, 3, None, 4], nan_as_null=False) + s = pd.Series([1, 2, 3, None, 4]) del(s) gc.collect() @@ -72,7 +71,7 @@ def setUp(self): } distance_task_spec = { - TaskSpecSchema.task_id: 'distance_by_cudf', + TaskSpecSchema.task_id: 'distance_by_df', TaskSpecSchema.node_type: 'DistanceNode', TaskSpecSchema.conf: {}, TaskSpecSchema.inputs: { @@ -100,14 +99,12 @@ def test_viz_graph(self): ''' nx_graph = self.tgraph.viz_graph(show_ports=True) nx_nodes = ['points_task', 'points_task.points_df_out', - 'points_task.points_ddf_out', - 'distance_by_cudf', 'distance_by_cudf.distance_df', - 'distance_by_cudf.distance_abs_df'] + 'distance_by_df', 'distance_by_df.distance_df', + 'distance_by_df.distance_abs_df'] nx_edges = [('points_task', 'points_task.points_df_out'), - ('points_task', 'points_task.points_ddf_out'), - ('points_task.points_df_out', 'distance_by_cudf'), - ('distance_by_cudf', 'distance_by_cudf.distance_df'), - ('distance_by_cudf', 'distance_by_cudf.distance_abs_df')] + ('points_task.points_df_out', 'distance_by_df'), + ('distance_by_df', 'distance_by_df.distance_df'), + ('distance_by_df', 'distance_by_df.distance_abs_df')] self.assertEqual(list(nx_graph.nodes), nx_nodes) self.assertEqual(list(nx_graph.edges), nx_edges) @@ -119,7 +116,7 @@ def test_build(self): self.tgraph.build() points_node = self.tgraph['points_task'] - distance_node = self.tgraph['distance_by_cudf'] + distance_node = self.tgraph['distance_by_df'] onode_info = { 'to_node': distance_node, @@ -147,10 +144,10 @@ def test_build(self): } self.assertEqual(inode_in_cols, distance_node.get_input_meta()) - inode_out_cols = {'distance_df': {'distance_cudf': 'float64', + inode_out_cols = {'distance_df': {'distance_df': 'float64', 'x': 'float64', 'y': 'float64'}, - 'distance_abs_df': {'distance_abs_cudf': 'float64', + 'distance_abs_df': {'distance_abs_df': 'float64', 'x': 'float64', 'y': 'float64'}} self.assertEqual(inode_out_cols, distance_node.meta_setup().outports) @@ -158,7 +155,7 @@ def test_build(self): def test_run(self): '''Test that a taskgraph can run successfully. ''' - outlist = ['distance_by_cudf.distance_df'] + outlist = ['distance_by_df.distance_df'] # Using numpy random seed to get repeatable and deterministic results. # For seed 2335 should get something around 761.062831178. replace_spec = { @@ -169,9 +166,9 @@ def test_run(self): } } } - (dist_df_w_cudf, ) = self.tgraph.run( + (dist_df_w_df, ) = self.tgraph.run( outputs=outlist, replace=replace_spec) - dist_sum = dist_df_w_cudf['distance_cudf'].sum() + dist_sum = dist_df_w_df['distance_df'].sum() # self.assertAlmostEqual(dist_sum, 0.0, places, msg, delta) self.assertAlmostEqual(dist_sum, 761.062831178) # match to 7 places @@ -243,7 +240,7 @@ def test_save_load_cache(self): 2. Load points_task df from cache when running the taskgraph. ''' replace_spec = {'points_task': {TaskSpecSchema.save: True}} - outlist = ['distance_by_cudf.distance_df'] + outlist = ['distance_by_df.distance_df'] with warnings.catch_warnings(): # ignore UserWarning: Using CPU via Pandas to write HDF dataset diff --git a/tests/unit/test_workflow_serialization.py b/gQuant/gquant/tests/unit/test_workflow_serialization.py similarity index 100% rename from tests/unit/test_workflow_serialization.py rename to gQuant/gquant/tests/unit/test_workflow_serialization.py diff --git a/tests/unit/utils.py b/gQuant/gquant/tests/unit/utils.py similarity index 100% rename from tests/unit/utils.py rename to gQuant/gquant/tests/unit/utils.py diff --git a/gquantlab/.eslintignore b/gQuant/gquantlab/.eslintignore similarity index 100% rename from gquantlab/.eslintignore rename to gQuant/gquantlab/.eslintignore diff --git a/gquantlab/.eslintrc.js b/gQuant/gquantlab/.eslintrc.js similarity index 100% rename from gquantlab/.eslintrc.js rename to gQuant/gquantlab/.eslintrc.js diff --git a/gquantlab/.gitignore b/gQuant/gquantlab/.gitignore similarity index 96% rename from gquantlab/.gitignore rename to gQuant/gquantlab/.gitignore index c0a8535a..232ad412 100644 --- a/gquantlab/.gitignore +++ b/gQuant/gquantlab/.gitignore @@ -4,8 +4,8 @@ node_modules/ *.egg-info/ .ipynb_checkpoints *.tsbuildinfo +gquantlab/labextension -*/labextension/*.tgz # Created by https://www.gitignore.io/api/python # Edit at https://www.gitignore.io/?templates=python @@ -107,3 +107,6 @@ dmypy.json .pyre/ # End of https://www.gitignore.io/api/python + +# OSX files +.DS_Store diff --git a/gquantlab/.prettierignore b/gQuant/gquantlab/.prettierignore similarity index 100% rename from gquantlab/.prettierignore rename to gQuant/gquantlab/.prettierignore diff --git a/gquantlab/.prettierrc b/gQuant/gquantlab/.prettierrc similarity index 100% rename from gquantlab/.prettierrc rename to gQuant/gquantlab/.prettierrc diff --git a/gQuant/gquantlab/LICENSE b/gQuant/gquantlab/LICENSE new file mode 100644 index 00000000..18bcb431 --- /dev/null +++ b/gQuant/gquantlab/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 NVIDIA Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/gquantlab/MANIFEST.in b/gQuant/gquantlab/MANIFEST.in similarity index 100% rename from gquantlab/MANIFEST.in rename to gQuant/gquantlab/MANIFEST.in diff --git a/gquantlab/README.md b/gQuant/gquantlab/README.md similarity index 53% rename from gquantlab/README.md rename to gQuant/gquantlab/README.md index 45f42c0a..28c7ae32 100644 --- a/gquantlab/README.md +++ b/gQuant/gquantlab/README.md @@ -2,7 +2,18 @@ ![Github Actions Status](https://github.com/rapidsai/gQuant/gquantlab/workflows/Build/badge.svg) -gQuant Jupyterlab extension +## gQuant jupyterlab extension +The gQuant Juyterlab extension provides the user interface to build the dataframe flow TaskGraph easily. It takes advantage of the open sources projects like [jupyterlab](https://github.com/jupyterlab/jupyterlab), [ipywidget](https://github.com/jupyter-widgets/ipywidgets), [React](https://reactjs.org/) and [D3](https://d3js.org/). It features: +1. Takes full advantage of the JupyterLab project that the extension adds commands to Jupyterlab context menu, command palette and bind them with keyboard shortcuts to speed up the productivity. +2. Define a new TaskGraph file format `.gq.yaml` that can be edited in the Jupyterlab. +3. Visually presents the TaskGraph as a DAG graph. Users can zoom in and out, freely move the nodes around, and make connections between nodes. +4. Use the special `Ouput Collector` to gather the results and organize them in a tab widget. The IPython [rich display](https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display) is fully supported. +5. Visually shows the progress of graph evaluation and computation dependence. +6. Automatically generate the UI elements to edit and validate the Node configuration given the configuration JSON schema. It exposes the function API in a user-friendly way. User can change the configuration and re-run the computation to test out the hyperparameters easily. +7. Dynamically compute the input-output ports compatibility, dataframe columns names and types, ports types to prevent connection errors. +8. Nodes can have multiple output ports that can be used to generate different output types. E.g. some data loader Node provides both `cudf` and `dask_cudf` output ports. The multiple GPUs distributed computation computation is automatically enabled by switching to the `dask_cudf` output port. +9. Provides the standard API to extend your computation Nodes. +10. The composite node can encapsulate the TaskGraph into a single node for easy reuse. The composite node can be exported as a regular gQuant node without any coding. This extension is composed of a Python package named `gquantlab` @@ -29,11 +40,10 @@ Set the gQuant path as the folder to start the development or you can open the ## Install -Note: You will need NodeJS to install the extension. +Note: You will need NodeJS of version 12^14^15 to install the extension. ```bash pip install gquantlab -jupyter lab build ``` ## Troubleshoot @@ -105,24 +115,3 @@ Now every change will be built locally and bundled into JupyterLab. Be sure to r pip uninstall gquantlab jupyter labextension uninstall gquantlab ``` - -### Start the JupyterLab - -Once the gquantlab plugin is install, the jupyterlab can be started. There is -one important environment to consider before starting. The custom module files -are specified in the `gquantrc` file. You can find an example `gquantrc` file in -the gQuant root directory. `gquantrc` file is by default is read at the same location -as the jupyterlab server's root directory. However, this can be overwirtten by -setting the `GQUANT_CONFIG` environment variable. In the example `gquantrc`, system -environment variable `MODULEPATH` is used to point to the paths of the module files. -To start the jupyterlab, please make sure `MODULEPATH` is set properly. - -For example, if you want to start the jupyterlab in the gQuant root directory. -```bash -MODULEPATH=$PWD/modules jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='' -``` - -Or, if you want to start the jupyterlab in the gquantlab directory. -```bash -GQUANT_CONFIG=../gquantrc MODULEPATH=$PWD/../modules jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='' -``` diff --git a/gQuant/gquantlab/gquantlab/__init__.py b/gQuant/gquantlab/gquantlab/__init__.py new file mode 100644 index 00000000..586b11dd --- /dev/null +++ b/gQuant/gquantlab/gquantlab/__init__.py @@ -0,0 +1,39 @@ + +import json +import os.path as osp + +from ._version import __version__ + +HERE = osp.abspath(osp.dirname(__file__)) + +with open(osp.join(HERE, 'labextension', 'package.json')) as fid: + data = json.load(fid) + +def _jupyter_labextension_paths(): + return [{ + 'src': 'labextension', + 'dest': data['name'] + }] + + + +from .handlers import setup_handlers + + +def _jupyter_server_extension_points(): + return [{ + "module": "gquantlab" + }] + + +def _load_jupyter_server_extension(server_app): + """Registers the API handler to receive HTTP requests from the frontend extension. + + Parameters + ---------- + lab_app: jupyterlab.labapp.LabApp + JupyterLab application instance + """ + setup_handlers(server_app.web_app) + server_app.log.info("Registered gQuantLab extension at URL path /gquantlab") + diff --git a/gquantlab/gquantlab/_frontend.py b/gQuant/gquantlab/gquantlab/_frontend.py similarity index 100% rename from gquantlab/gquantlab/_frontend.py rename to gQuant/gquantlab/gquantlab/_frontend.py diff --git a/gQuant/gquantlab/gquantlab/_version.py b/gQuant/gquantlab/gquantlab/_version.py new file mode 100644 index 00000000..1adc2b45 --- /dev/null +++ b/gQuant/gquantlab/gquantlab/_version.py @@ -0,0 +1,19 @@ +__all__ = ['__version__'] + +def _fetchVersion(): + import json + import os + + HERE = os.path.abspath(os.path.dirname(__file__)) + + for d, _, _ in os.walk(HERE): + try: + with open(os.path.join(d, 'package.json')) as f: + return json.load(f)['version'] + except FileNotFoundError: + pass + + raise FileNotFoundError('Could not find package.json under dir {}'.format(HERE)) + +__version__ = _fetchVersion() + diff --git a/gquantlab/gquantlab/gquantmodel.py b/gQuant/gquantlab/gquantlab/gquantmodel.py similarity index 100% rename from gquantlab/gquantlab/gquantmodel.py rename to gQuant/gquantlab/gquantlab/gquantmodel.py diff --git a/gquantlab/gquantlab/handlers.py b/gQuant/gquantlab/gquantlab/handlers.py similarity index 92% rename from gquantlab/gquantlab/handlers.py rename to gQuant/gquantlab/gquantlab/handlers.py index 4aa73bbf..5639b874 100644 --- a/gquantlab/gquantlab/handlers.py +++ b/gQuant/gquantlab/gquantlab/handlers.py @@ -1,7 +1,6 @@ import json - -from notebook.base.handlers import APIHandler -from notebook.utils import url_path_join +from jupyter_server.base.handlers import APIHandler +from jupyter_server.utils import url_path_join import tornado from gquant.dataframe_flow import TaskGraph from .server_utils import (get_nodes, add_nodes) @@ -61,12 +60,14 @@ def get(self): val_dict = getattr(client_mod, 'validation') client_info['validation'].update(val_dict) else: - print(client_mod, 'no validation') + pass + # print(client_mod, 'no validation') if hasattr(client_mod, 'display'): val_dict = getattr(client_mod, 'display') client_info['display'].update(val_dict) else: - print(client_mod, 'no display') + pass + # print(client_mod, 'no display') # else: # print(key, mod.mod, 'no client') @@ -78,12 +79,14 @@ def get(self): val_dict = getattr(client_mod, 'validation') client_info['validation'].update(val_dict) else: - print(client_mod, 'no validation') + pass + # print(client_mod, 'no validation') if hasattr(client_mod, 'display'): val_dict = getattr(client_mod, 'display') client_info['display'].update(val_dict) else: - print(client_mod, 'no display') + pass + # print(client_mod, 'no display') self.finish(json.dumps(client_info)) diff --git a/gquantlab/gquantlab/server_utils.py b/gQuant/gquantlab/gquantlab/server_utils.py similarity index 100% rename from gquantlab/gquantlab/server_utils.py rename to gQuant/gquantlab/gquantlab/server_utils.py diff --git a/gQuant/gquantlab/jupyter-config/gquantlab.json b/gQuant/gquantlab/jupyter-config/gquantlab.json new file mode 100644 index 00000000..77c32881 --- /dev/null +++ b/gQuant/gquantlab/jupyter-config/gquantlab.json @@ -0,0 +1,7 @@ +{ + "ServerApp": { + "jpserver_extensions": { + "gquantlab": true + } + } +} diff --git a/gquantlab/notebooks/Empty.ipynb b/gQuant/gquantlab/notebooks/Empty.ipynb similarity index 100% rename from gquantlab/notebooks/Empty.ipynb rename to gQuant/gquantlab/notebooks/Empty.ipynb diff --git a/gquantlab/notebooks/full_example.ipynb b/gQuant/gquantlab/notebooks/full_example.ipynb similarity index 100% rename from gquantlab/notebooks/full_example.ipynb rename to gQuant/gquantlab/notebooks/full_example.ipynb diff --git a/gquantlab/notebooks/test.ipynb b/gQuant/gquantlab/notebooks/test.ipynb similarity index 100% rename from gquantlab/notebooks/test.ipynb rename to gQuant/gquantlab/notebooks/test.ipynb diff --git a/gquantlab/notebooks/test_dask.ipynb b/gQuant/gquantlab/notebooks/test_dask.ipynb similarity index 100% rename from gquantlab/notebooks/test_dask.ipynb rename to gQuant/gquantlab/notebooks/test_dask.ipynb diff --git a/gquantlab/package.json b/gQuant/gquantlab/package.json similarity index 52% rename from gquantlab/package.json rename to gQuant/gquantlab/package.json index 613a5111..8de8e324 100644 --- a/gquantlab/package.json +++ b/gQuant/gquantlab/package.json @@ -1,6 +1,6 @@ { "name": "gquantlab", - "version": "0.1.2", + "version": "1.0.0", "description": "gQuant Jupyterlab extension", "keywords": [ "jupyter", @@ -28,52 +28,60 @@ "url": "https://github.com/rapidsai/gQuant.git" }, "scripts": { - "build": "jlpm run build:lib", - "build:labextension": "cd gquantlab && rimraf labextension && mkdirp labextension && cd labextension && npm pack ../..", - "build:lib": "tsc", + "build": "jlpm run build:lib && jlpm run build:labextension:dev", "build:all": "jlpm run build:labextension", + "build:labextension": "jupyter labextension build .", + "build:labextension:dev": "jupyter labextension build --development True .", + "build:lib": "tsc", + "build:prod": "jlpm run build:lib && jlpm run build:labextension", "clean": "jlpm run clean:lib", - "clean:lib": "rimraf lib tsconfig.tsbuildinfo", - "clean:labextension": "rimraf gquantlab/labextension", "clean:all": "jlpm run clean:lib && jlpm run clean:labextension", + "clean:labextension": "rimraf gquantlab/labextension", + "clean:lib": "rimraf lib tsconfig.tsbuildinfo", "eslint": "eslint . --ext .ts,.tsx --fix", "eslint:check": "eslint . --ext .ts,.tsx", - "prepare": "jlpm run clean && jlpm run build", - "watch": "tsc -w" + "install:extension": "jupyter labextension develop --overwrite .", + "prepare": "jlpm run clean && jlpm run build:prod", + "watch": "run-p watch:src watch:labextension", + "watch:labextension": "jupyter labextension watch .", + "watch:src": "tsc -w" }, "dependencies": { "@emotion/core": "^10.0.28", "@emotion/styled": "^10.0.27", - "@jupyter-widgets/base": "^3.0.0", - "@jupyterlab/application": "^2.0.0", - "@jupyterlab/cells": "^2.2.0", - "@jupyterlab/coreutils": "^4.0.0", - "@jupyterlab/docregistry": "^2.1.1", - "@jupyterlab/filebrowser": "^2.1.1", - "@jupyterlab/launcher": "^2.1.1", - "@jupyterlab/mainmenu": "^2.1.1", - "@jupyterlab/notebook": "^2.2.0", - "@jupyterlab/services": "^5.0.0", - "@jupyterlab/ui-components": "^2.1.1", - "@lumino/coreutils": "^1.5.2", - "@lumino/signaling": "^1.4.2", - "@lumino/widgets": "^1.13.2", + "@jupyter-widgets/base": "^4.0.0", + "@jupyterlab/application": "^3.0.0", + "@jupyterlab/cells": "^3.0.0", + "@jupyterlab/coreutils": "^5.0.0", + "@jupyterlab/docregistry": "^3.0.0", + "@jupyterlab/filebrowser": "^3.0.0", + "@jupyterlab/launcher": "^3.0.0", + "@jupyterlab/mainmenu": "^3.0.0", + "@jupyterlab/notebook": "^3.0.0", + "@jupyterlab/services": "^6.0.0", + "@jupyterlab/ui-components": "^3.0.0", + "@lumino/coreutils": "^1.5.3", + "@lumino/signaling": "^1.4.3", + "@lumino/widgets": "^1.16.1", "@rjsf/core": "^2.3.0", "@types/d3": "^5.7.2", + "@types/js-yaml": "^3.12.5", "bootstrap": "^4.5.0", "d3": "^5.16.0", - "d3-dag": "^0.4.0" + "d3-dag": "^0.6.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^2.25.0", - "@typescript-eslint/parser": "^2.25.0", - "eslint": "^6.8.0", + "@jupyterlab/builder": "^3.0.0-rc.13", + "@typescript-eslint/eslint-plugin": "^2.27.0", + "@typescript-eslint/parser": "^2.27.0", + "eslint": "^7.5.0", "eslint-config-prettier": "^6.10.1", "eslint-plugin-prettier": "^3.1.2", "mkdirp": "^1.0.3", - "prettier": "1.16.4", - "rimraf": "^2.6.1", - "typescript": "~3.7.0" + "npm-run-all": "^4.1.5", + "prettier": "^1.19.0", + "rimraf": "^3.0.2", + "typescript": "~4.1.3" }, "sideEffects": [ "style/*.css" @@ -89,6 +97,7 @@ } } }, - "extension": true + "extension": true, + "outputDir": "gquantlab/labextension" } } diff --git a/gQuant/gquantlab/pyproject.toml b/gQuant/gquantlab/pyproject.toml new file mode 100644 index 00000000..5f536843 --- /dev/null +++ b/gQuant/gquantlab/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["jupyter_packaging~=0.7.9", "jupyterlab>=3.0.0rc13,==3.*", "setuptools>=40.8.0", "wheel"] +build-backend = "setuptools.build_meta" diff --git a/gquantlab/setup.py b/gQuant/gquantlab/setup.py similarity index 58% rename from gquantlab/setup.py rename to gQuant/gquantlab/setup.py index 74157e5c..63dcc384 100644 --- a/gquantlab/setup.py +++ b/gQuant/gquantlab/setup.py @@ -1,11 +1,12 @@ """ -Setup Module to setup Python Handlers for the gquantlab extension. +gquantlab setup """ +import json import os from jupyter_packaging import ( create_cmdclass, install_npm, ensure_targets, - combine_commands, ensure_python, get_version, + combine_commands, skip_if_exists ) import setuptools @@ -14,17 +15,15 @@ # The name of the project name="gquantlab" -# Ensure a valid python version -ensure_python(">=3.5") - # Get our version -version = get_version(os.path.join(name, "_version.py")) +with open(os.path.join(HERE, 'package.json')) as f: + version = json.load(f)['version'] lab_path = os.path.join(HERE, name, "labextension") # Representative files that should exist after a successful build jstargets = [ - os.path.join(HERE, "lib", "gquantlab.js"), + os.path.join(lab_path, "package.json"), ] package_data_spec = { @@ -33,47 +32,58 @@ ] } +labext_name = "gquantlab" + data_files_spec = [ - ("share/jupyter/lab/extensions", lab_path, "*.tgz"), - ("etc/jupyter/jupyter_notebook_config.d", + ("share/jupyter/labextensions/%s" % labext_name, lab_path, "**"), + ("share/jupyter/labextensions/%s" % labext_name, HERE, "install.json"),("etc/jupyter/jupyter_server_config.d", "jupyter-config", "gquantlab.json"), + ] -cmdclass = create_cmdclass("jsdeps", +cmdclass = create_cmdclass("jsdeps", package_data_spec=package_data_spec, data_files_spec=data_files_spec ) -cmdclass["jsdeps"] = combine_commands( - install_npm(HERE, build_cmd="build:all", npm=["jlpm"]), +js_command = combine_commands( + install_npm(HERE, build_cmd="build:prod", npm=["jlpm"]), ensure_targets(jstargets), ) +is_repo = os.path.exists(os.path.join(HERE, ".git")) +if is_repo: + cmdclass["jsdeps"] = js_command +else: + cmdclass["jsdeps"] = skip_if_exists(jstargets, js_command) + with open("README.md", "r") as fh: long_description = fh.read() setup_args = dict( name=name, version=version, - url="https://github.com/rapidsai/gQuant/gquantlab", - author="Yi", + url="https://github.com/rapidsai/gQuant.git", + author="{'name': 'Yi Dong', 'email': 'doyend@gmail.com'}", description="gQuant Jupyterlab extension", long_description= long_description, long_description_content_type="text/markdown", cmdclass= cmdclass, packages=setuptools.find_packages(), install_requires=[ - "jupyterlab~=2.0", + "jupyterlab>=3.0.0rc13,==3.*", + "ipywidgets", ], zip_safe=False, include_package_data=True, + python_requires=">=3.6", license="Apache", platforms="Linux, Mac OS X, Windows", - keywords=["Jupyter", "JupyterLab"], + keywords=["Jupyter", "JupyterLab", "JupyterLab3"], classifiers=[ + "License :: OSI Approved :: Apache", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", diff --git a/gquantlab/src/EditorPanel.ts b/gQuant/gquantlab/src/EditorPanel.ts similarity index 100% rename from gquantlab/src/EditorPanel.ts rename to gQuant/gquantlab/src/EditorPanel.ts diff --git a/gquantlab/src/FilePathSelector.tsx b/gQuant/gquantlab/src/FilePathSelector.tsx similarity index 100% rename from gquantlab/src/FilePathSelector.tsx rename to gQuant/gquantlab/src/FilePathSelector.tsx diff --git a/gquantlab/src/chart.tsx b/gQuant/gquantlab/src/chart.tsx similarity index 100% rename from gquantlab/src/chart.tsx rename to gQuant/gquantlab/src/chart.tsx diff --git a/gquantlab/src/chartEngine.tsx b/gQuant/gquantlab/src/chartEngine.tsx similarity index 97% rename from gquantlab/src/chartEngine.tsx rename to gQuant/gquantlab/src/chartEngine.tsx index 494c3309..aff523e8 100644 --- a/gquantlab/src/chartEngine.tsx +++ b/gQuant/gquantlab/src/chartEngine.tsx @@ -1,6 +1,7 @@ import React from 'react'; -import { dagStratify, sugiyama, layeringSimplex, decrossOpt, coordVert } from 'd3-dag'; -import YAML from 'yaml'; +import { dagStratify, sugiyama, layeringLongestPath, decrossTwoLayer, coordCenter } from 'd3-dag'; +//import YAML from 'yaml'; +import jsyaml from 'js-yaml'; import { IEdge, INode, ContentHandler, IChartInput } from './document'; // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -388,9 +389,9 @@ export class ChartEngine extends React.Component { const dagData = dagStratify()(data); sugiyama() .size([height ? height : DefaultHeight, width ? width : DefaultWidth]) - .layering(layeringSimplex()) - .decross(decrossOpt()) - .coord(coordVert())(dagData); + .layering(layeringLongestPath()) + .decross(decrossTwoLayer()) + .coord(coordCenter())(dagData); // set the coordinates dagData.descendants().forEach((d: any) => { if (transform) { @@ -498,7 +499,7 @@ export class ChartEngine extends React.Component { this.props.contentHandler.privateCopy.save(); console.log('edges:', state.edges.length, 'nodes:', state.nodes.length); } - const yamlText = YAML.stringify(output); + const yamlText = jsyaml.safeDump(output); this.props.contentHandler.update(yamlText); } if (update) { diff --git a/gquantlab/src/commands.ts b/gQuant/gquantlab/src/commands.ts similarity index 99% rename from gquantlab/src/commands.ts rename to gQuant/gquantlab/src/commands.ts index 67ba055f..7f6b5c3d 100644 --- a/gquantlab/src/commands.ts +++ b/gQuant/gquantlab/src/commands.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/camelcase */ import { JupyterFrontEnd } from '@jupyterlab/application'; -import YAML from 'yaml'; +//import YAML from 'yaml'; +import jsyaml from 'js-yaml'; import { CommandRegistry } from '@lumino/commands'; import { gqIcon, @@ -137,7 +138,7 @@ export function setupCommands( }); const mainView = getMainView(); const obj = mainView.contentHandler.privateCopy.get('value'); - model.content = YAML.stringify(obj); + model.content = jsyaml.safeDump(obj); model.format = 'text'; app.serviceManager.contents.save(model.path, model); }; @@ -463,7 +464,7 @@ class ${args['nodeName']}(gquant.plugin_nodes.util.CompositeNode): if (isGquantVisible()) { mainView = app.shell.currentWidget as any; objStr = JSON.stringify( - YAML.parse(mainView.contentHandler.context.model.toString()), + jsyaml.safeLoad(mainView.contentHandler.context.model.toString()), null, 2 ); @@ -630,7 +631,7 @@ export function setupToolBarCommands( ext: '.gq.yaml' }); const obj = contentHandler.privateCopy.get('value'); - model.content = YAML.stringify(obj); + model.content = jsyaml.safeDump(obj); model.format = 'text'; app.serviceManager.contents.save(model.path, model); }; diff --git a/gquantlab/src/connectionHandler.ts b/gQuant/gquantlab/src/connectionHandler.ts similarity index 100% rename from gquantlab/src/connectionHandler.ts rename to gQuant/gquantlab/src/connectionHandler.ts diff --git a/gquantlab/src/document.ts b/gQuant/gquantlab/src/document.ts similarity index 98% rename from gquantlab/src/document.ts rename to gQuant/gquantlab/src/document.ts index 0dc9ced1..bedb2f2b 100644 --- a/gquantlab/src/document.ts +++ b/gQuant/gquantlab/src/document.ts @@ -5,7 +5,7 @@ import { } from '@jupyterlab/docregistry'; import { MainView } from './mainComponent'; import { requestAPI } from './gquantlab'; -import YAML from 'yaml'; +import jsyaml from 'js-yaml'; import { IEditorProp } from './nodeEditor'; import { Signal } from '@lumino/signaling'; import { MainAreaWidget } from '@jupyterlab/apputils'; @@ -196,7 +196,7 @@ export class ContentHandler { await this.context.ready; const yamlContent = this.context.model.toString(); console.log('model path', this.context.path); - const objContent = YAML.parse(yamlContent); + const objContent = jsyaml.safeLoad(yamlContent); this.renderGraph(objContent, width, height); }; refreshContent(); diff --git a/gquantlab/src/dragHandler.ts b/gQuant/gquantlab/src/dragHandler.ts similarity index 100% rename from gquantlab/src/dragHandler.ts rename to gQuant/gquantlab/src/dragHandler.ts diff --git a/gquantlab/src/editorWidget.tsx b/gQuant/gquantlab/src/editorWidget.tsx similarity index 100% rename from gquantlab/src/editorWidget.tsx rename to gQuant/gquantlab/src/editorWidget.tsx diff --git a/gquantlab/src/eventHandler.ts b/gQuant/gquantlab/src/eventHandler.ts similarity index 100% rename from gquantlab/src/eventHandler.ts rename to gQuant/gquantlab/src/eventHandler.ts diff --git a/gquantlab/src/gquantlab.ts b/gQuant/gquantlab/src/gquantlab.ts similarity index 100% rename from gquantlab/src/gquantlab.ts rename to gQuant/gquantlab/src/gquantlab.ts diff --git a/gquantlab/src/index.ts b/gQuant/gquantlab/src/index.ts similarity index 100% rename from gquantlab/src/index.ts rename to gQuant/gquantlab/src/index.ts diff --git a/gquantlab/src/mainComponent.tsx b/gQuant/gquantlab/src/mainComponent.tsx similarity index 100% rename from gquantlab/src/mainComponent.tsx rename to gQuant/gquantlab/src/mainComponent.tsx diff --git a/gquantlab/src/nodeEditor.tsx b/gQuant/gquantlab/src/nodeEditor.tsx similarity index 100% rename from gquantlab/src/nodeEditor.tsx rename to gQuant/gquantlab/src/nodeEditor.tsx diff --git a/gquantlab/src/showType.ts b/gQuant/gquantlab/src/showType.ts similarity index 100% rename from gquantlab/src/showType.ts rename to gQuant/gquantlab/src/showType.ts diff --git a/gquantlab/src/svg.d.ts b/gQuant/gquantlab/src/svg.d.ts similarity index 100% rename from gquantlab/src/svg.d.ts rename to gQuant/gquantlab/src/svg.d.ts diff --git a/gquantlab/src/validator.ts b/gQuant/gquantlab/src/validator.ts similarity index 100% rename from gquantlab/src/validator.ts rename to gQuant/gquantlab/src/validator.ts diff --git a/gquantlab/src/version.ts b/gQuant/gquantlab/src/version.ts similarity index 100% rename from gquantlab/src/version.ts rename to gQuant/gquantlab/src/version.ts diff --git a/gquantlab/src/widget.ts b/gQuant/gquantlab/src/widget.ts similarity index 100% rename from gquantlab/src/widget.ts rename to gQuant/gquantlab/src/widget.ts diff --git a/gquantlab/style/clean.svg b/gQuant/gquantlab/style/clean.svg similarity index 100% rename from gquantlab/style/clean.svg rename to gQuant/gquantlab/style/clean.svg diff --git a/gquantlab/style/editor.css b/gQuant/gquantlab/style/editor.css similarity index 100% rename from gquantlab/style/editor.css rename to gQuant/gquantlab/style/editor.css diff --git a/gquantlab/style/gq.svg b/gQuant/gquantlab/style/gq.svg similarity index 100% rename from gquantlab/style/gq.svg rename to gQuant/gquantlab/style/gq.svg diff --git a/gquantlab/style/index.css b/gQuant/gquantlab/style/index.css similarity index 100% rename from gquantlab/style/index.css rename to gQuant/gquantlab/style/index.css diff --git a/gquantlab/style/layout.svg b/gQuant/gquantlab/style/layout.svg similarity index 100% rename from gquantlab/style/layout.svg rename to gQuant/gquantlab/style/layout.svg diff --git a/gquantlab/style/run.svg b/gQuant/gquantlab/style/run.svg similarity index 100% rename from gquantlab/style/run.svg rename to gQuant/gquantlab/style/run.svg diff --git a/gquantlab/tsconfig.json b/gQuant/gquantlab/tsconfig.json similarity index 96% rename from gquantlab/tsconfig.json rename to gQuant/gquantlab/tsconfig.json index a86606a5..f82a054e 100644 --- a/gquantlab/tsconfig.json +++ b/gQuant/gquantlab/tsconfig.json @@ -19,7 +19,7 @@ "strict": true, "strictNullChecks": false, "target": "es2017", - "allowJs": true, + "allowJs": false, "types": [], "noImplicitThis": false, }, diff --git a/gquantlab_demo.gif b/gQuant/gquantlab_demo.gif similarity index 100% rename from gquantlab_demo.gif rename to gQuant/gquantlab_demo.gif diff --git a/gQuant/plugins/nemo_plugin/README.md b/gQuant/plugins/nemo_plugin/README.md new file mode 100644 index 00000000..0388a422 --- /dev/null +++ b/gQuant/plugins/nemo_plugin/README.md @@ -0,0 +1,53 @@ +## NeMo Plugin Example + +This is an example to show how to write an external gQuant plugin. gQuant take advantage of the `entry point` inside the `setup.py` file to register the plugin. gQuant can discover all the plugins that has the entry point group name `gquant.plugin`. Check the `setup.py` file to see details. + +### Create an new Python enviroment +```bash +conda create -n test python=3.8 +``` + +### Install the gQuant +To install the gQuant graph computation library, run: +```bash +pip install gquant +``` +Or install `gquant` at the gquant directory: +```bash +pip install . +``` + +### Install the gquantlab JupyterLab plugin +To install `gquantlab` JupyterLab plugin, make sure `nodejs` of version [12^14^15] is installed. E.g: +```bash +conda install -c conda-forge nodejs=12.4.0 +``` +Then install the `gquantlab`: +```bash +pip install gquantlab +``` +Or install `gquantlab` at the gquantlab directory: +```bash +pip install . +``` + +### Install the external example plugin +It depends on `gquant_rapids_plugin` plugin, install it first. Check the README file in `gquant_rapids_plugin` directory. +Next install `nemo` library. Currently, it is only compatible with old version of nemo. +``` +git clone -b v0.11.1 https://github.com/NVIDIA/NeMo.git +cd NeMo +cp ../nemo.patch . +git apply nemo.patch && bash reinstall.sh +``` +To install the external plugin, in the plugin diretory, run following command +```bash +pip install . +``` + +### Launch the Jupyter lab +After launching the JupyterLab by, +```bash +jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='' +``` +You can see the `DistanceNode` and `PointNode` under the name `custom_node` in the menu. diff --git a/modules/nemo_gquant_modules/__init__.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/__init__.py similarity index 100% rename from modules/nemo_gquant_modules/__init__.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/__init__.py diff --git a/modules/nemo_gquant_modules/asr.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/asr.py similarity index 100% rename from modules/nemo_gquant_modules/asr.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/asr.py diff --git a/modules/nemo_gquant_modules/client.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/client.py similarity index 100% rename from modules/nemo_gquant_modules/client.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/client.py diff --git a/modules/nemo_gquant_modules/common.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/common.py similarity index 100% rename from modules/nemo_gquant_modules/common.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/common.py diff --git a/modules/nemo_gquant_modules/cv.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/cv.py similarity index 100% rename from modules/nemo_gquant_modules/cv.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/cv.py diff --git a/modules/nemo_gquant_modules/nemoBaseNode.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemoBaseNode.py similarity index 100% rename from modules/nemo_gquant_modules/nemoBaseNode.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemoBaseNode.py diff --git a/modules/nemo_gquant_modules/nemo_util/__init__.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemo_util/__init__.py similarity index 100% rename from modules/nemo_gquant_modules/nemo_util/__init__.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemo_util/__init__.py diff --git a/modules/nemo_gquant_modules/nemo_util/inferNemo.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemo_util/inferNemo.py similarity index 100% rename from modules/nemo_gquant_modules/nemo_util/inferNemo.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemo_util/inferNemo.py diff --git a/modules/nemo_gquant_modules/nemo_util/nemoHPO.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemo_util/nemoHPO.py similarity index 99% rename from modules/nemo_gquant_modules/nemo_util/nemoHPO.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemo_util/nemoHPO.py index 492e1ea6..1c1149fa 100644 --- a/modules/nemo_gquant_modules/nemo_util/nemoHPO.py +++ b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemo_util/nemoHPO.py @@ -1,7 +1,4 @@ -import os -from gquant.dataframe_flow.task import load_modules -load_modules(os.getenv('MODULEPATH')+'/rapids_modules/') -from rapids_modules import GridRandomSearchNode # noqa #E402 +from gquant_rapids_plugin.ml import GridRandomSearchNode from gquant.plugin_nodes.util.contextCompositeNode import ContextCompositeNode # noqa #E402 from gquant.dataframe_flow.portsSpecSchema import (ConfSchema, # noqa #E402 NodePorts) diff --git a/modules/nemo_gquant_modules/nemo_util/trainNemo.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemo_util/trainNemo.py similarity index 100% rename from modules/nemo_gquant_modules/nemo_util/trainNemo.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nemo_util/trainNemo.py diff --git a/modules/nemo_gquant_modules/nlp.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nlp.py similarity index 100% rename from modules/nemo_gquant_modules/nlp.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/nlp.py diff --git a/modules/nemo_gquant_modules/simple_gan.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/simple_gan.py similarity index 100% rename from modules/nemo_gquant_modules/simple_gan.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/simple_gan.py diff --git a/modules/nemo_gquant_modules/tts.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/tts.py similarity index 100% rename from modules/nemo_gquant_modules/tts.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/tts.py diff --git a/modules/nemo_gquant_modules/tutorials.py b/gQuant/plugins/nemo_plugin/gquant_nemo_plugin/tutorials.py similarity index 100% rename from modules/nemo_gquant_modules/tutorials.py rename to gQuant/plugins/nemo_plugin/gquant_nemo_plugin/tutorials.py diff --git a/gQuant/plugins/nemo_plugin/nemo.patch b/gQuant/plugins/nemo_plugin/nemo.patch new file mode 100644 index 00000000..b0c3a756 --- /dev/null +++ b/gQuant/plugins/nemo_plugin/nemo.patch @@ -0,0 +1,99 @@ +diff --git a/nemo/collections/nlp/metrics/sacrebleu.py b/nemo/collections/nlp/metrics/sacrebleu.py +index 5130dd96..3b223ac6 100755 +--- a/nemo/collections/nlp/metrics/sacrebleu.py ++++ b/nemo/collections/nlp/metrics/sacrebleu.py +@@ -61,13 +61,16 @@ from nemo.collections.nlp.data.tokenizers.fairseq_tokenizer import tokenize_en + VERSION = '1.3.5' + + try: ++ import threading + # SIGPIPE is not available on Windows machines, throwing an exception. + from signal import SIGPIPE + + # If SIGPIPE is available, change behaviour to default instead of ignore. + from signal import signal, SIG_DFL + +- signal(SIGPIPE, SIG_DFL) ++ ++ if threading.current_thread() == threading.main_thread(): ++ signal(SIGPIPE, SIG_DFL) + + except ImportError: + logging.warning('Could not import signal.SIGPIPE (this is expected on Windows machines)') +diff --git a/nemo/backends/pytorch/common/rnn.py b/nemo/backends/pytorch/common/rnn.py +index c1c62ac0..b9936fe3 100644 +--- a/nemo/backends/pytorch/common/rnn.py ++++ b/nemo/backends/pytorch/common/rnn.py +@@ -235,7 +235,7 @@ class EncoderRNN(TrainableNM): + embedded = self.embedding(inputs) + embedded = self.dropout(embedded) + if input_lens is not None: +- embedded = nn.utils.rnn.pack_padded_sequence(embedded, input_lens, batch_first=True) ++ embedded = nn.utils.rnn.pack_padded_sequence(embedded, input_lens.cpu(), batch_first=True) + + outputs, hidden = self.rnn(embedded) + # outputs of shape (seq_len, batch, num_directions * hidden_size) +diff --git a/nemo/backends/pytorch/tutorials/chatbot/modules.py b/nemo/backends/pytorch/tutorials/chatbot/modules.py +index 2459afa1..59b88d28 100644 +--- a/nemo/backends/pytorch/tutorials/chatbot/modules.py ++++ b/nemo/backends/pytorch/tutorials/chatbot/modules.py +@@ -122,7 +122,7 @@ class EncoderRNN(TrainableNM): + embedded = self.embedding(input_seq) + embedded = self.embedding_dropout(embedded) + # Pack padded batch of sequences for RNN module +- packed = t.nn.utils.rnn.pack_padded_sequence(embedded, input_lengths) ++ packed = t.nn.utils.rnn.pack_padded_sequence(embedded, input_lengths.cpu()) + # Forward pass through GRU + outputs, hidden = self.gru(packed, hidden) + # Unpack padding +diff --git a/nemo/collections/nlp/nm/trainables/common/encoder_rnn.py b/nemo/collections/nlp/nm/trainables/common/encoder_rnn.py +index 2fc2ff0a..9ec7acc4 100644 +--- a/nemo/collections/nlp/nm/trainables/common/encoder_rnn.py ++++ b/nemo/collections/nlp/nm/trainables/common/encoder_rnn.py +@@ -64,7 +64,7 @@ class EncoderRNN(TrainableNM): + embedded = self.embedding(inputs) + embedded = self.dropout(embedded) + if input_lens is not None: +- embedded = nn.utils.rnn.pack_padded_sequence(embedded, input_lens, batch_first=True) ++ embedded = nn.utils.rnn.pack_padded_sequence(embedded, input_lens.cpu(), batch_first=True) + + outputs, hidden = self.rnn(embedded) + # outputs of shape (seq_len, batch, num_directions * hidden_size) +diff --git a/nemo/collections/tts/parts/tacotron2.py b/nemo/collections/tts/parts/tacotron2.py +index 925251f1..5f81647e 100644 +--- a/nemo/collections/tts/parts/tacotron2.py ++++ b/nemo/collections/tts/parts/tacotron2.py +@@ -221,7 +221,7 @@ class Encoder(nn.Module): + + # pytorch tensor are not reversible, hence the conversion + input_lengths = input_lengths.cpu().numpy() +- x = nn.utils.rnn.pack_padded_sequence(x, input_lengths, batch_first=True, enforce_sorted=False) ++ x = nn.utils.rnn.pack_padded_sequence(x, input_lengths.cpu(), batch_first=True, enforce_sorted=False) + + self.lstm.flatten_parameters() + outputs, _ = self.lstm(x) +diff --git a/requirements/requirements_asr.txt b/requirements/requirements_asr.txt +index 901a79af..4eb76f95 100644 +--- a/requirements/requirements_asr.txt ++++ b/requirements/requirements_asr.txt +@@ -14,4 +14,4 @@ unidecode + webdataset + kaldi-python-io +-librosa<=0.7.2 ++librosa<=0.8.0 +-numba<=0.48 ++numba==0.52.0 +diff --git a/requirements/requirements_nlp.txt b/requirements/requirements_nlp.txt +index 885adf3e..0e4e44e2 100644 +--- a/requirements/requirements_nlp.txt ++++ b/requirements/requirements_nlp.txt +@@ -3,7 +3,7 @@ h5py + matplotlib + sentencepiece + torchtext +-transformers>=2.11.0 ++transformers>=2.11.0,<=3.5.1 + unidecode + youtokentome + numpy + diff --git a/notebooks/10_nemo_chatbot.ipynb b/gQuant/plugins/nemo_plugin/notebooks/10_nemo_chatbot.ipynb similarity index 99% rename from notebooks/10_nemo_chatbot.ipynb rename to gQuant/plugins/nemo_plugin/notebooks/10_nemo_chatbot.ipynb index 599afec6..5e4df236 100644 --- a/notebooks/10_nemo_chatbot.ipynb +++ b/gQuant/plugins/nemo_plugin/notebooks/10_nemo_chatbot.ipynb @@ -174,7 +174,7 @@ } ], "source": [ - "taskGraph=TaskGraph.load_taskgraph('../taskgraphs/nemo_examples/chatbot_example.gq.yaml')\n", + "taskGraph=TaskGraph.load_taskgraph('../taskgraphs/chatbot_example.gq.yaml')\n", "taskGraph.draw()" ] }, @@ -220,7 +220,7 @@ } ], "source": [ - "taskGraph=TaskGraph.load_taskgraph('../taskgraphs/nemo_examples/chatbot_simplified.gq.yaml')\n", + "taskGraph=TaskGraph.load_taskgraph('../taskgraphs/chatbot_simplified.gq.yaml')\n", "taskGraph.draw()" ] }, @@ -1144,7 +1144,7 @@ } ], "source": [ - "taskGraph=TaskGraph.load_taskgraph('../taskgraphs/nemo_examples/chatbot_hpo.gq.yaml')\n", + "taskGraph=TaskGraph.load_taskgraph('../taskgraphs/chatbot_hpo.gq.yaml')\n", "taskGraph.draw()" ] }, @@ -1182,7 +1182,7 @@ } ], "source": [ - "taskGraph=TaskGraph.load_taskgraph('../taskgraphs/nemo_examples/chatbot_large_hpo_search.gq.yaml')\n", + "taskGraph=TaskGraph.load_taskgraph('../taskgraphs/chatbot_large_hpo_search.gq.yaml')\n", "taskGraph.draw()" ] }, diff --git a/gQuant/plugins/nemo_plugin/setup.py b/gQuant/plugins/nemo_plugin/setup.py new file mode 100644 index 00000000..291752a9 --- /dev/null +++ b/gQuant/plugins/nemo_plugin/setup.py @@ -0,0 +1,18 @@ +from setuptools import setup, find_packages + +setup( + name='gquant_nemo_plugin', + packages=find_packages(include=['gquant_nemo_plugin', + 'gquant_nemo_plugin.nemo_util']), + entry_points={ + 'gquant.plugin': + ['gquant_nemo_plugin = gquant_nemo_plugin', + 'gquant_nemo_plugin.asr = gquant_nemo_plugin.asr', + 'gquant_nemo_plugin.cv = gquant_nemo_plugin.cv', + 'gquant_nemo_plugin.nlp = gquant_nemo_plugin.nlp', + 'gquant_nemo_plugin.util = gquant_nemo_plugin.nemo_util', + 'gquant_nemo_plugin.gan = gquant_nemo_plugin.simple_gan', + 'gquant_nemo_plugin.tts = gquant_nemo_plugin.tts', + 'gquant_nemo_plugin.tutorials = gquant_nemo_plugin.tutorials'], + } +) diff --git a/taskgraphs/nemo_examples/chatbot_example.gq.yaml b/gQuant/plugins/nemo_plugin/taskgraphs/chatbot_example.gq.yaml similarity index 89% rename from taskgraphs/nemo_examples/chatbot_example.gq.yaml rename to gQuant/plugins/nemo_plugin/taskgraphs/chatbot_example.gq.yaml index 2723c581..e9f2ff27 100644 --- a/taskgraphs/nemo_examples/chatbot_example.gq.yaml +++ b/gQuant/plugins/nemo_plugin/taskgraphs/chatbot_example.gq.yaml @@ -6,7 +6,7 @@ datafile: notebooks/movie_data.txt min_count: 3 inputs: {} - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: encoder type: EncoderRNNNode conf: @@ -18,7 +18,7 @@ inputs: input_lengths: data.src_lengths input_seq: data.src - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: greedy_decoder type: GreedyLuongAttnDecoderRNNNode conf: @@ -31,7 +31,7 @@ inputs: encoder_outputs: encoder_eval.outputs in_nm: decoder.out_nm - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: decoder type: LuongAttnDecoderRNNNode conf: @@ -44,7 +44,7 @@ targets: data.tgt encoder_outputs: encoder.outputs max_target_len: data.max_tgt_lengths - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: loss type: MaskedXEntropyLossNode conf: {} @@ -52,7 +52,7 @@ predictions: decoder.outputs target: data.tgt mask: data.mask - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: "" type: Output_Collector conf: {} @@ -100,6 +100,7 @@ inputs: loss@loss: loss.loss eval_loss@loss: eval_loss.loss + module: gquant_nemo_plugin.util - id: inference type: NemoInferNode conf: @@ -120,6 +121,7 @@ eval_data@src: eval_data.src greedy_decoder@outputs: greedy_decoder.outputs eval_loss@loss: eval_loss.loss + module: gquant_nemo_plugin.util - id: eval_data type: DialogDataLayerNode conf: @@ -128,7 +130,7 @@ datafile: notebooks/movie_data.txt min_count: 3 inputs: {} - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: encoder_eval type: EncoderRNNNode conf: @@ -142,7 +144,7 @@ input_seq: eval_data.src input_lengths: eval_data.src_lengths in_nm: encoder.out_nm - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: decoder_eval type: LuongAttnDecoderRNNNode conf: @@ -157,7 +159,7 @@ encoder_outputs: encoder_eval.outputs max_target_len: eval_data.max_tgt_lengths in_nm: decoder.out_nm - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: eval_loss type: MaskedXEntropyLossNode conf: {} @@ -165,4 +167,4 @@ predictions: decoder_eval.outputs target: eval_data.tgt mask: eval_data.mask - module: nemo_modules + module: gquant_nemo_plugin.tutorials diff --git a/taskgraphs/nemo_examples/chatbot_hpo.gq.yaml b/gQuant/plugins/nemo_plugin/taskgraphs/chatbot_hpo.gq.yaml similarity index 98% rename from taskgraphs/nemo_examples/chatbot_hpo.gq.yaml rename to gQuant/plugins/nemo_plugin/taskgraphs/chatbot_hpo.gq.yaml index 9d021199..a30f0d9e 100644 --- a/taskgraphs/nemo_examples/chatbot_hpo.gq.yaml +++ b/gQuant/plugins/nemo_plugin/taskgraphs/chatbot_hpo.gq.yaml @@ -85,3 +85,4 @@ taskgraph: taskgraphs/nemo_examples/chatbot_example.gq.yaml inputs: conf_in: rnn_train.conf_out + module: gquant_nemo_plugin.util diff --git a/taskgraphs/nemo_examples/chatbot_large_hpo_search.gq.yaml b/gQuant/plugins/nemo_plugin/taskgraphs/chatbot_large_hpo_search.gq.yaml similarity index 98% rename from taskgraphs/nemo_examples/chatbot_large_hpo_search.gq.yaml rename to gQuant/plugins/nemo_plugin/taskgraphs/chatbot_large_hpo_search.gq.yaml index ee256da8..0c340378 100644 --- a/taskgraphs/nemo_examples/chatbot_large_hpo_search.gq.yaml +++ b/gQuant/plugins/nemo_plugin/taskgraphs/chatbot_large_hpo_search.gq.yaml @@ -112,3 +112,4 @@ taskgraph: taskgraphs/nemo_examples/chatbot_example.gq.yaml inputs: conf_in: rnn_train.conf_out + module: gquant_nemo_plugin.util diff --git a/taskgraphs/nemo_examples/chatbot_simplified.gq.yaml b/gQuant/plugins/nemo_plugin/taskgraphs/chatbot_simplified.gq.yaml similarity index 100% rename from taskgraphs/nemo_examples/chatbot_simplified.gq.yaml rename to gQuant/plugins/nemo_plugin/taskgraphs/chatbot_simplified.gq.yaml diff --git a/taskgraphs/nemo_examples/nemo_train_composite.gq.yaml b/gQuant/plugins/nemo_plugin/taskgraphs/nemo_train_composite.gq.yaml similarity index 94% rename from taskgraphs/nemo_examples/nemo_train_composite.gq.yaml rename to gQuant/plugins/nemo_plugin/taskgraphs/nemo_train_composite.gq.yaml index 8a790185..0c3df7e8 100644 --- a/taskgraphs/nemo_examples/nemo_train_composite.gq.yaml +++ b/gQuant/plugins/nemo_plugin/taskgraphs/nemo_train_composite.gq.yaml @@ -9,6 +9,7 @@ name: data inputs: {} module: nemo_modules +module: gquant_nemo_plugin.tutorials - id: train type: NemoTrainNode conf: @@ -44,6 +45,7 @@ name: sgd inputs: network@loss@loss: network.loss@loss + module: gquant_nemo_plugin.util - id: "" type: Output_Collector conf: {} @@ -78,3 +80,4 @@ inputs: net@x: data.x loss@target: data.y + module: gquant_nemo_plugin.util diff --git a/taskgraphs/nemo_examples/nemo_train_infer.gq.yaml b/gQuant/plugins/nemo_plugin/taskgraphs/nemo_train_infer.gq.yaml similarity index 89% rename from taskgraphs/nemo_examples/nemo_train_infer.gq.yaml rename to gQuant/plugins/nemo_plugin/taskgraphs/nemo_train_infer.gq.yaml index 71c5fa36..c7367a88 100644 --- a/taskgraphs/nemo_examples/nemo_train_infer.gq.yaml +++ b/gQuant/plugins/nemo_plugin/taskgraphs/nemo_train_infer.gq.yaml @@ -8,7 +8,7 @@ x_hi: 4 name: data inputs: {} - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: net type: TaylorNetNode conf: @@ -16,7 +16,7 @@ name: net inputs: x: data.x - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: loss type: MSELossNode conf: @@ -24,7 +24,7 @@ inputs: predictions: net.y_pred target: data.y - module: nemo_modules + module: gquant_nemo_plugin.tutorials - id: train type: NemoTrainNode conf: @@ -58,6 +58,7 @@ name: sgd inputs: loss@loss: loss.loss + module: gquant_nemo_plugin.util - id: "" type: Output_Collector conf: {} @@ -79,3 +80,4 @@ inputs: net@y_pred: net.y_pred log_dir: train.checkpoint_dir + module: gquant_nemo_plugin.util diff --git a/taskgraphs/nemo_examples/simplified.gq.yaml b/gQuant/plugins/nemo_plugin/taskgraphs/simplified.gq.yaml similarity index 100% rename from taskgraphs/nemo_examples/simplified.gq.yaml rename to gQuant/plugins/nemo_plugin/taskgraphs/simplified.gq.yaml diff --git a/gQuant/plugins/rapids_plugin/README.md b/gQuant/plugins/rapids_plugin/README.md new file mode 100644 index 00000000..6f556f54 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/README.md @@ -0,0 +1,70 @@ +## gQuant RAPIDS Plugin Example +This is a example to show how to write an external gQuant RAPIDS plugin. gQuant take advantage of the `entry point` inside the `setup.py` file to register the plugin. gQuant can discover all the plugins that has the entry point group name `gquant.plugin`. Check the `setup.py` file to see details. + +The examples range from simple accelerated calculation of technical trading indicators through defining workflows for interactively developing trading strategies and automating many typical tasks. + +The extensibility of the system is highlighted by examples showing how to create a dataframe flow graph, which allows for easy re-use and composability of higher level workflows. + +The examples also show how to easily convert a single-threaded solution into a Dask distributed one. + +These examples can be used as-is or, as they are open source, can be extended to suit your environments. + +### Create an new Python enviroment +```bash +conda create -n test python=3.8 +``` + +### Prerequisites +- NVIDIA Pascal™ GPU architecture or better. +- [CUDA 9.2](https://developer.nvidia.com/cuda-92-download-archive) with driver v396.37+ or [CUDA 10.0](https://developer.nvidia.com/cuda-10.0-download-archive) with driver v410.48+. +- Ubuntu 16.04 or 18.04. +- [NVIDIA-docker v2+](https://github.com/nvidia/nvidia-docker/wiki/Frequently-Asked-Questions#how-do-i-install-20-if-im-not-using-the-latest-docker-version). + + +### Download data files + +Run the following command at the project root diretory +```bash +bash download_data.sh + +``` + +### Install the gQuant +To install the gQuant graph computation library, run: +```bash +pip install gquant +``` +Or install `gquant` at the gquant directory: +```bash +pip install . +``` + +### Install the gquantlab JupyterLab plugin +To install `gquantlab` JupyterLab plugin, make sure `nodejs` of version [12^14^15] is installed. E.g: +```bash +conda install -c conda-forge nodejs=12.4.0 +``` +Then install the `gquantlab`: +```bash +pip install gquantlab +``` +Or install `gquantlab` at the gquantlab directory: +```bash +pip install . +``` + +### Install the external example plugin +Install RAPIDS: +```bash +conda install -y -c rapidsai -c nvidia -c conda-forge -c defaults rapids=0.17 +``` +To install the external plugin, in the plugin diretory, run following command +```bash +pip install . +``` + +### Launch the Jupyter lab +After launching the JupyterLab by, +```bash +jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='' +``` diff --git a/download_data.sh b/gQuant/plugins/rapids_plugin/download_data.sh similarity index 100% rename from download_data.sh rename to gQuant/plugins/rapids_plugin/download_data.sh diff --git a/modules/rapids_modules/__init__.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/__init__.py similarity index 90% rename from modules/rapids_modules/__init__.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/__init__.py index adba6acd..1ad7a348 100644 --- a/modules/rapids_modules/__init__.py +++ b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/__init__.py @@ -1,10 +1,3 @@ -from .dataloader import * # noqa: F403,F401 -from .analysis import * # noqa: F403,F401 -from .transform import * # noqa: F403,F401 -from .backtest import * # noqa: F403,F401 -from .strategy import * # noqa: F403,F401 -from .portofolio import * # noqa: F403,F401 -from .ml import * # noqa: F403,F401 from .client import validation, display # noqa: F401 from gquant.dataframe_flow._node_flow import register_validator from gquant.dataframe_flow._node_flow import register_copy_function @@ -28,8 +21,7 @@ def _validate_df(df_to_val, ref_cols, obj): number of columns. TODO: Create a ValidationError subclass. ''' - if (isinstance(df_to_val, cudf.DataFrame) or - isinstance(df_to_val, dask_cudf.DataFrame)) and \ + if isinstance(df_to_val, cudf.DataFrame) and \ len(df_to_val) == 0: err_msg = 'Node "{}" produced empty output'.format(obj.uid) raise Exception(err_msg) diff --git a/modules/rapids_modules/_port_type_node.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/_port_type_node.py similarity index 100% rename from modules/rapids_modules/_port_type_node.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/_port_type_node.py diff --git a/modules/rapids_modules/analysis/__init__.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/__init__.py similarity index 100% rename from modules/rapids_modules/analysis/__init__.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/__init__.py diff --git a/modules/rapids_modules/analysis/barPlotNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/barPlotNode.py similarity index 100% rename from modules/rapids_modules/analysis/barPlotNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/barPlotNode.py diff --git a/modules/rapids_modules/analysis/cumReturnNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/cumReturnNode.py similarity index 100% rename from modules/rapids_modules/analysis/cumReturnNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/cumReturnNode.py diff --git a/modules/rapids_modules/analysis/exportXGBoostNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/exportXGBoostNode.py similarity index 90% rename from modules/rapids_modules/analysis/exportXGBoostNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/exportXGBoostNode.py index f93c586b..15a45609 100644 --- a/modules/rapids_modules/analysis/exportXGBoostNode.py +++ b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/exportXGBoostNode.py @@ -2,6 +2,7 @@ from gquant.dataframe_flow.portsSpecSchema import (ConfSchema, MetaData, NodePorts, PortsSpecSchema) from xgboost import Booster +from gquant.dataframe_flow.util import get_file_path class XGBoostExportNode(Node): @@ -46,7 +47,7 @@ def conf_schema(self): "properties": { "path": { "type": "string", - "description": """The output filepath for the csv""" + "description": """The output filepath for the xgboost model""" } }, "required": ["path"], @@ -69,5 +70,6 @@ def process(self, inputs): model = inputs[self.INPUT_PORT_NAME] if isinstance(model, dict): model = model['booster'] - model.save_model(self.conf['path']) - return {self.OUTPUT_PORT_NAME: self.conf['path']} + pathname = get_file_path(self.conf['path']) + model.save_model(pathname) + return {self.OUTPUT_PORT_NAME: pathname} diff --git a/modules/rapids_modules/analysis/importanceCurve.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/importanceCurve.py similarity index 100% rename from modules/rapids_modules/analysis/importanceCurve.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/importanceCurve.py diff --git a/modules/rapids_modules/analysis/linePlotNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/linePlotNode.py similarity index 100% rename from modules/rapids_modules/analysis/linePlotNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/linePlotNode.py diff --git a/modules/rapids_modules/analysis/outCsvNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/outCsvNode.py similarity index 94% rename from modules/rapids_modules/analysis/outCsvNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/outCsvNode.py index b5436167..76371e2d 100644 --- a/modules/rapids_modules/analysis/outCsvNode.py +++ b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/outCsvNode.py @@ -1,5 +1,6 @@ from gquant.dataframe_flow import Node import dask_cudf +from gquant.dataframe_flow.util import get_file_path from gquant.dataframe_flow.portsSpecSchema import ConfSchema from .._port_type_node import _PortTypesMixin @@ -76,5 +77,6 @@ def process(self, inputs): input_df = raw_input_df.compute() # get the computed value else: input_df = raw_input_df - input_df.to_pandas().to_csv(self.conf['path'], index=False) + input_df.to_pandas().to_csv(get_file_path(self.conf['path']), + index=False) return {self.OUTPUT_PORT_NAME: raw_input_df} diff --git a/modules/rapids_modules/analysis/rocCurveNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/rocCurveNode.py similarity index 100% rename from modules/rapids_modules/analysis/rocCurveNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/rocCurveNode.py diff --git a/modules/rapids_modules/analysis/scatterPlotNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/scatterPlotNode.py similarity index 100% rename from modules/rapids_modules/analysis/scatterPlotNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/scatterPlotNode.py diff --git a/modules/rapids_modules/analysis/sharpeRatioNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/sharpeRatioNode.py similarity index 100% rename from modules/rapids_modules/analysis/sharpeRatioNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/analysis/sharpeRatioNode.py diff --git a/modules/rapids_modules/backtest/__init__.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/backtest/__init__.py similarity index 100% rename from modules/rapids_modules/backtest/__init__.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/backtest/__init__.py diff --git a/modules/rapids_modules/backtest/simpleBackTest.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/backtest/simpleBackTest.py similarity index 100% rename from modules/rapids_modules/backtest/simpleBackTest.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/backtest/simpleBackTest.py diff --git a/modules/rapids_modules/cache.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cache.py similarity index 100% rename from modules/rapids_modules/cache.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cache.py diff --git a/modules/rapids_modules/client.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/client.py similarity index 100% rename from modules/rapids_modules/client.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/client.py diff --git a/modules/rapids_modules/cuindicator/__init__.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/__init__.py similarity index 100% rename from modules/rapids_modules/cuindicator/__init__.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/__init__.py diff --git a/modules/rapids_modules/cuindicator/ewm.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/ewm.py similarity index 100% rename from modules/rapids_modules/cuindicator/ewm.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/ewm.py diff --git a/modules/rapids_modules/cuindicator/frac_diff.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/frac_diff.py similarity index 100% rename from modules/rapids_modules/cuindicator/frac_diff.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/frac_diff.py diff --git a/modules/rapids_modules/cuindicator/indicator.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/indicator.py similarity index 100% rename from modules/rapids_modules/cuindicator/indicator.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/indicator.py diff --git a/modules/rapids_modules/cuindicator/pewm.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/pewm.py similarity index 100% rename from modules/rapids_modules/cuindicator/pewm.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/pewm.py diff --git a/modules/rapids_modules/cuindicator/rolling.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/rolling.py similarity index 100% rename from modules/rapids_modules/cuindicator/rolling.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/rolling.py diff --git a/modules/rapids_modules/cuindicator/util.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/util.py similarity index 100% rename from modules/rapids_modules/cuindicator/util.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/util.py diff --git a/modules/rapids_modules/cuindicator/windows.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/windows.py similarity index 100% rename from modules/rapids_modules/cuindicator/windows.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/cuindicator/windows.py diff --git a/modules/rapids_modules/dataloader/__init__.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/__init__.py similarity index 100% rename from modules/rapids_modules/dataloader/__init__.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/__init__.py diff --git a/modules/rapids_modules/dataloader/classificationGenerator.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/classificationGenerator.py similarity index 100% rename from modules/rapids_modules/dataloader/classificationGenerator.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/classificationGenerator.py diff --git a/modules/rapids_modules/dataloader/csvStockLoader.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/csvStockLoader.py similarity index 100% rename from modules/rapids_modules/dataloader/csvStockLoader.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/csvStockLoader.py diff --git a/modules/rapids_modules/dataloader/stockMap.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/stockMap.py similarity index 100% rename from modules/rapids_modules/dataloader/stockMap.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/stockMap.py diff --git a/modules/rapids_modules/dataloader/stockNameLoader.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/stockNameLoader.py similarity index 100% rename from modules/rapids_modules/dataloader/stockNameLoader.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/dataloader/stockNameLoader.py diff --git a/modules/rapids_modules/ml/__init__.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/__init__.py similarity index 100% rename from modules/rapids_modules/ml/__init__.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/__init__.py diff --git a/modules/rapids_modules/ml/forestInference.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/forestInference.py similarity index 100% rename from modules/rapids_modules/ml/forestInference.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/forestInference.py diff --git a/modules/rapids_modules/ml/gridRandomSearchNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/gridRandomSearchNode.py similarity index 100% rename from modules/rapids_modules/ml/gridRandomSearchNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/gridRandomSearchNode.py diff --git a/modules/rapids_modules/ml/splitDataNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/splitDataNode.py similarity index 100% rename from modules/rapids_modules/ml/splitDataNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/splitDataNode.py diff --git a/modules/rapids_modules/ml/xgboostNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/xgboostNode.py similarity index 99% rename from modules/rapids_modules/ml/xgboostNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/xgboostNode.py index 09e18891..8fcd3f14 100644 --- a/modules/rapids_modules/ml/xgboostNode.py +++ b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/ml/xgboostNode.py @@ -469,7 +469,7 @@ def process(self, inputs): # get the client client = dask.distributed.client.default_client() dtrain = xgb.dask.DaskDMatrix(client, input_df[required_cols]) - prediction = xgb.dask.predict(client, bst_model, dtrain).persist() + prediction = xgb.dask.predict(client, bst_model, dtrain) pred_df = dask_cudf.from_dask_dataframe( prediction.to_dask_dataframe()) pred_df.index = input_df.index diff --git a/modules/rapids_modules/portofolio/__init__.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/portofolio/__init__.py similarity index 100% rename from modules/rapids_modules/portofolio/__init__.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/portofolio/__init__.py diff --git a/modules/rapids_modules/portofolio/simpleAveragePortOpt.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/portofolio/simpleAveragePortOpt.py similarity index 100% rename from modules/rapids_modules/portofolio/simpleAveragePortOpt.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/portofolio/simpleAveragePortOpt.py diff --git a/modules/rapids_modules/strategy/__init__.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/strategy/__init__.py similarity index 100% rename from modules/rapids_modules/strategy/__init__.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/strategy/__init__.py diff --git a/modules/rapids_modules/strategy/movingAverageStrategyNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/strategy/movingAverageStrategyNode.py similarity index 100% rename from modules/rapids_modules/strategy/movingAverageStrategyNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/strategy/movingAverageStrategyNode.py diff --git a/modules/rapids_modules/strategy/portExpMovingAverageStrategyNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/strategy/portExpMovingAverageStrategyNode.py similarity index 100% rename from modules/rapids_modules/strategy/portExpMovingAverageStrategyNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/strategy/portExpMovingAverageStrategyNode.py diff --git a/modules/rapids_modules/strategy/xgboostStrategyNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/strategy/xgboostStrategyNode.py similarity index 99% rename from modules/rapids_modules/strategy/xgboostStrategyNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/strategy/xgboostStrategyNode.py index 94317ea1..cf91860b 100644 --- a/modules/rapids_modules/strategy/xgboostStrategyNode.py +++ b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/strategy/xgboostStrategyNode.py @@ -201,7 +201,7 @@ def process(self, inputs): num_boost_round=self.conf["num_of_rounds"]) dtrain = xgb.dask.DaskDMatrix(client, input_df[train_cols]) - prediction = xgb.dask.predict(client, bst, dtrain).persist() + prediction = xgb.dask.predict(client, bst, dtrain) pred_df = dask_cudf.from_dask_dataframe( prediction.to_dask_dataframe()) pred_df.index = input_df.index diff --git a/modules/rapids_modules/transform/__init__.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/__init__.py similarity index 100% rename from modules/rapids_modules/transform/__init__.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/__init__.py diff --git a/modules/rapids_modules/transform/addSignIndicator.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/addSignIndicator.py similarity index 100% rename from modules/rapids_modules/transform/addSignIndicator.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/addSignIndicator.py diff --git a/modules/rapids_modules/transform/assetFilterNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/assetFilterNode.py similarity index 100% rename from modules/rapids_modules/transform/assetFilterNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/assetFilterNode.py diff --git a/modules/rapids_modules/transform/assetIndicatorNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/assetIndicatorNode.py similarity index 100% rename from modules/rapids_modules/transform/assetIndicatorNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/assetIndicatorNode.py diff --git a/modules/rapids_modules/transform/averageNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/averageNode.py similarity index 100% rename from modules/rapids_modules/transform/averageNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/averageNode.py diff --git a/modules/rapids_modules/transform/daskComputeNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/daskComputeNode.py similarity index 100% rename from modules/rapids_modules/transform/daskComputeNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/daskComputeNode.py diff --git a/modules/rapids_modules/transform/data_obj.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/data_obj.py similarity index 100% rename from modules/rapids_modules/transform/data_obj.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/data_obj.py diff --git a/modules/rapids_modules/transform/datetimeFilterNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/datetimeFilterNode.py similarity index 100% rename from modules/rapids_modules/transform/datetimeFilterNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/datetimeFilterNode.py diff --git a/modules/rapids_modules/transform/dropNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/dropNode.py similarity index 100% rename from modules/rapids_modules/transform/dropNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/dropNode.py diff --git a/modules/rapids_modules/transform/indicatorNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/indicatorNode.py similarity index 100% rename from modules/rapids_modules/transform/indicatorNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/indicatorNode.py diff --git a/modules/rapids_modules/transform/leftMergeNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/leftMergeNode.py similarity index 100% rename from modules/rapids_modules/transform/leftMergeNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/leftMergeNode.py diff --git a/modules/rapids_modules/transform/linearEmbedding.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/linearEmbedding.py similarity index 100% rename from modules/rapids_modules/transform/linearEmbedding.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/linearEmbedding.py diff --git a/modules/rapids_modules/transform/maxNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/maxNode.py similarity index 100% rename from modules/rapids_modules/transform/maxNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/maxNode.py diff --git a/modules/rapids_modules/transform/minNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/minNode.py similarity index 100% rename from modules/rapids_modules/transform/minNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/minNode.py diff --git a/modules/rapids_modules/transform/normalizationNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/normalizationNode.py similarity index 100% rename from modules/rapids_modules/transform/normalizationNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/normalizationNode.py diff --git a/modules/rapids_modules/transform/onehotEncoding.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/onehotEncoding.py similarity index 100% rename from modules/rapids_modules/transform/onehotEncoding.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/onehotEncoding.py diff --git a/modules/rapids_modules/transform/renameNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/renameNode.py similarity index 100% rename from modules/rapids_modules/transform/renameNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/renameNode.py diff --git a/modules/rapids_modules/transform/returnFeatureNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/returnFeatureNode.py similarity index 100% rename from modules/rapids_modules/transform/returnFeatureNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/returnFeatureNode.py diff --git a/modules/rapids_modules/transform/sortNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/sortNode.py similarity index 100% rename from modules/rapids_modules/transform/sortNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/sortNode.py diff --git a/modules/rapids_modules/transform/valueFilterNode.py b/gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/valueFilterNode.py similarity index 100% rename from modules/rapids_modules/transform/valueFilterNode.py rename to gQuant/plugins/rapids_plugin/gquant_rapids_plugin/transform/valueFilterNode.py diff --git a/gQuant/plugins/rapids_plugin/gquantrc b/gQuant/plugins/rapids_plugin/gquantrc new file mode 100644 index 00000000..e7b33464 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/gquantrc @@ -0,0 +1,2 @@ +[ModuleFiles] +my_node= %(MODULEPATH)s/my_node.py diff --git a/modules/my_node.py b/gQuant/plugins/rapids_plugin/modules/my_node.py similarity index 100% rename from modules/my_node.py rename to gQuant/plugins/rapids_plugin/modules/my_node.py diff --git a/gQuant/plugins/rapids_plugin/notebooks/01_tutorial.ipynb b/gQuant/plugins/rapids_plugin/notebooks/01_tutorial.ipynb new file mode 100644 index 00000000..ab33cc26 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/notebooks/01_tutorial.ipynb @@ -0,0 +1,1357 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction to gQuant\n", + "\n", + "**gQuant** is a set of open-source examples for Quantitative Analysis tasks:\n", + "- Data preparation & feat. engineering\n", + "- Alpha seeking modeling\n", + "- Technical indicators\n", + "- Backtesting\n", + "\n", + "It is GPU-accelerated by leveraging [**RAPIDS.ai**](https://rapids.ai) technology, and has Multi-GPU and Multi-Node support.\n", + "\n", + "gQuant computing components are oriented around its plugins and task graph.\n", + "\n", + "## Download example datasets\n", + "\n", + "Before getting started, let's download the example datasets if not present." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset is already present. No need to re-download it.\n" + ] + } + ], + "source": [ + "! ((test ! -f './data/stock_price_hist.csv.gz' || test ! -f './data/security_master.csv.gz') && \\\n", + " cd .. && bash download_data.sh) || echo \"Dataset is already present. No need to re-download it.\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## About this notebook\n", + "\n", + "In this tutorial, we are going to use gQuant to do a simple quant job. The job tasks are listed below:\n", + " 1. load csv stock data.\n", + " 2. filter out the stocks that has average volume smaller than 50.\n", + " 3. sort the stock symbols and datetime.\n", + " 4. add rate of return as a feature into the table.\n", + " 5. in two branches, computethe mean volume and mean return.\n", + " 6. read the file containing the stock symbol names, and join the computed dataframes.\n", + " 7. output the result in csv files.\n", + " \n", + "## TaskGraph playground\n", + "\n", + "Run the following gquant code to start a empty TaskGraph where computation graph can be created. You can follow the steps as listed below." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "aa99803de134434495790ac9be5c9871", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox())" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys; sys.path.insert(0, '..')\n", + "from gquant.dataframe_flow import TaskGraph\n", + "task_graph = TaskGraph()\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step by Step to build your first task graph\n", + "\n", + "### Create Task node to load the included stock csv file \n", + "\n", + "\n", + "### Explore the data and visualize it\n", + "\n", + "\n", + "### Clean up the Task nodes for next steps\n", + "\n", + "\n", + "### Filter the data and compute the rate of return feature\n", + "\n", + "\n", + "### Save current TaskGraph for a composite Task node\n", + "\n", + "\n", + "### Clean up the redudant feature computation Task nodes\n", + "\n", + "\n", + "### Compute the averge volume and returns \n", + "\n", + "\n", + "### Dump the dataframe to csv files\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Just in case you cannnot follow along, here you can load the tutorial taskgraph from the file. First one is the graph to calculate the return feature. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fb40274ceb44404f8221b1af3f9b94e5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/get_return_feature.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load the full graph and click on the `run` button to see the result" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "24c9bc5ac191466a978d6cde8d668b9c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/tutorial_intro.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## About Task graphs, nodes and plugins\n", + "\n", + "Quant processing operators are defined as nodes that operates on **cuDF**/**dask_cuDF** dataframes.\n", + "\n", + "A **task graph** is a list of tasks composed of gQuant nodes.\n", + "\n", + "The cell below contains the task graph described before." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import warnings; warnings.simplefilter(\"ignore\")\n", + "csv_average_return = 'average_return.csv'\n", + "csv_average_volume = 'average_volume.csv'\n", + "csv_file_path = './data/stock_price_hist.csv.gz'\n", + "csv_name_file_path = './data/security_master.csv.gz'\n", + "from gquant.dataframe_flow import TaskSpecSchema \n", + "\n", + "# load csv stock data\n", + "task_csvdata = {\n", + " TaskSpecSchema.task_id: 'stock_data',\n", + " TaskSpecSchema.node_type: 'CsvStockLoader',\n", + " TaskSpecSchema.conf: {'file': csv_file_path},\n", + " TaskSpecSchema.inputs: {},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.dataloader\"\n", + "}\n", + "\n", + "# filter out the stocks that has average volume smaller than 50\n", + "task_minVolume = {\n", + " TaskSpecSchema.task_id: 'volume_filter',\n", + " TaskSpecSchema.node_type: 'ValueFilterNode',\n", + " TaskSpecSchema.conf: [{'min': 50.0, 'column': 'volume'}],\n", + " TaskSpecSchema.inputs: {'in': 'stock_data.cudf_out'},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.transform\"\n", + "}\n", + "\n", + "# sort the stock symbols and datetime\n", + "task_sort = {\n", + " TaskSpecSchema.task_id: 'sort_node',\n", + " TaskSpecSchema.node_type: 'SortNode',\n", + " TaskSpecSchema.conf: {'keys': ['asset', 'datetime']},\n", + " TaskSpecSchema.inputs: {'in': 'volume_filter.out'},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.transform\"\n", + "}\n", + "\n", + "# add rate of return as a feature into the table\n", + "task_addReturn = {\n", + " TaskSpecSchema.task_id: 'add_return_feature',\n", + " TaskSpecSchema.node_type: 'ReturnFeatureNode',\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.inputs: {'stock_in': 'sort_node.out'},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.transform\"\n", + "}\n", + "\n", + "# read the stock symbol name file and join the computed dataframes\n", + "task_stockSymbol = {\n", + " TaskSpecSchema.task_id: 'stock_name',\n", + " TaskSpecSchema.node_type: 'StockNameLoader',\n", + " TaskSpecSchema.conf: {'file': csv_name_file_path },\n", + " TaskSpecSchema.inputs: {},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.dataloader\"\n", + "}\n", + "\n", + "# In two branches, compute the mean volume and mean return seperately\n", + "task_volumeMean = {\n", + " TaskSpecSchema.task_id: 'average_volume',\n", + " TaskSpecSchema.node_type: 'AverageNode',\n", + " TaskSpecSchema.conf: {'column': 'volume'},\n", + " TaskSpecSchema.inputs: {'stock_in': 'add_return_feature.stock_out'},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.transform\"\n", + "}\n", + "\n", + "task_returnMean = {\n", + " TaskSpecSchema.task_id: 'average_return',\n", + " TaskSpecSchema.node_type: 'AverageNode',\n", + " TaskSpecSchema.conf: {'column': 'returns'},\n", + " TaskSpecSchema.inputs: {'stock_in': 'add_return_feature.stock_out'},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.transform\"\n", + "}\n", + "\n", + "task_leftMerge1 = {\n", + " TaskSpecSchema.task_id: 'left_merge1',\n", + " TaskSpecSchema.node_type: 'LeftMergeNode',\n", + " TaskSpecSchema.conf: {'column': 'asset'},\n", + " TaskSpecSchema.inputs: {'left': 'average_return.stock_out', \n", + " 'right': 'stock_name.stock_name'},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.transform\"\n", + "}\n", + "\n", + "task_leftMerge2 = {\n", + " TaskSpecSchema.task_id: 'left_merge2',\n", + " TaskSpecSchema.node_type: 'LeftMergeNode',\n", + " TaskSpecSchema.conf: {'column': 'asset'},\n", + " TaskSpecSchema.inputs: {'left': 'average_volume.stock_out', \n", + " 'right': 'stock_name.stock_name'},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.transform\"\n", + "}\n", + "\n", + "# output the result in csv files\n", + "\n", + "task_outputCsv1 = {\n", + " TaskSpecSchema.task_id: 'output_csv1',\n", + " TaskSpecSchema.node_type: 'OutCsvNode',\n", + " TaskSpecSchema.conf: {'path': csv_average_return},\n", + " TaskSpecSchema.inputs: {'df_in': 'left_merge1.merged'},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.analysis\"\n", + "}\n", + "\n", + "task_outputCsv2 = {\n", + " TaskSpecSchema.task_id: 'output_csv2',\n", + " TaskSpecSchema.node_type: 'OutCsvNode',\n", + " TaskSpecSchema.conf: {'path': csv_average_volume },\n", + " TaskSpecSchema.inputs: {'df_in': 'left_merge2.merged'},\n", + " TaskSpecSchema.module: \"gquant_rapids_plugin.analysis\"\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Python, a gQuant task-spec is defined as a dictionary with the following fields:\n", + "- `id`\n", + "- `type`\n", + "- `conf`\n", + "- `inputs`\n", + "- `filepath`\n", + "- `module`\n", + "\n", + "As a best practice, we recommend using the `TaskSpecSchema` class for these fields, instead of strings.\n", + "\n", + "The `id` for a given task must be unique within a task graph. To use the result(s) of other task(s) as input(s) of a different task, we use the id(s) of the former task(s) in the `inputs` field of the next task.\n", + "\n", + "The `type` field contains the node type to use for the compute task. gQuant includes a collection of node classes. These can be found in `gquant.plugin_nodes`. Click [here](#node_class_example) to see a gQuant node class example.\n", + "\n", + "The `conf` field is used to parameterise a task. It lets you access user-set parameters within a plugin (such as `self.conf['min']` in the example above). Each node defines the `conf` json schema. The gQuant UI can use this schema to generate the proper form UI for the inputs. It is recommended to use the UI to configure the `conf`. \n", + "\n", + "The `filepath` field is used to specify a python module where a custom plugin is defined. It is optional if the plugin is in `plugin_nodes` directory, and mandatory when the plugin is somewhere else. In a different tutorial, we will learn how to create custom plugins.\n", + "\n", + "The `module` is optional to tell gQuant the name of module that the node type is from. If it is not specified, gQuant will search for it among all the customized modules. \n", + "\n", + "A custom node schema will look something like this:\n", + "```\n", + "custom_task = {\n", + " TaskSpecSchema.task_id: 'custom_calc',\n", + " TaskSpecSchema.node_type: 'CustomNode',\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.inputs: ['some_other_node'],\n", + " TaskSpecSchema.filepath: 'custom_nodes.py'\n", + "}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below, we compose our task graph and visualize it as a graph." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9fe6df6a63b0413bb8ec6f1f4c159bcc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from gquant.dataframe_flow import TaskGraph\n", + "\n", + "# list of nodes composing the task graph\n", + "task_list = [\n", + " task_csvdata, task_minVolume, task_sort, task_addReturn,\n", + " task_stockSymbol, task_volumeMean, task_returnMean,\n", + " task_leftMerge1, task_leftMerge2,\n", + " task_outputCsv1, task_outputCsv2]\n", + "\n", + "task_graph = TaskGraph(task_list)\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will use `save_taskgraph` method to save the task graph to a **yaml file**.\n", + "\n", + "That will allow us to re-use it in the future." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "task_graph_file_name = '01_tutorial_task_graph.gq.yaml'\n", + "\n", + "task_graph.save_taskgraph(task_graph_file_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is a snippet of the content in the resulting yaml file:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "- id: stock_data\n", + " type: CsvStockLoader\n", + " conf:\n", + " file: ./data/stock_price_hist.csv.gz\n", + " inputs: {}\n", + " module: gquant_rapids_plugin.dataloader\n", + "- id: volume_filter\n", + " type: ValueFilterNode\n", + " conf:\n", + " - column: volume\n", + " min: 50\n", + " inputs:\n", + " in: stock_data.cudf_out\n", + " module: gquant_rapids_plugin.transform\n", + "- id: sort_node\n", + " type: SortNode\n", + " conf:\n", + " keys:\n", + " - asset\n" + ] + } + ], + "source": [ + "%%bash -s \"$task_graph_file_name\"\n", + "head -n 19 $1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The yaml file describes the computation tasks. We can load it and visualize it as a graph." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3c5f7fabeb3046f5a459c8f769e6e5f7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph(task_graph_file_name)\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Building a task graph\n", + "\n", + "Running the task graph is the next logical step. Nevertheless, it can optionally be built before running it.\n", + "\n", + "By calling `build` method, the graph is traversed without running the dataframe computations. This could be useful to inspect the column names and types, validate that the plugins can be instantiated, and check for errors.\n", + "\n", + "The output of `build` are instances of each task in a dictionary.\n", + "\n", + "In the example below, we inspect the column names and types for the inputs and outputs of the `left_merge1` task:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Output of build task graph are instances of each task in a dictionary:\n", + "\n", + "stock_data: \n", + "volume_filter: \n", + "sort_node: \n", + "add_return_feature: \n", + "stock_name: \n", + "average_volume: \n", + "average_return: \n", + "left_merge1: \n", + "left_merge2: \n", + "output_csv1: \n", + "output_csv2: \n", + "\n" + ] + } + ], + "source": [ + "from pprint import pprint\n", + "\n", + "task_graph.build()\n", + "\n", + "print('Output of build task graph are instances of each task in a dictionary:\\n')\n", + "print(str(task_graph))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "output meta in outgoing dataframe:\n", + "\n", + "MetaData(inports={'left': {}, 'right': {}}, outports={'merged': {'returns': 'float64', 'asset': 'int64', 'asset_name': 'object'}})\n" + ] + } + ], + "source": [ + "# output meta in 'left_merge_1' node\n", + "\n", + "print('output meta in outgoing dataframe:\\n')\n", + "pprint(task_graph['left_merge1'].meta_setup())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running a task graph\n", + "\n", + "To execute the graph computations, we will use the `run` method. If the `Output_Collector` task node is not added to the graph, a output list can be feeded to the run method. The result can be displayed in a rich mode if the `formated` argument is turned on.\n", + "\n", + "`run` can also takes an optional `replace` argument which is used and explained later on" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c64c1e5f75d84692a2b085a5d66fc286", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Tab(children=(Output(), Output(), Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "outputs = ['stock_data.cudf_out', 'output_csv1.df_out', 'output_csv2.df_out']\n", + "task_graph.run(outputs=outputs, formated=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result can be used as a tuple or dictionary." + ] + }, + { + "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", + "
assetvolumeasset_name
0869577154.528596CTT
1869584701.630560LPT
2869587119.878161HBP
3869589161.938559DSLV
4869590204.126667BPTH
............
4995743880.495558NQM
4996744076.090120NQP
4997744186.637237NQS
49987443569.610747NR
4999745568.407921NRT
\n", + "

5000 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " asset volume asset_name\n", + "0 869577 154.528596 CTT\n", + "1 869584 701.630560 LPT\n", + "2 869587 119.878161 HBP\n", + "3 869589 161.938559 DSLV\n", + "4 869590 204.126667 BPTH\n", + "... ... ... ...\n", + "4995 7438 80.495558 NQM\n", + "4996 7440 76.090120 NQP\n", + "4997 7441 86.637237 NQS\n", + "4998 7443 569.610747 NR\n", + "4999 7455 68.407921 NRT\n", + "\n", + "[5000 rows x 3 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result = task_graph.run(outputs=outputs)\n", + "csv_data_df, csv_1_df, csv_2_df = result\n", + "result['output_csv2.df_out']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can profile each of the computation node running time by turning on the profiler." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:stock_data process time:4.007s\n", + "id:volume_filter process time:0.009s\n", + "id:sort_node process time:0.087s\n", + "id:add_return_feature process time:0.054s\n", + "id:average_volume process time:0.015s\n", + "id:average_return process time:0.014s\n", + "id:stock_name process time:0.014s\n", + "id:left_merge1 process time:0.003s\n", + "id:output_csv1 process time:0.015s\n", + "id:left_merge2 process time:0.002s\n", + "id:output_csv2 process time:0.013s\n" + ] + } + ], + "source": [ + "outputs = ['stock_data.cudf_out', 'output_csv1.df_out', 'output_csv2.df_out']\n", + "csv_data_df, csv_1_df, csv_2_df = task_graph.run(outputs=outputs, profile=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Where most of the time is spent on the csv file processing. This is because we have to convert the time string to the proper format via CPU. Let's inspect the content of `csv_1_df` and `csv_2_df`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "csv_1_df content:\n", + " asset returns asset_name\n", + "0 869577 -0.000295 CTT\n", + "1 869584 0.000387 LPT\n", + "2 869587 0.027713 HBP\n", + "3 869589 0.001337 DSLV\n", + "4 869590 0.009657 BPTH\n", + "... ... ... ...\n", + "4995 24076 -0.000566 STV\n", + "4996 24077 0.000285 INVN\n", + "4997 24078 0.045625 TCO\n", + "4998 24079 0.073684 WTFCW\n", + "4999 24088 0.001275 MCF\n", + "\n", + "[5000 rows x 3 columns]\n", + "\n", + "csv_2_df content:\n", + " asset volume asset_name\n", + "0 869577 154.528596 CTT\n", + "1 869584 701.630560 LPT\n", + "2 869587 119.878161 HBP\n", + "3 869589 161.938559 DSLV\n", + "4 869590 204.126667 BPTH\n", + "... ... ... ...\n", + "4995 24076 328.960250 STV\n", + "4996 24077 1998.246290 INVN\n", + "4997 24078 443.700394 TCO\n", + "4998 24079 221.725000 WTFCW\n", + "4999 24088 128.905316 MCF\n", + "\n", + "[5000 rows x 3 columns]\n" + ] + } + ], + "source": [ + "print('csv_1_df content:')\n", + "print(csv_1_df)\n", + "\n", + "print('\\ncsv_2_df content:')\n", + "print(csv_2_df) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Also, please notice that two resulting csv files has been created:\n", + "- average_return.csv\n", + "- average_volume.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "csv files created:\n" + ] + } + ], + "source": [ + "print('\\ncsv files created:')\n", + "!find . -iname \"*symbol*\" " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Subgraphs\n", + "\n", + "A nice feature of task graphs is that we can evaluate any **subgraph**. For instance, if you are only interested in the `average volume` result, you can run only the tasks which are relevant for that computation.\n", + "\n", + "If we would not want to re-run tasks, we could also use the `replace` argument of the `run` function with a `load` option.\n", + "\n", + "The `replace` argument needs to be a dictionary where each key is the task/node id. The values are a replacement task-spec dictionary (i.e. each key is a spec overload, and its value is what to overload with).\n", + "\n", + "In the example below, instead of re-running the `stock_data` node to load a csv file into a `cudf` dataframe, we will use its dataframe output to load from it." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " asset volume\n", + "0 93 86.594737\n", + "1 165 67.020000\n", + "2 239 128.835141\n", + "3 281 68.450000\n", + "4 592 110.333333\n", + "... ... ...\n", + "4995 869589 161.938559\n", + "4996 869590 204.126667\n", + "4997 869592 101.423675\n", + "4998 869597 81.298788\n", + "4999 869599 83.425988\n", + "\n", + "[5000 rows x 2 columns]\n" + ] + } + ], + "source": [ + "replace = {\n", + " 'stock_data': {\n", + " 'load': {\n", + " 'cudf_out': csv_data_df\n", + " },\n", + " 'save': True\n", + " }\n", + "}\n", + "\n", + "(volume_mean_df, ) = task_graph.run(outputs=['average_volume.stock_out'],\n", + " replace=replace)\n", + "\n", + "print(volume_mean_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a convenience, we can save on disk the checkpoints for any of the nodes, and re-load them if needed. It is only needed to set the save option to `True`. This step will take a while depends on the disk IO speed.\n", + "\n", + "In the example above, the `replace` spec directs `run` to save on disk for the `stock_data`. If `load` was boolean then the data would be loaded from disk presuming the data was saved to disk in a prior run.\n", + "\n", + "The default directory for saving is `/.cache/.hdf5`.\n", + "\n", + "`replace` is also used to override parameters in the tasks. For instance, if we wanted to use the value `40.0` instead `50.0` in the task `volume_filter`, we would do something similar to:\n", + "```\n", + "replace_spec = {\n", + " 'volume_filter': {\n", + " 'conf': {\n", + " 'min': 40.0\n", + " }\n", + " },\n", + " 'some_task': etc...\n", + "}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Return mean Dataframe:\n", + "\n", + " asset returns\n", + "0 93 0.241380\n", + "1 165 0.000700\n", + "2 239 0.010021\n", + "3 281 -0.088465\n", + "4 592 0.619716\n", + "... ... ...\n", + "4995 869589 0.001337\n", + "4996 869590 0.009657\n", + "4997 869592 0.001202\n", + "4998 869597 -0.003332\n", + "4999 869599 0.003291\n", + "\n", + "[5000 rows x 2 columns]\n" + ] + } + ], + "source": [ + "replace = {'stock_data': {'load': True},\n", + " 'average_return': {'save': True}}\n", + "\n", + "\n", + "(return_mean_df, ) = task_graph.run(outputs=['average_return.stock_out'], replace=replace)\n", + "\n", + "print('Return mean Dataframe:\\n')\n", + "print(return_mean_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we might want to load the `return_mean_df` from the saved file and evaluate only tasks that we are interested in.\n", + "\n", + "In the cells below, we compare different load approaches:\n", + "- in-memory,\n", + "- from disk, \n", + "- and not loading at all.\n", + "\n", + "When working interactively, or in situations requiring iterative and explorative task graphs, a significant amount of time is saved by just re-loading the data that do not require to be recalculated." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using in-memory dataframes for load:\n", + "CPU times: user 183 ms, sys: 88.8 ms, total: 272 ms\n", + "Wall time: 281 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "print('Using in-memory dataframes for load:')\n", + "\n", + "replace = {'stock_data': {'load': {\n", + " 'cudf_out': csv_data_df\n", + " }},\n", + " 'average return': {'load': \n", + " {'stock_out': return_mean_df}}\n", + " }\n", + "\n", + "_ = task_graph.run(outputs=['output_csv2.df_out'], replace=replace)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using cached dataframes on disk for load:\n", + "CPU times: user 2.97 s, sys: 932 ms, total: 3.9 s\n", + "Wall time: 3.88 s\n" + ] + } + ], + "source": [ + "%%time\n", + "print('Using cached dataframes on disk for load:')\n", + "\n", + "replace = {'stock_data': {'load': True},\n", + " 'average return': {'load': True}}\n", + "\n", + "_ = task_graph.run(outputs=['output_csv2.df_out'], replace=replace)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Re-running dataframes calculations instead of using load:\n", + "CPU times: user 2.94 s, sys: 989 ms, total: 3.93 s\n", + "Wall time: 3.89 s\n" + ] + } + ], + "source": [ + "%%time\n", + "print('Re-running dataframes calculations instead of using load:')\n", + "\n", + "replace = {'stock_data': {'load': True}}\n", + "\n", + "_ = task_graph.run(outputs=['output_csv2.df_out'], replace=replace)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An idiomatic way to save data, if not on disk, or load data, if present on disk, is demonstrated below." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 3.04 s, sys: 892 ms, total: 3.93 s\n", + "Wall time: 3.92 s\n" + ] + } + ], + "source": [ + "%%time\n", + "import os\n", + "\n", + "loadsave_csv_data = 'load' if os.path.isfile('./.cache/stock_data.hdf5') else 'save'\n", + "loadsave_return_mean = 'load' if os.path.isfile('./.cache/average_return.hdf5') else 'save'\n", + "\n", + "replace = {'stock_data': {loadsave_csv_data: True},\n", + " 'average_return': {loadsave_return_mean: True}}\n", + "\n", + "_ = task_graph.run(outputs=['output_csv2.df_out'], replace=replace)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Delete temporary files\n", + "\n", + "A few cells above, we generated a .yaml file containing the example task graph, and also a couple of CSV files.\n", + "\n", + "Let's keep our directory clean, and delete them." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "%%bash -s \"$task_graph_file_name\" \"$csv_average_return\" \"$csv_average_volume\" \n", + "rm -f $1 $2 $3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "---\n", + "\n", + "## Node class example\n", + "\n", + "Implementing custom nodes in gQuant is very straighforward.\n", + "\n", + "Data scientists only need to override five methods in the parent class `Node`:\n", + "- `init`\n", + "- `meta_setup`\n", + "- `ports_setup`\n", + "- `conf_schema`\n", + "- `process`\n", + "\n", + "`init` method is usually used to define the required column names\n", + "\n", + "`ports_setup` defines the input and output ports for the node\n", + "\n", + "`meta_setup` method is used to calculate the output meta name and types.\n", + "\n", + "`conf_schema` method is used to define the JSON schema for the node conf so the client can generate the proper UI for it.\n", + "\n", + "`process` method takes input dataframes and computes the output dataframe. \n", + "\n", + "In this way, dataframes are strongly typed, and errors can be detected early before the time-consuming computation happens.\n", + "\n", + "Below, it can be observed `ValueFilterNode` implementation details:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "class ValueFilterNode(_PortTypesMixin, Node):\n", + "\n", + " def init(self):\n", + " _PortTypesMixin.init(self)\n", + "\n", + " def meta_setup(self):\n", + " cols_required = {\"asset\": \"int64\"}\n", + " return _PortTypesMixin.meta_setup(self, required=cols_required)\n", + "\n", + " def ports_setup(self):\n", + " return _PortTypesMixin.ports_setup(self)\n", + "\n", + " def conf_schema(self):\n", + " json = {\n", + " \"title\": \"Value Filter Node configure\",\n", + " \"type\": \"array\",\n", + " \"description\": \"\"\"Filter the dataframe based on a list of\n", + " min/max values.\"\"\",\n", + " \"items\": {\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"column\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"dataframe column to be filered on\"\n", + " },\n", + " \"min\": {\n", + " \"type\": \"number\",\n", + " \"description\": \"min value, inclusive\"\n", + " },\n", + " \"max\": {\n", + " \"type\": \"number\",\n", + " \"description\": \"max value, inclusive\"\n", + " }\n", + " }\n", + " }\n", + " }\n", + " ui = {}\n", + " input_meta = self.get_input_meta()\n", + " if self.INPUT_PORT_NAME in input_meta:\n", + " col_from_inport = input_meta[self.INPUT_PORT_NAME]\n", + " enums = [col for col in col_from_inport.keys()]\n", + " json['items']['properties']['column']['enum'] = enums\n", + " return ConfSchema(json=json, ui=ui)\n", + " else:\n", + " return ConfSchema(json=json, ui=ui)\n", + "\n", + " def process(self, inputs):\n", + " \"\"\"\n", + " filter the dataframe based on a list of min/max values. The node's\n", + " conf is a list of column criteria. It defines the column name in\n", + " 'column`, the min value in `min` and the max value in `max`.\n", + "\n", + " Arguments\n", + " -------\n", + " inputs: list\n", + " list of input dataframes.\n", + " Returns\n", + " -------\n", + " dataframe\n", + " \"\"\"\n", + "\n", + " input_df = inputs[self.INPUT_PORT_NAME]\n", + " str_list = []\n", + " for column_item in self.conf:\n", + " column_name = column_item['column']\n", + " if 'min' in column_item:\n", + " minValue = column_item['min']\n", + " str_item = '%s >= %f' % (column_name, minValue)\n", + " str_list.append(str_item)\n", + " if 'max' in column_item:\n", + " maxValue = column_item['max']\n", + " str_item = '%s <= %f' % (column_name, maxValue)\n", + " str_list.append(str_item)\n", + " input_df = input_df.query(\" and \".join(str_list))\n", + " return {self.OUTPUT_PORT_NAME: input_df}\n", + "\n" + ] + } + ], + "source": [ + "import inspect\n", + "from gquant_rapids_plugin.transform import ValueFilterNode\n", + "\n", + "print(inspect.getsource(ValueFilterNode))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'status': 'ok', 'restart': True}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import IPython\n", + "app = IPython.Application.instance()\n", + "app.kernel.do_shutdown(True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/gQuant/plugins/rapids_plugin/notebooks/02_single_stock_trade.ipynb b/gQuant/plugins/rapids_plugin/notebooks/02_single_stock_trade.ipynb new file mode 100644 index 00000000..6b115e9f --- /dev/null +++ b/gQuant/plugins/rapids_plugin/notebooks/02_single_stock_trade.ipynb @@ -0,0 +1,383 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### gQuant Tutorial\n", + "First import all the necessary modules." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys; sys.path.insert(0, '..')\n", + "import os\n", + "import warnings\n", + "import ipywidgets as widgets\n", + "from gquant.dataframe_flow import TaskGraph\n", + "\n", + "warnings.simplefilter(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset is already present. No need to re-download it.\n" + ] + } + ], + "source": [ + "! ((test ! -f './data/stock_price_hist.csv.gz' || test ! -f './data/security_master.csv.gz') && \\\n", + " cd .. && bash download_data.sh) || echo \"Dataset is already present. No need to re-download it.\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this tutorial, we are going to use gQuant to do a simple quant job. The task is fully described in a yaml file" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "- conf:\n", + " file: notebooks/data/stock_price_hist.csv.gz\n", + " id: stock_data\n", + " inputs: {}\n", + " module: gquant_rapids_plugin.dataloader\n", + " type: CsvStockLoader\n", + "- conf:\n", + " file: notebooks/data/security_master.csv.gz\n", + " id: stock_name\n", + " inputs: {}\n", + " module: gquant_rapids_plugin.dataloader\n", + " type: StockNameLoader\n", + "- conf:\n", + " asset: 4330\n", + " id: stock_selector\n", + " inputs:\n", + " name_map: stock_name.map_data\n", + " stock_in: stock_data.cudf_out\n", + " module: gquant_rapids_plugin.transform\n", + " type: AssetFilterNode\n", + "- conf: {}\n", + " id: ''\n", + " inputs:\n", + " in1: stock_selector.stock_name\n", + " in2: lineplot.lineplot\n", + " in3: barplot.barplot\n", + " in4: sharpe_ratio.sharpe_out\n", + " in5: cumulative_return.cum_return\n", + " in6: stock_data.cudf_out\n", + " module: rapids_modules\n", + " type: Output_Collector\n" + ] + } + ], + "source": [ + "!head -n 31 ../taskgraphs/simple_trade.gq.yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The yaml file is describing the computation task by a graph, we can visualize it" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "205d890c5eaa49f7b8c5130b97ef8980", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/simple_trade.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8a424b40940546e2931d8f13f3f2e74c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Tab(children=(Output(), Output(), Output(), Output(), Output(), Output(), Output(layout=Layout(border='1px sol…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph.run(formated=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We define a method to organize the output images" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_figures(result):\n", + " # format the figures\n", + " figure_width = '1200px'\n", + " figure_height = '400px'\n", + " bar_figure = result['barplot.barplot']\n", + " sharpe_number = result['sharpe_ratio.sharpe_out']\n", + " cum_return = result['cumulative_return.cum_return']\n", + " signals = result['lineplot.lineplot']\n", + " symbol = result['stock_selector.stock_name']\n", + "\n", + " bar_figure.layout.height = figure_height\n", + " bar_figure.layout.width = figure_width\n", + " cum_return.layout.height = figure_height\n", + " cum_return.layout.width = figure_width\n", + " cum_return.title = 'P & L %.3f' % (sharpe_number)\n", + " bar_figure.marks[0].labels = [symbol]\n", + " cum_return.marks[0].labels = [symbol]\n", + " signals.layout.height = figure_height\n", + " signals.layout.width = figure_width\n", + " bar_figure.axes = [bar_figure.axes[1]]\n", + " cum_return.axes = [cum_return.axes[0]]\n", + " output = widgets.VBox([bar_figure, cum_return, signals])\n", + "\n", + " return output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rerun the graph and send the computation result to the `plot_figure` method" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "40e6288fcd354e9eb0870f2dbfbb8608", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Figure(axes=[Axis(label='Price', orientation='vertical', scale=LinearScale(max=38.13, min=-10.1…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "result = task_graph.run()\n", + "plot_figures(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can change the TaskGraph node parameters interatively and hit the run button to get the updated result. It can also be done programtically, E.g. change the mean reversion parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "df21e88386a2487a9f8ae6f9bbe5ac40", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Figure(axes=[Axis(label='Price', orientation='vertical', scale=LinearScale(max=38.13, min=-10.1…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "o = task_graph.run(\n", + " outputs=(list(result.get_keys())[0:]),\n", + " replace={'stock_data': {\"load\": {'cudf_out': result['stock_data.cudf_out']}},\n", + " 'mean_reversion': {'conf': {'fast': 1, 'slow': 10}}})\n", + "figure_combo = plot_figures(o)\n", + "figure_combo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since computation is accelerated in the GPU, we can do hyper-parameter search interatively, try to change the parameters of the `slow` and `fast` for the moving average and see if you can improve the result:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3e80a4f4282f4f19bf2efce27c378ff6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(HBox(children=(IntRangeSlider(value=(10, 30), continuous_update=False, description='MA:', max=6…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "para_selector = widgets.IntRangeSlider(value=[10, 30],\n", + " min=3,\n", + " max=60,\n", + " step=1,\n", + " description=\"MA:\",\n", + " disabled=False,\n", + " continuous_update=False,\n", + " orientation='horizontal',\n", + " readout=True)\n", + "\n", + "\n", + "def para_selection(*stocks):\n", + " with out:\n", + " print('run')\n", + " para1 = para_selector.value[0]\n", + " para2 = para_selector.value[1]\n", + " o = task_graph.run(\n", + " outputs=(list(result.get_keys())[0:]),\n", + " replace={'stock_data': {\"load\": {'cudf_out': result['stock_data.cudf_out']}},\n", + " 'mean_reversion': {'conf': {'fast': para1, 'slow': para2}}})\n", + " figure_combo = plot_figures(o)\n", + " if (len(w.children) < 2):\n", + " w.children = (w.children[0], figure_combo,)\n", + " else:\n", + " w.children[1].children[1].marks = figure_combo.children[1].marks\n", + " w.children[1].children[2].marks = figure_combo.children[2].marks\n", + " w.children[1].children[1].title = 'P & L %.3f' % (o['sharpe_ratio.sharpe_out'])\n", + "\n", + "\n", + "out = widgets.Output(layout={'border': '1px solid black'})\n", + "para_selector.observe(para_selection, 'value')\n", + "selectors = widgets.HBox([para_selector])\n", + "w = widgets.VBox([selectors])\n", + "w" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'status': 'ok', 'restart': True}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import IPython\n", + "app = IPython.Application.instance()\n", + "app.kernel.do_shutdown(True)" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/03_simple_dask_example.ipynb b/gQuant/plugins/rapids_plugin/notebooks/03_simple_dask_example.ipynb similarity index 84% rename from notebooks/03_simple_dask_example.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/03_simple_dask_example.ipynb index 39075e61..05b12a78 100644 --- a/notebooks/03_simple_dask_example.ipynb +++ b/gQuant/plugins/rapids_plugin/notebooks/03_simple_dask_example.ipynb @@ -23,7 +23,7 @@ "\n", "

Client

\n", "\n", "\n", @@ -39,7 +39,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -125,7 +125,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ee56162705ff4c4eb031c6fb5a84a2d3", + "model_id": "2d409afaf9ec46cd9d09af299b89be84", "version_major": 2, "version_minor": 0 }, @@ -158,7 +158,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d0203b59aba643e8957e62354d2eb697", + "model_id": "ac85f4fd74e748adac67769fb68c29d3", "version_major": 2, "version_minor": 0 }, @@ -191,14 +191,14 @@ { "data": { "text/plain": [ - "['/home/quant/gQuant/notebooks/many-small/0.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/1.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/2.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/3.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/4.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/5.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/6.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/7.csv']" + "['/home/yi/Projects/demo_gquant_install/plugins/rapids_plugin/notebooks/many-small/0.csv',\n", + " '/home/yi/Projects/demo_gquant_install/plugins/rapids_plugin/notebooks/many-small/1.csv',\n", + " '/home/yi/Projects/demo_gquant_install/plugins/rapids_plugin/notebooks/many-small/2.csv',\n", + " '/home/yi/Projects/demo_gquant_install/plugins/rapids_plugin/notebooks/many-small/3.csv',\n", + " '/home/yi/Projects/demo_gquant_install/plugins/rapids_plugin/notebooks/many-small/4.csv',\n", + " '/home/yi/Projects/demo_gquant_install/plugins/rapids_plugin/notebooks/many-small/5.csv',\n", + " '/home/yi/Projects/demo_gquant_install/plugins/rapids_plugin/notebooks/many-small/6.csv',\n", + " '/home/yi/Projects/demo_gquant_install/plugins/rapids_plugin/notebooks/many-small/7.csv']" ] }, "execution_count": 6, @@ -224,41 +224,41 @@ "name": "stdout", "output_type": "stream", "text": [ - "- id: stock_data\n", - " type: CsvStockLoader\n", - " conf:\n", - " file: /home/quant/gQuant/notebooks/data/stock_price_hist.csv.gz\n", - " path: /home/quant/gQuant/notebooks/many-small\n", + "- conf:\n", + " file: notebooks/data/stock_price_hist.csv.gz\n", + " path: notebooks/many-small\n", + " id: stock_data\n", " inputs: {}\n", - " module: rapids_modules\n", - "- id: sort_node\n", - " type: SortNode\n", - " conf:\n", + " module: gquant_rapids_plugin.dataloader\n", + " type: CsvStockLoader\n", + "- conf:\n", " keys:\n", - " - asset\n", - " - datetime\n", + " - asset\n", + " - datetime\n", + " id: sort_node\n", " inputs:\n", " in: stock_data.dask_cudf_out\n", - " module: rapids_modules\n", - "- id: \"\"\n", - " type: Output_Collector\n", - " conf: {}\n", + " module: gquant_rapids_plugin.transform\n", + " type: SortNode\n", + "- conf: {}\n", + " id: ''\n", " inputs:\n", " in1: output_csv.df_out\n", - "- id: average_volume\n", - " type: AverageNode\n", - " conf:\n", + " type: Output_Collector\n", + "- conf:\n", " column: volume\n", + " id: average_volume\n", " inputs:\n", " stock_in: sort_node.out\n", - " module: rapids_modules\n", - "- id: output_csv\n", - " type: OutCsvNode\n", - " conf:\n", - " path: /home/quant/gQuant/notebooks/dask_average_volume.csv\n", + " module: gquant_rapids_plugin.transform\n", + " type: AverageNode\n", + "- conf:\n", + " path: notebooks/dask_average_volume.csv\n", + " id: output_csv\n", " inputs:\n", " df_in: average_volume.stock_out\n", - " module: rapids_modules\n" + " module: gquant_rapids_plugin.analysis\n", + " type: OutCsvNode\n" ] } ], @@ -274,7 +274,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "745c2373d88a4faeb29affdeea9c0184", + "model_id": "a6ff3dc1c1b84e13b42dc199059e77d5", "version_major": 2, "version_minor": 0 }, @@ -300,16 +300,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "id:stock_data process time:0.018s\n", - "id:average_volume process time:0.318s\n", - "id:output_csv process time:0.344s\n", + "id:stock_data process time:0.020s\n", + "id:average_volume process time:0.185s\n", + "id:output_csv process time:0.276s\n", "\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4fd773d9f1ef4263bcb3424f144adf3e", + "model_id": "64b0bdf3bc584f6f93fc8c21afcdb6e3", "version_major": 2, "version_minor": 0 }, @@ -480,6 +480,13 @@ "app.kernel.do_shutdown(True)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -504,7 +511,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/gQuant/plugins/rapids_plugin/notebooks/04_portfolio_trade.ipynb b/gQuant/plugins/rapids_plugin/notebooks/04_portfolio_trade.ipynb new file mode 100644 index 00000000..02d430c6 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/notebooks/04_portfolio_trade.ipynb @@ -0,0 +1,1070 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# gQuant - Making Quantitative Analysis Faster\n", + "\n", + "## Background\n", + "By definition, **Quantitative Finance** is the use of mathematical models and large datasets to analyze financial markets and securities, requiring massive computation to extract insight from the data. \n", + "\n", + "Many data science toolkits have been developed to help data scientists to manipulate the data. It starts with scalar number computations at the beginning. Later, the development of [Numpy](https://www.numpy.org) library helps to operate the numbers at vectors, and the popular [Pandas](https://pandas.pydata.org) library operates at a dataframe level. Manipulating data at a high level brings productivity gain for data scientists in quantitative finance.\n", + "\n", + "However, the amount of collected data is increasing exponentially over time. Also, more and more machine learning and statistical models are being developed. As a result, data scientists are facing new challenges hard to deal with traditional data science libraries.\n", + "\n", + "It is very time-consuming for CPUs to crunch massive amount of data and compute the complicated data science models. Large data set requires distributed computation, which is too complicated for data scientists to adopt.\n", + "\n", + "As a consequence, the quantitative workflow has become more complicated than ever. It integrates massive data from different sources, requiring multiple iterations to obtain significative results. \n", + "\n", + "**gQuant** has been developed to address all these challenges by organizing dataframes into graphs. It introduces the idea of **dataframe-flow**, which manipulates dataframes at graph level. An **acyclic directed graph** is defined, where the nodes are dataframe processors and the edges are the directions of passing resulting dataframes.\n", + "\n", + "With a graph approach, quant's workflow is described at a high level, letting quant analysts address the complicated workflow challenge.\n", + "\n", + "It is GPU-accelerated by leveraging [RAPIDS.ai](https://rapids.ai) technology and has **Multi-GPU and Multi-Node support**.\n", + "\n", + "We can get orders of magnitude performance boosts compared to CPU. gQuant dataframe-flow is **dataframe agnostic**, and can flow:\n", + "- Pandas dataframe, computed in the CPU.\n", + "- cuDF dataframe, computed in the GPU and producing the same result but much faster.\n", + "- dask_cuDF dataframe, being the computation automatically executed on multiple nodes and multiple GPUs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Download example datasets\n", + "\n", + "Before getting started, let's download the example datasets if not present." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset is already present. No need to re-download it.\n" + ] + } + ], + "source": [ + "! ((test ! -f './data/stock_price_hist.csv.gz' || test ! -f './data/security_master.csv.gz') && \\\n", + " cd .. && bash download_data.sh) || echo \"Dataset is already present. No need to re-download it.\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prepare for running in Dask environment\n", + "\n", + "Let's start the Dask local cluster environment for distributed computation.\n", + "\n", + "Dask provides a web-based dashboard to help to track progress, identify performance issues, and debug failures. To learn more about Dask dashboard, just follow this [link](https://distributed.dask.org/en/latest/web.html).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

Client

\n", + "\n", + "
\n", + "

Cluster

\n", + "
    \n", + "
  • Workers: 2
  • \n", + "
  • Cores: 2
  • \n", + "
  • Memory: 100.00 GB
  • \n", + "
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Start the Dask local cluster environment for distrubuted computation\n", + "from dask_cuda import LocalCUDACluster\n", + "from dask.distributed import Client\n", + "\n", + "cluster = LocalCUDACluster()\n", + "client = Client(cluster)\n", + "client\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Though our stock dataset is small enough to fit in a single 16G GPU, to show how to do distributed computation, we will split the dataframe into small pieces to be loaded by different workers in the cluster.\n", + "\n", + "Notice this step is need only if the dataset is not split in multiple files yet.\n", + "\n", + "First use this simple taskgraph to load data then sort it by the asset id and datatime:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "61924f0cdef24365b2086fdafc7b5acb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys; sys.path.insert(0, '..')\n", + "from gquant.dataframe_flow import TaskGraph\n", + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/sort_stocks.gq.yaml')\n", + "input_cached, = task_graph.run()\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "convert the sorted stock data into partitions and save it into csv files. Note, the data is slited in a way that the same asset belongs to the same partition" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['/home/yi/Projects/demo_gquant_install/notebooks/many-small/0.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/1.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/2.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/3.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/4.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/5.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/6.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/7.csv']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import dask.dataframe as dd\n", + "import os\n", + "num_partitions = 8\n", + "\n", + "os.makedirs('many-small', exist_ok=True)\n", + "dd.from_pandas(input_cached.set_index('asset'), npartitions=num_partitions).reset_index().to_csv('many-small/*.csv', index=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The toy example\n", + "In this notebook, we will use a simple toy example to show how easy it is to accelerate the quant workflow in the GPU.\n", + "\n", + "To mimic the end-to-end quantitative analyst task, we are going to backtest a simple mean reversion trading strategy.\n", + "\n", + "The workflow can be divided into two steps. You can follow with me with an empty gQuant widget to build the TaskGraph:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1684faac504943b287881bfe436fd78c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox())" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "task_graph = TaskGraph()\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Preprocess the dataset to remove bad points and add return feature\n", + "\n", + "\n", + "1. Load the 5000 end-of-day stocks CSV data into the dataframe and add rate of return feature to the dataframe.\n", + "\n", + "\n", + "2. Compute the average volume, min/max returns for each of the stocks\n", + "\n", + "\n", + "3. Merge the features into one dataframe, clean up the data by removing low volume stocks and extreme rate of returns stocks.\n", + "\n", + "\n", + "4. Create a composite node for this preprocess task\n", + "\n", + "\n", + "### Apply simple mean reversion algorithm and run backtest\n", + "\n", + "1. Clean up the nodes for the backtest\n", + "\n", + "\n", + "2. Compute the slow and fast exponential moving average and compute the trading signal based on it. Run backtesting and compute the returns from this strategy for each of the days and stock symbols. Run a simple portfolio optimization by averaging the stocks together for each of the trading days. Compute the sharpe ratio and cumulative return results.\n", + "\n", + "\n", + "3. Change the `slow`, `fast` parameters for the trading stratiges and re-run the backtest\n", + "\n", + "\n", + "4. Switch to run the backtest in a distributed environment by Dask\n", + "\n", + "\n", + "5. As a reference, switch to run the backtest in a CPU environment by Pandas\n", + "\n", + "\n", + "The whole workflow is organized into a TaskGraph file, which is described in a **gq.yaml** file.\n", + "\n", + "The same taskgraphs are saved in the `taskgraphs` directories. The whole workflow can be organized into a computation graph, which is described in a **yaml** file. \n", + "\n", + "Here is snippet of the yaml file:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "- conf:\n", + " file: notebooks/data/stock_price_hist.csv.gz\n", + " path: notebooks/many-small\n", + " id: stock_data\n", + " inputs: {}\n", + " module: gquant_rapids_plugin.dataloader\n", + " type: CsvStockLoader\n", + "- conf:\n", + " input:\n", + " - sort_node.in\n", + " output:\n", + " - drop_columns.out\n", + " subnode_ids:\n", + " - value_filter\n", + " subnodes_conf:\n", + " value_filter:\n", + " conf:\n", + " - column: min_return\n", + "...\n" + ] + } + ], + "source": [ + "!head -n 18 ../taskgraphs/portfolio_trade.gq.yaml\n", + "print(\"...\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Lode the preprocess TaskGraph by `load_taskgraph` command" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c91e0a7be3bf4e69973965709e5eff9d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/preprocess.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lode the whole TaskGraph by `load_taskgraph` command" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6ce4096ee9dd4ec78d929077650a9899", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/portfolio_trade.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Running this toy example in a Dask distributed environment is super easy, as gQuant operates at dataframe level.\n", + "\n", + "We just need to swap cuDF dataframes to **dask_cuDF** dataframes. Try to connect the `preprocess` node to the `Dask dataframe` output port in the `stock data` node.\n", + "\n", + "Similarly, to see how fast the GPU acceleration is, we can swtich to CPU computation environment by connecting to the `Pandas dataframe` output port.\n", + "\n", + "## Benchmarks\n", + "\n", + "While running this notebook, we have obtained the following results:\n", + "\n", + "- 181.00 seconds to run in CPU (Intel(R) Xeon(R) CPU E5-2698 v4 @ 2.20GHz).\n", + "- 9.06 seconds to run in GPU (NVIDIA v100).\n", + "\n", + "We get ~20x speed up by using GPU and GPU dataframes, compared to CPU and CPU dataframes.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## GQuant Task Node \n", + "\n", + "Each node is composed of:\n", + "- a unique id,\n", + "- a node type, \n", + "- configuration parameters\n", + "- from zero to many input nodes ids.\n", + "\n", + "gQuant's `load_taskgraph` takes this yaml file, and wires it into a graph.\n", + "\n", + "gQuant implementation includes some common nodes, useful for quantitative finance. With the help of [Numba](https://numba.pydata.org) library, we have implemented more than 30 technical indicators used in computing trading signals. All of them computed in the GPU.\n", + "\n", + "However, gQuant's goal is not to be comprehensive for quant applications. It provides a framework that is easy for anyone to implement his own nodes in the gQuant.\n", + "\n", + "\n", + "Data scientists only need to override five methods in the parent class `Node`:\n", + "- `init`\n", + "- `meta_setup`\n", + "- `ports_setup`\n", + "- `conf_schema`\n", + "- `process`\n", + "\n", + "`init` method is usually used to define the required column names\n", + "\n", + "`ports_setup` defines the input and output ports for the node\n", + "\n", + "`meta_setup` method is used to calculate the output meta name and types.\n", + "\n", + "`conf_schema` method is used to define the JSON schema for the node conf so the client can generate the proper UI for it.\n", + "\n", + "`process` method takes input dataframes and computes the output dataframe. \n", + "\n", + "In this way, dataframes are strongly typed, and errors can be detected early before the time-consuming computation happens.\n", + "\n", + "Here is the code example for implementing `MaxNode`, which is to compute the maximum value for a specified column in the dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "from gquant.dataframe_flow import Node\n", + "from gquant_rapids_plugin._port_type_node import _PortTypesMixin\n", + "from gquant.dataframe_flow.portsSpecSchema import ConfSchema\n", + "\n", + "\n", + "class MaxNode(Node, _PortTypesMixin):\n", + "\n", + " def init(self):\n", + " _PortTypesMixin.init(self)\n", + " self.INPUT_PORT_NAME = 'in'\n", + " self.OUTPUT_PORT_NAME = 'out'\n", + "\n", + " def ports_setup(self):\n", + " return _PortTypesMixin.ports_setup(self)\n", + "\n", + " def conf_schema(self):\n", + " json = {\n", + " \"title\": \"Maximum Value Node configure\",\n", + " \"type\": \"object\",\n", + " \"description\": \"Compute the maximum value of the key column\",\n", + " \"properties\": {\n", + " \"column\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"column to calculate the maximum value\"\n", + " }\n", + " },\n", + " \"required\": [\"column\"],\n", + " }\n", + " input_meta = self.get_input_meta()\n", + " if self.INPUT_PORT_NAME in input_meta:\n", + " col_from_inport = input_meta[self.INPUT_PORT_NAME]\n", + " enums = [col for col in col_from_inport.keys()]\n", + " json['properties']['column']['enum'] = enums\n", + " ui = {}\n", + " return ConfSchema(json=json, ui=ui)\n", + " else:\n", + " ui = {\n", + " \"column\": {\"ui:widget\": \"text\"}\n", + " }\n", + " return ConfSchema(json=json, ui=ui)\n", + "\n", + " def process(self, inputs):\n", + " \"\"\"\n", + " Compute the maximum value of the key column which is defined in the\n", + " `column` of the node's conf\n", + "\n", + " Arguments\n", + " -------\n", + " inputs: list\n", + " list of input dataframes.\n", + " Returns\n", + " -------\n", + " dataframe\n", + " \"\"\"\n", + " input_df = inputs[self.INPUT_PORT_NAME]\n", + " max_column = self.conf['column']\n", + " volume_df = input_df[[max_column,\n", + " \"asset\"]].groupby([\"asset\"]).max().reset_index()\n", + " volume_df.columns = ['asset', max_column]\n", + " return {self.OUTPUT_PORT_NAME: volume_df}\n", + "\n", + " def meta_setup(self):\n", + " cols_required = {\"asset\": \"int64\"}\n", + " if 'column' in self.conf:\n", + " retention = {self.conf['column']: \"float64\",\n", + " \"asset\": \"int64\"}\n", + " return _PortTypesMixin.retention_meta_setup(self,\n", + " retention,\n", + " required=cols_required)\n", + " else:\n", + " retention = {\"asset\": \"int64\"}\n", + " return _PortTypesMixin.retention_meta_setup(self,\n", + " retention,\n", + " required=cols_required)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In case that there is no direct dataframe method for a particular logic, a Numba GPU kernel can be used to implement it. Some examples of customized GPU kernels in Numba can be found [here](https://github.com/rapidsai/gQuant/blob/master/notebooks/05_customize_nodes.ipynb).\n", + "\n", + "If we use customized GPU kernel functions inside the `process` method to process the dataframe instead of _normal_ dataframe API functions calls, we need to add `self.delayed_process = True` in the `meta_setup` method to let gQuant handle the dask graph integration problem. If we use _normal_ dataframe API functions inside the `process` method, nothing needs to be done as `self.delayed_process = False` by default.bgQuant automatically handles the complication of including a customized GPU kernel node into the Dask computation graph.\n", + "\n", + "Note, we set `self.delayed_process = True` for the `SortNode`. So th sort is performed at the Dask data partition level instead of sorting it globally. This has a benefits of guranteeing the sortting doens't pollute the data partition allocation, as sometimes we want to make sure the data partition remain the same during the distributed computation. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the TaskGraph programmatically\n", + "\n", + "\n", + "To run the TaskGraph programmatically , we can specifiy a list of output ports to the TaskGraph `run` method. The `profile` flag can be used to see the computation time spent on each of the nodes:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:stock_data process time:4.120s\n", + "id:preprocess process time:0.879s\n", + "id:sort_after process time:0.055s\n", + "id:exp_mean_reversion process time:0.796s\n", + "id:backtest process time:0.001s\n", + "id:portfolio_opt process time:0.012s\n", + "id:sharpe_ratio process time:0.001s\n", + "id:cumulative_return process time:0.016s\n" + ] + } + ], + "source": [ + "import warnings; warnings.simplefilter(\"ignore\")\n", + "\n", + "o_gpu = task_graph.run(\n", + " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return','stock_data.cudf_out', 'preprocess.drop_columns@out'], profile=True)\n", + "gpu_strategy_cached = o_gpu['preprocess.drop_columns@out'] \n", + "gpu_input_cached = o_gpu['stock_data.cudf_out'] " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`o_gpu` will contain the outputs of four nodes: `sharpe_ratio`, `cumlative_return`, `stock_data`, `preprocess`.\n", + "\n", + "Similarly, the output from `stock_data` and `preprocess` nodes will be cached stored in `gpu_input_cached` and `strategy_cached` variables for later use. \n", + "\n", + "We can check how many of the stocks are filtered out by preprocessing steps:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5052 stocks in original dataset.\n", + "1558 stocks remaining after filtering.\n" + ] + } + ], + "source": [ + "print(\"{} stocks in original dataset.\".format(len(gpu_input_cached['asset'].unique())))\n", + "print(\"{} stocks remaining after filtering.\".format(len(gpu_strategy_cached['asset'].unique())))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result can be shown in IPython Rich display by turnning on the `formatted` flag:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ca90df245c254e4ba78ae8ac9bd404ed", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Tab(children=(Output(), Output(), Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph.run(\n", + " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return','preprocess.drop_columns@out'], formated=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This toy strategy gets a Sharpe ratio 0.338 without considering the transaction cost. Nice! \n", + "\n", + "[bqplot](https://github.com/bloomberg/bqplot) library is used to visualize the backtesting results in the JupyterLab notebooks. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dc0336888fa940d4903d91ce87244888", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side='left'), Axis(l…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# define the function to format the plots\n", + "def plot_figures(outputs):\n", + " # format the figures\n", + " figure_width = '1200px'\n", + " figure_height = '400px'\n", + " sharpe_number = outputs[0]\n", + " cum_return = outputs[1]\n", + " cum_return.layout.height = figure_height\n", + " cum_return.layout.width = figure_width\n", + " cum_return.title = 'P & L %.3f' % (sharpe_number)\n", + " return cum_return\n", + "\n", + "plot_figures(o_gpu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "gQuant TaskGraph can be evaluated by overwritting any of the Node's parameters. E.g. we can change the parameters to filter out the stocks:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Define some constants for the data filters.\n", + "# If using a GPU of 32G memory, you can safely \n", + "# set the `min_volume` to 5.0\n", + "min_volume = 10.0\n", + "min_rate = -10.0\n", + "max_rate = 10.0" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:stock_data process time:4.021s\n", + "id:preprocess process time:0.702s\n", + "id:sort_after process time:0.130s\n", + "id:exp_mean_reversion process time:0.079s\n", + "id:backtest process time:0.003s\n", + "id:portfolio_opt process time:0.017s\n", + "id:sharpe_ratio process time:0.001s\n", + "id:cumulative_return process time:0.015s\n", + "5052 stocks in original dataset.\n", + "4405 stocks remaining after filtering.\n", + "CPU times: user 4.82 s, sys: 725 ms, total: 5.54 s\n", + "Wall time: 5.36 s\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4227850521c94892a4fe3c2b94183811", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis(label='Time', …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%time\n", + "o_gpu = task_graph.run(\n", + " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return', 'stock_data.cudf_out', 'preprocess.drop_columns@out'], \n", + " replace={'preprocess': {\"conf\": {\n", + " \"subnodes_conf\": {\n", + " \"value_filter\": {\n", + " \"conf\": [{\"column\": \"average_volume\", \"min\": min_volume},\n", + " {\"column\": \"max_return\", \"max\": max_rate},\n", + " {\"column\": \"min_return\", \"min\": min_rate}]\n", + " }\n", + " },\n", + " \"taskgraph\": \"taskgraphs/preprocess.gq.yaml\",\n", + " \"input\": [\"sort_node.in\"],\n", + " \"output\": [\"drop_columns.out\"]\n", + " }}\n", + " }, profile=True)\n", + "\n", + "gpu_input_cached = o_gpu['stock_data.cudf_out'] \n", + "gpu_strategy_cached = o_gpu['preprocess.drop_columns@out'] \n", + "print(\"{} stocks in original dataset.\".format(len(gpu_input_cached['asset'].unique())))\n", + "print(\"{} stocks remaining after filtering.\".format(len(gpu_strategy_cached['asset'].unique())))\n", + "plot_figures(o_gpu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the example above, `preprocess` node is a composite node that use a seperate TaskGraph as input and output. Any of the node inside the composite node TaskGraph configuration can be overridden as shown in the example. We change the `filter_value` node configuration inside the composite node to filter out the stocks that are not suitable for backtesting. It will discard stocks according to the values stored in `min_volume`, `min_rate`, and `max_rate` variables.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we are going to compare the performance difference between CPU and GPU. The same computation graph can be used to flow the CPU Pandas dataframe with one change that\n", + "the preprocess node need to get input from the Pandas dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:stock_data process time:64.310s\n", + "id:preprocess process time:22.999s\n", + "id:sort_after process time:1.303s\n", + "id:exp_mean_reversion process time:6.645s\n", + "id:backtest process time:0.043s\n", + "id:portfolio_opt process time:0.448s\n", + "id:sharpe_ratio process time:0.001s\n", + "id:cumulative_return process time:0.014s\n", + "CPU times: user 1min 23s, sys: 14.5 s, total: 1min 38s\n", + "Wall time: 1min 35s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "o_cpu = task_graph.run(\n", + " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return'], \n", + " replace={'preprocess': {\"inputs\": {\"sort_node@in\": \"stock_data.pandas_out\"}}}, profile=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8e2c4dadba0148d5b9294a42ec0689a3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side='left'), Axis(l…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_figures(o_cpu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It produces the same result as the single GPU version but a lot slower.\n", + "\n", + "While running this notebook, we have obtained the following results:\n", + "\n", + "- 181.00 seconds to run in CPU (Intel(R) Xeon(R) CPU E5-2698 v4 @ 2.20GHz).\n", + "- 9.06 seconds to run in GPU (NVIDIA v100).\n", + "\n", + "We get ~20x speed up by using GPU and GPU dataframes, compared to CPU and CPU dataframes.\n", + "\n", + "Note, the input nodes load the dataframes from the cache variables to save the disk IO time." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The distributed computation is turned on by changing the preprocess node's input dataframe to dask dataframe: " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:stock_data process time:0.115s\n", + "id:preprocess process time:7.280s\n", + "id:backtest process time:0.013s\n", + "id:portfolio_opt process time:0.036s\n", + "id:sharpe_ratio process time:0.328s\n", + "id:cumulative_return process time:0.353s\n", + "CPU times: user 3.85 s, sys: 377 ms, total: 4.22 s\n", + "Wall time: 14.4 s\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "abf0fa6953074fad9f9bd7e7fa08872a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis(label='Time', …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%time\n", + "o_dask = task_graph.run(\n", + " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return'], \n", + " replace={'preprocess': {\"inputs\": {\"sort_node@in\": \"stock_data.dask_cudf_out\"}}}, profile=True)\n", + "plot_figures(o_dask)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, it produces the same results. However, the performance is not better than in the single GPU scenarios.\n", + "\n", + "Distributed computation only makes sense if we have a very large dataset that cannot be fit into one GPU.\n", + "\n", + "In this example, the dataset is small enough to be loaded into a single GPU. The between-GPU communication overhead dominates in the computation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Strategy parameter search\n", + "Quantitative analysts often need to explore different parameters for their trading strategy.\n", + "\n", + "gQuant speeds up this iterative exploration process by using cached dataframes and sub-graphs evaluation.\n", + "\n", + "To find the optimal parameters for this toy mean reversion strategy, we only need the dataframe from `sort_2` node, which is cached in the `gpu_strategy_cached` variable.\n", + "\n", + "Because the GPU computation is so fast, we can make the parameter exploration interactive in the JupyterLab notebook:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "30f5d401388b40648ce422e3973f4d9f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(HBox(children=(IntRangeSlider(value=(10, 30), continuous_update=False, description='MA:', max=6…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import ipywidgets as widgets\n", + "\n", + "para_selector = widgets.IntRangeSlider(value=[10, 30],\n", + " min=3,\n", + " max=60,\n", + " step=1,\n", + " description=\"MA:\",\n", + " disabled=False,\n", + " continuous_update=False,\n", + " orientation='horizontal',\n", + " readout=True)\n", + "\n", + "\n", + "def para_selection(*stocks):\n", + " with out:\n", + " para1 = para_selector.value[0]\n", + " para2 = para_selector.value[1]\n", + " o = task_graph.run(\n", + " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return'],\n", + " replace={'exp_mean_reversion': {'conf': {'fast': para1,\n", + " 'slow': para2}},\n", + " 'preprocess': {\"load\": {\"drop_columns@out\": gpu_strategy_cached},\n", + " \"conf\": {\n", + " \"subnodes_conf\": {\n", + " \"value_filter\": {\n", + " \"conf\": [{\"column\": \"average_volume\", \"min\": min_volume},\n", + " {\"column\": \"max_return\", \"max\": max_rate},\n", + " {\"column\": \"min_return\", \"min\": min_rate}]\n", + " }\n", + " },\n", + " \"taskgraph\": \"taskgraphs/preprocess.gq.yaml\",\n", + " \"input\": [\"sort_node.in\"],\n", + " \"output\": [\"drop_columns.out\"]\n", + " }}})\n", + "\n", + " figure_combo = plot_figures(o)\n", + " w.children = (w.children[0], figure_combo,)\n", + "\n", + "\n", + "out = widgets.Output(layout={'border': '1px solid black'})\n", + "para_selector.observe(para_selection, 'value')\n", + "selectors = widgets.HBox([para_selector])\n", + "w = widgets.VBox([selectors])\n", + "w" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2b093c4f26244fdf831e4b1507dec36a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output(layout=Layout(border='1px solid black'))" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "out" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'status': 'ok', 'restart': True}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import IPython\n", + "app = IPython.Application.instance()\n", + "app.kernel.do_shutdown(True)" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/gQuant/plugins/rapids_plugin/notebooks/05_customize_nodes_with_ports.ipynb b/gQuant/plugins/rapids_plugin/notebooks/05_customize_nodes_with_ports.ipynb new file mode 100644 index 00000000..45578aa8 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/notebooks/05_customize_nodes_with_ports.ipynb @@ -0,0 +1,1842 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Customize your own GPU Kernels in gQuant\n", + "\n", + "The gQuant is designed to accelerate quantitive finance workflows on the GPU. The acceleration on GPU is facilitated by using cuDF dataframes organized into a computation graph. The cuDF project is a continously evolving library that provides a pandas-like API. Sometimes the data scientists are facing a few challenges that cannot be easily solved:\n", + "\n", + " 1. The quantitative work needs customized logic to manipulate the data, and there are no direct methods within cuDF to support this logic.\n", + " 2. Each cuDF dataframe method call launches the GPU kernel once. For performance crtical task, it is sometimes required to wrap lots of computation steps together in a single GPU kernel to reduce the kernel launch overheads.\n", + "\n", + "The solution is to build customized GPU kernels to implement them. The code and examples below illustrate a variety of approaches to implement customized GPU kernels in Python." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys; sys.path.insert(0, '..')\n", + "# Load necessary Python modules\n", + "import sys\n", + "from gquant.dataframe_flow import TaskSpecSchema, TaskGraph, MetaData\n", + "from gquant.dataframe_flow import Node, NodePorts, PortsSpecSchema\n", + "from gquant.dataframe_flow import ConfSchema\n", + "import cudf\n", + "import numpy as np\n", + "from numba import cuda\n", + "import cupy\n", + "import math\n", + "import dask\n", + "import dask_cudf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define a utility function to verify the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def verify(ground_truth, computed):\n", + " max_difference = (ground_truth - computed).abs().max()\n", + " # print('Max Difference: {}'.format(max_difference))\n", + " assert(max_difference < 1e-8)\n", + " return max_difference" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "task_graph = TaskGraph()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example Problem: Calculating the distance of points to the origin\n", + "\n", + "The sample problem is to take a list of points in 2-D space and compute their distance to the origin.\n", + "We start by creating a source `Node` in the graph that generates a cuDF dataframe containing some configurable number of random points. A custom node is defined by inheriting from the `Node` class and overriding methods `init`, `meta_setup`, `ports_setup`, `conf_schema`, `process`.\n", + "\n", + "The `ports_setup` must return an instance of `NodePorts` which encapsulates the ports specs. Ports specs are dictionaries with port attributes/options per `PortsSpecSchema`.\n", + "\n", + "In the case of the `PointNode` below the input port is an empty dictionary, since no inputs are required, and the output has two ports `points_df_out` and `points_ddf_out`. It can output two types of dataframe frames depends who connects it.\n", + "\n", + "The `process` method receives a input dictionary where keys are input ports and values are input data. It return a dictionary where the keys correspond to the output ports. \n", + "\n", + "The `meta_setup` is used to compute the output meta information. It returns a dictionary where keys correspond to the output ports.\n", + "\n", + "The `conf_schema` is used to define the Node configuration [JSON schema](https://json-schema.org/). gQuantlab UI uses [RJSF](https://github.com/rjsf-team/react-jsonschema-form) project to generate HTML form elements based on the JSON schema. [RJSF playground](https://rjsf-team.github.io/react-jsonschema-form/) is a good place to learn how to write JSON schema and visualize it. `conf_schema` returns `ConfSchema` which encapsulate the JSON schema and UI schema together.\n", + "\n", + "The `column` and `port_types` information sometimes are determined dynamically. gQuant provides a few utility functions to help get dynamical graph information. `self.get_connected_inports()` will return a dictionay where keys are connected inport names and values are inport types. \n", + "`self.get_input_meta()` will return a dictionary where keys are connected inport names and values are column name/type paris from the parent node. `self.outport_connected(port_name)` method returns a boolean if the output port `port_name` is connected. The `PointNode` uses it to determine what kind of computation it needs to do depending on the connection." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "class PointNode(Node):\n", + "\n", + " def ports_setup(self):\n", + " input_ports = {}\n", + " output_ports = {\n", + " 'points_df_out': {\n", + " PortsSpecSchema.port_type: cudf.DataFrame\n", + " },\n", + " 'points_ddf_out': {\n", + " PortsSpecSchema.port_type: dask_cudf.DataFrame\n", + " },\n", + " }\n", + " return NodePorts(inports=input_ports, outports=output_ports)\n", + "\n", + " def conf_schema(self):\n", + " json = {\n", + " \"title\": \"PointNode configure\",\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"npts\": {\n", + " \"type\": \"number\",\n", + " \"description\": \"number of data points\",\n", + " \"minimum\": 10\n", + " },\n", + " \"npartitions\": {\n", + " \"type\": \"number\",\n", + " \"description\": \"num of partitions in the Dask dataframe\",\n", + " \"minimum\": 1\n", + " }\n", + "\n", + " },\n", + " \"required\": [\"npts\", \"npartitions\"],\n", + " }\n", + "\n", + " ui = {\n", + " \"npts\": {\"ui:widget\": \"updown\"},\n", + " \"npartitions\": {\"ui:widget\": \"updown\"}\n", + " }\n", + " return ConfSchema(json=json, ui=ui)\n", + "\n", + " def init(self):\n", + " pass\n", + " \n", + " def meta_setup(self):\n", + " columns_out = {\n", + " 'points_df_out': {\n", + " 'x': 'float64',\n", + " 'y': 'float64'\n", + " },\n", + " 'points_ddf_out': {\n", + " 'x': 'float64',\n", + " 'y': 'float64'\n", + " }\n", + " }\n", + " return MetaData(inports={}, outports=columns_out)\n", + "\n", + " def process(self, inputs):\n", + " npts = self.conf['npts']\n", + " df = cudf.DataFrame()\n", + " df['x'] = np.random.rand(npts)\n", + " df['y'] = np.random.rand(npts)\n", + " output = {}\n", + " if self.outport_connected('points_df_out'):\n", + " output.update({'points_df_out': df})\n", + " if self.outport_connected('points_ddf_out'):\n", + " npartitions = self.conf['npartitions']\n", + " ddf = dask_cudf.from_cudf(df, npartitions=npartitions)\n", + " output.update({'points_ddf_out': ddf})\n", + " return output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The distance can be computed via cuDF methods. We define the `DistanceNode` to calculate the euclidean distance and add a `distance_cudf` column to the output dataframe. We will use that as the ground truth to compare and verify results later. Additionally, the distance node calculates absolute distance (Manhattan distance) in another output port. The compuation is done depending which output is connected.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class DistanceNode(Node):\n", + "\n", + " def ports_setup(self):\n", + " port_type = PortsSpecSchema.port_type\n", + " input_ports = {\n", + " 'points_df_in': {\n", + " port_type: [cudf.DataFrame, dask_cudf.DataFrame]\n", + " }\n", + " }\n", + "\n", + " output_ports = {\n", + " 'distance_df': {\n", + " port_type: [cudf.DataFrame, dask_cudf.DataFrame]\n", + " },\n", + " 'distance_abs_df': {\n", + " PortsSpecSchema.port_type: [cudf.DataFrame, dask_cudf.DataFrame]\n", + " }\n", + " }\n", + " input_connections = self.get_connected_inports()\n", + " if 'points_df_in' in input_connections:\n", + " types = input_connections['points_df_in']\n", + " # connected, use the types passed in from parent\n", + " return NodePorts(inports={'points_df_in': {port_type: types}},\n", + " outports={'distance_df': {port_type: types},\n", + " 'distance_abs_df': {port_type: types},\n", + " })\n", + " else:\n", + " return NodePorts(inports=input_ports, outports=output_ports)\n", + "\n", + " def conf_schema(self):\n", + " return ConfSchema()\n", + "\n", + " def init(self):\n", + " self.delayed_process = True\n", + "\n", + "\n", + " def meta_setup(self):\n", + " req_cols = {\n", + " 'x': 'float64',\n", + " 'y': 'float64'\n", + " }\n", + " required = {\n", + " 'points_df_in': req_cols,\n", + " }\n", + " input_meta = self.get_input_meta()\n", + " output_cols = ({\n", + " 'distance_df': {\n", + " 'distance_cudf': 'float64',\n", + " 'x': 'float64',\n", + " 'y': 'float64'\n", + " },\n", + " 'distance_abs_df': {\n", + " 'distance_abs_cudf': 'float64',\n", + " 'x': 'float64',\n", + " 'y': 'float64'\n", + " }\n", + " })\n", + " if 'points_df_in' in input_meta:\n", + " col_from_inport = input_meta['points_df_in']\n", + " # additional ports\n", + " output_cols['distance_df'].update(col_from_inport)\n", + " output_cols['distance_abs_df'].update(col_from_inport)\n", + " return MetaData(inports=required, outports=output_cols)\n", + "\n", + " def process(self, inputs):\n", + " df = inputs['points_df_in']\n", + " output = {}\n", + " if self.outport_connected('distance_df'):\n", + " copy_df = df.copy()\n", + " copy_df['distance_cudf'] = (df['x'] ** 2 + df['y'] ** 2).sqrt()\n", + " output.update({'distance_df': copy_df})\n", + " if self.outport_connected('distance_abs_df'):\n", + " copy_df = df.copy()\n", + " copy_df['distance_abs_cudf'] = df['x'].abs() + df['y'].abs()\n", + " output.update({'distance_abs_df': copy_df})\n", + " return output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Having these two nodes, we can construct a simple task graph to compute the distance." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Task specifications.\n", + "module_name = 'custom_nodes'\n", + "\n", + "points_tspec = {\n", + " TaskSpecSchema.task_id: 'points_task',\n", + " TaskSpecSchema.node_type: PointNode,\n", + " TaskSpecSchema.conf: {'npts': 1000},\n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {},\n", + "}\n", + "\n", + "cudf_distance_tspec = {\n", + " TaskSpecSchema.task_id: 'distance_by_cudf',\n", + " TaskSpecSchema.node_type: DistanceNode,\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'points_task.points_df_out'\n", + " }\n", + "}\n", + "\n", + "out_spec = {\n", + " TaskSpecSchema.task_id: '',\n", + " TaskSpecSchema.node_type: \"Output_Collector\",\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.inputs: {\n", + " 'in0': 'points_task.points_df_out',\n", + " 'in1': 'distance_by_cudf.distance_df',\n", + " 'in2': 'distance_by_cudf.distance_abs_df'\n", + " }\n", + "}\n", + "\n", + "task_list = [points_tspec, cudf_distance_tspec, out_spec]\n", + "task_graph = TaskGraph(task_list)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can draw the graph in an interactive widget. First, let's register the dynamically defined gQuant nodes so the client knows about them. Note, this step is only needed if we would like to interact with gQuant by Jupyterlab UI. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3a1e2a3eb1394ce3bcab13db4daf6ec9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox())" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "TaskGraph.register_lab_node(module_name, PointNode)\n", + "TaskGraph.register_lab_node(module_name, DistanceNode)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Draw the widget:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "85fd29bfb68c4dcdabf1b5fe2aa604be", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next step is to run the task graph to obtain the distances. The output is identified by the `id` of the distance node:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "119fc64a511742dfb9b2db98ed120971", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Tab(children=(Output(), Output(), Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "r = task_graph.run()\n", + "points_df = r['points_task.points_df_out']\n", + "task_graph.run(formated=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Customized Kernel with Numba library\n", + "\n", + "Numba is an excellent python library used for accelerating numerical computations. Numba supports CUDA GPU programming by directly compiling a restricted subset of Python code into CUDA kernels and device functions. The Numba GPU kernel is written in Python and translated (JIT just-in-time compiled) into GPU code at runtime. This is achieved by decorating a Python function with `@cuda.jit`. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Just like a C/C++ CUDA GPU kernel, the `distance_kernel` function is called by thousands of threads in the GPU. The thread id is computed by `threadIdx.x`, `blockId.x` and `blockDim.x` built-in variables. Please check the [CUDA programming guild](https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#thread-hierarchy) for details." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A cuDF series can be converted to GPU arrays compatible with the Numba library via.to_gpu_array` API. The next step is to define a Node that calls this Numba kernel to compute the distance and save the result into `distance_numba` column in the output dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import cupy\n", + "@cuda.jit\n", + "def distance_kernel(x, y, distance, array_len):\n", + " # ii - overall thread index\n", + " ii = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x\n", + " if ii < array_len:\n", + " distance[ii] = math.sqrt(x[ii] ** 2 + y[ii] ** 2)\n", + "\n", + "\n", + "class NumbaDistanceNode(Node):\n", + "\n", + " def ports_setup(self):\n", + " port_type = PortsSpecSchema.port_type\n", + " input_ports = {\n", + " 'points_df_in': {\n", + " port_type: [cudf.DataFrame,\n", + " dask_cudf.DataFrame]\n", + " }\n", + " }\n", + "\n", + " output_ports = {\n", + " 'distance_df': {\n", + " port_type: [cudf.DataFrame,\n", + " dask_cudf.DataFrame]\n", + " }\n", + " }\n", + "\n", + " input_connections = self.get_connected_inports()\n", + " if 'points_df_in' in input_connections:\n", + " types = input_connections['points_df_in']\n", + " # connected\n", + " return NodePorts(inports={'points_df_in': {port_type: types}},\n", + " outports={'distance_df': {port_type: types}})\n", + " else:\n", + " return NodePorts(inports=input_ports, outports=output_ports)\n", + " \n", + " def init(self):\n", + " self.delayed_process = True\n", + "\n", + "\n", + " def meta_setup(self,):\n", + " required_cols = {'x': 'float64',\n", + " 'y': 'float64'}\n", + " required = {\n", + " 'points_df_in': required_cols,\n", + " 'distance_df': required_cols\n", + " }\n", + " input_meta = self.get_input_meta()\n", + " output_cols = ({\n", + " 'distance_df': {\n", + " 'distance_numba': 'float64',\n", + " 'x': 'float64',\n", + " 'y': 'float64'\n", + " }\n", + " })\n", + " if 'points_df_in' in input_meta:\n", + " col_from_inport = input_meta['points_df_in']\n", + " # additional ports\n", + " output_cols['distance_df'].update(col_from_inport)\n", + " return MetaData(inports=required, outports=output_cols)\n", + "\n", + " def conf_schema(self):\n", + " return ConfSchema()\n", + "\n", + " def process(self, inputs):\n", + " df = inputs['points_df_in']\n", + " number_of_threads = 16\n", + " number_of_blocks = ((len(df) - 1) // number_of_threads) + 1\n", + " # Inits device array by setting 0 for each index.\n", + " darr = cuda.device_array(len(df))\n", + " distance_kernel[(number_of_blocks,), (number_of_threads,)](\n", + " df['x'],\n", + " df['y'],\n", + " darr,\n", + " len(df))\n", + " df['distance_numba'] = darr\n", + " return {'distance_df': df}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `self.delayed_process = True` flag in the `meta_setup` is necesary to enable the logic in the `Node` class for handling `dask_cudf` dataframes in order to use Dask (for distributed computation i.e. multi-gpu in examples later on). The `dask_cudf` dataframe does not support GPU customized kernels directly. The `to_delayed` and `from_delayed` low level interfaces of `dask_cudf` enable this support. The gQuant framework handles `dask_cudf` dataframes automatically under the hood when we set this flag." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Customized Kernel by CuPy library\n", + "\n", + "CuPy is an alternative to Numba. Numba JIT compiles Python code into GPU device code at runtime. There are some limitations in how Numba can be used as well as JIT compilation latency overhead. When a Python process calls a Numba GPU kernel for the first time Numba has to compile the Python code, and each time a new Python process is started the GPU kernel has to be recompiled. If advanced features of CUDA are needed and latency is important, CuPy is an alternative library that can be used to compile C/C++ CUDA code. CuPy caches the GPU device code on disk (default location `$(HOME)/.cupy/kernel_cache` which can be changed via `CUPY_CACHE_DIR` environment variable) thus eliminating compilation latency for subsequent Python processes.\n", + "\n", + "`CuPy` GPU kernel is esentially a C/C++ GPU kernel. Below we define the `compute_distance` kernel using `CuPy`:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using gQuant we can now define a Node that calls this CuPy kernel to compute the distance and save the results into `distance_cupy` column of a `cudf` dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "kernel_string = r'''\n", + " extern \"C\" __global__\n", + " void compute_distance(const double* x, const double* y,\n", + " double* distance, int arr_len) {\n", + " int tid = blockDim.x * blockIdx.x + threadIdx.x;\n", + " if (tid < arr_len){\n", + " distance[tid] = sqrt(x[tid]*x[tid] + y[tid]*y[tid]);\n", + " }\n", + " }\n", + "'''\n", + "\n", + "\n", + "class CupyDistanceNode(Node):\n", + "\n", + " def ports_setup(self):\n", + " port_type = PortsSpecSchema.port_type\n", + " input_ports = {\n", + " 'points_df_in': {\n", + " port_type: [cudf.DataFrame,\n", + " dask_cudf.DataFrame]\n", + " }\n", + " }\n", + "\n", + " output_ports = {\n", + " 'distance_df': {\n", + " port_type: [cudf.DataFrame,\n", + " dask_cudf.DataFrame]\n", + " }\n", + " }\n", + "\n", + " input_connections = self.get_connected_inports()\n", + " if 'points_df_in' in input_connections:\n", + " types = input_connections['points_df_in']\n", + " # connected\n", + " return NodePorts(inports={'points_df_in': {port_type: types}},\n", + " outports={'distance_df': {port_type: types}})\n", + " else:\n", + " return NodePorts(inports=input_ports, outports=output_ports)\n", + "\n", + " def init(self):\n", + " self.delayed_process = True\n", + "\n", + "\n", + " def meta_setup(self,):\n", + " cols_required = {'x': 'float64',\n", + " 'y': 'float64'}\n", + " required = {\n", + " 'points_df_in': cols_required,\n", + " 'distance_df': cols_required\n", + " }\n", + " input_meta = self.get_input_meta()\n", + " output_cols = ({\n", + " 'distance_df': {\n", + " 'distance_cupy': 'float64',\n", + " 'x': 'float64',\n", + " 'y': 'float64'\n", + " }\n", + " })\n", + " if 'points_df_in' in input_meta:\n", + " col_from_inport = input_meta['points_df_in']\n", + " # additional ports\n", + " output_cols['distance_df'].update(col_from_inport)\n", + " return MetaData(inports=required, outports=output_cols)\n", + "\n", + " def conf_schema(self):\n", + " return ConfSchema()\n", + "\n", + " def get_kernel(self):\n", + " raw_kernel = cupy.RawKernel(kernel_string, 'compute_distance')\n", + " return raw_kernel\n", + "\n", + " def process(self, inputs):\n", + " df = inputs['points_df_in']\n", + " cupy_x = cupy.asarray(df['x'])\n", + " cupy_y = cupy.asarray(df['y'])\n", + " number_of_threads = 16\n", + " number_of_blocks = (len(df) - 1) // number_of_threads + 1\n", + " dis = cupy.ndarray(len(df), dtype=cupy.float64)\n", + " self.get_kernel()((number_of_blocks,), (number_of_threads,),\n", + " (cupy_x, cupy_y, dis, len(df)))\n", + " df['distance_cupy'] = dis\n", + "\n", + " return {'distance_df': df}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `self.delayed_process = True` flag is added for the same reason as with `DistanceNumbaNode` i.e. to support `dask_cudf` data frames.\n", + "\n", + "Let's register these two added new nodes" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "TaskGraph.register_lab_node(module_name, NumbaDistanceNode)\n", + "TaskGraph.register_lab_node(module_name, CupyDistanceNode)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Computing using the Nodes with customized GPU kernels\n", + "\n", + "First we construct the computation graph for gQuant." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0b49a2e2b8d9437cabe925588839a29a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# For comparison to above re-use points dataframe instead\n", + "# of rand generating each time when running the task-graph.\n", + "\n", + "numba_distance_tspec = {\n", + " TaskSpecSchema.task_id: 'distance_by_numba',\n", + " TaskSpecSchema.node_type: NumbaDistanceNode,\n", + " TaskSpecSchema.conf: {}, \n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'points_task.points_df_out'\n", + " },\n", + "}\n", + "\n", + "cupy_distance_tspec = {\n", + " TaskSpecSchema.task_id: 'distance_by_cupy',\n", + " TaskSpecSchema.node_type: CupyDistanceNode,\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'points_task.points_df_out'\n", + " },\n", + "}\n", + "\n", + "out_spec = {\n", + " TaskSpecSchema.task_id: '',\n", + " TaskSpecSchema.node_type: \"Output_Collector\",\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.inputs: {\n", + " 'in0': 'distance_by_cudf.distance_df',\n", + " 'in1': 'distance_by_numba.distance_df',\n", + " 'in2': 'distance_by_cupy.distance_df'\n", + " }\n", + "}\n", + "\n", + "task_list = [\n", + " points_tspec,\n", + " cudf_distance_tspec,\n", + " numba_distance_tspec,\n", + " cupy_distance_tspec,\n", + " out_spec\n", + "]\n", + "task_graph = TaskGraph(task_list)\n", + "\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or, run it programmatically" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d4014aaf33944b86a6618a2d6ecc127e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Tab(children=(Output(), Output(), Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "out_list = [\n", + " 'distance_by_cudf.distance_df',\n", + " 'distance_by_numba.distance_df',\n", + " 'distance_by_cupy.distance_df'\n", + "]\n", + "cache_load = {\"points_task\": {\"load\": {'points_df_out': points_df}}}\n", + "(df_w_cudf, df_w_numba, df_w_cupy) = task_graph.run(out_list, replace=cache_load)\n", + "task_graph.run(out_list, replace=cache_load, formated=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `verify` function defined above to verify the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max Difference cudf to numba: 2.220446049250313e-16\n", + "Max Difference cudf to cupy: 2.220446049250313e-16\n" + ] + } + ], + "source": [ + "mdiff = verify(df_w_cudf['distance_cudf'], df_w_numba['distance_numba'])\n", + "print('Max Difference cudf to numba: {}'.format(mdiff))\n", + "mdiff = verify(df_w_cudf['distance_cudf'], df_w_cupy['distance_cupy'])\n", + "print('Max Difference cudf to cupy: {}'.format(mdiff))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To illustrate multi-input nodes let's create a verify node." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "class VerifyNode(Node):\n", + "\n", + " def ports_setup(self):\n", + " input_ports = {\n", + " 'df1': {\n", + " PortsSpecSchema.port_type: [cudf.DataFrame,\n", + " dask_cudf.DataFrame]\n", + " },\n", + " 'df2': {\n", + " PortsSpecSchema.port_type: [cudf.DataFrame,\n", + " dask_cudf.DataFrame]\n", + " }\n", + " }\n", + " output_ports = {\n", + " 'max_diff': {\n", + " PortsSpecSchema.port_type: float\n", + " }\n", + " }\n", + "\n", + " connections = self.get_connected_inports() \n", + " for key in input_ports:\n", + " if key in connections:\n", + " # connected\n", + " types = connections[key]\n", + " input_ports[key].update({PortsSpecSchema.port_type: types})\n", + " return NodePorts(inports=input_ports, outports=output_ports)\n", + "\n", + " def meta_setup(self):\n", + " required ={\n", + " \"df1\": {},\n", + " \"df2\": {}\n", + " }\n", + " return MetaData(inports=required, outports={'max_diff': {}})\n", + "\n", + " def conf_schema(self):\n", + " json = {\n", + " \"title\": \"VerifyNode configure\",\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"df1_col\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"dataframe1 column name\"\n", + " },\n", + " \"df2_col\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"dataframe2 column name\"\n", + " }\n", + " },\n", + " \"required\": [\"df1_col\", \"df2_col\"],\n", + " }\n", + "\n", + " ui = {\n", + " \"df1_col\": {\"ui:widget\": \"text\"},\n", + " \"df2_col\": {\"ui:widget\": \"text\"}\n", + " }\n", + " return ConfSchema(json=json, ui=ui)\n", + "\n", + " def process(self, inputs):\n", + " df1 = inputs['df1']\n", + " df2 = inputs['df2']\n", + " col_df1 = self.conf['df1_col']\n", + " col_df2 = self.conf['df2_col']\n", + "\n", + " df1_col = df1[col_df1]\n", + " if isinstance(df1, dask_cudf.DataFrame):\n", + " # df1_col = df1_col.compute()\n", + " pass\n", + "\n", + " df2_col = df2[col_df2]\n", + " if isinstance(df2, dask_cudf.DataFrame):\n", + " # df2_col = df2_col.compute()\n", + " pass\n", + "\n", + " max_difference = (df1_col - df2_col).abs().max()\n", + "\n", + " if isinstance(max_difference, dask.dataframe.core.Scalar):\n", + " max_difference = float(max_difference.compute())\n", + " max_difference = float(max_difference)\n", + " return {'max_diff': max_difference}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Register the `VerifyNode`:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "TaskGraph.register_lab_node(module_name, VerifyNode)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define the full Taskgraph:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ecb7023af0084c43b953f33c03a12cf0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "verify_tspec = {\n", + " TaskSpecSchema.task_id: 'verify_cudf_to_numba',\n", + " TaskSpecSchema.node_type: VerifyNode,\n", + " TaskSpecSchema.conf: {\n", + " 'df1_col': 'distance_cudf',\n", + " 'df2_col': 'distance_numba'\n", + " }, \n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {\n", + " 'df1': 'distance_by_cudf.distance_df',\n", + " 'df2': 'distance_by_numba.distance_df'\n", + " }\n", + "}\n", + "\n", + "verify_tspec2 = {\n", + " TaskSpecSchema.task_id: 'verify_cudf_to_cupy',\n", + " TaskSpecSchema.node_type: VerifyNode,\n", + " TaskSpecSchema.conf: {\n", + " 'df1_col': 'distance_cudf',\n", + " 'df2_col': 'distance_cupy'\n", + " },\n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {\n", + " 'df1': 'distance_by_cudf.distance_df',\n", + " 'df2': 'distance_by_cupy.distance_df'\n", + " }\n", + "}\n", + "out_spec = {\n", + " TaskSpecSchema.task_id: '',\n", + " TaskSpecSchema.node_type: \"Output_Collector\",\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.inputs: {\n", + " 'in0': 'verify_cudf_to_numba.max_diff',\n", + " 'in1': 'verify_cudf_to_cupy.max_diff'\n", + " }\n", + "}\n", + "\n", + "task_list = [\n", + " points_tspec,\n", + " cudf_distance_tspec,\n", + " numba_distance_tspec,\n", + " cupy_distance_tspec,\n", + " out_spec,\n", + " verify_tspec, \n", + " verify_tspec2\n", + "]\n", + "task_graph = TaskGraph(task_list)\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Max Difference cudf to numba: 2.220446049250313e-16\n", + "Max Difference cudf to cupy: 2.220446049250313e-16\n" + ] + } + ], + "source": [ + "(max_cudf_to_numba_diff, max_cudf_to_cupy_diff) = task_graph.run([\n", + " 'verify_cudf_to_numba.max_diff',\n", + " 'verify_cudf_to_cupy.max_diff'\n", + "])\n", + "print('Max Difference cudf to numba: {}'.format(max_cudf_to_numba_diff))\n", + "print('Max Difference cudf to cupy: {}'.format(max_cudf_to_cupy_diff))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dask distributed computation\n", + "\n", + "Using Dask and `dask-cudf` we can run the Nodes with customized GPU kernels on distributed dataframes. Under the hood of the `Node` class the Dask delayed processing API is handled for cudf dataframes when the `self.delayed_process = True` flag is set.\n", + "\n", + "We first start a distributed Dask environment. When a dask client is instantiated it registers itself as the default Dask scheduler (). Therefore all subsequent Dask distibuted dataframe operations will run in distributed fashion." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

Client

\n", + "\n", + "
\n", + "

Cluster

\n", + "
    \n", + "
  • Workers: 2
  • \n", + "
  • Cores: 2
  • \n", + "
  • Memory: 100.00 GB
  • \n", + "
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from dask_cuda import LocalCUDACluster\n", + "from dask.distributed import Client\n", + "\n", + "cluster = LocalCUDACluster()\n", + "client = Client(cluster)\n", + "client" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Dask status page can be displayed in a web browser at `:8787`. The ip-address corresponds to the machine where the dask cluster (scheduler) was launched. Most likely same ip-address as where this jupyter notebook is running. Using the Dask status page is convenient for monitoring dask distributed processing. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next step is to partition the `cudf` dataframe into a `dask_cudf` dataframe. Here we make the number of partitions corresponding to the number of workers:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "class DistributedNode(Node):\n", + "\n", + " def ports_setup(self):\n", + " input_ports = {\n", + " 'points_df_in': {\n", + " PortsSpecSchema.port_type: cudf.DataFrame\n", + " }\n", + " }\n", + "\n", + " output_ports = {\n", + " 'points_ddf_out': {\n", + " PortsSpecSchema.port_type: dask_cudf.DataFrame\n", + " }\n", + " }\n", + "\n", + " return NodePorts(inports=input_ports, outports=output_ports)\n", + "\n", + " def init(self):\n", + " pass\n", + "\n", + " def meta_setup(self,):\n", + " cols_required = {\n", + " 'x': 'float64',\n", + " 'y': 'float64'\n", + " }\n", + " required = {\n", + " 'points_df_in': cols_required,\n", + " 'points_ddf_out': cols_required\n", + " }\n", + " input_meta = self.get_input_meta()\n", + " output_cols = ({\n", + " 'points_ddf_out': {\n", + " 'x': 'float64',\n", + " 'y': 'float64'\n", + " }\n", + " })\n", + " if 'points_df_in' in input_meta:\n", + " col_from_inport = input_meta['points_df_in']\n", + " # additional ports\n", + " output_cols['points_ddf_out'].update(col_from_inport)\n", + " return MetaData(inports=required, outports=output_cols)\n", + "\n", + " def conf_schema(self):\n", + " json = {\n", + " \"title\": \"DistributedNode configure\",\n", + " \"type\": \"object\",\n", + " \"properties\": {\n", + " \"npartitions\": {\n", + " \"type\": \"number\",\n", + " \"description\": \"num of partitions in the Dask dataframe\",\n", + " \"minimum\": 1\n", + " }\n", + " },\n", + " \"required\": [\"npartitions\"],\n", + " }\n", + "\n", + " ui = {\n", + " \"npartitions\": {\"ui:widget\": \"updown\"}\n", + " }\n", + " return ConfSchema(json=json, ui=ui)\n", + "\n", + " def process(self, inputs):\n", + " npartitions = self.conf['npartitions']\n", + " df = inputs['points_df_in']\n", + " ddf = dask_cudf.from_cudf(df, npartitions=npartitions)\n", + " return {'points_ddf_out': ddf}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Register it:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "TaskGraph.register_lab_node(module_name, DistributedNode)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We add this distribution node to the computation graph to convert `cudf` dataframes into `dask-cudf` dataframes. The `dask-cudf` dataframes are handled automatically in gQuant when `self.delayed_process=True` within a `Node` implementation (setup in `meta_setup`). When using nodes with ports with `self.delayed_process=True` setting, it is required that all input and output ports be of type `cudf.DataFrame`. Otherwise don't set `self.delayed_process` and one can write custom logic to handle distributed dataframes (refer to `VerifyNode` abover for an example where `dask_cudf` dataframes are handled directly within the process method)." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "261bd245de244b109984bc369777f922", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "npartitions = len(client.scheduler_info()['workers'])\n", + "\n", + "\n", + "distribute_tspec = {\n", + " TaskSpecSchema.task_id: 'distributed_points',\n", + " TaskSpecSchema.node_type: DistributedNode,\n", + " TaskSpecSchema.conf: {'npartitions': npartitions},\n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'points_task.points_df_out'\n", + " }\n", + "}\n", + "\n", + "dask_cudf_distance_tspec = {\n", + " TaskSpecSchema.task_id: 'distance_by_cudf',\n", + " TaskSpecSchema.node_type: DistanceNode,\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'distributed_points.points_ddf_out'\n", + " }\n", + "}\n", + "\n", + "dask_numba_distance_tspec = {\n", + " TaskSpecSchema.task_id: 'distance_by_numba',\n", + " TaskSpecSchema.node_type: NumbaDistanceNode,\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'distributed_points.points_ddf_out'\n", + " }\n", + "}\n", + "\n", + "dask_cupy_distance_tspec = {\n", + " TaskSpecSchema.task_id: 'distance_by_cupy',\n", + " TaskSpecSchema.node_type: CupyDistanceNode,\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.module: module_name,\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'distributed_points.points_ddf_out'\n", + " }\n", + "}\n", + "\n", + "out_spec = {\n", + " TaskSpecSchema.task_id: '',\n", + " TaskSpecSchema.node_type: \"Output_Collector\",\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.inputs: {\n", + " 'in0': 'distributed_points.points_ddf_out',\n", + " 'in1': 'distance_by_cudf.distance_df',\n", + " 'in2': 'distance_by_numba.distance_df',\n", + " 'in3': 'distance_by_cupy.distance_df'\n", + " }\n", + "}\n", + "\n", + "\n", + "task_list = [\n", + " points_tspec,\n", + " distribute_tspec,\n", + " dask_cudf_distance_tspec,\n", + " dask_numba_distance_tspec,\n", + " dask_cupy_distance_tspec,\n", + " out_spec\n", + "]\n", + "\n", + "task_graph = TaskGraph(task_list)\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the distributed computation programmatically:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "out_list = [\n", + " 'distributed_points.points_ddf_out',\n", + " 'distance_by_cudf.distance_df',\n", + " 'distance_by_numba.distance_df',\n", + " 'distance_by_cupy.distance_df'\n", + "]\n", + "\n", + "(points_ddf, ddf_w_cudf, ddf_w_numba, ddf_w_cupy) = task_graph.run(out_list)\n", + "df_w_cudf = ddf_w_cudf.compute()\n", + "df_w_numba = ddf_w_numba.compute()\n", + "df_w_cupy = ddf_w_cupy.compute()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "261bd245de244b109984bc369777f922", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(cache={'nodes': [{'width': 110, 'id': 'points_task', 'type': 'PointNode', 'schema': {'title': 'Po…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "verify_cudf_numba_tspec = verify_tspec.copy()\n", + "verify_cudf_cupy_tspec = verify_tspec2.copy()\n", + "\n", + "task_graph.extend(\n", + " [verify_cudf_numba_tspec,\n", + " verify_cudf_cupy_tspec],\n", + " replace=True)\n", + "task_graph.draw()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Verify the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HEAD points_ddf:\n", + " x y\n", + "0 0.793239 0.794183\n", + "1 0.405215 0.753843\n", + "2 0.039310 0.076363\n", + "3 0.456579 0.369289\n", + "4 0.165980 0.383398\n", + "\n", + "HEAD df_w_cudf:\n", + " x y distance_cudf\n", + "0 0.793239 0.794183 1.122477\n", + "1 0.405215 0.753843 0.855849\n", + "2 0.039310 0.076363 0.085887\n", + "3 0.456579 0.369289 0.587230\n", + "4 0.165980 0.383398 0.417784\n", + "\n", + "HEAD df_w_numba:\n", + " x y distance_numba\n", + "0 0.793239 0.794183 1.122477\n", + "1 0.405215 0.753843 0.855849\n", + "2 0.039310 0.076363 0.085887\n", + "3 0.456579 0.369289 0.587230\n", + "4 0.165980 0.383398 0.417784\n", + "\n", + "HEAD df_w_cupy:\n", + " x y distance_cupy\n", + "0 0.793239 0.794183 1.122477\n", + "1 0.405215 0.753843 0.855849\n", + "2 0.039310 0.076363 0.085887\n", + "3 0.456579 0.369289 0.587230\n", + "4 0.165980 0.383398 0.417784\n", + "\n", + "Max Difference cudf to numba: 2.220446049250313e-16\n", + "Max Difference cudf to cupy: 2.220446049250313e-16\n" + ] + } + ], + "source": [ + "# Use results above and avoid re-running dask\n", + "replace_spec = {\n", + " 'distance_by_cudf': {\n", + " TaskSpecSchema.load: {\n", + " 'distance_df': ddf_w_cudf\n", + " }\n", + " },\n", + " 'distance_by_numba': {\n", + " TaskSpecSchema.load: {\n", + " 'distance_df': ddf_w_numba\n", + " }\n", + " },\n", + " 'distance_by_cupy': {\n", + " TaskSpecSchema.load: {\n", + " 'distance_df': ddf_w_cupy\n", + " }\n", + " }\n", + "}\n", + "\n", + "(max_cudf_to_numba_diff, max_cudf_to_cupy_diff) = task_graph.run(\n", + " ['verify_cudf_to_numba.max_diff',\n", + " 'verify_cudf_to_cupy.max_diff'],\n", + " replace=replace_spec\n", + ")\n", + "\n", + "print('HEAD points_ddf:\\n{}\\n'.format(points_ddf.head()))\n", + "print('HEAD df_w_cudf:\\n{}\\n'.format(ddf_w_cudf.head()))\n", + "print('HEAD df_w_numba:\\n{}\\n'.format(ddf_w_numba.head()))\n", + "print('HEAD df_w_cupy:\\n{}\\n'.format(ddf_w_cupy.head()))\n", + "print('Max Difference cudf to numba: {}'.format(max_cudf_to_numba_diff))\n", + "print('Max Difference cudf to cupy: {}'.format(max_cudf_to_cupy_diff))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One limitation to be aware of when using customized kernels within Nodes in the Dask environment, is that each GPU kernel works on one partition of the dataframe. Therefore if the computation depends on other partitions of the dataframe the approach above does not work." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Saving Custom Nodes and Kernels\n", + "\n", + "The gQuant examples already implement a number of `Nodes`. These can be found in `gquant.plugin_nodes` submodules.\n", + "\n", + "The customized kernels and nodes can be saved to your own python modules for future re-use instead of having to re-define them at runtime. The nodes we defined above were to a written to a python module \"custom_port_nodes.py\" (the `DistanceNode` was simplified to ommit the absolute distance calculation). We will re-run our workflow importing the Nodes from the custom module we wrote out.\n", + "\n", + "When defining the tasks we specify `filepath` for the path to the python module that has the Node definition. Notice, that the `node_type` is specified as a string instead of class. The string is the class name of the node that will be imported for running a task." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "340070cd3cf9451fbf61f19052b3d66c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from gquant.dataframe_flow.util import get_file_path\n", + "npartitions = len(client.scheduler_info()['workers'])\n", + "points_tspec = {\n", + " TaskSpecSchema.task_id: 'points_task',\n", + " TaskSpecSchema.node_type: 'PointNode',\n", + " TaskSpecSchema.filepath: get_file_path('notebooks/custom_port_nodes.py'),\n", + " TaskSpecSchema.conf: {'npts': 1000},\n", + " TaskSpecSchema.inputs: {},\n", + "}\n", + "\n", + "distribute_tspec = {\n", + " TaskSpecSchema.task_id: 'distributed_points',\n", + " TaskSpecSchema.node_type: 'DistributedNode',\n", + " TaskSpecSchema.filepath: get_file_path('notebooks/custom_port_nodes.py'),\n", + " TaskSpecSchema.conf: {'npartitions': npartitions},\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'points_task.points_df_out'\n", + " }\n", + "}\n", + "\n", + "dask_cudf_distance_tspec = {\n", + " TaskSpecSchema.task_id: 'distance_by_cudf',\n", + " TaskSpecSchema.node_type: 'DistanceNode',\n", + " TaskSpecSchema.filepath: get_file_path('notebooks/custom_port_nodes.py'),\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'distributed_points.points_ddf_out'\n", + " }\n", + "}\n", + "\n", + "dask_numba_distance_tspec = {\n", + " TaskSpecSchema.task_id: 'distance_by_numba',\n", + " TaskSpecSchema.node_type: 'NumbaDistanceNode',\n", + " TaskSpecSchema.filepath: get_file_path('notebooks/custom_port_nodes.py'),\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'distributed_points.points_ddf_out'\n", + " }\n", + "}\n", + "\n", + "dask_cupy_distance_tspec = {\n", + " TaskSpecSchema.task_id: 'distance_by_cupy',\n", + " TaskSpecSchema.node_type: 'CupyDistanceNode',\n", + " TaskSpecSchema.filepath: get_file_path('notebooks/custom_port_nodes.py'),\n", + " TaskSpecSchema.conf: {},\n", + " TaskSpecSchema.inputs: {\n", + " 'points_df_in': 'distributed_points.points_ddf_out'\n", + " }\n", + "}\n", + "\n", + "verify_cudf_to_numba_tspec = {\n", + " TaskSpecSchema.task_id: 'verify_cudf_to_numba',\n", + " TaskSpecSchema.node_type: 'VerifyNode',\n", + " TaskSpecSchema.filepath: get_file_path('notebooks/custom_port_nodes.py'),\n", + " TaskSpecSchema.conf: {\n", + " 'df1_col': 'distance_cudf',\n", + " 'df2_col': 'distance_numba'\n", + " }, \n", + " TaskSpecSchema.inputs: {\n", + " 'df1': 'distance_by_cudf.distance_df',\n", + " 'df2': 'distance_by_numba.distance_df'\n", + " }\n", + "}\n", + "\n", + "verify_cudf_to_cupy_tspec = {\n", + " TaskSpecSchema.task_id: 'verify_cudf_to_cupy',\n", + " TaskSpecSchema.node_type: 'VerifyNode',\n", + " TaskSpecSchema.filepath: get_file_path('notebooks/custom_port_nodes.py'),\n", + " TaskSpecSchema.conf: {\n", + " 'df1_col': 'distance_cudf',\n", + " 'df2_col': 'distance_cupy'\n", + " }, \n", + " TaskSpecSchema.inputs: {\n", + " 'df1': 'distance_by_cudf.distance_df',\n", + " 'df2': 'distance_by_cupy.distance_df'\n", + " }\n", + "}\n", + "\n", + "task_list = [\n", + " points_tspec,\n", + " distribute_tspec,\n", + " dask_cudf_distance_tspec,\n", + " dask_numba_distance_tspec,\n", + " dask_cupy_distance_tspec,\n", + " verify_cudf_to_numba_tspec,\n", + " verify_cudf_to_cupy_tspec\n", + "]\n", + "\n", + "task_graph = TaskGraph(task_list)\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HEAD df_w_cudf:\n", + " x y distance_cudf\n", + "0 0.729991 0.418487 0.841438\n", + "1 0.887041 0.875456 1.246301\n", + "2 0.763563 0.220629 0.794799\n", + "3 0.454909 0.976449 1.077217\n", + "4 0.108439 0.707618 0.715878\n", + "\n", + "HEAD df_w_numba:\n", + " x y distance_numba\n", + "0 0.729991 0.418487 0.841438\n", + "1 0.887041 0.875456 1.246301\n", + "2 0.763563 0.220629 0.794799\n", + "3 0.454909 0.976449 1.077217\n", + "4 0.108439 0.707618 0.715878\n", + "\n", + "HEAD df_w_cupy:\n", + " x y distance_cupy\n", + "0 0.729991 0.418487 0.841438\n", + "1 0.887041 0.875456 1.246301\n", + "2 0.763563 0.220629 0.794799\n", + "3 0.454909 0.976449 1.077217\n", + "4 0.108439 0.707618 0.715878\n", + "\n", + "Max Difference cudf to numba: 2.220446049250313e-16\n", + "Max Difference cudf to cupy: 2.220446049250313e-16\n" + ] + } + ], + "source": [ + "out_list = [\n", + " 'distance_by_cudf.distance_df',\n", + " 'distance_by_numba.distance_df',\n", + " 'distance_by_cupy.distance_df',\n", + " 'verify_cudf_to_numba.max_diff',\n", + " 'verify_cudf_to_cupy.max_diff'\n", + "]\n", + "\n", + "(ddf_w_cudf, ddf_w_numba, ddf_w_cupy,\n", + " mdiff_cudf_to_numba, mdiff_cudf_to_cupy) = task_graph.run(out_list)\n", + "\n", + "print('HEAD df_w_cudf:\\n{}\\n'.format(ddf_w_cudf.head()))\n", + "print('HEAD df_w_numba:\\n{}\\n'.format(ddf_w_numba.head()))\n", + "print('HEAD df_w_cupy:\\n{}\\n'.format(ddf_w_cupy.head()))\n", + "print('Max Difference cudf to numba: {}'.format(mdiff_cudf_to_numba))\n", + "print('Max Difference cudf to cupy: {}'.format(mdiff_cudf_to_cupy))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final illustration is how to save and load a task graph to a file for re-use." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "task_graph.save_taskgraph('custom_wflow.gq.yaml')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The gQuant TaskGraph file is created and saved. You can double click on it to open it up in the JupyterLab to edit it.\n", + "\n", + "Or you can display it by gQuant widget and play with it interactively " + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ab7d2484abe64998bcb17e69802f9a67", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph('custom_wflow.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course you can run it by callign `run` method." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "242b0b34d6b245f0a1b807d290bdc436", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Tab(children=(Output(), Output(), Output(), Output(), Output(), Output(layout=Layout(border='1px solid black')…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "# update npartitions in case the scheduler is running with\n", + "# different number of workers than what was saved.\n", + "npartitions = len(client.scheduler_info()['workers'])\n", + "replace_spec = {\n", + " 'distributed_points': {\n", + " TaskSpecSchema.conf: {'npartitions': npartitions},\n", + " }\n", + "}\n", + "\n", + "out_list = [\n", + " 'distance_by_cudf.distance_df',\n", + " 'distance_by_numba.distance_df',\n", + " 'distance_by_cupy.distance_df',\n", + " 'verify_cudf_to_numba.max_diff',\n", + " 'verify_cudf_to_cupy.max_diff'\n", + "]\n", + "\n", + "task_graph.run(out_list, replace=replace_spec, formated=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HEAD df_w_cudf:\n", + " x y distance_cudf\n", + "0 0.729991 0.418487 0.841438\n", + "1 0.887041 0.875456 1.246301\n", + "2 0.763563 0.220629 0.794799\n", + "3 0.454909 0.976449 1.077217\n", + "4 0.108439 0.707618 0.715878\n", + "\n", + "HEAD df_w_numba:\n", + " x y distance_numba\n", + "0 0.729991 0.418487 0.841438\n", + "1 0.887041 0.875456 1.246301\n", + "2 0.763563 0.220629 0.794799\n", + "3 0.454909 0.976449 1.077217\n", + "4 0.108439 0.707618 0.715878\n", + "\n", + "HEAD df_w_cupy:\n", + " x y distance_cupy\n", + "0 0.729991 0.418487 0.841438\n", + "1 0.887041 0.875456 1.246301\n", + "2 0.763563 0.220629 0.794799\n", + "3 0.454909 0.976449 1.077217\n", + "4 0.108439 0.707618 0.715878\n", + "\n" + ] + } + ], + "source": [ + "\n", + "print('HEAD df_w_cudf:\\n{}\\n'.format(ddf_w_cudf.head()))\n", + "print('HEAD df_w_numba:\\n{}\\n'.format(ddf_w_numba.head()))\n", + "print('HEAD df_w_cupy:\\n{}\\n'.format(ddf_w_cupy.head()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Conclusion\n", + "\n", + "Using customized GPU kernels allows data scientists to implement and incorporate advanced algorithms. We demonstrated implementations using Numba and CuPy.\n", + "\n", + "The Numba approach enables data scientists to write GPU kernels directly in the Python language. Numba is easy to use for implementing and accelerating computations. However there is some overhead incurred for compiling the kernels whenever the Numba GPU kernels are used for the first time in a Python process. Currently Numba library only supports primitive data types. Some advanced CUDA programming features, such as function pointers and function recursions are not supported. \n", + "\n", + "The Cupy method is very flexible, because data scientists are writing C/C++ GPU kernels with CUDA directly. All the CUDA programming features are supported. CuPy compiles the kernel and caches the device code to the filesystem. The launch overhead is low. Also, the GPU kernel is built statically resulting in runtime efficiency. However it might be harder for data scientists to use, because C/C++ programming is more complicated. \n", + "\n", + "Below is a brief summary comparison table:\n", + "\n", + "| Methods | Development Difficulty | Flexibility | Efficiency | Latency |\n", + "|---|---|---|---|---|\n", + "| Numba method | medium | medium | low | high |\n", + "| CuPy method | hard | high | high | low |\n", + "\n", + "We recommend that the data scientists select the approach appropriate for their task taking into consideration the efficiency, latency, difficulty and flexibility of their workflow. \n", + "\n", + "In this blog, we showed how to wrap the customized GPU kernels in gQuant nodes. Also, by taking advantage of having the gQuant handle the low-level Dask interfaces for the developer, we demonstrated how to use the gQuant workflow with Dask distributed computations." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# Clean up\n", + "\n", + "# Shutdown the Dask cluster\n", + "client.close()\n", + "cluster.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'status': 'ok', 'restart': True}" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import IPython\n", + "app = IPython.Application.instance()\n", + "app.kernel.do_shutdown(True)\n" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/gQuant/plugins/rapids_plugin/notebooks/06_xgboost_trade.ipynb b/gQuant/plugins/rapids_plugin/notebooks/06_xgboost_trade.ipynb new file mode 100644 index 00000000..0cf9083b --- /dev/null +++ b/gQuant/plugins/rapids_plugin/notebooks/06_xgboost_trade.ipynb @@ -0,0 +1,1193 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Trade with XGBoost algorithm\n", + "## Background\n", + "In the [portfolio trade example](https://github.com/rapidsai/gQuant/blob/master/notebooks/04_portfolio_trade.ipynb), we use gQuant to backtest a simple mean reversion trading strategy on 5000 stocks.\n", + "It shows decent performance by tweaking the moving average window size. Searching for alpha signal is the ultimate goal for the trading companies. A lot of different methods are used to do so. Machine learning approach\n", + "is one of those. It has the benefits of extracting important information in the data automatically given enough computation. There are a few popular machine learning algrithoms, including SVM, Random forest tree etc. Amoung those, XGBoost is known to be a very powerful machine \n", + "learning method that is winning a lot of [ML competitions](https://medium.com/syncedreview/tree-boosting-with-xgboost-why-does-xgboost-win-every-machine-learning-competition-ca8034c0b283). Luckily, the [RAPIDS library](https://github.com/rapidsai) accelerates the XGBoost ML algorithm in the GPU so that we can easily take advantage of it in the gQuant. \n", + "\n", + "In this notebook, we are going to demo how to use gQuant to backtest a XGBoost based trading stragty.\n", + "\n", + "\n", + "## Environment Preparation\n", + "\n", + "### Download the example Datasets\n", + "Before getting started, let's download the example datasets if not presen" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset is already present. No need to re-download it.\n" + ] + } + ], + "source": [ + "! ((test ! -f './data/stock_price_hist.csv.gz' || test ! -f './data/security_master.csv.gz') && \\\n", + " cd .. && bash download_data.sh) || echo \"Dataset is already present. No need to re-download it.\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prepare for running in Dask environment\n", + "\n", + "Let's start the Dask local cluster environment for distributed computation.\n", + "\n", + "Dask provides a web-based dashboard to help to track progress, identify performance issues, and debug failures. To learn more about Dask dashboard, just follow this [link](https://distributed.dask.org/en/latest/web.html).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

Client

\n", + "\n", + "
\n", + "

Cluster

\n", + "
    \n", + "
  • Workers: 2
  • \n", + "
  • Cores: 2
  • \n", + "
  • Memory: 100.00 GB
  • \n", + "
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Start the Dask local cluster environment for distrubuted computation\n", + "from dask_cuda import LocalCUDACluster\n", + "from dask.distributed import Client\n", + "\n", + "cluster = LocalCUDACluster()\n", + "client = Client(cluster)\n", + "client\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Though our stock dataset is small enough to fit in a single 16G GPU, to show how to do distributed computation, we will split the dataframe into small pieces to be loaded by different workers in the cluster.\n", + "\n", + "Notice this step is need only if the dataset is not split in multiple files yet.\n", + "\n", + "First use this simple taskgraph to load data then sort it by the asset id and datatime:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "970f1e4cbc3043bb990e0dcefaa6a01f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys; sys.path.insert(0, '..')\n", + "import warnings\n", + "from gquant.dataframe_flow import TaskGraph\n", + "import ipywidgets as widgets\n", + "import os\n", + "warnings.simplefilter(\"ignore\")\n", + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/sort_stocks.gq.yaml')\n", + "input_cached, = task_graph.run()\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "convert the sorted stock data into partitions and save it into csv files. Note, the data is slited in a way that the same asset belongs to the same partition" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['/home/yi/Projects/demo_gquant_install/notebooks/many-small/0.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/1.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/2.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/3.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/4.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/5.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/6.csv',\n", + " '/home/yi/Projects/demo_gquant_install/notebooks/many-small/7.csv']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import dask.dataframe as dd\n", + "import os\n", + "num_partitions = 8\n", + "\n", + "os.makedirs('many-small', exist_ok=True)\n", + "dd.from_pandas(input_cached.set_index('asset'), npartitions=num_partitions).reset_index().to_csv('many-small/*.csv', index=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note, this notebook requires `cudf` of version >=0.8.0. It can be checked by following command" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.17.0\n" + ] + } + ], + "source": [ + "import cudf\n", + "print(cudf.__version__)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The toy example\n", + "To mimic the end-to-end quantitative analyst task, we are going to backtest a XGBoost trading strategy. \n", + "\n", + "We will reuse the preprocessing steps as shown in the portfolio trade notebook example. \n", + "\n", + "The workflow includes following steps:\n", + "\n", + "1. Preprocess the datasets.\n", + "\n", + "4. Compute the features based on different technical indicators \n", + "\n", + "5. Split the data in training and testing and build a XGBoost model based on the training data. From the XGBoost model, compute the trading signals for all the data points.\n", + "\n", + "5. Run backtesting and compute the returns from this strategy for each of the days and stock symbols \n", + "\n", + "6. Run a simple portfolio optimization by averaging the stocks together for each of the trading days.\n", + "\n", + "7. Compute the sharpe ratio and cumulative return results for both training and testing datasets\n", + "\n", + "The whole workflow can be organized into a TaskGraph, which are fully described in a `.gq.yaml` file.\n", + "\n", + "Each nodes has a unique id, a node type, configuration parameters and input nodes ids. gQuant takes this yaml file, wires it into a graph to visualize it.\n", + "\n", + "First let's load the proprocess TaskGraph:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6eb535c0bcee4a3d8b92cdd41c991967", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/preprocess.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lode the whole TaskGraph by `load_taskgraph` command. Note the preprocess TaskGraph is included inside the `preprocess` `Composite Node`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "49e4668f4fdf4a5cb7656b4fe42b7fd0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/xgboost_trade.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The features used for XGBoost algorithm are prepared in the `xgboost` Task node, where `cuIndicator` module is used to compute the technical indicators in the GPU for all the stock symbols. `xgboost` is the Task node that is used to compute the trading signals from the stock technical indicators. Each of the gQuant Task node is implemented by overwriting `meta_setup`, `process`, `ports_setup`, `conf_chema` methods of the Node base class. Please refer to [customize nodes notebook](https://github.com/rapidsai/gQuant/blob/master/notebooks/05_customize_nodes.ipynb) for details. Following is the source code for \"XGBoostStrategyNode\":" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "class XGBoostStrategyNode(_PortTypesMixin, Node):\n", + " \"\"\"\n", + " This is the Node used to compute trading signal from XGBoost Strategy.\n", + " It requires the following conf fields:\n", + " \"train_date\": a date string of \"Y-m-d\" format. All the data points\n", + " before this date is considered as training, otherwise as testing. If\n", + " not provided, all the data points are considered as training.\n", + " \"xgboost_parameters\": a dictionary of any legal parameters for XGBoost\n", + " models. It overwrites the default parameters used in the process method\n", + " \"no_feature\": specifying a list of columns in the input dataframe that\n", + " should NOT be considered as training features.\n", + " \"target\": the column that is considered as \"target\" in machine learning\n", + " algorithm\n", + " It requires the \"datetime\" column for spliting the data points and adds a\n", + " new column \"signal\" to be used for backtesting.\n", + " The detailed computation steps are listed in the process method's docstring\n", + " \"\"\"\n", + "\n", + " def init(self):\n", + " _PortTypesMixin.init(self)\n", + " self.INPUT_PORT_NAME = 'stock_in'\n", + " self.OUTPUT_PORT_NAME = 'stock_out'\n", + "\n", + " def meta_setup(self):\n", + " # if 'no_feature' in self.conf:\n", + " # retention = self.conf['no_feature']\n", + " # else:\n", + " cols_required = {'datetime': 'date',\n", + " \"asset\": \"int64\"}\n", + " # self.delayed_process = True\n", + " required = {\n", + " self.INPUT_PORT_NAME: cols_required\n", + " }\n", + " retention = {}\n", + " retention['signal'] = 'float64'\n", + " # _PortTypesMixin.retention_meta_setup(self, retention)\n", + "\n", + " input_meta = self.get_input_meta()\n", + " if self.INPUT_PORT_NAME not in input_meta:\n", + " col_from_inport = required[self.INPUT_PORT_NAME]\n", + " else:\n", + " col_from_inport = input_meta[self.INPUT_PORT_NAME]\n", + " # delete the columns from the inputs\n", + " if 'no_feature' in self.conf:\n", + " for key in self.conf['no_feature']:\n", + " if key in col_from_inport:\n", + " retention[key] = col_from_inport[key]\n", + " metadata = MetaData(inports=required,\n", + " outports={self.OUTPUT_PORT_NAME: retention})\n", + " return metadata\n", + "\n", + " def ports_setup(self):\n", + " types = [cudf.DataFrame,\n", + " dask_cudf.DataFrame]\n", + " return _PortTypesMixin.ports_setup_from_types(self, types)\n", + "\n", + " def conf_schema(self):\n", + " json = {\n", + " \"title\": \"XGBoost Node configure\",\n", + " \"type\": \"object\",\n", + " \"description\": \"\"\"Split the data into training and testing based on\n", + " 'train_data', train a XGBoost model based on the training data,\n", + " make predictions for all the data points, compute the trading.\n", + " \"\"\",\n", + " \"properties\": {\n", + " \"num_of_rounds\": {\n", + " \"type\": \"number\",\n", + " \"description\": \"\"\"The number of rounds for boosting\"\"\",\n", + " \"default\": 100\n", + " },\n", + " \"train_date\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"\"\"the date to splite train and validation\n", + " dataset\"\"\"\n", + " },\n", + " \"target\": {\n", + " \"type\": \"string\",\n", + " \"description\": \"the column used as dependent variable\"\n", + " },\n", + " \"no_feature\": {\n", + " \"type\": \"array\",\n", + " \"items\": {\n", + " \"type\": \"string\",\n", + " },\n", + " \"description\": \"\"\"columns in the input dataframe that\n", + " should NOT be considered as training features.\"\"\"\n", + " },\n", + " \"xgboost_parameters\": {\n", + " \"type\": \"object\",\n", + " \"description\": \"xgoobst parameters\",\n", + " \"properties\": {\n", + " 'max_depth': {\n", + " \"type\": \"number\",\n", + " \"description\": \"Maximum depth of a tree.\",\n", + " \"default\": 8\n", + " },\n", + " \"max_leaves\": {\n", + " \"type\": \"number\",\n", + " \"description\": \"maximum number of tree leaves\",\n", + " \"default\": 2**8\n", + " },\n", + " \"gamma\": {\n", + " \"type\": \"number\",\n", + " \"description\": \"\"\"Minimum loss reduction required\n", + " to make a further partition on a leaf node of the\n", + " tree.\"\"\",\n", + " \"default\": 0\n", + " },\n", + " \"objective\": {\n", + " \"type\": \"string\",\n", + " \"enum\": [\"reg:squarederror\", \"reg:squaredlogerror\",\n", + " \"reg:logistic\", \"reg:pseudohubererror\"],\n", + " \"description\": \"\"\"Specify the learning task and\n", + " the corresponding learning objective.\"\"\",\n", + " \"default\": \"reg:squarederror\"\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"required\": [\"target\", \"num_of_rounds\"],\n", + " }\n", + " ui = {\n", + " \"train_date\": {\n", + " \"ui:widget\": \"alt-date\",\n", + " \"ui:options\": {\n", + " \"yearsRange\": [1985, 2025],\n", + " \"hideNowButton\": True,\n", + " \"hideClearButton\": True,\n", + " },\n", + " },\n", + " }\n", + " input_meta = self.get_input_meta()\n", + " if self.INPUT_PORT_NAME in input_meta:\n", + " col_from_inport = input_meta[self.INPUT_PORT_NAME]\n", + " enums = [col for col in col_from_inport.keys()]\n", + " json['properties']['no_feature']['items']['enum'] = enums\n", + " json['properties']['target']['enum'] = enums\n", + " return ConfSchema(json=json, ui=ui)\n", + " else:\n", + " return ConfSchema(json=json, ui=ui)\n", + "\n", + " def process(self, inputs):\n", + " \"\"\"\n", + " The process is doing following things:\n", + " 1. split the data into training and testing based on provided\n", + " conf['train_date']. If it is not provided, all the data is\n", + " treated as training data.\n", + " 2. train a XGBoost model based on the training data\n", + " 3. Make predictions for all the data points including training and\n", + " testing.\n", + " 4. From the prediction of returns, compute the trading signals that\n", + " can be used in the backtesting.\n", + " Arguments\n", + " -------\n", + " inputs: list\n", + " list of input dataframes.\n", + " Returns\n", + " -------\n", + " dataframe\n", + " \"\"\"\n", + " dxgb_params = {\n", + " 'max_depth': 8,\n", + " 'max_leaves': 2 ** 8,\n", + " 'tree_method': 'gpu_hist',\n", + " 'objective': 'reg:squarederror',\n", + " 'grow_policy': 'lossguide',\n", + " }\n", + " # num_of_rounds = 100\n", + " if 'xgboost_parameters' in self.conf:\n", + " dxgb_params.update(self.conf['xgboost_parameters'])\n", + " input_df = inputs[self.INPUT_PORT_NAME]\n", + " model_df = input_df\n", + " train_cols = set(model_df.columns) - set(\n", + " self.conf['no_feature'])\n", + " train_cols = list(train_cols - set([self.conf['target']]))\n", + "\n", + " if isinstance(input_df, dask_cudf.DataFrame):\n", + " # get the client\n", + " client = dask.distributed.client.default_client()\n", + " if 'train_date' in self.conf:\n", + " train_date = datetime.datetime.strptime(self.conf['train_date'], # noqa: F841, E501\n", + " '%Y-%m-%d')\n", + " model_df = model_df[model_df.datetime < train_date]\n", + " train = model_df[train_cols]\n", + " target = model_df[self.conf['target']]\n", + " dmatrix = xgb.dask.DaskDMatrix(client, train, label=target)\n", + " bst = xgb.dask.train(client, dxgb_params, dmatrix,\n", + " num_boost_round=self.conf[\"num_of_rounds\"])\n", + "\n", + " dtrain = xgb.dask.DaskDMatrix(client, input_df[train_cols])\n", + " prediction = xgb.dask.predict(client, bst, dtrain).persist()\n", + " pred_df = dask_cudf.from_dask_dataframe(\n", + " prediction.to_dask_dataframe())\n", + " pred_df.index = input_df.index\n", + " input_df['signal'] = pred_df\n", + " elif isinstance(input_df, cudf.DataFrame):\n", + " if 'train_date' in self.conf:\n", + " train_date = datetime.datetime.strptime(self.conf['train_date'], # noqa: F841, E501\n", + " '%Y-%m-%d')\n", + " model_df = model_df.query('datetime<@train_date')\n", + " train = model_df[train_cols]\n", + " target = model_df[self.conf['target']]\n", + " dmatrix = xgb.DMatrix(train, label=target)\n", + " bst = xgb.train(dxgb_params, dmatrix,\n", + " num_boost_round=self.conf[\"num_of_rounds\"])\n", + " infer_dmatrix = xgb.DMatrix(input_df[train_cols])\n", + " prediction = cudf.Series(bst.predict(infer_dmatrix),\n", + " nan_as_null=False,\n", + " index=input_df.index\n", + " ).astype('float64')\n", + " input_df['signal'] = prediction\n", + "\n", + " input_df['tmp'] = (input_df['asset'] -\n", + " input_df['asset'].shift(1)).fillna(1)\n", + " input_df['tmp'] = (input_df['tmp'] != 0).astype('int32')\n", + " tmp = input_df['tmp']\n", + " input_df['tmp'] = tmp.where(tmp != 1, None)\n", + " input_df = input_df.dropna(subset=['tmp'])\n", + " input_df = input_df.drop('tmp', axis=1)\n", + "\n", + " # convert the signal to trading action\n", + " # 1 is buy and -1 is sell\n", + " # It predicts the tomorrow's return (shift -1)\n", + " # We shift 1 for trading actions so that it acts on the second day\n", + " input_df['signal'] = ((\n", + " input_df['signal'] >= 0).astype('float') * 2 - 1).shift(1)\n", + "\n", + " # remove the bad datapints\n", + " input_df = input_df.dropna()\n", + " remaining = list(self.conf['no_feature']) + ['signal']\n", + " return {self.OUTPUT_PORT_NAME: input_df[remaining]}\n", + "\n" + ] + } + ], + "source": [ + "import inspect\n", + "from gquant_rapids_plugin.strategy import XGBoostStrategyNode\n", + "\n", + "print(inspect.getsource(XGBoostStrategyNode))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### XGBoost Trading Strategy Performance\n", + "Similar to tensorflow, gQuant graph is evaluated by specifying the output nodes and input nodes replacement. We first look at the column result from data preparation node." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "output meta of node node_technical_indicator:\n", + "MetaData(inports={'stock_in': {'indicator': 'int32', 'high': 'float64', 'low': 'float64', 'close': 'float64', 'volume': 'float64', 'returns': 'float64'}}, outports={'stock_out': {'CH_OS_10_20': 'float64', 'BO_BA_b1_10': 'float64', 'BO_BA_b2_10': 'float64', 'SHIFT_-1': 'float64', 'indicator': 'int32', 'returns': 'float64', 'datetime': 'date', 'asset': 'int64', 'volume': 'float64', 'close': 'float64', 'open': 'float64', 'high': 'float64', 'low': 'float64'}})\n" + ] + } + ], + "source": [ + "from pprint import pprint\n", + "print('output meta of node node_technical_indicator:')\n", + "task_graph.build()\n", + "pprint(task_graph['technical_indicator'].meta_setup())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It adds the columns \"BO_BA_b1_10\", \"BO_BA_b2_10\", 'CH_OS_10_20\" as features and \"SHFIT_-1\" as the target, which is the return of next day. A good feature should be the one that provides highest information about the next day return. In the case we have no prior information about it,\n", + "we can compute as many features as we like and leave it to the XGBoost to find the right combination of those features. \n", + "\n", + "Evaluate the leaf nodes of the backtesting graph by gQuant `run` method." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:stock_data process time:4.270s\n", + "id:preprocess process time:0.761s\n", + "id:sort_after process time:0.056s\n", + "id:technical_indicator process time:2.571s\n", + "id:xgboost process time:2.495s\n", + "id:backtest process time:0.001s\n", + "id:train_df process time:0.125s\n", + "id:portfolio_opt_train process time:0.012s\n", + "id:sharpe_ratio_trn process time:0.001s\n", + "id:cumulative_return_trn process time:0.016s\n", + "id:validation_df process time:0.006s\n", + "id:portfolio_opt_validation process time:0.009s\n", + "id:sharpe_ratio_val process time:0.001s\n", + "id:cumulative_return_val process time:0.015s\n", + "CPU times: user 10 s, sys: 1.43 s, total: 11.4 s\n", + "Wall time: 11.1 s\n" + ] + } + ], + "source": [ + "%%time\n", + "output_list = ['sharpe_ratio_trn.sharpe_out',\n", + " 'cumulative_return_trn.cum_return',\n", + " 'sharpe_ratio_val.sharpe_out',\n", + " 'cumulative_return_val.cum_return',\n", + " 'sort_after.out']\n", + "o_gpu = task_graph.run(output_list, profile=True)\n", + "cached_sort = o_gpu['sort_after.out']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define a function to organized the plot results. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "99ac1d90b02b407b9a9df08658f437b8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side=…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# define the function to format the plots\n", + "def plot_figures(o):\n", + " # format the figures\n", + " figure_width = '1200px'\n", + " figure_height = '400px'\n", + " sharpe_number = o['sharpe_ratio_trn.sharpe_out']\n", + " cum_return_train = o['cumulative_return_trn.cum_return']\n", + " cum_return_train.layout.height = figure_height\n", + " cum_return_train.layout.width = figure_width\n", + " cum_return_train.title = 'Training P & L %.3f' % (sharpe_number)\n", + " sharpe_number = o['sharpe_ratio_val.sharpe_out']\n", + " cum_return_test = o['cumulative_return_val.cum_return']\n", + " cum_return_test.layout.height = figure_height\n", + " cum_return_test.layout.width = figure_width\n", + " cum_return_test.title = 'Testing P & L %.3f' % (sharpe_number)\n", + "\n", + " return widgets.VBox([cum_return_train, cum_return_test])\n", + "plot_figures(o_gpu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The XGBoost model does a good job to predict the next day of return. It overfits in the training dataset and gets Sharpe Ratio of 5 as shown in the figure above. In the testing period, it gets Sharpe Ratio of 1.\n", + "\n", + "The example model runs in a single GPU because of the small dataset. But in real world, the dataset usually is so large that it doesn't fit in a single GPU. Luckily, the XGBoost library natively supports multiple nodes and multiple GPU training by using Dask. You can scale out the computation using Dask dataframe.\n", + "\n", + "To show how easy it is to do distributed computation, let's run the above exmaple in the Dask environment for educational purpose. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run the whole workflow, simply change the `preprocess` node to get Dask Dataframe and run the graph again. Here we look at the testing results:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:stock_data process time:0.010s\n", + "id:preprocess process time:7.655s\n", + "id:xgboost process time:3.325s\n", + "id:backtest process time:0.010s\n", + "id:train_df process time:0.143s\n", + "id:portfolio_opt_train process time:0.033s\n", + "id:sharpe_ratio_trn process time:1.407s\n", + "id:cumulative_return_trn process time:1.193s\n", + "id:validation_df process time:0.007s\n", + "id:portfolio_opt_validation process time:0.032s\n", + "id:sharpe_ratio_val process time:1.172s\n", + "id:cumulative_return_val process time:1.268s\n", + "CPU times: user 8.24 s, sys: 801 ms, total: 9.04 s\n", + "Wall time: 29.7 s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "replace_spec = {'preprocess': {\"inputs\": {\"sort_node@in\": \"stock_data.dask_cudf_out\"}}}\n", + "o_gpu = task_graph.run(replace=replace_spec, profile=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "98b03eaa90714b2381a5563914964296", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side=…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_figures(o_gpu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Clearly, 3 feautres is way too little here. gQuant implmented 36 technical indicators. We can change the configuration of node_technical_indicator node to include more features." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "chaikin_para0 = 10\n", + "chaikin_para1 = 20\n", + "bollinger_para = 10\n", + "macd_para0 = 2\n", + "macd_para1 = 3\n", + "rsi_para0 = 5\n", + "atr_para0 = 10\n", + "sod_para = 2\n", + "mflow_para = 3\n", + "findex_para = 5\n", + "adis_para = 5\n", + "ccindex_para = 5\n", + "bvol_para = 3\n", + "vindex_para = 3\n", + "mindex_para0 = 10\n", + "mindex_para1 = 15\n", + "tindex_para0 = 5\n", + "tindex_para1 = 10\n", + "emove_para = 5\n", + "cc_para = 15\n", + "kchannel_para = 10\n", + "indicator_conf = {\n", + " \"indicators\": [\n", + " {\"function\": \"port_chaikin_oscillator\",\n", + " \"columns\": [\"high\", \"low\", \"close\", \"volume\"],\n", + " \"args\": [chaikin_para0, chaikin_para1]\n", + " },\n", + " {\"function\": \"port_bollinger_bands\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [bollinger_para],\n", + " \"outputs\": [\"b1\", \"b2\"]\n", + " },\n", + " {\"function\": \"port_macd\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [macd_para0, macd_para1],\n", + " \"outputs\": [\"MACDsign\", \"MACDdiff\"]\n", + " },\n", + " {\"function\": \"port_relative_strength_index\",\n", + " \"columns\": [\"high\", \"low\"],\n", + " \"args\": [rsi_para0],\n", + " },\n", + " {\"function\": \"port_average_true_range\",\n", + " \"columns\": [\"high\", \"low\", \"close\"],\n", + " \"args\": [atr_para0],\n", + " },\n", + " {\"function\": \"port_stochastic_oscillator_k\",\n", + " \"columns\": [\"high\", \"low\", \"close\"],\n", + " \"args\": [],\n", + " },\n", + " {\"function\": \"port_stochastic_oscillator_d\",\n", + " \"columns\": [\"high\", \"low\", \"close\"],\n", + " \"args\": [sod_para],\n", + " },\n", + " {\"function\": \"port_money_flow_index\",\n", + " \"columns\": [\"high\", \"low\", \"close\", \"volume\"],\n", + " \"args\": [mflow_para],\n", + " },\n", + " {\"function\": \"port_force_index\",\n", + " \"columns\": [\"close\", \"volume\"],\n", + " \"args\": [findex_para],\n", + " },\n", + " {\"function\": \"port_ultimate_oscillator\",\n", + " \"columns\": [\"high\",\"low\",\"close\"],\n", + " \"args\": [],\n", + " },\n", + " {\"function\": \"port_accumulation_distribution\",\n", + " \"columns\": [\"high\",\"low\",\"close\",\"volume\"],\n", + " \"args\": [adis_para],\n", + " },\n", + " {\"function\": \"port_commodity_channel_index\",\n", + " \"columns\": [\"high\",\"low\",\"close\"],\n", + " \"args\": [ccindex_para],\n", + " },\n", + " {\"function\": \"port_on_balance_volume\",\n", + " \"columns\": [\"close\", \"volume\"],\n", + " \"args\": [bvol_para],\n", + " },\n", + " {\"function\": \"port_vortex_indicator\",\n", + " \"columns\": [\"high\", \"low\", \"close\"],\n", + " \"args\": [vindex_para],\n", + " },\n", + " {\"function\": \"port_kst_oscillator\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [3, 4, 5, 6, 7, 8, 9, 10],\n", + " },\n", + " {\"function\": \"port_mass_index\",\n", + " \"columns\": [\"high\", \"low\"],\n", + " \"args\": [mindex_para0, mindex_para1],\n", + " },\n", + " {\"function\": \"port_true_strength_index\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [tindex_para0, tindex_para1],\n", + " },\n", + " {\"function\": \"port_ease_of_movement\",\n", + " \"columns\": [\"high\", \"low\", \"volume\"],\n", + " \"args\": [emove_para],\n", + " },\n", + " {\"function\": \"port_coppock_curve\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [cc_para],\n", + " },\n", + " {\"function\": \"port_keltner_channel\",\n", + " \"columns\": [\"high\", \"low\", \"close\"],\n", + " \"args\": [kchannel_para],\n", + " \"outputs\": [\"KelChD\", \"KelChM\", \"KelChU\"]\n", + " },\n", + " {\"function\": \"port_ppsr\",\n", + " \"columns\": [\"high\", \"low\", \"close\"],\n", + " \"args\": [],\n", + " \"outputs\": [\"PP\", \"R1\", \"S1\", \"R2\", \"S2\", \"R3\", \"S3\"]\n", + " },\n", + " {\"function\": \"port_shift\",\n", + " \"columns\": [\"returns\"],\n", + " \"args\": [-1]\n", + " } \n", + " ],\n", + " \"remove_na\": True\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "49e4668f4fdf4a5cb7656b4fe42b7fd0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(cache={'nodes': [{'width': 140, 'id': 'stock_data', 'type': 'CsvStockLoader', 'schema': {'title':…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the backtesting again" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:technical_indicator process time:2.659s\n", + "id:xgboost process time:5.527s\n", + "id:backtest process time:0.002s\n", + "id:train_df process time:0.007s\n", + "id:portfolio_opt_train process time:0.011s\n", + "id:sharpe_ratio_trn process time:0.001s\n", + "id:cumulative_return_trn process time:0.015s\n", + "id:validation_df process time:0.005s\n", + "id:portfolio_opt_validation process time:0.009s\n", + "id:sharpe_ratio_val process time:0.001s\n", + "id:cumulative_return_val process time:0.015s\n", + "CPU times: user 7.86 s, sys: 1.37 s, total: 9.22 s\n", + "Wall time: 8.89 s\n" + ] + } + ], + "source": [ + "%%time\n", + "replace_spec = {}\n", + "replace_spec['technical_indicator'] = {\"conf\": indicator_conf}\n", + "\n", + "replace_spec['sort_after'] = {\"load\": {'out': cached_sort}}\n", + "\n", + "o_gpu = task_graph.run(replace=replace_spec, profile=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c37ca8d7dc8a487fbe99d187748ecb48", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side=…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_figures(o_gpu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We get Sharpe Ratio of `1.93` in the testing dataset, not bad!\n", + "\n", + "Using `min_volume=400.0`, it selects 1558 stocks. Setting a lower threshhold, it can include more stocks for the backtesting and hence increase the Sharpe Ratio. But it runs out of memory of single GPU. We have shown Dask can help to break down the large task into small tasks and schedule them a distributed environment. So we can handle dataset of any sizes in this way:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:stock_data process time:0.007s\n", + "id:preprocess process time:5.938s\n", + "id:xgboost process time:9.109s\n", + "id:backtest process time:0.010s\n", + "id:train_df process time:0.007s\n", + "id:portfolio_opt_train process time:0.032s\n", + "id:sharpe_ratio_trn process time:2.444s\n", + "id:cumulative_return_trn process time:2.464s\n", + "id:validation_df process time:0.006s\n", + "id:portfolio_opt_validation process time:0.032s\n", + "id:sharpe_ratio_val process time:2.344s\n", + "id:cumulative_return_val process time:2.389s\n", + "CPU times: user 10 s, sys: 2.84 s, total: 12.9 s\n", + "Wall time: 43.4 s\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4f37ade2840b4a6db394f4c07f5bca47", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%time\n", + "min_volume = 4.0\n", + "min_rate = -10.0\n", + "max_rate = 10.0\n", + "replace_spec={}\n", + "replace_spec['technical_indicator'] = {\"conf\": indicator_conf}\n", + "\n", + "replace_spec['node_filterValue']={\"conf\": [{\"column\": \"volume_mean\", \"min\": min_volume},\n", + " {\"column\": \"returns_max\", \"max\": max_rate},\n", + " {\"column\": \"returns_min\", \"min\": min_rate}]}\n", + "replace_spec['preprocess'] = {\"conf\": {\"subnodes_conf\": {\n", + " \"value_filter\": {\n", + " \"conf\": [{\"column\": \"average_volume\", \"min\": min_volume},\n", + " {\"column\": \"max_return\", \"max\": max_rate},\n", + " {\"column\": \"min_return\", \"min\": min_rate}]\n", + " },\n", + " \"drop_columns\": {\n", + " \"conf\": {\n", + " \"columns\": [\"average_volume\", \"min_return\", \"max_return\"]\n", + " }\n", + " }\n", + " },\n", + " \"taskgraph\": \"taskgraphs/preprocess.gq.yaml\",\n", + " \"input\": [\"sort_node.in\"],\n", + " \"output\": [\"drop_columns.out\"]\n", + " },\n", + " \"inputs\": {\"sort_node@in\": \"stock_data.dask_cudf_out\"}}\n", + "\n", + "o_gpu = task_graph.run(replace=replace_spec, profile=True)\n", + "plot_figures(o_gpu)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dd477080878b49c28174a3c3b1218369", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_figures(o_gpu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We get Sharpe Ratio of `4.7` in the testing dataset. This is a great improvement!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Strategy parameter search\n", + "Quantitative analyst usually need to explore different parameters for their trading strategy. The exploration process is an iterative process. gQuant help to speed up this by allowing using cached dataframe and evaluating the sub-graphs.\n", + "\n", + "To find the optimal technical indicator parameters for this XGBoost strategy, we build a wiget to search the parameter interactively. " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4907f1afde0445f6bea3c99150c57d5a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(VBox(children=(IntRangeSlider(value=(10, 20), continuous_update=False, description='Chaikin', m…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import plotutils\n", + "replace_spec={}\n", + "replace_spec['technical_indicator'] = {\"conf\": indicator_conf}\n", + "replace_spec['sort_after'] = {\"load\": {'out': cached_sort}}\n", + "plotutils.getXGBoostWidget(replace_spec, task_graph, plot_figures)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Conclusions\n", + "In this notebook, we demoed how to use gQuant to backtest XGBoost trading strategy. It is convenient and efficient to use indicator node from the gQuant to compute features for all the stocks in the dataset in the GPU. The XGBoost training are computed in the GPU, so we can get the results quickly. This example shows the XGBoost algorithm's power in finding trading signals. We can achieve close to 2 raw Sharpe ratio in the testing time period." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'status': 'ok', 'restart': True}" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import IPython\n", + "app = IPython.Application.instance()\n", + "app.kernel.do_shutdown(True)" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/gQuant/plugins/rapids_plugin/notebooks/07_fractional_differencing.ipynb b/gQuant/plugins/rapids_plugin/notebooks/07_fractional_differencing.ipynb new file mode 100644 index 00000000..4743f05e --- /dev/null +++ b/gQuant/plugins/rapids_plugin/notebooks/07_fractional_differencing.ipynb @@ -0,0 +1,806 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fractional Differencing\n", + "\n", + "### Background\n", + "Fractional Differencing is a signal processing technique that is used to remove the non-stationarity from the time series while maintaining as much memory as possible. It is widely used in FSI to prepare training data for machine learning algorithms. In this [open-source project](https://github.com/ritchieng/fractional_differencing_gpu/blob/master/notebooks/gpu_fractional_differencing.ipynb) done by Ensemble Capital, fractional differencing computation is accelerated via `cudf.appy_chunk` method in the GPU. It achieves hundreds of times acceleration compared with CPU implementation in their [report](https://www.researchgate.net/publication/335159299_GFD_GPU_Fractional_Differencing_for_Rapid_Large-scale_Stationarizing_of_Time_Series_Data_while_Minimizing_Memory_Loss). \n", + "Using `apply_rows` and `apply_chunks` method from the cudf library is the easiest way of customizing GPU computations as covered in this [blog](https://medium.com/rapids-ai/user-defined-functions-in-rapids-cudf-2d7c3fc2728d). However, it is not the most efficient way.\n", + "\n", + "In this notebook, we are going to show how to use Numba to do fractional differencing computation efficiently. As gQuant wrap the fractional differencing function in the computation node, we are going to show it is easy for data scientists to compute fractional differencing signals and use them to generate alpha signals. \n", + "\n", + "### Environment Preparation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys; sys.path.insert(0, '..')\n", + "\n", + "import warnings\n", + "import gquant\n", + "import ipywidgets as widgets\n", + "import os\n", + "import time\n", + "import numpy as np\n", + "from numba import cuda\n", + "import cudf\n", + "import inspect\n", + "from numba import njit\n", + "from numba import prange\n", + "from gquant.dataframe_flow.task import load_modules\n", + "from gquant_rapids_plugin.cuindicator import get_weights_floored, fractional_diff\n", + "warnings.simplefilter(\"ignore\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copy the fractional differencing code from the [open-source project](https://github.com/ritchieng/fractional_differencing_gpu/blob/master/notebooks/gpu_fractional_differencing.ipynb). We will use this as our benchmark reference" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def moving_dot_product_kernel(in_data, out, window_size, weights):\n", + " # Set the first window_size-1 rows in each chunk to np.nan due \n", + " # insufficient history\n", + " for i in range(cuda.threadIdx.x, window_size - 1, cuda.blockDim.x):\n", + " out[i] = np.nan\n", + " \n", + " # Compute dot product of preceding window_size rows\n", + " for i in range(cuda.threadIdx.x + window_size - 1, in_data.size, cuda.blockDim.x):\n", + " rolling_dot_product = 0.0\n", + " \n", + " k = 0\n", + " for j in range(i - window_size + 1, i + 1):\n", + " rolling_dot_product += in_data[j] * weights[k][0]\n", + " k += 1\n", + " \n", + " out[i] = rolling_dot_product \n", + " \n", + "def frac_diff_gpu(df, d, floor=1e-3):\n", + " r\"\"\"Fractionally difference time series via GPU.\n", + " \n", + " Args:\n", + " df (pd.DataFrame): dataframe of raw time series values.\n", + " d (float): differencing value from 0 to 1 where > 1 has no FD.\n", + " floor (float): minimum value of weights, ignoring anything smaller.\n", + " \"\"\"\n", + " \n", + " # Bring dataframe to GPU, reset index for GPU dot product kernel\n", + " # gdf_raw = cudf.from_pandas(df).reset_index(drop=True)\n", + " gdf_raw = df\n", + " gdf_raw.columns = ['in_data']\n", + "\n", + " # Get weights window\n", + " weights = get_weights_floored(d=d, num_k=len(gdf_raw), floor=floor)\n", + " weights_window_size = len(weights)\n", + " \n", + " # Reverse weights and as contiguous\n", + " weights = np.ascontiguousarray(weights[::-1])\n", + " \n", + " # Bring weights to GPU\n", + " gdf_weights = cudf.DataFrame()\n", + " gdf_weights[gdf_raw.columns[0]] = weights.reshape(-1)\n", + "\n", + " # Length of data\n", + " data_length = len(gdf_raw)\n", + "\n", + " # T4: max of 518 threads per block.\n", + " # V100: max 1024 threads per block\n", + " threads_per_block = 518\n", + "\n", + " # Chunk size split\n", + " # This has to be improved, but as a v0.1, it's sufficient to show speed-up\n", + " # Up to easily 100 million data points\n", + " trunk_size = data_length\n", + "\n", + " # Get fractionally differenced time series through GPU function\n", + " gdf_raw_fd = gdf_raw.apply_chunks(moving_dot_product_kernel,\n", + " incols=['in_data'],\n", + " outcols=dict(out=np.float64),\n", + " kwargs=dict(window_size=weights_window_size, weights=weights),\n", + " chunks=list(range(0, data_length, trunk_size)) + [data_length],\n", + " tpb=threads_per_block)\n", + " \n", + " # Bring to CPU for normal manipulation\n", + " # df_raw_fd = gdf_raw_fd.to_pandas().dropna().iloc[:-1, 1]\n", + " \n", + " return gdf_raw_fd, weights" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Following is the gQuant's fractional differencing implementation via Numba library" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "def fractional_diff(input_arr, d=0.5, floor=1e-3, min_periods=None,\n", + " thread_tile=2, number_of_threads=512):\n", + " \"\"\"\n", + " The fractional difference computation method.\n", + "\n", + " Arguments:\n", + " -------\n", + " input_arr: numba.cuda.DeviceNDArray or cudf.Series\n", + " the input array to compute the fractional difference\n", + " d: float\n", + " the differencing value. range from 0 to 1\n", + " floor: float\n", + " minimum value for the weights for computational efficiency.\n", + " min_periods: int\n", + " default the lengths of the weights. Need at least min_periods of\n", + " non-na elements to get fractional difference value\n", + " thread_tile: int\n", + " each thread will be responsible for `thread_tile` number of\n", + " elements in window computation\n", + " number_of_threads: int\n", + " number of threads in a block for CUDA computation\n", + "\n", + " Returns\n", + " -------\n", + " (numba.cuda.DeviceNDArray, np.array)\n", + " the computed fractional difference array and the weight array tuple\n", + "\n", + " \"\"\"\n", + " if isinstance(input_arr, numba.cuda.cudadrv.devicearray.DeviceNDArray):\n", + " gpu_in = input_arr\n", + " else:\n", + " gpu_in = input_arr.to_gpu_array()\n", + "\n", + " # compute the weights for the fractional difference\n", + " weights = get_weights_floored(d=d,\n", + " num_k=len(input_arr),\n", + " floor=floor)[::-1, 0]\n", + " weights_out = np.ascontiguousarray(weights)\n", + " weights = numba.cuda.to_device(weights_out)\n", + "\n", + " window = len(weights)\n", + "\n", + " if min_periods is None:\n", + " min_periods = window\n", + " else:\n", + " min_periods = min_periods\n", + "\n", + " number_of_threads = number_of_threads\n", + " array_len = len(gpu_in)\n", + "\n", + " # allocate the output array\n", + " gpu_out = numba.cuda.device_array_like(gpu_in)\n", + "\n", + " number_of_blocks = \\\n", + " (array_len + (number_of_threads * thread_tile - 1)) // \\\n", + " (number_of_threads * thread_tile)\n", + "\n", + " shared_buffer_size = (number_of_threads * thread_tile +\n", + " window - 1 + window)\n", + "\n", + " # call the conv kernel\n", + " kernel[(number_of_blocks,),\n", + " (number_of_threads,),\n", + " 0,\n", + " shared_buffer_size * 8](gpu_in,\n", + " weights,\n", + " gpu_out,\n", + " window,\n", + " array_len,\n", + " thread_tile,\n", + " min_periods)\n", + " return gpu_out, weights_out\n", + "\n" + ] + } + ], + "source": [ + "print(inspect.getsource(fractional_diff))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It launches the Numba kernel, which defined as:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "@cuda.jit(device=True)\n", + "def conv_window(shared, history_len, out_arr, window_size,\n", + " arr_len, offset, offset2, min_size):\n", + " \"\"\"\n", + " This function is to do convolution for one thread\n", + "\n", + " Arguments:\n", + " ------\n", + " shared: numba.cuda.DeviceNDArray\n", + " 3 chunks of data are stored in the shared memory\n", + " the first [0, window_size) elements is the chunk of data that is\n", + " necessary to compute the first convolution element.\n", + " then [window_size, window_size + thread_tile * blockDim) elements\n", + " are the inputs allocated for this block of threads\n", + " the last [window_size + thread_tile,\n", + " window_size + thread_tile + window_size) is to store the kernel values\n", + " history_len: int\n", + " total number of historical elements available for this chunk of data\n", + " out_arr: numba.cuda.DeviceNDArray\n", + " output gpu_array of size of `thread_tile`\n", + " window_size: int\n", + " the number of elements in the kernel\n", + " arr_len: int\n", + " the chunk array length, same as `thread_tile`\n", + " offset: int\n", + " indicate the starting index of the chunk array in the shared for\n", + " this thread.\n", + " offset: int\n", + " indicate the starting position of the weights/kernel array\n", + " min_size: int\n", + " the minimum number of non-na elements\n", + " \"\"\"\n", + " for i in range(arr_len):\n", + " if i + history_len < window_size-1:\n", + " out_arr[i] = np.nan\n", + " else:\n", + " s = 0.0\n", + " average_size = 0\n", + " for j in range(0, window_size):\n", + " if not (cmath.isnan(\n", + " shared[offset + i - j])):\n", + " s += (shared[offset + i - j] *\n", + " shared[offset2 + window_size - 1 - j])\n", + " average_size += 1\n", + " if average_size >= min_size:\n", + " out_arr[i] = s\n", + " else:\n", + " out_arr[i] = np.nan\n", + "\n", + " \n", + "@cuda.jit\n", + "def kernel(in_arr, weight_arr, out_arr, window,\n", + " arr_len, thread_tile, min_size):\n", + " \"\"\"\n", + " This kernel is to do 1D convlution on `in_arr` array with `weight_arr`\n", + " as kernel. The results is saved on `out_arr`.\n", + "\n", + " Arguments:\n", + " ------\n", + " in_arr: numba.cuda.DeviceNDArray\n", + " input gpu array\n", + " weight_arr: numba.cuda.DeviceNDArray\n", + " convolution kernel gpu array\n", + " out_arr: numba.cuda.DeviceNDArray\n", + " output gpu_array\n", + " window: int\n", + " the number of elements in the weight_arr\n", + " arr_len: int\n", + " the input/output array length\n", + " thread_tile: int\n", + " each thread is responsible for `thread_tile` number of elements\n", + " min_size: int\n", + " the minimum number of non-na elements\n", + " \"\"\"\n", + " shared = cuda.shared.array(shape=0,\n", + " dtype=numba.float64)\n", + " block_size = cuda.blockDim.x # total number of threads\n", + " tx = cuda.threadIdx.x\n", + " # Block id in a 1D grid\n", + " bid = cuda.blockIdx.x\n", + " starting_id = bid * block_size * thread_tile\n", + "\n", + " # copy the thread_tile * number_of_thread_per_block into the shared\n", + " for j in range(thread_tile):\n", + " offset = tx + j * block_size\n", + " if (starting_id + offset) < arr_len:\n", + " shared[offset + window - 1] = in_arr[\n", + " starting_id + offset]\n", + " cuda.syncthreads()\n", + "\n", + " # copy the window - 1 into the shared\n", + " for j in range(0, window - 1, block_size):\n", + " if (((tx + j) <\n", + " window - 1) and (\n", + " starting_id - window + 1 + tx + j >= 0)):\n", + " shared[tx + j] = \\\n", + " in_arr[starting_id - window + 1 + tx + j]\n", + " cuda.syncthreads()\n", + " # copy the weights into the shared\n", + " for j in range(0, window, block_size):\n", + " element_id = tx + j\n", + " if (((tx + j) < window) and (element_id < window)):\n", + " shared[thread_tile * block_size + window - 1 + tx +\n", + " j] = weight_arr[tx + j]\n", + " cuda.syncthreads()\n", + " # slice the shared memory for each threads\n", + " start_shared = tx * thread_tile\n", + " his_len = min(window - 1,\n", + " starting_id + tx * thread_tile)\n", + " # slice the global memory for each threads\n", + " start = starting_id + tx * thread_tile\n", + " end = min(starting_id + (tx + 1) * thread_tile, arr_len)\n", + " sub_outarr = out_arr[start:end]\n", + " sub_len = end - start\n", + " conv_window(shared, his_len, sub_outarr,\n", + " window, sub_len,\n", + " window - 1 + start_shared,\n", + " thread_tile * block_size + window - 1,\n", + " min_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Fractional differencing is essentially doing 1D convolution computation with the kernel values set to be the weights computed from get_weights_floored. Check the original notebook for the details of the meanings of the weights. To make convolution computation faster, we divide the long input array into small chunks and send to different thread blocks. All the array chunks and the weights are loaded into the GPU shared memory for fast IO. The device function conv_window is doing the convolution computation for one thread.\n", + "\n", + "To make a fair comparsion with CPU implementation, we implemented an efficient CPU version of the fractional differencing calculation. It is accelerated by numba.njit that take advantage of multiple cores of the CPU and fastmath compiler optimization." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "@njit(fastmath=True, parallel=True)\n", + "def moving_dot_product_cpu(in_data, out, window_size, weights):\n", + " # Set the first window_size-1 rows in each chunk to np.nan due \n", + " # insufficient history\n", + " for i in prange(0, window_size - 1):\n", + " out[i] = np.nan\n", + " \n", + " # Compute dot product of preceding window_size rows\n", + " for i in prange(window_size - 1, len(in_data)):\n", + " rolling_dot_product = 0.0\n", + " \n", + " k = 0\n", + " for j in range(i - window_size + 1, i + 1):\n", + " rolling_dot_product += in_data[j] * weights[k]\n", + " k += 1\n", + " \n", + " out[i] = rolling_dot_product \n", + "\n", + "def cpu_fractional_diff(input_arr, d=0.5, floor=1e-3):\n", + "\n", + " # compute the weights for the fractional difference\n", + " weights = get_weights_floored(d=d,\n", + " num_k=len(input_arr),\n", + " floor=floor)[::-1, 0]\n", + " weights_out = np.ascontiguousarray(weights)\n", + " weights = weights_out\n", + " weights_window_size = len(weights)\n", + " window = len(weights)\n", + " out = np.zeros_like(input_arr)\n", + " moving_dot_product_cpu(input_arr, out, weights_window_size, weights)\n", + " return out" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Fractional differencing is essentially doing 1D convolution computation with the kernel values set to be the weights computed from `get_weights_floored`. Check the original [notebook](https://github.com/ritchieng/fractional_differencing_gpu/blob/master/notebooks/gpu_fractional_differencing.ipynb) for the details of the meanings of the weights. To make convolution computation faster, we divide the long input array into small chunks and send to different thread blocks. All the array chunks and the weights are loaded into the GPU shared memory for fast IO. The device function `conv_window` is doing the convolution computation for one thread.\n", + "\n", + "We can compare the performance of gQuant GPU implementation vs the original one and CPU implementation:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "array size 100000, Ensemble: time 0.273 s, gQuant GPU Time 0.374 s, gQuant CPU Time 0.499, speed up 0.73, speed up vs CPU 1.33, error 0.0000 \n", + "array size 1000000, Ensemble: time 0.144 s, gQuant GPU Time 0.007 s, gQuant CPU Time 0.035, speed up 20.04, speed up vs CPU 4.83, error 0.0000 \n", + "array size 10000000, Ensemble: time 1.023 s, gQuant GPU Time 0.031 s, gQuant CPU Time 0.125, speed up 32.87, speed up vs CPU 4.02, error 0.0000 \n", + "array size 100000000, Ensemble: time 10.207 s, gQuant GPU Time 0.267 s, gQuant CPU Time 1.057, speed up 38.18, speed up vs CPU 3.95, error 0.0000 \n" + ] + } + ], + "source": [ + "for i in range(5, 9):\n", + " df_raw = cudf.DataFrame()\n", + " ran_array = np.random.rand(10**int(i))\n", + " df_raw['in'] = ran_array\n", + " df_raw2 = cudf.DataFrame()\n", + " df_raw2['in'] = ran_array\n", + "\n", + " # Start timer\n", + " start = time.time()\n", + " df_raw_fd_from_gpu, weights = frac_diff_gpu(df_raw, d=0.5, floor=5e-5)\n", + " # End timer\n", + " end = time.time()\n", + " duration = end - start\n", + "\n", + " start = time.time()\n", + " gquant_gpu, weights = fractional_diff(df_raw2['in'], d=0.5, floor=5e-5)\n", + " cuda.synchronize()\n", + " end = time.time()\n", + " optimized_duration = end - start\n", + " #(df_raw_fd_from_gpu.values)\n", + " \n", + " \n", + " start = time.time()\n", + " cpu_result = cpu_fractional_diff(ran_array, d=0.5, floor=5e-5)\n", + " end = time.time()\n", + " cpu_duration = end - start\n", + " \n", + " err = np.abs(df_raw_fd_from_gpu['out'].to_array()[weights.size-1:] - np.array(gquant_gpu)[weights.size-1:]).max()\n", + " err = max(np.abs(df_raw_fd_from_gpu['out'].to_array()[weights.size-1:] - cpu_result[weights.size-1:]).max(), err)\n", + " print('array size %d, Ensemble: time %.3f s, gQuant GPU Time %.3f s, gQuant CPU Time %.3f, speed up %.2f, speed up vs CPU %.2f, error %.4f ' % (10**int(i), duration, optimized_duration, cpu_duration, duration / optimized_duration, cpu_duration/optimized_duration, err))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the array of length 100m, gQuant can achieve 100x speedup compare with the Ensemble Capitial's GPU implementatoin and 30x speed up compared with multiple core CPU." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Use the fractional differencing signal to trade stocks\n", + "\n", + "We will use the same [XGBoost example](https://github.com/rapidsai/gQuant/blob/master/notebooks/06_xgboost_trade.ipynbx) to do backtest with fractional differencing signals. The workflow includes the following steps:\n", + "\n", + "1. Preprocess the datasets.\n", + "\n", + "2. Compute the features based on different fractional differencing signals of the closing prices of the stocks \n", + "\n", + "3. Split the data in training and testing and build a XGBoost model based on the training data. From the XGBoost model, compute the trading signals for all the data points.\n", + "\n", + "4. Run backtesting and compute the returns from this strategy for each of the days and stock symbols \n", + "\n", + "5. Run a simple portfolio optimization by averaging the stocks together for each of the trading days.\n", + "\n", + "6. Compute the Sharpe ratio and cumulative return results for both training and testing datasets\n", + "\n", + "The whole workflow can be organized into a computation graph, which are fully described in a yaml file. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each nodes has a unique id, a node type, configuration parameters and input nodes ids. gQuant takes this yaml file, wires it into a graph to visualize it. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d1a3e7ad5d224709a8e092c3e4140b36", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%reset -s -f\n", + "import sys\n", + "import os\n", + "sys.path.append('..')\n", + "import gquant\n", + "from gquant.dataframe_flow import TaskGraph\n", + "import ipywidgets as widgets\n", + "import warnings\n", + "warnings.simplefilter(\"ignore\")\n", + "\n", + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/xgboost_trade.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The features used for XGBoost algorithm are prepared in the `xgboost` Task node, where `cuIndicator` module is used to compute the technical indicators in the GPU for all the stock symbols. `xgboost` is the Task node that is used to compute the trading signals from the stock technical indicators. Each of the gQuant Task node is implemented by overwriting `meta_setup`, `process`, `ports_setup`, `conf_chema` methods of the Node base class. Please refer to [customize nodes notebook](https://github.com/rapidsai/gQuant/blob/master/notebooks/05_customize_nodes.ipynb) for details. Following is the source code for \"XGBoostStrategyNode\":" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# define the function to format the plots\n", + "def plot_figures(o):\n", + " # format the figures\n", + " figure_width = '1200px'\n", + " figure_height = '400px'\n", + " sharpe_number = o['sharpe_ratio_trn.sharpe_out']\n", + " cum_return_train = o['cumulative_return_trn.cum_return']\n", + " cum_return_train.layout.height = figure_height\n", + " cum_return_train.layout.width = figure_width\n", + " cum_return_train.title = 'Training P & L %.3f' % (sharpe_number)\n", + " sharpe_number = o['sharpe_ratio_val.sharpe_out']\n", + " cum_return_test = o['cumulative_return_val.cum_return']\n", + " cum_return_test.layout.height = figure_height\n", + " cum_return_test.layout.width = figure_width\n", + " cum_return_test.title = 'Testing P & L %.3f' % (sharpe_number)\n", + " return widgets.VBox([cum_return_train, cum_return_test])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, we are going to add 5 fractional differencing signals from the closing prices " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "indicator_conf = {\n", + " \"indicators\": [\n", + " {\"function\": \"port_fractional_diff\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [0.5]\n", + " },\n", + " {\"function\": \"port_fractional_diff\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [0.3]\n", + " },\n", + " {\"function\": \"port_fractional_diff\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [0.1]\n", + " },\n", + " {\"function\": \"port_fractional_diff\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [0.7]\n", + " },\n", + " {\"function\": \"port_fractional_diff\",\n", + " \"columns\": [\"close\"],\n", + " \"args\": [0.9]\n", + " },\n", + " {\"function\": \"port_shift\",\n", + " \"columns\": [\"returns\"],\n", + " \"args\": [-1]\n", + " } \n", + " ],\n", + " \"remove_na\": True\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the backtest" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "id:stock_data process time:4.146s\n", + "id:preprocess process time:0.752s\n", + "id:sort_after process time:0.056s\n", + "id:technical_indicator process time:0.459s\n", + "id:xgboost process time:2.345s\n", + "id:backtest process time:0.001s\n", + "id:train_df process time:0.144s\n", + "id:portfolio_opt_train process time:0.011s\n", + "id:sharpe_ratio_trn process time:0.001s\n", + "id:cumulative_return_trn process time:0.015s\n", + "id:validation_df process time:0.005s\n", + "id:portfolio_opt_validation process time:0.009s\n", + "id:sharpe_ratio_val process time:0.001s\n", + "id:cumulative_return_val process time:0.014s\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "aabd384e30614c609ee3f881b974d53c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "replace_spec = {}\n", + "replace_spec['technical_indicator'] = {\"conf\": indicator_conf}\n", + "\n", + "o_gpu = task_graph.run(replace=replace_spec, profile=True)\n", + "\n", + "plot_figures(o_gpu)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We get Sharpe Ratio of `1.01` just from the fractional differencing signals of the closing prices\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To visualize the computed fractional differencing signals, we can make a TaskGraph to visualize it. We put the XGboost trade TaskGraph into a composite node. We select the asset with id `22123` and plot 4 fractional differencing signals with different `d` values. Check the updated graph below. Note, there are 2 layers of composite nodes in the following graph. As you can see, composite node is a powerful way of organizing the TaskGraphs. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a75a2bfde85b4e9f82674b7c8f98f12a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph = TaskGraph.load_taskgraph('../taskgraphs/visualize_frac_diff.gq.yaml')\n", + "task_graph.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b3c117b3f5634731938dbdd0fe2525c1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Tab(children=(Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_type': 'stream', 'na…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "task_graph.run(formated=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can run the sub-graph just for plotting the signals." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note, smaller `d` value signal has more memory information but not as stationary as the high `d` value signals. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Conclusions\n", + "In this notebook, we demoed how to use Numba to implemement fractional differencing calculation in GPU. It achieves 100x speed up compared with the method done by Ensemble Capital. We also showed it is easy to use gQuant to compute fractional difference and run backtests" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'status': 'ok', 'restart': True}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import IPython\n", + "app = IPython.Application.instance()\n", + "app.kernel.do_shutdown(True)\n" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/08_gquant_machine_learning.ipynb b/gQuant/plugins/rapids_plugin/notebooks/08_gquant_machine_learning.ipynb similarity index 95% rename from notebooks/08_gquant_machine_learning.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/08_gquant_machine_learning.ipynb index a5ac9eb1..84796421 100644 --- a/notebooks/08_gquant_machine_learning.ipynb +++ b/gQuant/plugins/rapids_plugin/notebooks/08_gquant_machine_learning.ipynb @@ -59,7 +59,7 @@ "\n", "

Client

\n", "\n", "\n", @@ -75,7 +75,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -114,18 +114,18 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "34f39e2a8ef64d758d9929b6aff44abe", + "model_id": "e95e03a0301344d0ae20857a659bfd34", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'data_gen'), ('type', 'ClassificationData'), ('conf', {'n_…" + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'data_gen'), ('type', 'ClassificationData'), ('conf', {'cl…" ] }, "metadata": {}, @@ -165,13 +165,13 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "20ac20a0160b4c9599eb6792d1fec45c", + "model_id": "7d0d0d15571341ee9564159a88be0db1", "version_major": 2, "version_minor": 0 }, @@ -208,18 +208,18 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "550036d1896c4125b25470468e47d9e8", + "model_id": "1caa94fded3c424db5b619d05173757b", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'data_gen'), ('type', 'ClassificationData'), ('conf', {'n_…" + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'data_gen'), ('type', 'ClassificationData'), ('conf', {'cl…" ] }, "metadata": {}, @@ -245,18 +245,18 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9a22506effe94bd489930088de60a9f4", + "model_id": "f1d8da9435864f7f9f4bb308c84d0711", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'data_gen'), ('type', 'ClassificationData'), ('conf', {'n_…" + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'data_gen'), ('type', 'ClassificationData'), ('conf', {'cl…" ] }, "metadata": {}, @@ -285,18 +285,18 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "cef6af7d426746abaa6e08aed8b987f9", + "model_id": "3d64b8d9b6fb4db989fa399790e75bd5", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'data_gen'), ('type', 'ClassificationData'), ('conf', {'n_…" + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'data_gen'), ('type', 'ClassificationData'), ('conf', {'cl…" ] }, "metadata": {}, @@ -463,7 +463,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.8.2" } }, "nbformat": 4, diff --git a/notebooks/09_gquant_machine_hpo.ipynb b/gQuant/plugins/rapids_plugin/notebooks/09_gquant_machine_hpo.ipynb similarity index 100% rename from notebooks/09_gquant_machine_hpo.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/09_gquant_machine_hpo.ipynb diff --git a/notebooks/11_streamz.ipynb b/gQuant/plugins/rapids_plugin/notebooks/10_streamz.ipynb.ipynb similarity index 99% rename from notebooks/11_streamz.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/10_streamz.ipynb.ipynb index 1e235447..5fc5166d 100644 --- a/notebooks/11_streamz.ipynb +++ b/gQuant/plugins/rapids_plugin/notebooks/10_streamz.ipynb.ipynb @@ -105,7 +105,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As shown above, this source node has one output port which outputs `streamz.Stream` object. It has no configuration, so we just leave it empty. In the `meta_setup` method, we specify that the element type in the stream is a number. The down-stream node can connect to it only if its `self.required` has the same key value pair. The `Stream` could stream many types of data and just knowing that something is a `streamz.Stream` is not enough to know what is actually being streamed. Using columns setup enables one to implement meta-typecking enforcement i.e. above one expects the stream output to contain `{'element': 'number'}` which is just some custom type specification. When the outputs are dataframes (pandas, cudf, dask-dataframes) then the columns has a concrete meaning i.e. what columns are present and what are their types in the dataframes.\n", + "As shown above, this source node has one output port which outputs `streamz.Stream` object. It has no configuration, so we just leave it empty. In the `meta_setup` method, we specify that the element type in the stream is a number. The down-stream node can connect to it only if its `MetaData.inports` has the same key value pair. The `Stream` could stream many types of data and just knowing that something is a `streamz.Stream` is not enough to know what is actually being streamed. Using columns setup enables one to implement meta-typecking enforcement i.e. above one expects the stream output to contain `{'element': 'number'}` which is just some custom type specification. When the outputs are dataframes (pandas, cudf, dask-dataframes) then the columns has a concrete meaning i.e. what columns are present and what are their types in the dataframes.\n", "\n", "In the `process` method, `StreamNode` outputs the `stream.Stream()` as the source end of the pipeline. Later, we will use the `emit` method to add numbers to it." ] @@ -173,7 +173,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "`TransformNode` definition is similar to `StreamNode`, but it has an input port `stream_in`. It defines the key value pair `element->number` in the `self.required` dictionary, so it is compatible to connect to the source node. \n", + "`TransformNode` definition is similar to `StreamNode`, but it has an input port `stream_in`. It defines the key value pair `element->number` in the `MetaData.inports` dictionary, so it is compatible to connect to the source node. \n", "\n", "In the `process` method, it maps each elements in the stream by `double` function." ] @@ -369,7 +369,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "511ae5e7169349d4935b6fdbde89c721", + "model_id": "d388c2b064f949fdb5be20ebe0717bdc", "version_major": 2, "version_minor": 0 }, @@ -402,7 +402,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6137f8f7ea194e5b970179ebb3837b1f", + "model_id": "0aabb8adc0d842eabdd3d38dd78eaca5", "version_major": 2, "version_minor": 0 }, @@ -681,7 +681,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e77a11291ffd4ab29c3c60a61133ebc5", + "model_id": "57bb637730d74bd19969a98aebc57b16", "version_major": 2, "version_minor": 0 }, @@ -731,12 +731,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0cfe7e0d461f4f2c8ee8c688ce0e92bf", + "model_id": "2872e0f7dbe34d25804f03616ca90be0", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Figure(animation_duration=10, axes=[Axis(label='x', scale=LinearScale()), Axis(label='y', orientation='vertica…" + "Figure(animation_duration=10, axes=[Axis(label='x', scale=LinearScale(), side='bottom'), Axis(label='y', orien…" ] }, "metadata": {}, @@ -835,12 +835,6 @@ " }\n", " iports_conn = self.get_connected_inports()\n", " nports = len(iports_conn)\n", - " if nports > 2:\n", - " self.required = {\n", - " iport: {\n", - " 'element': 'numbers'\n", - " } for iport in iports_conn\n", - " }\n", " columns_out = {\n", " 'stream_out': {'element': 'numbers'}\n", " }\n", @@ -886,7 +880,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "628ac22e7afb4475a584e3521c3727d4", + "model_id": "eab5330a56954bccb8ba78429bda9166", "version_major": 2, "version_minor": 0 }, @@ -936,12 +930,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ea867d84b2f341858b906a34d652309b", + "model_id": "35326b6d4e6844baaf8618632a1f7773", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Figure(animation_duration=10, axes=[Axis(label='x', scale=LinearScale()), Axis(label='y', orientation='vertica…" + "Figure(animation_duration=10, axes=[Axis(label='x', scale=LinearScale(), side='bottom'), Axis(label='y', orien…" ] }, "metadata": {}, @@ -1280,7 +1274,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "f48951f72e8544f4a13c1106a7d1b5d5", + "model_id": "2dcccf77e41e43429d97142fe23736e0", "version_major": 2, "version_minor": 0 }, @@ -1329,12 +1323,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "5831237559254e978e910da8aadfead2", + "model_id": "98df014eec71488abb30b271ea2c3fdf", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Figure(animation_duration=10, axes=[Axis(label='x', scale=LinearScale()), Axis(label='y', orientation='vertica…" + "Figure(animation_duration=10, axes=[Axis(label='x', scale=LinearScale(), side='bottom'), Axis(label='y', orien…" ] }, "metadata": {}, @@ -4269,6 +4263,13 @@ "app.kernel.do_shutdown(True)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -4293,7 +4294,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/notebooks/asian_barrier_option/Makefile b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/Makefile similarity index 100% rename from notebooks/asian_barrier_option/Makefile rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/Makefile diff --git a/notebooks/asian_barrier_option/README.md b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/README.md similarity index 100% rename from notebooks/asian_barrier_option/README.md rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/README.md diff --git a/notebooks/asian_barrier_option/cuda_pricing.cu b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/cuda_pricing.cu similarity index 100% rename from notebooks/asian_barrier_option/cuda_pricing.cu rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/cuda_pricing.cu diff --git a/notebooks/asian_barrier_option/deep_learning_nemo.ipynb b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/deep_learning_nemo.ipynb similarity index 100% rename from notebooks/asian_barrier_option/deep_learning_nemo.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/deep_learning_nemo.ipynb diff --git a/notebooks/asian_barrier_option/deep_learning_option_1.ipynb b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/deep_learning_option_1.ipynb similarity index 100% rename from notebooks/asian_barrier_option/deep_learning_option_1.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/deep_learning_option_1.ipynb diff --git a/notebooks/asian_barrier_option/deep_learning_option_2.ipynb b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/deep_learning_option_2.ipynb similarity index 100% rename from notebooks/asian_barrier_option/deep_learning_option_2.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/deep_learning_option_2.ipynb diff --git a/notebooks/asian_barrier_option/docker/Dockerfile b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/docker/Dockerfile similarity index 100% rename from notebooks/asian_barrier_option/docker/Dockerfile rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/docker/Dockerfile diff --git a/notebooks/asian_barrier_option/download_data.sh b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/download_data.sh similarity index 100% rename from notebooks/asian_barrier_option/download_data.sh rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/download_data.sh diff --git a/notebooks/asian_barrier_option/elu_activation/CMakeLists.txt b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/CMakeLists.txt similarity index 100% rename from notebooks/asian_barrier_option/elu_activation/CMakeLists.txt rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/CMakeLists.txt diff --git a/notebooks/asian_barrier_option/elu_activation/log/common.h b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/log/common.h similarity index 100% rename from notebooks/asian_barrier_option/elu_activation/log/common.h rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/log/common.h diff --git a/notebooks/asian_barrier_option/elu_activation/log/logger.cpp b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/log/logger.cpp similarity index 100% rename from notebooks/asian_barrier_option/elu_activation/log/logger.cpp rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/log/logger.cpp diff --git a/notebooks/asian_barrier_option/elu_activation/log/logger.h b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/log/logger.h similarity index 100% rename from notebooks/asian_barrier_option/elu_activation/log/logger.h rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/log/logger.h diff --git a/notebooks/asian_barrier_option/elu_activation/log/logging.h b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/log/logging.h similarity index 100% rename from notebooks/asian_barrier_option/elu_activation/log/logging.h rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/log/logging.h diff --git a/notebooks/asian_barrier_option/elu_activation/plugins/eluPlugin.cu b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/plugins/eluPlugin.cu similarity index 100% rename from notebooks/asian_barrier_option/elu_activation/plugins/eluPlugin.cu rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/plugins/eluPlugin.cu diff --git a/notebooks/asian_barrier_option/elu_activation/plugins/eluPlugin.h b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/plugins/eluPlugin.h similarity index 100% rename from notebooks/asian_barrier_option/elu_activation/plugins/eluPlugin.h rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/plugins/eluPlugin.h diff --git a/notebooks/asian_barrier_option/elu_activation/plugins/pluginKernels.h b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/plugins/pluginKernels.h similarity index 100% rename from notebooks/asian_barrier_option/elu_activation/plugins/pluginKernels.h rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/plugins/pluginKernels.h diff --git a/notebooks/asian_barrier_option/elu_activation/plugins/pluginUtil.h b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/plugins/pluginUtil.h similarity index 100% rename from notebooks/asian_barrier_option/elu_activation/plugins/pluginUtil.h rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/elu_activation/plugins/pluginUtil.h diff --git a/notebooks/asian_barrier_option/helper_cuda.h b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/helper_cuda.h similarity index 100% rename from notebooks/asian_barrier_option/helper_cuda.h rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/helper_cuda.h diff --git a/notebooks/asian_barrier_option/helper_string.h b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/helper_string.h similarity index 100% rename from notebooks/asian_barrier_option/helper_string.h rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/helper_string.h diff --git a/notebooks/asian_barrier_option/index.ipynb b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/index.ipynb similarity index 100% rename from notebooks/asian_barrier_option/index.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/index.ipynb diff --git a/notebooks/asian_barrier_option/mc_pricing.ipynb b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/mc_pricing.ipynb similarity index 100% rename from notebooks/asian_barrier_option/mc_pricing.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/mc_pricing.ipynb diff --git a/notebooks/asian_barrier_option/tensorrt.ipynb b/gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/tensorrt.ipynb similarity index 100% rename from notebooks/asian_barrier_option/tensorrt.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/asian_barrier_option/tensorrt.ipynb diff --git a/notebooks/cuIndicator/indicator_demo.ipynb b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/indicator_demo.ipynb similarity index 100% rename from notebooks/cuIndicator/indicator_demo.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/indicator_demo.ipynb diff --git a/notebooks/cuIndicator/rsi_perf.ipynb b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/rsi_perf.ipynb similarity index 100% rename from notebooks/cuIndicator/rsi_perf.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/rsi_perf.ipynb diff --git a/tests/unit/__init__.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/__init__.py similarity index 100% rename from tests/unit/__init__.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/__init__.py diff --git a/notebooks/cuIndicator/viz/accumulation_distribution.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/accumulation_distribution.py similarity index 100% rename from notebooks/cuIndicator/viz/accumulation_distribution.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/accumulation_distribution.py diff --git a/notebooks/cuIndicator/viz/admi.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/admi.py similarity index 100% rename from notebooks/cuIndicator/viz/admi.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/admi.py diff --git a/notebooks/cuIndicator/viz/average_true_range.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/average_true_range.py similarity index 100% rename from notebooks/cuIndicator/viz/average_true_range.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/average_true_range.py diff --git a/notebooks/cuIndicator/viz/bollinger_bands.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/bollinger_bands.py similarity index 100% rename from notebooks/cuIndicator/viz/bollinger_bands.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/bollinger_bands.py diff --git a/notebooks/cuIndicator/viz/ch_oscillator.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ch_oscillator.py similarity index 100% rename from notebooks/cuIndicator/viz/ch_oscillator.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ch_oscillator.py diff --git a/notebooks/cuIndicator/viz/commodity_channel_index.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/commodity_channel_index.py similarity index 100% rename from notebooks/cuIndicator/viz/commodity_channel_index.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/commodity_channel_index.py diff --git a/notebooks/cuIndicator/viz/coppock_curve.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/coppock_curve.py similarity index 100% rename from notebooks/cuIndicator/viz/coppock_curve.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/coppock_curve.py diff --git a/notebooks/cuIndicator/viz/donchian_channel.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/donchian_channel.py similarity index 100% rename from notebooks/cuIndicator/viz/donchian_channel.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/donchian_channel.py diff --git a/notebooks/cuIndicator/viz/ease_of_movement.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ease_of_movement.py similarity index 100% rename from notebooks/cuIndicator/viz/ease_of_movement.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ease_of_movement.py diff --git a/notebooks/cuIndicator/viz/ewa.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ewa.py similarity index 100% rename from notebooks/cuIndicator/viz/ewa.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ewa.py diff --git a/notebooks/cuIndicator/viz/force_index.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/force_index.py similarity index 100% rename from notebooks/cuIndicator/viz/force_index.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/force_index.py diff --git a/notebooks/cuIndicator/viz/keltner_channel.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/keltner_channel.py similarity index 100% rename from notebooks/cuIndicator/viz/keltner_channel.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/keltner_channel.py diff --git a/notebooks/cuIndicator/viz/kst_oscillator.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/kst_oscillator.py similarity index 100% rename from notebooks/cuIndicator/viz/kst_oscillator.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/kst_oscillator.py diff --git a/notebooks/cuIndicator/viz/ma.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ma.py similarity index 100% rename from notebooks/cuIndicator/viz/ma.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ma.py diff --git a/notebooks/cuIndicator/viz/macd.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/macd.py similarity index 100% rename from notebooks/cuIndicator/viz/macd.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/macd.py diff --git a/notebooks/cuIndicator/viz/mass_index.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/mass_index.py similarity index 100% rename from notebooks/cuIndicator/viz/mass_index.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/mass_index.py diff --git a/notebooks/cuIndicator/viz/momentum.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/momentum.py similarity index 100% rename from notebooks/cuIndicator/viz/momentum.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/momentum.py diff --git a/notebooks/cuIndicator/viz/money_flow_index.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/money_flow_index.py similarity index 100% rename from notebooks/cuIndicator/viz/money_flow_index.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/money_flow_index.py diff --git a/notebooks/cuIndicator/viz/on_balance_volume.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/on_balance_volume.py similarity index 100% rename from notebooks/cuIndicator/viz/on_balance_volume.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/on_balance_volume.py diff --git a/notebooks/cuIndicator/viz/parabolic_sar.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/parabolic_sar.py similarity index 100% rename from notebooks/cuIndicator/viz/parabolic_sar.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/parabolic_sar.py diff --git a/notebooks/cuIndicator/viz/rate_of_change.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/rate_of_change.py similarity index 100% rename from notebooks/cuIndicator/viz/rate_of_change.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/rate_of_change.py diff --git a/notebooks/cuIndicator/viz/rsi.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/rsi.py similarity index 100% rename from notebooks/cuIndicator/viz/rsi.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/rsi.py diff --git a/notebooks/cuIndicator/viz/stochastic_oscillator_d.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/stochastic_oscillator_d.py similarity index 100% rename from notebooks/cuIndicator/viz/stochastic_oscillator_d.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/stochastic_oscillator_d.py diff --git a/notebooks/cuIndicator/viz/stochastic_oscillator_k.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/stochastic_oscillator_k.py similarity index 100% rename from notebooks/cuIndicator/viz/stochastic_oscillator_k.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/stochastic_oscillator_k.py diff --git a/notebooks/cuIndicator/viz/trix.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/trix.py similarity index 100% rename from notebooks/cuIndicator/viz/trix.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/trix.py diff --git a/notebooks/cuIndicator/viz/true_strength_index.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/true_strength_index.py similarity index 100% rename from notebooks/cuIndicator/viz/true_strength_index.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/true_strength_index.py diff --git a/notebooks/cuIndicator/viz/ultimate_oscillator.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ultimate_oscillator.py similarity index 100% rename from notebooks/cuIndicator/viz/ultimate_oscillator.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/ultimate_oscillator.py diff --git a/notebooks/cuIndicator/viz/vortex_indicator.py b/gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/vortex_indicator.py similarity index 100% rename from notebooks/cuIndicator/viz/vortex_indicator.py rename to gQuant/plugins/rapids_plugin/notebooks/cuIndicator/viz/vortex_indicator.py diff --git a/notebooks/custom_port_nodes.py b/gQuant/plugins/rapids_plugin/notebooks/custom_port_nodes.py similarity index 99% rename from notebooks/custom_port_nodes.py rename to gQuant/plugins/rapids_plugin/notebooks/custom_port_nodes.py index b6f83b82..615f7afc 100644 --- a/notebooks/custom_port_nodes.py +++ b/gQuant/plugins/rapids_plugin/notebooks/custom_port_nodes.py @@ -5,7 +5,6 @@ import cudf import dask_cudf import dask -import rmm from gquant.dataframe_flow import Node, MetaData from gquant.dataframe_flow import NodePorts, PortsSpecSchema from gquant.dataframe_flow import ConfSchema @@ -236,8 +235,7 @@ def process(self, inputs): number_of_threads = 16 number_of_blocks = ((len(df) - 1) // number_of_threads) + 1 # Inits device array by setting 0 for each index. - # df['distance_numba'] = 0.0 - darr = rmm.device_array(len(df)) + darr = cuda.device_array(len(df)) distance_kernel[(number_of_blocks,), (number_of_threads,)]( df['x'], df['y'], diff --git a/notebooks/images/add_composite_node.gif b/gQuant/plugins/rapids_plugin/notebooks/images/add_composite_node.gif similarity index 100% rename from notebooks/images/add_composite_node.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/add_composite_node.gif diff --git a/notebooks/images/average.gif b/gQuant/plugins/rapids_plugin/notebooks/images/average.gif similarity index 100% rename from notebooks/images/average.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/average.gif diff --git a/notebooks/images/clean.gif b/gQuant/plugins/rapids_plugin/notebooks/images/clean.gif similarity index 100% rename from notebooks/images/clean.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/clean.gif diff --git a/notebooks/images/clean_up_feature.gif b/gQuant/plugins/rapids_plugin/notebooks/images/clean_up_feature.gif similarity index 100% rename from notebooks/images/clean_up_feature.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/clean_up_feature.gif diff --git a/notebooks/images/csv_out.gif b/gQuant/plugins/rapids_plugin/notebooks/images/csv_out.gif similarity index 100% rename from notebooks/images/csv_out.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/csv_out.gif diff --git a/notebooks/images/explore_data.gif b/gQuant/plugins/rapids_plugin/notebooks/images/explore_data.gif similarity index 100% rename from notebooks/images/explore_data.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/explore_data.gif diff --git a/notebooks/images/get_return_feature.gif b/gQuant/plugins/rapids_plugin/notebooks/images/get_return_feature.gif similarity index 100% rename from notebooks/images/get_return_feature.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/get_return_feature.gif diff --git a/notebooks/images/loader_csv.gif b/gQuant/plugins/rapids_plugin/notebooks/images/loader_csv.gif similarity index 100% rename from notebooks/images/loader_csv.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/loader_csv.gif diff --git a/notebooks/images/portfolio/add_indicator.gif b/gQuant/plugins/rapids_plugin/notebooks/images/portfolio/add_indicator.gif similarity index 100% rename from notebooks/images/portfolio/add_indicator.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/portfolio/add_indicator.gif diff --git a/notebooks/images/portfolio/add_volume_min_max_return.gif b/gQuant/plugins/rapids_plugin/notebooks/images/portfolio/add_volume_min_max_return.gif similarity index 100% rename from notebooks/images/portfolio/add_volume_min_max_return.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/portfolio/add_volume_min_max_return.gif diff --git a/notebooks/images/portfolio/backtest.gif b/gQuant/plugins/rapids_plugin/notebooks/images/portfolio/backtest.gif similarity index 100% rename from notebooks/images/portfolio/backtest.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/portfolio/backtest.gif diff --git a/notebooks/images/portfolio/change_parameters.gif b/gQuant/plugins/rapids_plugin/notebooks/images/portfolio/change_parameters.gif similarity index 100% rename from notebooks/images/portfolio/change_parameters.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/portfolio/change_parameters.gif diff --git a/notebooks/images/portfolio/clean_up_for_backtest.gif b/gQuant/plugins/rapids_plugin/notebooks/images/portfolio/clean_up_for_backtest.gif similarity index 100% rename from notebooks/images/portfolio/clean_up_for_backtest.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/portfolio/clean_up_for_backtest.gif diff --git a/notebooks/images/portfolio/create_composite.gif b/gQuant/plugins/rapids_plugin/notebooks/images/portfolio/create_composite.gif similarity index 100% rename from notebooks/images/portfolio/create_composite.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/portfolio/create_composite.gif diff --git a/notebooks/images/portfolio/filter_value.gif b/gQuant/plugins/rapids_plugin/notebooks/images/portfolio/filter_value.gif similarity index 100% rename from notebooks/images/portfolio/filter_value.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/portfolio/filter_value.gif diff --git a/notebooks/images/portfolio/run_dask_trade.gif b/gQuant/plugins/rapids_plugin/notebooks/images/portfolio/run_dask_trade.gif similarity index 100% rename from notebooks/images/portfolio/run_dask_trade.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/portfolio/run_dask_trade.gif diff --git a/notebooks/images/portfolio/run_pandas.gif b/gQuant/plugins/rapids_plugin/notebooks/images/portfolio/run_pandas.gif similarity index 100% rename from notebooks/images/portfolio/run_pandas.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/portfolio/run_pandas.gif diff --git a/notebooks/images/xgboost/categorical_variable.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/categorical_variable.gif similarity index 100% rename from notebooks/images/xgboost/categorical_variable.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/categorical_variable.gif diff --git a/notebooks/images/xgboost/create_composite_node.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/create_composite_node.gif similarity index 100% rename from notebooks/images/xgboost/create_composite_node.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/create_composite_node.gif diff --git a/notebooks/images/xgboost/create_node.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/create_node.gif similarity index 100% rename from notebooks/images/xgboost/create_node.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/create_node.gif diff --git a/notebooks/images/xgboost/custom_node.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/custom_node.gif similarity index 100% rename from notebooks/images/xgboost/custom_node.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/custom_node.gif diff --git a/notebooks/images/xgboost/dask_and_sub_graph.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/dask_and_sub_graph.gif similarity index 100% rename from notebooks/images/xgboost/dask_and_sub_graph.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/dask_and_sub_graph.gif diff --git a/notebooks/images/xgboost/distributed_inference.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/distributed_inference.gif similarity index 100% rename from notebooks/images/xgboost/distributed_inference.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/distributed_inference.gif diff --git a/notebooks/images/xgboost/forest_inference.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/forest_inference.gif similarity index 100% rename from notebooks/images/xgboost/forest_inference.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/forest_inference.gif diff --git a/notebooks/images/xgboost/normalize.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/normalize.gif similarity index 100% rename from notebooks/images/xgboost/normalize.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/normalize.gif diff --git a/notebooks/images/xgboost/prepare_stock_data.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/prepare_stock_data.gif similarity index 100% rename from notebooks/images/xgboost/prepare_stock_data.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/prepare_stock_data.gif diff --git a/notebooks/images/xgboost/split_the_dataset.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/split_the_dataset.gif similarity index 100% rename from notebooks/images/xgboost/split_the_dataset.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/split_the_dataset.gif diff --git a/notebooks/images/xgboost/train_and_infer.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/train_and_infer.gif similarity index 100% rename from notebooks/images/xgboost/train_and_infer.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/train_and_infer.gif diff --git a/notebooks/images/xgboost/visualize_data.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/visualize_data.gif similarity index 100% rename from notebooks/images/xgboost/visualize_data.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/visualize_data.gif diff --git a/notebooks/images/xgboost/xgboost_metrics.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/xgboost_metrics.gif similarity index 100% rename from notebooks/images/xgboost/xgboost_metrics.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/xgboost_metrics.gif diff --git a/notebooks/images/xgboost/xgboost_stock_data.gif b/gQuant/plugins/rapids_plugin/notebooks/images/xgboost/xgboost_stock_data.gif similarity index 100% rename from notebooks/images/xgboost/xgboost_stock_data.gif rename to gQuant/plugins/rapids_plugin/notebooks/images/xgboost/xgboost_stock_data.gif diff --git a/notebooks/mortgage_e2e_gquant/mortgage_common.py b/gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_common.py similarity index 100% rename from notebooks/mortgage_e2e_gquant/mortgage_common.py rename to gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_common.py diff --git a/notebooks/mortgage_e2e_gquant/mortgage_e2e_gquant.ipynb b/gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_e2e_gquant.ipynb similarity index 100% rename from notebooks/mortgage_e2e_gquant/mortgage_e2e_gquant.ipynb rename to gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_e2e_gquant.ipynb diff --git a/notebooks/mortgage_e2e_gquant/mortgage_gquant_plugins.py b/gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_gquant_plugins.py similarity index 100% rename from notebooks/mortgage_e2e_gquant/mortgage_gquant_plugins.py rename to gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_gquant_plugins.py diff --git a/notebooks/mortgage_e2e_gquant/mortgage_run_workflow_daskdistrib.py b/gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_run_workflow_daskdistrib.py similarity index 100% rename from notebooks/mortgage_e2e_gquant/mortgage_run_workflow_daskdistrib.py rename to gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_run_workflow_daskdistrib.py diff --git a/notebooks/mortgage_e2e_gquant/mortgage_run_workflow_local.py b/gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_run_workflow_local.py similarity index 100% rename from notebooks/mortgage_e2e_gquant/mortgage_run_workflow_local.py rename to gQuant/plugins/rapids_plugin/notebooks/mortgage_e2e_gquant/mortgage_run_workflow_local.py diff --git a/notebooks/plotutils.py b/gQuant/plugins/rapids_plugin/notebooks/plotutils.py similarity index 100% rename from notebooks/plotutils.py rename to gQuant/plugins/rapids_plugin/notebooks/plotutils.py diff --git a/gQuant/plugins/rapids_plugin/setup.py b/gQuant/plugins/rapids_plugin/setup.py new file mode 100644 index 00000000..d8eba41b --- /dev/null +++ b/gQuant/plugins/rapids_plugin/setup.py @@ -0,0 +1,28 @@ +from setuptools import setup, find_packages + +setup( + name='gquant_rapids_plugin', + install_requires=[ + "bqplot", "tables", "ray[tune]" + ], + packages=find_packages(include=['gquant_rapids_plugin', + 'gquant_rapids_plugin.analysis', + 'gquant_rapids_plugin.backtest', + 'gquant_rapids_plugin.dataloader', + 'gquant_rapids_plugin.ml', + 'gquant_rapids_plugin.portofolio', + 'gquant_rapids_plugin.strategy', + 'gquant_rapids_plugin.cuindicator', + 'gquant_rapids_plugin.transform']), + entry_points={ + 'gquant.plugin': + ['gquant_rapids_plugin = gquant_rapids_plugin', + 'gquant_rapids_plugin.analysis = gquant_rapids_plugin.analysis', + 'gquant_rapids_plugin.backtest = gquant_rapids_plugin.backtest', + 'gquant_rapids_plugin.dataloader = gquant_rapids_plugin.dataloader', + 'gquant_rapids_plugin.ml = gquant_rapids_plugin.ml', + 'gquant_rapids_plugin.portofolio = gquant_rapids_plugin.portofolio', + 'gquant_rapids_plugin.strategy = gquant_rapids_plugin.strategy', + 'gquant_rapids_plugin.transform = gquant_rapids_plugin.transform'], + } +) diff --git a/gQuant/plugins/rapids_plugin/taskgraphs/dask_tutorial.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/dask_tutorial.gq.yaml new file mode 100644 index 00000000..298fea36 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/taskgraphs/dask_tutorial.gq.yaml @@ -0,0 +1,35 @@ +- conf: + file: notebooks/data/stock_price_hist.csv.gz + path: notebooks/many-small + id: stock_data + inputs: {} + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: + keys: + - asset + - datetime + id: sort_node + inputs: + in: stock_data.dask_cudf_out + module: gquant_rapids_plugin.transform + type: SortNode +- conf: {} + id: '' + inputs: + in1: output_csv.df_out + type: Output_Collector +- conf: + column: volume + id: average_volume + inputs: + stock_in: sort_node.out + module: gquant_rapids_plugin.transform + type: AverageNode +- conf: + path: notebooks/dask_average_volume.csv + id: output_csv + inputs: + df_in: average_volume.stock_out + module: gquant_rapids_plugin.analysis + type: OutCsvNode diff --git a/taskgraphs/full_example.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/full_example.gq.yaml similarity index 81% rename from taskgraphs/full_example.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/full_example.gq.yaml index 8a119d24..8dba32e6 100644 --- a/taskgraphs/full_example.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/full_example.gq.yaml @@ -1,65 +1,65 @@ -- id: points_task - type: PointNode - conf: - npts: 80 +- conf: npartitions: 4 + npts: 80 + id: points_task inputs: {} -- id: numba - type: NumbaDistanceNode - conf: {} + type: PointNode +- conf: {} + id: numba inputs: points_df_in: points_task.points_df_out -- id: cupy - type: CupyDistanceNode - conf: {} + type: NumbaDistanceNode +- conf: {} + id: cupy inputs: points_df_in: points_task.points_df_out -- id: verify - type: VerifyNode - conf: + type: CupyDistanceNode +- conf: df1_col: distance_numba df2_col: distance_cupy + id: verify inputs: df1: numba.distance_df df2: cupy.distance_df -- id: cudf - type: DistanceNode - conf: {} + type: VerifyNode +- conf: {} + id: cudf inputs: points_df_in: points_task.points_df_out -- id: verify2 - type: VerifyNode - conf: + type: DistanceNode +- conf: df1_col: distance_cupy df2_col: distance_cudf + id: verify2 inputs: df1: cupy.distance_df df2: cudf.distance_df -- id: dask_cudf - type: DistanceNode - conf: {} + type: VerifyNode +- conf: {} + id: dask_cudf inputs: points_df_in: points_task.points_ddf_out module: custom_port_nodes -- id: verify_dask - type: VerifyNode - conf: + type: DistanceNode +- conf: df1_col: distance_cudf df2_col: distance_numba + id: verify_dask inputs: - df2: dask_numba.distance_df df1: dask_cudf.distance_df + df2: dask_numba.distance_df module: custom_port_nodes -- id: distributed_data - type: DistributedNode - conf: + type: VerifyNode +- conf: npartitions: 4 + id: distributed_data inputs: points_df_in: points_task.points_df_out module: custom_port_nodes -- id: dask_numba - type: NumbaDistanceNode - conf: {} + type: DistributedNode +- conf: {} + id: dask_numba inputs: points_df_in: distributed_data.points_ddf_out module: custom_port_nodes + type: NumbaDistanceNode diff --git a/taskgraphs/get_return_feature.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/get_return_feature.gq.yaml similarity index 52% rename from taskgraphs/get_return_feature.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/get_return_feature.gq.yaml index 3a0c3db8..985a4d0d 100644 --- a/taskgraphs/get_return_feature.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/get_return_feature.gq.yaml @@ -1,36 +1,36 @@ -- id: stock_data - type: CsvStockLoader - conf: +- conf: file: notebooks/data/stock_price_hist.csv.gz + id: stock_data inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: {} + id: '' inputs: in1: stock_data.cudf_out in2: add_return_feature.stock_out module: rapids_modules -- id: volume_filter - type: ValueFilterNode - conf: - - column: volume - min: 50 + type: Output_Collector +- conf: + - column: volume + min: 50 + id: volume_filter inputs: in: stock_data.cudf_out - module: rapids_modules -- id: sort_node - type: SortNode - conf: + module: gquant_rapids_plugin.transform + type: ValueFilterNode +- conf: keys: - - asset - - datetime + - asset + - datetime + id: sort_node inputs: in: volume_filter.out - module: rapids_modules -- id: add_return_feature - type: ReturnFeatureNode - conf: {} + module: gquant_rapids_plugin.transform + type: SortNode +- conf: {} + id: add_return_feature inputs: stock_in: sort_node.out - module: rapids_modules + module: gquant_rapids_plugin.transform + type: ReturnFeatureNode diff --git a/taskgraphs/portfolio_trade.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/portfolio_trade.gq.yaml similarity index 55% rename from taskgraphs/portfolio_trade.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/portfolio_trade.gq.yaml index 541a9597..1414d4ed 100644 --- a/taskgraphs/portfolio_trade.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/portfolio_trade.gq.yaml @@ -1,78 +1,78 @@ -- id: stock_data - type: CsvStockLoader - conf: +- conf: file: notebooks/data/stock_price_hist.csv.gz path: notebooks/many-small + id: stock_data inputs: {} - module: rapids_modules -- id: preprocess - type: CompositeNode - conf: + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: + input: + - sort_node.in + output: + - drop_columns.out subnode_ids: - - value_filter + - value_filter subnodes_conf: value_filter: conf: - - column: min_return - min: -10 - - column: max_return - max: 10 - - column: average_volume - min: 400 + - column: min_return + min: -10 + - column: max_return + max: 10 + - column: average_volume + min: 400 taskgraph: taskgraphs/preprocess.gq.yaml - input: - - sort_node.in - output: - - drop_columns.out + id: preprocess inputs: sort_node@in: stock_data.cudf_out -- id: sort_after - type: SortNode - conf: + type: CompositeNode +- conf: keys: - - asset - - datetime + - asset + - datetime + id: sort_after inputs: in: preprocess.drop_columns@out - module: rapids_modules -- id: exp_mean_reversion - type: PortExpMovingAverageStrategyNode - conf: + module: gquant_rapids_plugin.transform + type: SortNode +- conf: fast: 5 slow: 20 + id: exp_mean_reversion inputs: stock_in: sort_after.out - module: rapids_modules -- id: backtest - type: SimpleBackTestNode - conf: {} + module: gquant_rapids_plugin.strategy + type: PortExpMovingAverageStrategyNode +- conf: {} + id: backtest inputs: bardata_in: exp_mean_reversion.stock_out - module: rapids_modules -- id: portfolio_opt - type: SimpleAveragePortOpt - conf: {} + module: gquant_rapids_plugin.backtest + type: SimpleBackTestNode +- conf: {} + id: portfolio_opt inputs: stock_in: backtest.backtest_out - module: rapids_modules -- id: sharpe_ratio - type: SharpeRatioNode - conf: {} + module: gquant_rapids_plugin.portofolio + type: SimpleAveragePortOpt +- conf: {} + id: sharpe_ratio inputs: stock_in: portfolio_opt.stock_out - module: rapids_modules -- id: cumulative_return - type: CumReturnNode - conf: - points: 300 + module: gquant_rapids_plugin.analysis + type: SharpeRatioNode +- conf: label: cumulative return + points: 300 + id: cumulative_return inputs: in: portfolio_opt.stock_out - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.analysis + type: CumReturnNode +- conf: {} + id: '' inputs: in1: cumulative_return.cum_return in2: sharpe_ratio.sharpe_out module: rapids_modules + type: Output_Collector diff --git a/taskgraphs/preprocess.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/preprocess.gq.yaml similarity index 51% rename from taskgraphs/preprocess.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/preprocess.gq.yaml index 9da3dff2..dda07c86 100644 --- a/taskgraphs/preprocess.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/preprocess.gq.yaml @@ -1,128 +1,128 @@ -- id: stock_data - type: CsvStockLoader - conf: +- conf: file: notebooks/data/stock_price_hist.csv.gz path: notebooks/many-small/ + id: stock_data inputs: {} - module: rapids_modules -- id: sort_node - type: SortNode - conf: + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: keys: - - asset - - datetime + - asset + - datetime + id: sort_node inputs: in: stock_data.cudf_out - module: rapids_modules -- id: add_return_feature - type: ReturnFeatureNode - conf: {} + module: gquant_rapids_plugin.transform + type: SortNode +- conf: {} + id: add_return_feature inputs: stock_in: sort_node.out - module: rapids_modules -- id: find_stock_row - type: AssetIndicatorNode - conf: {} + module: gquant_rapids_plugin.transform + type: ReturnFeatureNode +- conf: {} + id: find_stock_row inputs: stock_in: add_return_feature.stock_out - module: rapids_modules -- id: average_volume - type: AverageNode - conf: + module: gquant_rapids_plugin.transform + type: AssetIndicatorNode +- conf: column: volume + id: average_volume inputs: stock_in: find_stock_row.stock_out - module: rapids_modules -- id: rename_average_volume - type: RenameNode - conf: - old: volume + module: gquant_rapids_plugin.transform + type: AverageNode +- conf: new: average_volume + old: volume + id: rename_average_volume inputs: in: average_volume.stock_out - module: rapids_modules -- id: merge_average_volume - type: LeftMergeNode - conf: + module: gquant_rapids_plugin.transform + type: RenameNode +- conf: column: asset + id: merge_average_volume inputs: left: find_stock_row.stock_out right: rename_average_volume.out - module: rapids_modules -- id: min_return - type: MinNode - conf: + module: gquant_rapids_plugin.transform + type: LeftMergeNode +- conf: column: returns + id: min_return inputs: in: find_stock_row.stock_out - module: rapids_modules -- id: rename_min_return - type: RenameNode - conf: - old: returns + module: gquant_rapids_plugin.transform + type: MinNode +- conf: new: min_return + old: returns + id: rename_min_return inputs: in: min_return.out - module: rapids_modules -- id: merge_min_return - type: LeftMergeNode - conf: + module: gquant_rapids_plugin.transform + type: RenameNode +- conf: column: asset + id: merge_min_return inputs: - right: rename_min_return.out left: merge_average_volume.merged - module: rapids_modules -- id: max_return - type: MaxNode - conf: + right: rename_min_return.out + module: gquant_rapids_plugin.transform + type: LeftMergeNode +- conf: column: returns + id: max_return inputs: in: find_stock_row.stock_out - module: rapids_modules -- id: rename_max_return - type: RenameNode - conf: - old: returns + module: gquant_rapids_plugin.transform + type: MaxNode +- conf: new: max_return + old: returns + id: rename_max_return inputs: in: max_return.out - module: rapids_modules -- id: merge_max_return - type: LeftMergeNode - conf: + module: gquant_rapids_plugin.transform + type: RenameNode +- conf: column: asset + id: merge_max_return inputs: - right: rename_max_return.out left: merge_min_return.merged - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + right: rename_max_return.out + module: gquant_rapids_plugin.transform + type: LeftMergeNode +- conf: {} + id: '' inputs: in1: drop_columns.out -- id: value_filter - type: ValueFilterNode - conf: - - column: average_volume - min: 10 - - column: min_return - min: -10 - - column: max_return - max: 10 + type: Output_Collector +- conf: + - column: average_volume + min: 10 + - column: min_return + min: -10 + - column: max_return + max: 10 + id: value_filter inputs: in: merge_max_return.merged - module: rapids_modules -- id: drop_columns - type: DropNode - conf: + module: gquant_rapids_plugin.transform + type: ValueFilterNode +- conf: columns: - - average_volume - - min_return - - max_return - - open - - high - - low - - volume + - average_volume + - min_return + - max_return + - open + - high + - low + - volume + id: drop_columns inputs: in: value_filter.out - module: rapids_modules + module: gquant_rapids_plugin.transform + type: DropNode diff --git a/taskgraphs/simple_trade.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/simple_trade.gq.yaml similarity index 57% rename from taskgraphs/simple_trade.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/simple_trade.gq.yaml index 7775a632..e08d96d5 100644 --- a/taskgraphs/simple_trade.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/simple_trade.gq.yaml @@ -1,26 +1,25 @@ -- id: stock_data - type: CsvStockLoader - conf: +- conf: file: notebooks/data/stock_price_hist.csv.gz + id: stock_data inputs: {} - module: rapids_modules -- id: stock_name - type: StockNameLoader - conf: + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: file: notebooks/data/security_master.csv.gz + id: stock_name inputs: {} - module: rapids_modules -- id: stock_selector - type: AssetFilterNode - conf: + module: gquant_rapids_plugin.dataloader + type: StockNameLoader +- conf: asset: 4330 + id: stock_selector inputs: name_map: stock_name.map_data stock_in: stock_data.cudf_out - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.transform + type: AssetFilterNode +- conf: {} + id: '' inputs: in1: stock_selector.stock_name in2: lineplot.lineplot @@ -29,69 +28,70 @@ in5: cumulative_return.cum_return in6: stock_data.cudf_out module: rapids_modules -- id: sort_node - type: SortNode - conf: + type: Output_Collector +- conf: keys: - - asset - - datetime + - asset + - datetime + id: sort_node inputs: in: stock_selector.stock_out - module: rapids_modules -- id: add_return - type: ReturnFeatureNode - conf: {} + module: gquant_rapids_plugin.transform + type: SortNode +- conf: {} + id: add_return inputs: stock_in: sort_node.out - module: rapids_modules -- id: mean_reversion - type: MovingAverageStrategyNode - conf: + module: gquant_rapids_plugin.transform + type: ReturnFeatureNode +- conf: fast: 5 slow: 10 + id: mean_reversion inputs: stock_in: add_return.stock_out - module: rapids_modules -- id: backtest - type: SimpleBackTestNode - conf: {} + module: gquant_rapids_plugin.strategy + type: MovingAverageStrategyNode +- conf: {} + id: backtest inputs: bardata_in: mean_reversion.stock_out - module: rapids_modules -- id: barplot - type: BarPlotNode - conf: - points: 300 + module: gquant_rapids_plugin.backtest + type: SimpleBackTestNode +- conf: label: barplot + points: 300 + id: barplot inputs: stock_in: backtest.backtest_out - module: rapids_modules -- id: lineplot - type: LinePlotNode - conf: + module: gquant_rapids_plugin.analysis + type: BarPlotNode +- conf: lines: - - column: ma_slow - label: slow - color: blue - - column: ma_fast - label: fast - color: green + - color: blue + column: ma_slow + label: slow + - color: green + column: ma_fast + label: fast points: 300 title: signals + id: lineplot inputs: in: backtest.backtest_out - module: rapids_modules -- id: sharpe_ratio - type: SharpeRatioNode - conf: {} + module: gquant_rapids_plugin.analysis + type: LinePlotNode +- conf: {} + id: sharpe_ratio inputs: stock_in: backtest.backtest_out - module: rapids_modules -- id: cumulative_return - type: CumReturnNode - conf: - points: 300 + module: gquant_rapids_plugin.analysis + type: SharpeRatioNode +- conf: label: cumulative_return + points: 300 + id: cumulative_return inputs: in: backtest.backtest_out - module: rapids_modules + module: gquant_rapids_plugin.analysis + type: CumReturnNode diff --git a/taskgraphs/sort_stocks.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/sort_stocks.gq.yaml similarity index 57% rename from taskgraphs/sort_stocks.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/sort_stocks.gq.yaml index 323b3144..be104e32 100644 --- a/taskgraphs/sort_stocks.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/sort_stocks.gq.yaml @@ -1,21 +1,21 @@ -- id: stock_data - type: CsvStockLoader - conf: +- conf: file: notebooks/data/stock_price_hist.csv.gz path: notebooks/many-small + id: stock_data inputs: {} - module: rapids_modules -- id: sort_node - type: SortNode - conf: + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: keys: - - asset - - datetime + - asset + - datetime + id: sort_node inputs: in: stock_data.cudf_out - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.transform + type: SortNode +- conf: {} + id: '' inputs: in1: sort_node.out + type: Output_Collector diff --git a/taskgraphs/streamz/gpu_double.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/streamz/gpu_double.gq.yaml similarity index 76% rename from taskgraphs/streamz/gpu_double.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/streamz/gpu_double.gq.yaml index 7d1ff015..b339edfd 100644 --- a/taskgraphs/streamz/gpu_double.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/streamz/gpu_double.gq.yaml @@ -1,55 +1,55 @@ -- id: source - type: StreamNode - conf: {} +- conf: {} + id: source inputs: {} module: streamz -- id: "" - type: Output_Collector - conf: {} + type: StreamNode +- conf: {} + id: '' inputs: in1: source.stream_out in2: plot.fig_out in3: print.stream_out -- id: slide_window - type: SlideWindowNode - conf: + type: Output_Collector +- conf: window: 50 + id: slide_window inputs: stream_in: source.stream_out module: streamz -- id: plot - type: PlotSinkNode - conf: {} + type: SlideWindowNode +- conf: {} + id: plot inputs: stream_in: to_stream.stream_out module: streamz -- id: convert - type: TupleToCudf - conf: {} + type: PlotSinkNode +- conf: {} + id: convert inputs: stream_in: slide_window.stream_out module: streamz -- id: to_dataframe - type: ToDataFrame - conf: {} + type: TupleToCudf +- conf: {} + id: to_dataframe inputs: stream_in: convert.stream_out module: streamz -- id: to_stream - type: ToStream - conf: {} + type: ToDataFrame +- conf: {} + id: to_stream inputs: df_in: double_in_gpu.df_out module: streamz -- id: double_in_gpu - type: GPUDouble - conf: {} + type: ToStream +- conf: {} + id: double_in_gpu inputs: df_in: to_dataframe.df_out module: streamz -- id: print - type: SinkNode - conf: {} + type: GPUDouble +- conf: {} + id: print inputs: stream_in: to_stream.stream_out module: streamz + type: SinkNode diff --git a/taskgraphs/streamz/gpu_double_two_branches.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/streamz/gpu_double_two_branches.gq.yaml similarity index 76% rename from taskgraphs/streamz/gpu_double_two_branches.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/streamz/gpu_double_two_branches.gq.yaml index fc78c645..94e0c10c 100644 --- a/taskgraphs/streamz/gpu_double_two_branches.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/streamz/gpu_double_two_branches.gq.yaml @@ -1,74 +1,74 @@ -- id: source - type: StreamNode - conf: {} +- conf: {} + id: source inputs: {} module: streamz -- id: "" - type: Output_Collector - conf: {} + type: StreamNode +- conf: {} + id: '' inputs: in1: source.stream_out in2: plot.fig_out in3: print.stream_out -- id: slide_window - type: SlideWindowNode - conf: + type: Output_Collector +- conf: window: 50 + id: slide_window inputs: stream_in: source.stream_out module: streamz -- id: plot - type: PlotSinkNode - conf: {} + type: SlideWindowNode +- conf: {} + id: plot inputs: stream_in: zip_streams.stream_out module: streamz -- id: convert - type: TupleToCudf - conf: {} + type: PlotSinkNode +- conf: {} + id: convert inputs: stream_in: slide_window.stream_out module: streamz -- id: to_dataframe - type: ToDataFrame - conf: {} + type: TupleToCudf +- conf: {} + id: to_dataframe inputs: stream_in: convert.stream_out module: streamz -- id: to_stream - type: ToStream - conf: {} + type: ToDataFrame +- conf: {} + id: to_stream inputs: df_in: double_in_gpu.df_out module: streamz -- id: double_in_gpu - type: GPUDouble - conf: {} + type: ToStream +- conf: {} + id: double_in_gpu inputs: df_in: to_dataframe.df_out module: streamz -- id: print - type: SinkNode - conf: {} + type: GPUDouble +- conf: {} + id: print inputs: stream_in: zip_streams.stream_out module: streamz -- id: double_again - type: GPUDouble - conf: {} + type: SinkNode +- conf: {} + id: double_again inputs: df_in: double_in_gpu.df_out module: streamz -- id: to_stream2 - type: ToStream - conf: {} + type: GPUDouble +- conf: {} + id: to_stream2 inputs: df_in: double_again.df_out module: streamz -- id: zip_streams - type: ZipNode - conf: {} + type: ToStream +- conf: {} + id: zip_streams inputs: stream1_in: to_stream.stream_out stream2_in: to_stream2.stream_out module: streamz + type: ZipNode diff --git a/taskgraphs/streamz/plot.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/streamz/plot.gq.yaml similarity index 77% rename from taskgraphs/streamz/plot.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/streamz/plot.gq.yaml index 9f02fa00..677a05ff 100644 --- a/taskgraphs/streamz/plot.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/streamz/plot.gq.yaml @@ -1,30 +1,30 @@ -- id: source - type: StreamNode - conf: {} +- conf: {} + id: source inputs: {} module: streamz -- id: double - type: TransformNode - conf: {} + type: StreamNode +- conf: {} + id: double inputs: stream_in: source.stream_out module: streamz -- id: "" - type: Output_Collector - conf: {} + type: TransformNode +- conf: {} + id: '' inputs: in1: source.stream_out in2: plot.fig_out -- id: slide_window - type: SlideWindowNode - conf: + type: Output_Collector +- conf: window: 50 + id: slide_window inputs: stream_in: double.stream_out module: streamz -- id: plot - type: PlotSinkNode - conf: {} + type: SlideWindowNode +- conf: {} + id: plot inputs: stream_in: slide_window.stream_out module: streamz + type: PlotSinkNode diff --git a/taskgraphs/streamz/two_branches.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/streamz/two_branches.gq.yaml similarity index 78% rename from taskgraphs/streamz/two_branches.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/streamz/two_branches.gq.yaml index 631ad752..7f768c1b 100644 --- a/taskgraphs/streamz/two_branches.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/streamz/two_branches.gq.yaml @@ -1,50 +1,50 @@ -- id: source - type: StreamNode - conf: {} +- conf: {} + id: source inputs: {} module: streamz -- id: double - type: TransformNode - conf: {} + type: StreamNode +- conf: {} + id: double inputs: stream_in: source.stream_out module: streamz -- id: "" - type: Output_Collector - conf: {} + type: TransformNode +- conf: {} + id: '' inputs: in1: source.stream_out in2: plot.fig_out -- id: slide_window - type: SlideWindowNode - conf: + type: Output_Collector +- conf: window: 50 + id: slide_window inputs: stream_in: double.stream_out module: streamz -- id: plot - type: PlotSinkNode - conf: {} + type: SlideWindowNode +- conf: {} + id: plot inputs: stream_in: zip.stream_out module: streamz -- id: double_again - type: TransformNode - conf: {} + type: PlotSinkNode +- conf: {} + id: double_again inputs: stream_in: double.stream_out module: streamz -- id: zip - type: ZipNode - conf: {} + type: TransformNode +- conf: {} + id: zip inputs: stream1_in: slide_window.stream_out stream2_in: slide_window2.stream_out module: streamz -- id: slide_window2 - type: SlideWindowNode - conf: + type: ZipNode +- conf: window: 50 + id: slide_window2 inputs: stream_in: double_again.stream_out module: streamz + type: SlideWindowNode diff --git a/taskgraphs/tutorial_intro.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/tutorial_intro.gq.yaml similarity index 57% rename from taskgraphs/tutorial_intro.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/tutorial_intro.gq.yaml index 93a35988..44275ec2 100644 --- a/taskgraphs/tutorial_intro.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/tutorial_intro.gq.yaml @@ -1,80 +1,80 @@ -- id: stock_data - type: CsvStockLoader - conf: +- conf: file: notebooks/data/stock_price_hist.csv.gz + id: stock_data inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: {} + id: '' inputs: in1: csv_output2.df_out in2: csv_output1.df_out module: rapids_modules -- id: get_return - type: CompositeNode - conf: + type: Output_Collector +- conf: + input: + - volume_filter.in + output: + - add_return_feature.stock_out subnode_ids: - - volume_filter + - volume_filter subnodes_conf: volume_filter: conf: - - column: volume - min: 100 + - column: volume + min: 100 taskgraph: taskgraphs/get_return_feature.gq.yaml - input: - - volume_filter.in - output: - - add_return_feature.stock_out + id: get_return inputs: volume_filter@in: stock_data.cudf_out -- id: average_volume - type: AverageNode - conf: + type: CompositeNode +- conf: column: volume + id: average_volume inputs: stock_in: get_return.add_return_feature@stock_out - module: rapids_modules -- id: average_return + module: gquant_rapids_plugin.transform type: AverageNode - conf: +- conf: column: returns + id: average_return inputs: stock_in: get_return.add_return_feature@stock_out - module: rapids_modules -- id: stock_name - type: StockNameLoader - conf: + module: gquant_rapids_plugin.transform + type: AverageNode +- conf: file: notebooks/data/security_master.csv.gz + id: stock_name inputs: {} - module: rapids_modules -- id: left_merge1 - type: LeftMergeNode - conf: + module: gquant_rapids_plugin.dataloader + type: StockNameLoader +- conf: column: asset + id: left_merge1 inputs: left: average_volume.stock_out right: stock_name.stock_name - module: rapids_modules -- id: left_merge2 + module: gquant_rapids_plugin.transform type: LeftMergeNode - conf: +- conf: column: asset + id: left_merge2 inputs: left: average_return.stock_out right: stock_name.stock_name - module: rapids_modules -- id: csv_output1 - type: OutCsvNode - conf: - path: /home/quant/gQuant/notebooks/average_return.csv + module: gquant_rapids_plugin.transform + type: LeftMergeNode +- conf: + path: notebooks/average_return.csv + id: csv_output1 inputs: df_in: left_merge2.merged - module: rapids_modules -- id: csv_output2 + module: gquant_rapids_plugin.analysis type: OutCsvNode - conf: - path: /home/quant/gQuant/notebooks/average_volume.csv +- conf: + path: notebooks/average_volume.csv + id: csv_output2 inputs: df_in: left_merge1.merged - module: rapids_modules + module: gquant_rapids_plugin.analysis + type: OutCsvNode diff --git a/gQuant/plugins/rapids_plugin/taskgraphs/visualize_frac_diff.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/visualize_frac_diff.gq.yaml new file mode 100644 index 00000000..f131af34 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/taskgraphs/visualize_frac_diff.gq.yaml @@ -0,0 +1,113 @@ +- conf: + file: notebooks/data/stock_price_hist.csv.gz + path: notebooks/many-small + id: stock_data + inputs: {} + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: + asset: 22123 + id: asset_filter + inputs: + stock_in: xgboost_graph.technical_indicator@stock_out + module: gquant_rapids_plugin.transform + type: AssetFilterNode +- conf: {} + id: '' + inputs: + in1: lineplot.lineplot + type: Output_Collector +- conf: + lines: + - color: blue + column: FR_DI_0.1 + label: d 0.1 + - color: orange + column: FR_DI_0.3 + label: d 0.3 + - color: green + column: FR_DI_0.5 + label: d 0.5 + - color: black + column: FR_DI_0.7 + label: d 0.7 + points: 300 + title: signals + id: lineplot + inputs: + in: asset_filter.stock_out + module: gquant_rapids_plugin.analysis + type: LinePlotNode +- conf: + input: + - preprocess.sort_node@in + output: + - technical_indicator.stock_out + subnode_ids: + - preprocess + - technical_indicator + subnodes_conf: + preprocess: + conf: + input: + - sort_node.in + output: + - drop_columns.out + subnode_ids: + - value_filter + - drop_columns + subnodes_conf: + drop_columns: + conf: + columns: + - average_volume + - min_return + - max_return + value_filter: + conf: + - column: average_volume + min: 400 + - column: min_return + min: -10 + - column: max_return + max: 10 + taskgraph: taskgraphs/preprocess.gq.yaml + technical_indicator: + conf: + indicators: + - args: + - 0.9 + columns: + - close + function: port_fractional_diff + - args: + - 0.7 + columns: + - close + function: port_fractional_diff + - args: + - 0.5 + columns: + - close + function: port_fractional_diff + - args: + - 0.3 + columns: + - close + function: port_fractional_diff + - args: + - 0.1 + columns: + - close + function: port_fractional_diff + - args: + - -1 + columns: + - returns + function: port_shift + remove_na: true + taskgraph: taskgraphs/xgboost_trade.gq.yaml + id: xgboost_graph + inputs: + preprocess@sort_node@in: stock_data.cudf_out + type: CompositeNode diff --git a/taskgraphs/xgboost_example/data_generator.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/data_generator.gq.yaml similarity index 54% rename from taskgraphs/xgboost_example/data_generator.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/data_generator.gq.yaml index cb483df3..32c937e7 100644 --- a/taskgraphs/xgboost_example/data_generator.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/data_generator.gq.yaml @@ -1,73 +1,73 @@ -- id: data_gen - type: ClassificationData - conf: - n_samples: 10000 +- conf: + class_sep: 1 + dtype: float64 + flip_y: 0.01 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.01 - class_sep: 1 - hypercube: true - shift: 0 + n_samples: 10000 + order: F scale: 1 + shift: 0 shuffle: true - order: F - dtype: float64 - n_parts: 4 + id: data_gen inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.dataloader + type: ClassificationData +- conf: {} + id: '' inputs: in1: drop_x2_x3.out -- id: x2_to_sign - type: AddSignIndicatorNode - conf: - sign: x2_sign + type: Output_Collector +- conf: column: x2 + sign: x2_sign + id: x2_to_sign inputs: in: data_gen.cudf_out - module: rapids_modules -- id: x3_to_sign + module: gquant_rapids_plugin.transform type: AddSignIndicatorNode - conf: - sign: x3_sign +- conf: column: x3 + sign: x3_sign + id: x3_to_sign inputs: in: x2_to_sign.out - module: rapids_modules -- id: drop_x2_x3 - type: DropNode - conf: + module: gquant_rapids_plugin.transform + type: AddSignIndicatorNode +- conf: columns: - - x2 - - x3 - - x3_sign - - x2_sign + - x2 + - x3 + - x3_sign + - x2_sign + id: drop_x2_x3 inputs: in: one_hot_encoding.out - module: rapids_modules -- id: one_hot_encoding - type: OneHotEncodingNode - conf: - - cats: - - 0 - - 1 - prefix_sep: _ - dtype: float64 - column: x3_sign - prefix: x3 - - cats: - - 0 - - 1 - prefix_sep: _ - dtype: float64 - column: x2_sign - prefix: x2 + module: gquant_rapids_plugin.transform + type: DropNode +- conf: + - cats: + - 0 + - 1 + column: x3_sign + dtype: float64 + prefix: x3 + prefix_sep: _ + - cats: + - 0 + - 1 + column: x2_sign + dtype: float64 + prefix: x2 + prefix_sep: _ + id: one_hot_encoding inputs: in: x3_to_sign.out - module: rapids_modules + module: gquant_rapids_plugin.transform + type: OneHotEncodingNode diff --git a/taskgraphs/xgboost_example/hyper_parameters_search.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/hyper_parameters_search.gq.yaml similarity index 53% rename from taskgraphs/xgboost_example/hyper_parameters_search.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/hyper_parameters_search.gq.yaml index 35810e55..9751b937 100644 --- a/taskgraphs/xgboost_example/hyper_parameters_search.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/hyper_parameters_search.gq.yaml @@ -1,211 +1,211 @@ -- id: data_gen - type: ClassificationData - conf: - n_samples: 10000 +- conf: + class_sep: 1 + dtype: float64 + flip_y: 0.01 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.01 - class_sep: 1 - hypercube: true - shift: 0 + n_samples: 10000 + order: F scale: 1 + shift: 0 shuffle: true - order: F - dtype: float64 - n_parts: 4 + id: data_gen inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.dataloader + type: ClassificationData +- conf: {} + id: '' inputs: in1: xgboost_model.train_roc@roc_curve in2: xgboost_model.test_roc@roc_curve in3: hpo.conf_out in4: hpo.train_roc@roc_curve in5: hpo.test_roc@roc_curve -- id: data_generator - type: CompositeNode - conf: + type: Output_Collector +- conf: input: - - x2_to_sign.in + - x2_to_sign.in output: - - drop_x2_x3.out + - drop_x2_x3.out subnode_ids: - - data_gen + - data_gen subnodes_conf: data_gen: conf: - n_samples: 10000 + class_sep: 1 + dtype: float64 + flip_y: 0.1 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.1 - class_sep: 1 - hypercube: true - shift: 0 - scale: 1 - shuffle: true + n_samples: 10000 order: F - dtype: float64 - n_parts: 4 random_state: 10 + scale: 1 + shift: 0 + shuffle: true taskgraph: taskgraphs/xgboost_example/data_generator.gq.yaml + id: data_generator inputs: x2_to_sign@in: data_gen.cudf_out -- id: data_splitter - type: DataSplittingNode - conf: - train_size: 0.8 + type: CompositeNode +- conf: target: y + train_size: 0.8 + id: data_splitter inputs: in: data_generator.drop_x2_x3@out - module: rapids_modules -- id: xgboost_model - type: ContextCompositeNode - conf: - input: - - train_norm.df_in - - test_norm.df_in - output: - - train_infer.out - - test_infer.out - - train_roc.roc_curve - - test_roc.roc_curve + module: gquant_rapids_plugin.ml + type: DataSplittingNode +- conf: context: - target: - type: string - value: y + depth: map: - - node_id: train_xgboost - xpath: train_xgboost.conf.target - - node_id: train_roc - xpath: train_roc.conf.label - - node_id: test_roc - xpath: test_roc.conf.label + - node_id: train_xgboost + xpath: train_xgboost.conf.xgboost_parameters.max_depth + type: number + value: 1 + eta: + map: + - node_id: train_xgboost + xpath: train_xgboost.conf.xgboost_parameters.eta + type: number + value: 0.1 features: + map: + - node_id: train_norm + xpath: train_norm.conf.columns + - node_id: train_xgboost + xpath: train_xgboost.conf.columns type: array_string value: - - y - map: - - node_id: train_norm - xpath: train_norm.conf.columns - - node_id: train_xgboost - xpath: train_xgboost.conf.columns + - y inclusive: - type: boolean map: - - node_id: train_norm - xpath: train_norm.conf.include - - node_id: train_xgboost - xpath: train_xgboost.conf.include + - node_id: train_norm + xpath: train_norm.conf.include + - node_id: train_xgboost + xpath: train_xgboost.conf.include + type: boolean value: false - depth: - type: number - value: 1 - map: - - node_id: train_xgboost - xpath: train_xgboost.conf.xgboost_parameters.max_depth - eta: - type: number - value: 0.1 + target: map: - - node_id: train_xgboost - xpath: train_xgboost.conf.xgboost_parameters.eta + - node_id: train_xgboost + xpath: train_xgboost.conf.target + - node_id: train_roc + xpath: train_roc.conf.label + - node_id: test_roc + xpath: test_roc.conf.label + type: string + value: y + input: + - train_norm.df_in + - test_norm.df_in + output: + - train_infer.out + - test_infer.out + - train_roc.roc_curve + - test_roc.roc_curve subnodes_conf: {} taskgraph: taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml + id: xgboost_model inputs: test_norm@df_in: data_splitter.test train_norm@df_in: data_splitter.train -- id: hpo - type: GridRandomSearchNode - conf: - parameters: - - search: - function: grid_search - args: - - 1 - - 3 - - 5 - name: depth - - search: - function: uniform - args: - - 0.1 - - 0.8 - name: eta - metrics: - - train_roc.value - - test_roc.value + type: ContextCompositeNode +- conf: best: - mode: max metric: test_roc.value - tune: - local_dir: ./ray - name: exp - num_samples: 1 - resources_per_trial: - cpu: 1 - gpu: 1 - input: - - train_norm.df_in - - test_norm.df_in - output: - - train_infer.out - - test_infer.out - - train_roc.roc_curve - - test_roc.roc_curve + mode: max context: - target: - type: string - value: y + depth: map: - - node_id: train_xgboost - xpath: train_xgboost.conf.target - - node_id: train_roc - xpath: train_roc.conf.label - - node_id: test_roc - xpath: test_roc.conf.label + - node_id: train_xgboost + xpath: train_xgboost.conf.xgboost_parameters.max_depth + type: number + value: 3 + eta: + map: + - node_id: train_xgboost + xpath: train_xgboost.conf.xgboost_parameters.eta + type: number + value: 0.2719547419145216 features: + map: + - node_id: train_norm + xpath: train_norm.conf.columns + - node_id: train_xgboost + xpath: train_xgboost.conf.columns type: array_string value: - - y - map: - - node_id: train_norm - xpath: train_norm.conf.columns - - node_id: train_xgboost - xpath: train_xgboost.conf.columns + - y inclusive: - type: boolean map: - - node_id: train_norm - xpath: train_norm.conf.include - - node_id: train_xgboost - xpath: train_xgboost.conf.include + - node_id: train_norm + xpath: train_norm.conf.include + - node_id: train_xgboost + xpath: train_xgboost.conf.include + type: boolean value: false - depth: - type: number - value: 3 - map: - - node_id: train_xgboost - xpath: train_xgboost.conf.xgboost_parameters.max_depth - eta: - type: number - value: 0.2719547419145216 + target: map: - - node_id: train_xgboost - xpath: train_xgboost.conf.xgboost_parameters.eta + - node_id: train_xgboost + xpath: train_xgboost.conf.target + - node_id: train_roc + xpath: train_roc.conf.label + - node_id: test_roc + xpath: test_roc.conf.label + type: string + value: y + input: + - train_norm.df_in + - test_norm.df_in + metrics: + - train_roc.value + - test_roc.value + output: + - train_infer.out + - test_infer.out + - train_roc.roc_curve + - test_roc.roc_curve + parameters: + - name: depth + search: + args: + - 1 + - 3 + - 5 + function: grid_search + - name: eta + search: + args: + - 0.1 + - 0.8 + function: uniform subnodes_conf: {} taskgraph: taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml + tune: + local_dir: ./ray + name: exp + num_samples: 1 + resources_per_trial: + cpu: 1 + gpu: 1 + id: hpo inputs: conf_in: xgboost_model.conf_out - train_norm@df_in: data_splitter.train test_norm@df_in: data_splitter.test - module: rapids_modules + train_norm@df_in: data_splitter.train + module: gquant_rapids_plugin.ml + type: GridRandomSearchNode diff --git a/taskgraphs/xgboost_example/metrics.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/metrics.gq.yaml similarity index 75% rename from taskgraphs/xgboost_example/metrics.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/metrics.gq.yaml index 08c8f25e..172f6aec 100644 --- a/taskgraphs/xgboost_example/metrics.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/metrics.gq.yaml @@ -1,106 +1,106 @@ -- id: data_gen - type: ClassificationData - conf: - n_samples: 10000 +- conf: + class_sep: 1 + dtype: float64 + flip_y: 0.01 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.01 - class_sep: 1 - hypercube: true - shift: 0 + n_samples: 10000 + order: F scale: 1 + shift: 0 shuffle: true - order: F - dtype: float64 - n_parts: 4 + id: data_gen inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.dataloader + type: ClassificationData +- conf: {} + id: '' inputs: in1: train_roc.roc_curve in2: test_roc.roc_curve in3: feature_importance.importance_curve -- id: data_generator - type: CompositeNode - conf: + type: Output_Collector +- conf: input: - - x2_to_sign.in + - x2_to_sign.in output: - - drop_x2_x3.out + - drop_x2_x3.out subnode_ids: - - data_gen + - data_gen subnodes_conf: data_gen: conf: - n_samples: 10000 + class_sep: 1 + dtype: float64 + flip_y: 0.1 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.1 - class_sep: 1 - hypercube: true - shift: 0 - scale: 1 - shuffle: true + n_samples: 10000 order: F - dtype: float64 - n_parts: 4 random_state: 10 + scale: 1 + shift: 0 + shuffle: true taskgraph: taskgraphs/xgboost_example/data_generator.gq.yaml + id: data_generator inputs: x2_to_sign@in: data_gen.cudf_out -- id: xgboost_model type: CompositeNode - conf: +- conf: input: - - train_norm.df_in - - test_norm.df_in + - train_norm.df_in + - test_norm.df_in output: - - train_infer.out - - test_infer.out - - train_xgboost.model_out + - train_infer.out + - test_infer.out + - train_xgboost.model_out subnodes_conf: {} taskgraph: taskgraphs/xgboost_example/xgboost_model.gq.yaml + id: xgboost_model inputs: test_norm@df_in: data_splitter.test train_norm@df_in: data_splitter.train -- id: data_splitter - type: DataSplittingNode - conf: - train_size: 0.8 + type: CompositeNode +- conf: target: y + train_size: 0.8 + id: data_splitter inputs: in: data_generator.drop_x2_x3@out - module: rapids_modules -- id: train_roc - type: RocCurveNode - conf: + module: gquant_rapids_plugin.ml + type: DataSplittingNode +- conf: label: y prediction: predict + id: train_roc inputs: in: xgboost_model.train_infer@out - module: rapids_modules -- id: test_roc + module: gquant_rapids_plugin.analysis type: RocCurveNode - conf: +- conf: label: y prediction: predict + id: test_roc inputs: in: xgboost_model.test_infer@out - module: rapids_modules -- id: feature_importance - type: ImportanceCurveNode - conf: + module: gquant_rapids_plugin.analysis + type: RocCurveNode +- conf: type: gain + id: feature_importance inputs: in: xgboost_model.train_xgboost@model_out - module: rapids_modules + module: gquant_rapids_plugin.analysis + type: ImportanceCurveNode diff --git a/taskgraphs/xgboost_example/ml_preprocess.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/ml_preprocess.gq.yaml similarity index 75% rename from taskgraphs/xgboost_example/ml_preprocess.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/ml_preprocess.gq.yaml index 11387f91..3002367c 100644 --- a/taskgraphs/xgboost_example/ml_preprocess.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/ml_preprocess.gq.yaml @@ -1,64 +1,64 @@ -- id: "" - type: Output_Collector - conf: {} +- conf: {} + id: '' inputs: in1: train_norm.df_out in2: test_norm.df_out -- id: data_generator - type: CompositeNode - conf: + type: Output_Collector +- conf: output: - - drop_x2_x3.out + - drop_x2_x3.out subnode_ids: - - data_gen + - data_gen subnodes_conf: data_gen: conf: - n_samples: 10000 + class_sep: 1 + dtype: float64 + flip_y: 0.1 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.1 - class_sep: 1 - hypercube: true - shift: 0 - scale: 1 - shuffle: true + n_samples: 10000 order: F - dtype: float64 - n_parts: 4 random_state: 10 + scale: 1 + shift: 0 + shuffle: true taskgraph: taskgraphs/xgboost_example/data_generator.gq.yaml + id: data_generator inputs: {} -- id: data_splitter - type: DataSplittingNode - conf: - train_size: 0.8 + type: CompositeNode +- conf: target: y + train_size: 0.8 + id: data_splitter inputs: in: data_generator.drop_x2_x3@out - module: rapids_modules -- id: train_norm - type: NormalizationNode - conf: + module: gquant_rapids_plugin.ml + type: DataSplittingNode +- conf: columns: - - x3_0 - - x3_1 - - x2_0 - - x2_1 - - y + - x3_0 + - x3_1 + - x2_0 + - x2_1 + - y include: false + id: train_norm inputs: df_in: data_splitter.train - module: rapids_modules -- id: test_norm + module: gquant_rapids_plugin.transform type: NormalizationNode - conf: +- conf: include: true + id: test_norm inputs: - norm_data_in: train_norm.norm_data_out df_in: data_splitter.test - module: rapids_modules + norm_data_in: train_norm.norm_data_out + module: gquant_rapids_plugin.transform + type: NormalizationNode diff --git a/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/stock_data.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/stock_data.gq.yaml new file mode 100644 index 00000000..0e043934 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/stock_data.gq.yaml @@ -0,0 +1,229 @@ +- conf: + file: notebooks/data/stock_price_hist.csv.gz + path: notebooks/many-small + id: stock_data + inputs: {} + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: {} + id: '' + inputs: + in1: drop_col.out + type: Output_Collector +- conf: + input: + - preprocess.sort_node@in + output: + - technical_indicator.stock_out + subnode_ids: + - technical_indicator + subnodes_conf: + technical_indicator: + conf: + indicators: + - args: + - 10 + columns: + - close + function: port_bollinger_bands + - args: + - 2 + - 3 + columns: + - high + - low + - close + - volume + function: port_chaikin_oscillator + - args: + - 2 + - 3 + columns: + - close + function: port_macd + - args: + - 2 + columns: + - high + - low + function: port_relative_strength_index + - args: + - 2 + columns: + - high + - low + - close + function: port_average_true_range + - args: + - 2 + columns: + - high + - low + - close + function: port_stochastic_oscillator_k + - args: + - 2 + columns: + - high + - low + - close + function: port_stochastic_oscillator_d + - args: + - 2 + columns: + - high + - low + - close + - volume + function: port_money_flow_index + - args: + - 2 + columns: + - close + - volume + function: port_force_index + - args: + - 2 + columns: + - high + - low + - close + function: port_ultimate_oscillator + - args: + - 2 + columns: + - high + - low + - close + - volume + function: port_accumulation_distribution + - args: + - 2 + columns: + - high + - low + - close + function: port_commodity_channel_index + - args: + - 2 + columns: + - close + - volume + function: port_on_balance_volume + - args: + - 2 + columns: + - high + - low + - close + function: port_vortex_indicator + - args: + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + columns: + - close + function: port_kst_oscillator + - args: + - 2 + - 3 + columns: + - high + - low + function: port_mass_index + - args: + - 2 + - 3 + columns: + - close + function: port_true_strength_index + - args: + - 2 + columns: + - high + - low + - volume + function: port_ease_of_movement + - args: + - 2 + columns: + - close + function: port_coppock_curve + - args: + - 2 + columns: + - high + - low + - close + function: port_keltner_channel + - args: + - 2 + columns: + - high + - low + - close + function: port_ppsr + - args: + - 0.9 + columns: + - close + function: port_fractional_diff + - args: + - 0.7 + columns: + - close + function: port_fractional_diff + - args: + - 0.5 + columns: + - close + function: port_fractional_diff + - args: + - 0.3 + columns: + - close + function: port_fractional_diff + - args: + - 0.1 + columns: + - close + function: port_fractional_diff + - args: + - -1 + columns: + - returns + function: port_shift + remove_na: true + taskgraph: taskgraphs/xgboost_trade.gq.yaml + id: stock_feature + inputs: + preprocess@sort_node@in: stock_data.cudf_out + type: CompositeNode +- conf: + column: SHIFT_-1 + sign: sign + id: pos_neg_return + inputs: + in: stock_feature.technical_indicator@stock_out + module: gquant_rapids_plugin.transform + type: AddSignIndicatorNode +- conf: + columns: + - indicator + - datetime + - asset + - SHIFT_-1 + - open + - high + - low + - close + id: drop_col + inputs: + in: pos_neg_return.out + module: gquant_rapids_plugin.transform + type: DropNode diff --git a/taskgraphs/xgboost_example/tree_inference.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/tree_inference.gq.yaml similarity index 71% rename from taskgraphs/xgboost_example/tree_inference.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/tree_inference.gq.yaml index dbac5f6c..be3d762b 100644 --- a/taskgraphs/xgboost_example/tree_inference.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/tree_inference.gq.yaml @@ -1,124 +1,124 @@ -- id: data_gen - type: ClassificationData - conf: - n_samples: 10000 +- conf: + class_sep: 1 + dtype: float64 + flip_y: 0.01 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.01 - class_sep: 1 - hypercube: true - shift: 0 + n_samples: 10000 + order: F scale: 1 + shift: 0 shuffle: true - order: F - dtype: float64 - n_parts: 4 + id: data_gen inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.dataloader + type: ClassificationData +- conf: {} + id: '' inputs: in1: model_export.filename in2: test_data.out in3: test_infer.out in4: xgboost_infer.out -- id: data_generator - type: CompositeNode - conf: + type: Output_Collector +- conf: input: - - x2_to_sign.in + - x2_to_sign.in output: - - drop_x2_x3.out + - drop_x2_x3.out subnode_ids: - - data_gen + - data_gen subnodes_conf: data_gen: conf: - n_samples: 10000 + class_sep: 1 + dtype: float64 + flip_y: 0.1 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.1 - class_sep: 1 - hypercube: true - shift: 0 - scale: 1 - shuffle: true + n_samples: 10000 order: F - dtype: float64 - n_parts: 4 random_state: 10 + scale: 1 + shift: 0 + shuffle: true taskgraph: taskgraphs/xgboost_example/data_generator.gq.yaml + id: data_generator inputs: x2_to_sign@in: data_gen.dask_cudf_out -- id: xgboost_model type: CompositeNode - conf: +- conf: input: - - train_norm.df_in - - test_norm.df_in + - train_norm.df_in + - test_norm.df_in output: - - train_infer.out - - test_infer.out - - train_xgboost.model_out - - train_norm.df_out - - test_norm.df_out + - train_infer.out + - test_infer.out + - train_xgboost.model_out + - train_norm.df_out + - test_norm.df_out subnode_ids: [] subnodes_conf: {} taskgraph: taskgraphs/xgboost_example/xgboost_model.gq.yaml + id: xgboost_model inputs: test_norm@df_in: data_splitter.test train_norm@df_in: data_splitter.train -- id: data_splitter - type: DataSplittingNode - conf: - train_size: 0.8 + type: CompositeNode +- conf: target: y + train_size: 0.8 + id: data_splitter inputs: in: data_generator.drop_x2_x3@out - module: rapids_modules -- id: model_export - type: XGBoostExportNode - conf: + module: gquant_rapids_plugin.ml + type: DataSplittingNode +- conf: path: xgboost_model_file + id: model_export inputs: model_in: xgboost_model.train_xgboost@model_out - module: rapids_modules -- id: tree_inference - type: ForestInferenceNode - conf: + module: gquant_rapids_plugin.analysis + type: XGBoostExportNode +- conf: columns: - - y + - y + file: xgboost_model_file include: false prediction: predict - file: xgboost_model_file + id: tree_inference inputs: - model_file: model_export.filename data_in: xgboost_model.test_norm@df_out - module: rapids_modules -- id: test_data - type: DaskComputeNode - conf: {} + model_file: model_export.filename + module: gquant_rapids_plugin.ml + type: ForestInferenceNode +- conf: {} + id: test_data inputs: in: xgboost_model.test_norm@df_out - module: rapids_modules -- id: test_infer + module: gquant_rapids_plugin.transform type: DaskComputeNode - conf: {} +- conf: {} + id: test_infer inputs: in: tree_inference.out - module: rapids_modules -- id: xgboost_infer + module: gquant_rapids_plugin.transform type: DaskComputeNode - conf: {} +- conf: {} + id: xgboost_infer inputs: in: xgboost_model.test_infer@out - module: rapids_modules + module: gquant_rapids_plugin.transform + type: DaskComputeNode diff --git a/taskgraphs/xgboost_example/xgboost_model.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_model.gq.yaml similarity index 78% rename from taskgraphs/xgboost_example/xgboost_model.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_model.gq.yaml index 8c7e5d04..07dcf4e0 100644 --- a/taskgraphs/xgboost_example/xgboost_model.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_model.gq.yaml @@ -1,133 +1,133 @@ -- id: data_gen - type: ClassificationData - conf: - n_samples: 10000 +- conf: + class_sep: 1 + dtype: float64 + flip_y: 0.01 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.01 - class_sep: 1 - hypercube: true - shift: 0 + n_samples: 10000 + order: F scale: 1 + shift: 0 shuffle: true - order: F - dtype: float64 - n_parts: 4 + id: data_gen inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.dataloader + type: ClassificationData +- conf: {} + id: '' inputs: in1: test_infer.out in2: train_infer.out -- id: data_generator - type: CompositeNode - conf: + type: Output_Collector +- conf: input: - - x2_to_sign.in + - x2_to_sign.in output: - - drop_x2_x3.out + - drop_x2_x3.out subnode_ids: - - data_gen + - data_gen subnodes_conf: data_gen: conf: - n_samples: 10000 + class_sep: 1 + dtype: float64 + flip_y: 0.1 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.1 - class_sep: 1 - hypercube: true - shift: 0 - scale: 1 - shuffle: true + n_samples: 10000 order: F - dtype: float64 - n_parts: 4 random_state: 10 + scale: 1 + shift: 0 + shuffle: true taskgraph: taskgraphs/xgboost_example/data_generator.gq.yaml + id: data_generator inputs: x2_to_sign@in: data_gen.cudf_out -- id: data_splitter - type: DataSplittingNode - conf: - train_size: 0.8 + type: CompositeNode +- conf: target: y + train_size: 0.8 + id: data_splitter inputs: in: data_generator.drop_x2_x3@out - module: rapids_modules -- id: train_norm - type: NormalizationNode - conf: + module: gquant_rapids_plugin.ml + type: DataSplittingNode +- conf: columns: - - x3_0 - - x3_1 - - x2_0 - - x2_1 - - y + - x3_0 + - x3_1 + - x2_0 + - x2_1 + - y include: false + id: train_norm inputs: df_in: data_splitter.train - module: rapids_modules -- id: test_norm + module: gquant_rapids_plugin.transform type: NormalizationNode - conf: +- conf: include: true + id: test_norm inputs: - norm_data_in: train_norm.norm_data_out df_in: data_splitter.test - module: rapids_modules -- id: train_xgboost - type: TrainXGBoostNode - conf: - num_of_rounds: 100 + norm_data_in: train_norm.norm_data_out + module: gquant_rapids_plugin.transform + type: NormalizationNode +- conf: columns: - - y + - y include: false + num_of_rounds: 100 + target: y xgboost_parameters: - eta: 0.3 - min_child_weight: 1 - subsample: 1 - sampling_method: uniform - colsample_bytree: 1 + alpha: 0 colsample_bylevel: 1 colsample_bynode: 1 - max_depth: 8 - max_leaves: 256 - grow_policy: depthwise + colsample_bytree: 1 + deterministic_histogram: false + eta: 0.3 gamma: 0 + grow_policy: depthwise lambda: 1 - alpha: 0 - tree_method: gpu_hist - single_precision_histogram: false - deterministic_histogram: false + max_depth: 8 + max_leaves: 256 + min_child_weight: 1 objective: binary:logistic - target: y + sampling_method: uniform + single_precision_histogram: false + subsample: 1 + tree_method: gpu_hist + id: train_xgboost inputs: in: train_norm.df_out - module: rapids_modules -- id: train_infer - type: InferXGBoostNode - conf: + module: gquant_rapids_plugin.ml + type: TrainXGBoostNode +- conf: prediction: predict + id: train_infer inputs: data_in: train_norm.df_out model_in: train_xgboost.model_out - module: rapids_modules -- id: test_infer + module: gquant_rapids_plugin.ml type: InferXGBoostNode - conf: +- conf: prediction: predict + id: test_infer inputs: data_in: test_norm.df_out model_in: train_xgboost.model_out - module: rapids_modules + module: gquant_rapids_plugin.ml + type: InferXGBoostNode diff --git a/taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml similarity index 76% rename from taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml index 913dcf49..5826b40b 100644 --- a/taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml @@ -1,149 +1,149 @@ -- id: data_gen - type: ClassificationData - conf: - n_samples: 10000 +- conf: + class_sep: 1 + dtype: float64 + flip_y: 0.01 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.01 - class_sep: 1 - hypercube: true - shift: 0 + n_samples: 10000 + order: F scale: 1 + shift: 0 shuffle: true - order: F - dtype: float64 - n_parts: 4 + id: data_gen inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.dataloader + type: ClassificationData +- conf: {} + id: '' inputs: in1: test_roc.roc_curve in2: train_roc.roc_curve -- id: data_generator - type: CompositeNode - conf: + type: Output_Collector +- conf: input: - - x2_to_sign.in + - x2_to_sign.in output: - - drop_x2_x3.out + - drop_x2_x3.out subnode_ids: - - data_gen + - data_gen subnodes_conf: data_gen: conf: - n_samples: 10000 + class_sep: 1 + dtype: float64 + flip_y: 0.1 + hypercube: true + n_classes: 2 + n_clusters_per_class: 2 n_features: 10 n_informative: 4 + n_parts: 4 n_redundant: 0 n_repeated: 0 - n_classes: 2 - n_clusters_per_class: 2 - flip_y: 0.1 - class_sep: 1 - hypercube: true - shift: 0 - scale: 1 - shuffle: true + n_samples: 10000 order: F - dtype: float64 - n_parts: 4 random_state: 10 + scale: 1 + shift: 0 + shuffle: true taskgraph: taskgraphs/xgboost_example/data_generator.gq.yaml + id: data_generator inputs: x2_to_sign@in: data_gen.cudf_out -- id: data_splitter - type: DataSplittingNode - conf: - train_size: 0.8 + type: CompositeNode +- conf: target: y + train_size: 0.8 + id: data_splitter inputs: in: data_generator.drop_x2_x3@out - module: rapids_modules -- id: train_norm - type: NormalizationNode - conf: + module: gquant_rapids_plugin.ml + type: DataSplittingNode +- conf: columns: - - x3_0 - - x3_1 - - x2_0 - - x2_1 - - y + - x3_0 + - x3_1 + - x2_0 + - x2_1 + - y include: false + id: train_norm inputs: df_in: data_splitter.train - module: rapids_modules -- id: test_norm + module: gquant_rapids_plugin.transform type: NormalizationNode - conf: +- conf: include: true + id: test_norm inputs: - norm_data_in: train_norm.norm_data_out df_in: data_splitter.test - module: rapids_modules -- id: train_xgboost - type: TrainXGBoostNode - conf: - num_of_rounds: 100 + norm_data_in: train_norm.norm_data_out + module: gquant_rapids_plugin.transform + type: NormalizationNode +- conf: columns: - - y + - y include: false + num_of_rounds: 100 + target: y xgboost_parameters: - eta: 0.3 - min_child_weight: 1 - subsample: 1 - sampling_method: uniform - colsample_bytree: 1 + alpha: 0 colsample_bylevel: 1 colsample_bynode: 1 - max_depth: 8 - max_leaves: 256 - grow_policy: depthwise + colsample_bytree: 1 + deterministic_histogram: false + eta: 0.3 gamma: 0 + grow_policy: depthwise lambda: 1 - alpha: 0 - tree_method: gpu_hist - single_precision_histogram: false - deterministic_histogram: false + max_depth: 8 + max_leaves: 256 + min_child_weight: 1 objective: binary:logistic - target: y + sampling_method: uniform + single_precision_histogram: false + subsample: 1 + tree_method: gpu_hist + id: train_xgboost inputs: in: train_norm.df_out - module: rapids_modules -- id: train_infer - type: InferXGBoostNode - conf: + module: gquant_rapids_plugin.ml + type: TrainXGBoostNode +- conf: prediction: predict + id: train_infer inputs: data_in: train_norm.df_out model_in: train_xgboost.model_out - module: rapids_modules -- id: test_infer + module: gquant_rapids_plugin.ml type: InferXGBoostNode - conf: +- conf: prediction: predict + id: test_infer inputs: data_in: test_norm.df_out model_in: train_xgboost.model_out - module: rapids_modules -- id: train_roc - type: RocCurveNode - conf: + module: gquant_rapids_plugin.ml + type: InferXGBoostNode +- conf: label: y prediction: predict + id: train_roc inputs: in: train_infer.out - module: rapids_modules -- id: test_roc + module: gquant_rapids_plugin.analysis type: RocCurveNode - conf: +- conf: label: y prediction: predict + id: test_roc inputs: in: test_infer.out - module: rapids_modules + module: gquant_rapids_plugin.analysis + type: RocCurveNode diff --git a/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_stock.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_stock.gq.yaml new file mode 100644 index 00000000..c767614f --- /dev/null +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_stock.gq.yaml @@ -0,0 +1,300 @@ +- conf: + file: notebooks/data/stock_price_hist.csv.gz + path: notebooks/many-small + id: stock_data + inputs: {} + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: {} + id: '' + inputs: + in1: test_roc.roc_curve + in2: train_roc.roc_curve + in3: feature_importance.importance_curve + in4: xgboost_model.train_xgboost@model_out + type: Output_Collector +- conf: + input: + - preprocess.sort_node@in + output: + - technical_indicator.stock_out + subnode_ids: + - technical_indicator + subnodes_conf: + technical_indicator: + conf: + indicators: + - args: + - 10 + columns: + - close + function: port_bollinger_bands + - args: + - 2 + - 3 + columns: + - high + - low + - close + - volume + function: port_chaikin_oscillator + - args: + - 2 + - 3 + columns: + - close + function: port_macd + - args: + - 2 + columns: + - high + - low + function: port_relative_strength_index + - args: + - 2 + columns: + - high + - low + - close + function: port_average_true_range + - args: + - 2 + columns: + - high + - low + - close + function: port_stochastic_oscillator_k + - args: + - 2 + columns: + - high + - low + - close + function: port_stochastic_oscillator_d + - args: + - 2 + columns: + - high + - low + - close + - volume + function: port_money_flow_index + - args: + - 2 + columns: + - close + - volume + function: port_force_index + - args: + - 2 + columns: + - high + - low + - close + function: port_ultimate_oscillator + - args: + - 2 + columns: + - high + - low + - close + - volume + function: port_accumulation_distribution + - args: + - 2 + columns: + - high + - low + - close + function: port_commodity_channel_index + - args: + - 2 + columns: + - close + - volume + function: port_on_balance_volume + - args: + - 2 + columns: + - high + - low + - close + function: port_vortex_indicator + - args: + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + columns: + - close + function: port_kst_oscillator + - args: + - 2 + - 3 + columns: + - high + - low + function: port_mass_index + - args: + - 2 + - 3 + columns: + - close + function: port_true_strength_index + - args: + - 2 + columns: + - high + - low + - volume + function: port_ease_of_movement + - args: + - 2 + columns: + - close + function: port_coppock_curve + - args: + - 2 + columns: + - high + - low + - close + function: port_keltner_channel + - args: + - 2 + columns: + - high + - low + - close + function: port_ppsr + - args: + - 0.9 + columns: + - close + function: port_fractional_diff + - args: + - 0.7 + columns: + - close + function: port_fractional_diff + - args: + - 0.5 + columns: + - close + function: port_fractional_diff + - args: + - 0.3 + columns: + - close + function: port_fractional_diff + - args: + - 0.1 + columns: + - close + function: port_fractional_diff + - args: + - -1 + columns: + - returns + function: port_shift + remove_na: true + taskgraph: taskgraphs/xgboost_trade.gq.yaml + id: stock_feature + inputs: + preprocess@sort_node@in: stock_data.dask_cudf_out + type: CompositeNode +- conf: + column: SHIFT_-1 + sign: sign + id: pos_neg_return + inputs: + in: stock_feature.technical_indicator@stock_out + module: gquant_rapids_plugin.transform + type: AddSignIndicatorNode +- conf: + columns: + - indicator + - datetime + - asset + - SHIFT_-1 + - open + - high + - low + - close + id: drop_col + inputs: + in: pos_neg_return.out + module: gquant_rapids_plugin.transform + type: DropNode +- conf: + target: sign + train_size: 0.8 + id: split_data + inputs: + in: drop_col.out + module: gquant_rapids_plugin.ml + type: DataSplittingNode +- conf: + train_norm: + conf: + columns: + - sign + include: false + train_xgboost: + conf: + columns: + - sign + include: false + num_of_rounds: 100 + target: sign + xgboost_parameters: + alpha: 0 + colsample_bylevel: 1 + colsample_bynode: 1 + colsample_bytree: 1 + deterministic_histogram: false + eta: 0.3 + gamma: 0 + grow_policy: depthwise + lambda: 1 + max_depth: 8 + max_leaves: 256 + min_child_weight: 1 + objective: binary:logistic + sampling_method: uniform + single_precision_histogram: false + subsample: 1 + tree_method: gpu_hist + id: xgboost_model + inputs: + test_norm@df_in: split_data.test + train_norm@df_in: split_data.train + module: my_node + type: CustXGBoostNode +- conf: + label: sign + prediction: predict + id: train_roc + inputs: + in: xgboost_model.train_infer@out + module: gquant_rapids_plugin.analysis + type: RocCurveNode +- conf: + label: sign + prediction: predict + id: test_roc + inputs: + in: xgboost_model.test_infer@out + module: gquant_rapids_plugin.analysis + type: RocCurveNode +- conf: + type: gain + id: feature_importance + inputs: + in: xgboost_model.train_xgboost@model_out + module: gquant_rapids_plugin.analysis + type: ImportanceCurveNode diff --git a/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_stock_hpo.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_stock_hpo.gq.yaml new file mode 100644 index 00000000..9fd66008 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_example/xgboost_stock_hpo.gq.yaml @@ -0,0 +1,382 @@ +- conf: {} + id: '' + inputs: + in1: xgboost_model.train_roc@roc_curve + in2: xgboost_model.test_roc@roc_curve + in3: hpo.conf_out + in4: hpo.train_roc@roc_curve + in5: hpo.test_roc@roc_curve + type: Output_Collector +- conf: + context: + depth: + map: + - node_id: train_xgboost + xpath: train_xgboost.conf.xgboost_parameters.max_depth + type: number + value: 1 + eta: + map: + - node_id: train_xgboost + xpath: train_xgboost.conf.xgboost_parameters.eta + type: number + value: 0.1 + features: + map: + - node_id: train_norm + xpath: train_norm.conf.columns + - node_id: train_xgboost + xpath: train_xgboost.conf.columns + type: array_string + value: + - sign + inclusive: + map: + - node_id: train_norm + xpath: train_norm.conf.include + - node_id: train_xgboost + xpath: train_xgboost.conf.include + type: boolean + value: false + target: + map: + - node_id: train_xgboost + xpath: train_xgboost.conf.target + - node_id: train_roc + xpath: train_roc.conf.label + - node_id: test_roc + xpath: test_roc.conf.label + type: string + value: sign + input: + - train_norm.df_in + - test_norm.df_in + output: + - train_infer.out + - test_infer.out + - train_roc.roc_curve + - test_roc.roc_curve + subnodes_conf: {} + taskgraph: taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml + id: xgboost_model + inputs: + test_norm@df_in: split_data.test + train_norm@df_in: split_data.train + type: ContextCompositeNode +- conf: + best: + metric: test_roc.value + mode: max + context: + depth: + map: + - node_id: train_xgboost + xpath: train_xgboost.conf.xgboost_parameters.max_depth + type: number + value: 1 + eta: + map: + - node_id: train_xgboost + xpath: train_xgboost.conf.xgboost_parameters.eta + type: number + value: 0.1 + features: + map: + - node_id: train_norm + xpath: train_norm.conf.columns + - node_id: train_xgboost + xpath: train_xgboost.conf.columns + type: array_string + value: + - sign + inclusive: + map: + - node_id: train_norm + xpath: train_norm.conf.include + - node_id: train_xgboost + xpath: train_xgboost.conf.include + type: boolean + value: false + target: + map: + - node_id: train_xgboost + xpath: train_xgboost.conf.target + - node_id: train_roc + xpath: train_roc.conf.label + - node_id: test_roc + xpath: test_roc.conf.label + type: string + value: sign + input: + - train_norm.df_in + - test_norm.df_in + metrics: + - train_roc.value + - test_roc.value + output: + - train_infer.out + - test_infer.out + - train_roc.roc_curve + - test_roc.roc_curve + parameters: + - name: depth + search: + args: + - 1 + - 3 + - 5 + function: grid_search + - name: eta + search: + args: + - 0.1 + - 0.8 + function: uniform + subnodes_conf: {} + taskgraph: taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml + tune: + local_dir: ./ray + name: stock + num_samples: 1 + resources_per_trial: + cpu: 1 + gpu: 1 + id: hpo + inputs: + conf_in: xgboost_model.conf_out + test_norm@df_in: split_data.test + train_norm@df_in: split_data.train + module: gquant_rapids_plugin.ml + type: GridRandomSearchNode +- conf: + file: notebooks/data/stock_price_hist.csv.gz + path: notebooks/many-small + id: stock_data + inputs: {} + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: + input: + - preprocess.sort_node@in + output: + - technical_indicator.stock_out + subnode_ids: + - technical_indicator + subnodes_conf: + technical_indicator: + conf: + indicators: + - args: + - 10 + columns: + - close + function: port_bollinger_bands + - args: + - 2 + - 3 + columns: + - high + - low + - close + - volume + function: port_chaikin_oscillator + - args: + - 2 + - 3 + columns: + - close + function: port_macd + - args: + - 2 + columns: + - high + - low + function: port_relative_strength_index + - args: + - 2 + columns: + - high + - low + - close + function: port_average_true_range + - args: + - 2 + columns: + - high + - low + - close + function: port_stochastic_oscillator_k + - args: + - 2 + columns: + - high + - low + - close + function: port_stochastic_oscillator_d + - args: + - 2 + columns: + - high + - low + - close + - volume + function: port_money_flow_index + - args: + - 2 + columns: + - close + - volume + function: port_force_index + - args: + - 2 + columns: + - high + - low + - close + function: port_ultimate_oscillator + - args: + - 2 + columns: + - high + - low + - close + - volume + function: port_accumulation_distribution + - args: + - 2 + columns: + - high + - low + - close + function: port_commodity_channel_index + - args: + - 2 + columns: + - close + - volume + function: port_on_balance_volume + - args: + - 2 + columns: + - high + - low + - close + function: port_vortex_indicator + - args: + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + columns: + - close + function: port_kst_oscillator + - args: + - 2 + - 3 + columns: + - high + - low + function: port_mass_index + - args: + - 2 + - 3 + columns: + - close + function: port_true_strength_index + - args: + - 2 + columns: + - high + - low + - volume + function: port_ease_of_movement + - args: + - 2 + columns: + - close + function: port_coppock_curve + - args: + - 2 + columns: + - high + - low + - close + function: port_keltner_channel + - args: + - 2 + columns: + - high + - low + - close + function: port_ppsr + - args: + - 0.9 + columns: + - close + function: port_fractional_diff + - args: + - 0.7 + columns: + - close + function: port_fractional_diff + - args: + - 0.5 + columns: + - close + function: port_fractional_diff + - args: + - 0.3 + columns: + - close + function: port_fractional_diff + - args: + - 0.1 + columns: + - close + function: port_fractional_diff + - args: + - -1 + columns: + - returns + function: port_shift + remove_na: true + taskgraph: taskgraphs/xgboost_trade.gq.yaml + id: stock_feature + inputs: + preprocess@sort_node@in: stock_data.cudf_out + type: CompositeNode +- conf: + column: SHIFT_-1 + sign: sign + id: pos_neg_return + inputs: + in: stock_feature.technical_indicator@stock_out + module: gquant_rapids_plugin.transform + type: AddSignIndicatorNode +- conf: + columns: + - indicator + - datetime + - asset + - SHIFT_-1 + - open + - high + - low + - close + id: drop_col + inputs: + in: pos_neg_return.out + module: gquant_rapids_plugin.transform + type: DropNode +- conf: + target: sign + train_size: 0.8 + id: split_data + inputs: + in: drop_col.out + module: gquant_rapids_plugin.ml + type: DataSplittingNode diff --git a/taskgraphs/xgboost_trade.gq.yaml b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_trade.gq.yaml similarity index 53% rename from taskgraphs/xgboost_trade.gq.yaml rename to gQuant/plugins/rapids_plugin/taskgraphs/xgboost_trade.gq.yaml index b54913db..4367589a 100644 --- a/taskgraphs/xgboost_trade.gq.yaml +++ b/gQuant/plugins/rapids_plugin/taskgraphs/xgboost_trade.gq.yaml @@ -1,165 +1,165 @@ -- id: stock_data - type: CsvStockLoader - conf: +- conf: file: notebooks/data/stock_price_hist.csv.gz path: notebooks/many-small + id: stock_data inputs: {} - module: rapids_modules -- id: preprocess - type: CompositeNode - conf: + module: gquant_rapids_plugin.dataloader + type: CsvStockLoader +- conf: + input: + - sort_node.in + output: + - drop_columns.out subnode_ids: - - value_filter - - drop_columns + - value_filter + - drop_columns subnodes_conf: - value_filter: - conf: - - column: min_return - min: -10 - - column: max_return - max: 10 - - column: average_volume - min: 400 drop_columns: conf: columns: - - average_volume - - min_return - - max_return + - average_volume + - min_return + - max_return + value_filter: + conf: + - column: min_return + min: -10 + - column: max_return + max: 10 + - column: average_volume + min: 400 taskgraph: taskgraphs/preprocess.gq.yaml - input: - - sort_node.in - output: - - drop_columns.out + id: preprocess inputs: sort_node@in: stock_data.cudf_out -- id: sort_after - type: SortNode - conf: + type: CompositeNode +- conf: keys: - - asset - - datetime + - asset + - datetime + id: sort_after inputs: in: preprocess.drop_columns@out - module: rapids_modules -- id: backtest - type: SimpleBackTestNode - conf: {} + module: gquant_rapids_plugin.transform + type: SortNode +- conf: {} + id: backtest inputs: bardata_in: xgboost.stock_out - module: rapids_modules -- id: portfolio_opt_train - type: SimpleAveragePortOpt - conf: {} + module: gquant_rapids_plugin.backtest + type: SimpleBackTestNode +- conf: {} + id: portfolio_opt_train inputs: stock_in: train_df.stock_out - module: rapids_modules -- id: sharpe_ratio_trn - type: SharpeRatioNode - conf: {} + module: gquant_rapids_plugin.portofolio + type: SimpleAveragePortOpt +- conf: {} + id: sharpe_ratio_trn inputs: stock_in: portfolio_opt_train.stock_out - module: rapids_modules -- id: cumulative_return_trn - type: CumReturnNode - conf: - points: 300 + module: gquant_rapids_plugin.analysis + type: SharpeRatioNode +- conf: label: training cumulative return + points: 300 + id: cumulative_return_trn inputs: in: portfolio_opt_train.stock_out - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} + module: gquant_rapids_plugin.analysis + type: CumReturnNode +- conf: {} + id: '' inputs: in1: sharpe_ratio_trn.sharpe_out in2: cumulative_return_trn.cum_return in3: sharpe_ratio_val.sharpe_out in4: cumulative_return_val.cum_return -- id: technical_indicator - type: IndicatorNode - conf: + type: Output_Collector +- conf: indicators: - - function: port_chaikin_oscillator - args: - - 10 - - 20 - columns: - - high - - low - - close - - volume - - function: port_bollinger_bands - args: - - 10 - columns: - - close - - function: port_shift - args: - - -1 - columns: - - returns + - args: + - 10 + - 20 + columns: + - high + - low + - close + - volume + function: port_chaikin_oscillator + - args: + - 10 + columns: + - close + function: port_bollinger_bands + - args: + - -1 + columns: + - returns + function: port_shift remove_na: true + id: technical_indicator inputs: stock_in: sort_after.out - module: rapids_modules -- id: xgboost - type: XGBoostStrategyNode - conf: - num_of_rounds: 100 + module: gquant_rapids_plugin.transform + type: IndicatorNode +- conf: no_feature: - - asset - - datetime - - volume - - close - - high - - low - - returns - - indicator - - open + - asset + - datetime + - volume + - close + - high + - low + - returns + - indicator + - open + num_of_rounds: 100 + target: SHIFT_-1 + train_date: 2010-01-01 xgboost_parameters: + gamma: 0 max_depth: 8 max_leaves: 256 - gamma: 0 objective: reg:squarederror - train_date: 2010-01-01 - target: SHIFT_-1 + id: xgboost inputs: stock_in: technical_indicator.stock_out - module: rapids_modules -- id: train_df - type: DatetimeFilterNode - conf: - end: 2010-01-01 + module: gquant_rapids_plugin.strategy + type: XGBoostStrategyNode +- conf: beg: 1985-01-01 + end: 2010-01-01 + id: train_df inputs: stock_in: backtest.backtest_out - module: rapids_modules -- id: validation_df + module: gquant_rapids_plugin.transform type: DatetimeFilterNode - conf: +- conf: beg: 2010-01-01 end: 2025-01-01 + id: validation_df inputs: stock_in: backtest.backtest_out - module: rapids_modules -- id: portfolio_opt_validation - type: SimpleAveragePortOpt - conf: {} + module: gquant_rapids_plugin.transform + type: DatetimeFilterNode +- conf: {} + id: portfolio_opt_validation inputs: stock_in: validation_df.stock_out - module: rapids_modules -- id: sharpe_ratio_val - type: SharpeRatioNode - conf: {} + module: gquant_rapids_plugin.portofolio + type: SimpleAveragePortOpt +- conf: {} + id: sharpe_ratio_val inputs: stock_in: portfolio_opt_validation.stock_out - module: rapids_modules -- id: cumulative_return_val - type: CumReturnNode - conf: - points: 300 + module: gquant_rapids_plugin.analysis + type: SharpeRatioNode +- conf: label: validation cumulative return + points: 300 + id: cumulative_return_val inputs: in: portfolio_opt_validation.stock_out - module: rapids_modules + module: gquant_rapids_plugin.analysis + type: CumReturnNode diff --git a/gQuant/plugins/rapids_plugin/tests/__init__.py b/gQuant/plugins/rapids_plugin/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gQuant/plugins/rapids_plugin/tests/unit/__init__.py b/gQuant/plugins/rapids_plugin/tests/unit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/technical_indicators.py b/gQuant/plugins/rapids_plugin/tests/unit/technical_indicators.py similarity index 99% rename from tests/unit/technical_indicators.py rename to gQuant/plugins/rapids_plugin/tests/unit/technical_indicators.py index 489e6105..d38c4aaa 100644 --- a/tests/unit/technical_indicators.py +++ b/gQuant/plugins/rapids_plugin/tests/unit/technical_indicators.py @@ -551,7 +551,7 @@ def donchian_channel(df, n): i = 0 while i + n - 1 < df.index[-1]: - dc = max(df['High'].ix[i:i + n - 1]) - min(df['Low'].ix[i:i + n - 1]) + dc = max(df['High'].loc[i:i + n - 1]) - min(df['Low'].loc[i:i + n - 1]) dc_l.append(dc) i += 1 diff --git a/tests/unit/test_fractional_diff.py b/gQuant/plugins/rapids_plugin/tests/unit/test_fractional_diff.py similarity index 95% rename from tests/unit/test_fractional_diff.py rename to gQuant/plugins/rapids_plugin/tests/unit/test_fractional_diff.py index 7b47e530..8ee325b3 100644 --- a/tests/unit/test_fractional_diff.py +++ b/gQuant/plugins/rapids_plugin/tests/unit/test_fractional_diff.py @@ -22,11 +22,9 @@ import pandas as pd import unittest import cudf -import os -from gquant.dataframe_flow.task import load_modules -load_modules(os.getenv('MODULEPATH')+'/rapids_modules/') -from rapids_modules.cuindicator import (fractional_diff, get_weights_floored, - port_fractional_diff) +from gquant_rapids_plugin.cuindicator import (fractional_diff, + get_weights_floored, + port_fractional_diff) import numpy as np from .utils import make_orderer import warnings diff --git a/tests/unit/test_indicator.py b/gQuant/plugins/rapids_plugin/tests/unit/test_indicator.py similarity index 99% rename from tests/unit/test_indicator.py rename to gQuant/plugins/rapids_plugin/tests/unit/test_indicator.py index 4060b512..7f27c51f 100644 --- a/tests/unit/test_indicator.py +++ b/gQuant/plugins/rapids_plugin/tests/unit/test_indicator.py @@ -24,10 +24,7 @@ import unittest import pathlib import cudf -import os -from gquant.dataframe_flow.task import load_modules -load_modules(os.getenv('MODULEPATH')+'/rapids_modules/') -import rapids_modules.cuindicator as gi +import gquant_rapids_plugin.cuindicator as gi from . import technical_indicators as ti from .utils import make_orderer, error_function import numpy as np diff --git a/tests/unit/test_indicator_node.py b/gQuant/plugins/rapids_plugin/tests/unit/test_indicator_node.py similarity index 97% rename from tests/unit/test_indicator_node.py rename to gQuant/plugins/rapids_plugin/tests/unit/test_indicator_node.py index 0a543d24..7f2bdc76 100644 --- a/tests/unit/test_indicator_node.py +++ b/gQuant/plugins/rapids_plugin/tests/unit/test_indicator_node.py @@ -22,11 +22,8 @@ import warnings import unittest import cudf -import os -from gquant.dataframe_flow.task import load_modules -load_modules(os.getenv('MODULEPATH')+'/rapids_modules/') -import rapids_modules.cuindicator as gi -from rapids_modules.transform.indicatorNode import IndicatorNode +import gquant_rapids_plugin.cuindicator as gi +from gquant_rapids_plugin.transform.indicatorNode import IndicatorNode from gquant.dataframe_flow.task import Task from .utils import make_orderer import numpy as np diff --git a/tests/unit/test_multi_assets_indicator.py b/gQuant/plugins/rapids_plugin/tests/unit/test_multi_assets_indicator.py similarity index 99% rename from tests/unit/test_multi_assets_indicator.py rename to gQuant/plugins/rapids_plugin/tests/unit/test_multi_assets_indicator.py index 5de85440..5330cbb2 100644 --- a/tests/unit/test_multi_assets_indicator.py +++ b/gQuant/plugins/rapids_plugin/tests/unit/test_multi_assets_indicator.py @@ -23,12 +23,9 @@ import unittest import cudf from .utils import make_orderer, error_function -import os -from gquant.dataframe_flow.task import load_modules -load_modules(os.getenv('MODULEPATH')+'/rapids_modules/') -import rapids_modules.cuindicator as gi +import gquant_rapids_plugin.cuindicator as gi from . import technical_indicators as ti -from rapids_modules.cuindicator import PEwm +from gquant_rapids_plugin.cuindicator import PEwm import numpy as np import warnings diff --git a/tests/unit/test_nodes.py b/gQuant/plugins/rapids_plugin/tests/unit/test_nodes.py similarity index 98% rename from tests/unit/test_nodes.py rename to gQuant/plugins/rapids_plugin/tests/unit/test_nodes.py index ebea19ec..cc7d8f4f 100644 --- a/tests/unit/test_nodes.py +++ b/gQuant/plugins/rapids_plugin/tests/unit/test_nodes.py @@ -22,12 +22,9 @@ import warnings import unittest import cudf -import os -from gquant.dataframe_flow.task import load_modules -load_modules(os.getenv('MODULEPATH')+'/rapids_modules/') -from rapids_modules.transform.returnFeatureNode import ReturnFeatureNode -from rapids_modules.transform.indicatorNode import IndicatorNode -from rapids_modules.transform.assetIndicatorNode import AssetIndicatorNode +from gquant_rapids_plugin.transform import ReturnFeatureNode +from gquant_rapids_plugin.transform import IndicatorNode +from gquant_rapids_plugin.transform import AssetIndicatorNode from gquant.dataframe_flow.task import Task from .utils import make_orderer, error_function_index import numpy as np @@ -163,9 +160,8 @@ def test_asset_indicator(self): inN = AssetIndicatorNode(task) gt = self._cudf_data.to_pandas()['indicator'] - o = inN.process({'stock_in': - self._cudf_data.drop('indicator')})['stock_out'] + self._cudf_data.drop('indicator', axis=1)})['stock_out'] err, index_err = error_function_index(o['indicator'], gt) msg = "bad error %f\n" % (err,) diff --git a/tests/unit/test_rolling.py b/gQuant/plugins/rapids_plugin/tests/unit/test_rolling.py similarity index 95% rename from tests/unit/test_rolling.py rename to gQuant/plugins/rapids_plugin/tests/unit/test_rolling.py index 4f659ef0..535985b4 100644 --- a/tests/unit/test_rolling.py +++ b/gQuant/plugins/rapids_plugin/tests/unit/test_rolling.py @@ -22,10 +22,7 @@ import pandas as pd import unittest import cudf -import os -from gquant.dataframe_flow.task import load_modules -load_modules(os.getenv('MODULEPATH')+'/rapids_modules/') -from rapids_modules.cuindicator import Rolling, Ewm +from gquant_rapids_plugin.cuindicator import Rolling, Ewm from .utils import make_orderer, error_function import numpy as np diff --git a/tests/unit/test_util.py b/gQuant/plugins/rapids_plugin/tests/unit/test_util.py similarity index 92% rename from tests/unit/test_util.py rename to gQuant/plugins/rapids_plugin/tests/unit/test_util.py index 39403b85..bada0c72 100644 --- a/tests/unit/test_util.py +++ b/gQuant/plugins/rapids_plugin/tests/unit/test_util.py @@ -22,10 +22,7 @@ import pandas as pd import unittest import cudf -from gquant.dataframe_flow.task import load_modules -import os -load_modules(os.getenv('MODULEPATH')+'/rapids_modules/') -from rapids_modules.cuindicator import shift, diff +from gquant_rapids_plugin.cuindicator import shift, diff import numpy as np from .utils import make_orderer, error_function diff --git a/tests/unit/testdata.csv.gz b/gQuant/plugins/rapids_plugin/tests/unit/testdata.csv.gz similarity index 100% rename from tests/unit/testdata.csv.gz rename to gQuant/plugins/rapids_plugin/tests/unit/testdata.csv.gz diff --git a/gQuant/plugins/rapids_plugin/tests/unit/utils.py b/gQuant/plugins/rapids_plugin/tests/unit/utils.py new file mode 100644 index 00000000..be3a71d0 --- /dev/null +++ b/gQuant/plugins/rapids_plugin/tests/unit/utils.py @@ -0,0 +1,61 @@ +import numpy as np + + +def make_orderer(): + """Keep tests in order""" + order = {} + + def ordered(f): + order[f.__name__] = len(order) + return f + + def compare(a, b): + return [1, -1][order[a] < order[b]] + + return ordered, compare + + +def error_function(gpu_series, result_series): + """ + utility function to compare GPU array vs CPU array + Parameters + ------ + gpu_series: cudf.Series + GPU computation result series + result_series: pandas.Series + Pandas computation result series + + Returns + ----- + double + maximum error of the two arrays + """ + gpu_arr = gpu_series.to_array(fillna='pandas') + pan_arr = result_series.values + gpu_arr = gpu_arr[~np.isnan(gpu_arr) & ~np.isinf(gpu_arr)] + pan_arr = pan_arr[~np.isnan(pan_arr) & ~np.isinf(pan_arr)] + err = np.abs(gpu_arr - pan_arr).max() + return err + + +def error_function_index(gpu_series, result_series): + """ + utility function to compare GPU array vs CPU array + Parameters + ------ + gpu_series: cudf.Series + GPU computation result series + result_series: pandas.Series + Pandas computation result series + + Returns + ----- + double + maximum error of the two arrays + int + maximum index value diff + """ + err = error_function(gpu_series, result_series) + error_index = np.abs(gpu_series.index.to_array() - + result_series.index.values).max() + return err, error_index diff --git a/external/README.md b/gQuant/plugins/simple_example/README.md similarity index 56% rename from external/README.md rename to gQuant/plugins/simple_example/README.md index 6846d1a5..c4e7c791 100644 --- a/external/README.md +++ b/gQuant/plugins/simple_example/README.md @@ -7,34 +7,28 @@ This is a simple example to show how to write an external gQuant plugin. gQuant conda create -n test python=3.8 ``` -### Install the gQuant lib -To install the gQuant graph computation library, first install the dependence libraries: -```bash -pip install dask[dataframe] distributed networkx -conda install python-graphviz ruamel.yaml numpy pandas -``` -Then install gquant lib: +### Install the gQuant +To install the gQuant graph computation library, run: ```bash pip install gquant ``` - -### Install the gQuantlab plugin -To install JupyterLab plugin, install the following dependence libraries: +Or install `gquant` at the gquant directory: ```bash -conda install nodejs ipywidgets +pip install . ``` -Then install the gquantlab lib: + +### Install the gquantlab JupyterLab plugin +To install `gquantlab` JupyterLab plugin, make sure `nodejs` of version [12^14^15] is installed. E.g: ```bash -pip install gquantlab==0.1.2 +conda install -c conda-forge nodejs=12.4.0 ``` -Build the ipywidgets Jupyterlab plugin +Then install the `gquantlab`: ```bash -jupyter labextension install @jupyter-widgets/jupyterlab-manager@2.0 +pip install gquantlab ``` -If you launch the JupyterLab, it will prompt to build the new plugin. You can -explicitly build it by: +Or install `gquantlab` at the gquantlab directory: ```bash -jupyter lab build +pip install . ``` ### Install the external example plugin diff --git a/external/example/__init__.py b/gQuant/plugins/simple_example/example/__init__.py similarity index 100% rename from external/example/__init__.py rename to gQuant/plugins/simple_example/example/__init__.py diff --git a/external/example/client.py b/gQuant/plugins/simple_example/example/client.py similarity index 100% rename from external/example/client.py rename to gQuant/plugins/simple_example/example/client.py diff --git a/external/example/distanceNode.py b/gQuant/plugins/simple_example/example/distanceNode.py similarity index 100% rename from external/example/distanceNode.py rename to gQuant/plugins/simple_example/example/distanceNode.py diff --git a/external/example/pointNode.py b/gQuant/plugins/simple_example/example/pointNode.py similarity index 100% rename from external/example/pointNode.py rename to gQuant/plugins/simple_example/example/pointNode.py diff --git a/gQuant/plugins/simple_example/notebooks/plugin_example.ipynb b/gQuant/plugins/simple_example/notebooks/plugin_example.ipynb new file mode 100644 index 00000000..0b08f3ee --- /dev/null +++ b/gQuant/plugins/simple_example/notebooks/plugin_example.ipynb @@ -0,0 +1,90 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "28b4de15b5114ea4929c4a3d716eb194", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points'), ('type', 'PointNode'), ('conf', {'npts': 20}), …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import json\n", + "from gquant.dataframe_flow import TaskGraph\n", + "taskGraph=TaskGraph.load_taskgraph('./simple_plugin.gq.yaml')\n", + "taskGraph.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "bc10f41548f7414585a3b5454c4ce8c2", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Tab(children=(Output(), Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_type': 'st…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "taskGraph.run(formated=True)" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/gQuant/plugins/simple_example/notebooks/simple_plugin.gq.yaml b/gQuant/plugins/simple_example/notebooks/simple_plugin.gq.yaml new file mode 100644 index 00000000..6be153f2 --- /dev/null +++ b/gQuant/plugins/simple_example/notebooks/simple_plugin.gq.yaml @@ -0,0 +1,18 @@ +- id: points + type: PointNode + conf: + npts: 20 + inputs: {} + module: custom_nodes +- id: compute_distance + type: DistanceNode + conf: {} + inputs: + points_df_in: points.points_df_out + module: custom_nodes +- id: '' + type: Output_Collector + conf: {} + inputs: + in1: compute_distance.distance_df + in2: compute_distance.distance_abs_df diff --git a/external/setup.py b/gQuant/plugins/simple_example/setup.py similarity index 100% rename from external/setup.py rename to gQuant/plugins/simple_example/setup.py diff --git a/tutorial.gif b/gQuant/tutorial.gif similarity index 100% rename from tutorial.gif rename to gQuant/tutorial.gif diff --git a/util/auto_gen.py b/gQuant/util/auto_gen.py similarity index 100% rename from util/auto_gen.py rename to gQuant/util/auto_gen.py diff --git a/util/print_env.sh b/gQuant/util/print_env.sh similarity index 100% rename from util/print_env.sh rename to gQuant/util/print_env.sh diff --git a/util/start.sh b/gQuant/util/start.sh similarity index 100% rename from util/start.sh rename to gQuant/util/start.sh diff --git a/util/stop.sh b/gQuant/util/stop.sh similarity index 100% rename from util/stop.sh rename to gQuant/util/stop.sh diff --git a/workspace.code-workspace b/gQuant/workspace.code-workspace similarity index 93% rename from workspace.code-workspace rename to gQuant/workspace.code-workspace index 41b2e86d..21e186db 100644 --- a/workspace.code-workspace +++ b/gQuant/workspace.code-workspace @@ -6,7 +6,7 @@ ], "settings": { "terminal.integrated.shell.linux": "/bin/bash", - "python.pythonPath": "${env:HOME}/miniconda3/bin/python", + "python.pythonPath": "/home/yi/miniconda3/envs/gdax/bin/python", "python.linting.enabled": true, "python.linting.pylintEnabled": true, "python.formatting.autopep8Path": "${env:HOME}/miniconda3/bin/autopep8", diff --git a/gquantlab/gquantlab/__init__.py b/gquantlab/gquantlab/__init__.py deleted file mode 100644 index 13a3f2b8..00000000 --- a/gquantlab/gquantlab/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -from ._version import __version__ -from .handlers import setup_handlers - - -def _jupyter_server_extension_paths(): - return [{ - "module": "gquantlab" - }] - - -def load_jupyter_server_extension(lab_app): - """Registers the API handler to receive HTTP requests from the frontend extension. - - Parameters - ---------- - lab_app: jupyterlab.labapp.LabApp - JupyterLab application instance - """ - setup_handlers(lab_app.web_app) - lab_app.log.info("Registered gQuantLab extension at URL path /gquantlab") diff --git a/gquantlab/gquantlab/_version.py b/gquantlab/gquantlab/_version.py deleted file mode 100644 index 38852bdb..00000000 --- a/gquantlab/gquantlab/_version.py +++ /dev/null @@ -1,2 +0,0 @@ -version_info = (0, 1, 2) -__version__ = ".".join(map(str, version_info)) diff --git a/gquantlab/jupyter-config/gquantlab.json b/gquantlab/jupyter-config/gquantlab.json deleted file mode 100644 index 3aa2c1cc..00000000 --- a/gquantlab/jupyter-config/gquantlab.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "NotebookApp": { - "nbserver_extensions": { - "gquantlab": true - } - } -} diff --git a/gquantlab/pyproject.toml b/gquantlab/pyproject.toml deleted file mode 100644 index 010df900..00000000 --- a/gquantlab/pyproject.toml +++ /dev/null @@ -1,3 +0,0 @@ -[build-system] -requires = ["jupyter_packaging~=0.4.0", "jupyterlab~=2.0", "setuptools>=40.8.0", "wheel"] -build-backend = "setuptools.build_meta" diff --git a/gquantrc b/gquantrc deleted file mode 100644 index d30087b3..00000000 --- a/gquantrc +++ /dev/null @@ -1,4 +0,0 @@ -[ModuleFiles] -nemo_modules= %(MODULEPATH)s/nemo_gquant_modules -rapids_modules= %(MODULEPATH)s/rapids_modules -my_node= %(MODULEPATH)s/my_node.py diff --git a/notebooks/01_tutorial.ipynb b/notebooks/01_tutorial.ipynb deleted file mode 100644 index 3e25e25d..00000000 --- a/notebooks/01_tutorial.ipynb +++ /dev/null @@ -1,1413 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Introduction to gQuant\n", - "\n", - "**gQuant** is a set of open-source examples for Quantitative Analysis tasks:\n", - "- Data preparation & feat. engineering\n", - "- Alpha seeking modeling\n", - "- Technical indicators\n", - "- Backtesting\n", - "\n", - "It is GPU-accelerated by leveraging [**RAPIDS.ai**](https://rapids.ai) technology, and has Multi-GPU and Multi-Node support.\n", - "\n", - "gQuant computing components are oriented around its plugins and task graph.\n", - "\n", - "## Download example datasets\n", - "\n", - "Before getting started, let's download the example datasets if not present." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dataset is already present. No need to re-download it.\n" - ] - } - ], - "source": [ - "! ((test ! -f './data/stock_price_hist.csv.gz' || test ! -f './data/security_master.csv.gz') && \\\n", - " cd .. && bash download_data.sh) || echo \"Dataset is already present. No need to re-download it.\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## About this notebook\n", - "\n", - "In this tutorial, we are going to use gQuant to do a simple quant job. The job tasks are listed below:\n", - " 1. load csv stock data.\n", - " 2. filter out the stocks that has average volume smaller than 50.\n", - " 3. sort the stock symbols and datetime.\n", - " 4. add rate of return as a feature into the table.\n", - " 5. in two branches, computethe mean volume and mean return.\n", - " 6. read the file containing the stock symbol names, and join the computed dataframes.\n", - " 7. output the result in csv files.\n", - " \n", - "## TaskGraph playground\n", - "\n", - "Run the following gquant code to start a empty TaskGraph where computation graph can be created. You can follow the steps as listed below." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "26579d22aa1743bda97aa88f04e8dc36", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox())" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import sys; sys.path.insert(0, '..')\n", - "from gquant.dataframe_flow import TaskGraph\n", - "task_graph = TaskGraph()\n", - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step by Step to build your first task graph\n", - "\n", - "### Create Task node to load the included stock csv file \n", - "\n", - "\n", - "### Explore the data and visualize it\n", - "\n", - "\n", - "### Clean up the Task nodes for next steps\n", - "\n", - "\n", - "### Filter the data and compute the rate of return feature\n", - "\n", - "\n", - "### Save current TaskGraph for a composite Task node\n", - "\n", - "\n", - "### Clean up the redudant feature computation Task nodes\n", - "\n", - "\n", - "### Compute the averge volume and returns \n", - "\n", - "\n", - "### Dump the dataframe to csv files\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Just in case you cannnot follow along, here you can load the tutorial taskgraph from the file. First one is the graph to calculate the return feature. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "0c3b7242f4124ac58758b09a3079e273", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/get_return_feature.gq.yaml')\n", - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Load the full graph and click on the `run` button to see the result" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "6f710007cebc41ce8cb2f91dd4237b77", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/tutorial_intro.gq.yaml')\n", - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## About Task graphs, nodes and plugins\n", - "\n", - "Quant processing operators are defined as nodes that operates on **cuDF**/**dask_cuDF** dataframes.\n", - "\n", - "A **task graph** is a list of tasks composed of gQuant nodes.\n", - "\n", - "The cell below contains the task graph described before." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings; warnings.simplefilter(\"ignore\")\n", - "csv_average_return = 'average_return.csv'\n", - "csv_average_volume = 'average_volume.csv'\n", - "csv_file_path = './data/stock_price_hist.csv.gz'\n", - "csv_name_file_path = './data/security_master.csv.gz'\n", - "from gquant.dataframe_flow import TaskSpecSchema \n", - "\n", - "# load csv stock data\n", - "task_csvdata = {\n", - " TaskSpecSchema.task_id: 'stock_data',\n", - " TaskSpecSchema.node_type: 'CsvStockLoader',\n", - " TaskSpecSchema.conf: {'file': csv_file_path},\n", - " TaskSpecSchema.inputs: {},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "# filter out the stocks that has average volume smaller than 50\n", - "task_minVolume = {\n", - " TaskSpecSchema.task_id: 'volume_filter',\n", - " TaskSpecSchema.node_type: 'ValueFilterNode',\n", - " TaskSpecSchema.conf: [{'min': 50.0, 'column': 'volume'}],\n", - " TaskSpecSchema.inputs: {'in': 'stock_data.cudf_out'},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "# sort the stock symbols and datetime\n", - "task_sort = {\n", - " TaskSpecSchema.task_id: 'sort_node',\n", - " TaskSpecSchema.node_type: 'SortNode',\n", - " TaskSpecSchema.conf: {'keys': ['asset', 'datetime']},\n", - " TaskSpecSchema.inputs: {'in': 'volume_filter.out'},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "# add rate of return as a feature into the table\n", - "task_addReturn = {\n", - " TaskSpecSchema.task_id: 'add_return_feature',\n", - " TaskSpecSchema.node_type: 'ReturnFeatureNode',\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.inputs: {'stock_in': 'sort_node.out'},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "# read the stock symbol name file and join the computed dataframes\n", - "task_stockSymbol = {\n", - " TaskSpecSchema.task_id: 'stock_name',\n", - " TaskSpecSchema.node_type: 'StockNameLoader',\n", - " TaskSpecSchema.conf: {'file': csv_name_file_path },\n", - " TaskSpecSchema.inputs: {},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "# In two branches, compute the mean volume and mean return seperately\n", - "task_volumeMean = {\n", - " TaskSpecSchema.task_id: 'average_volume',\n", - " TaskSpecSchema.node_type: 'AverageNode',\n", - " TaskSpecSchema.conf: {'column': 'volume'},\n", - " TaskSpecSchema.inputs: {'stock_in': 'add_return_feature.stock_out'},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "task_returnMean = {\n", - " TaskSpecSchema.task_id: 'average_return',\n", - " TaskSpecSchema.node_type: 'AverageNode',\n", - " TaskSpecSchema.conf: {'column': 'returns'},\n", - " TaskSpecSchema.inputs: {'stock_in': 'add_return_feature.stock_out'},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "task_leftMerge1 = {\n", - " TaskSpecSchema.task_id: 'left_merge1',\n", - " TaskSpecSchema.node_type: 'LeftMergeNode',\n", - " TaskSpecSchema.conf: {'column': 'asset'},\n", - " TaskSpecSchema.inputs: {'left': 'average_return.stock_out', \n", - " 'right': 'stock_name.stock_name'},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "task_leftMerge2 = {\n", - " TaskSpecSchema.task_id: 'left_merge2',\n", - " TaskSpecSchema.node_type: 'LeftMergeNode',\n", - " TaskSpecSchema.conf: {'column': 'asset'},\n", - " TaskSpecSchema.inputs: {'left': 'average_volume.stock_out', \n", - " 'right': 'stock_name.stock_name'},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "# output the result in csv files\n", - "\n", - "task_outputCsv1 = {\n", - " TaskSpecSchema.task_id: 'output_csv1',\n", - " TaskSpecSchema.node_type: 'OutCsvNode',\n", - " TaskSpecSchema.conf: {'path': csv_average_return},\n", - " TaskSpecSchema.inputs: {'df_in': 'left_merge1.merged'},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}\n", - "\n", - "task_outputCsv2 = {\n", - " TaskSpecSchema.task_id: 'output_csv2',\n", - " TaskSpecSchema.node_type: 'OutCsvNode',\n", - " TaskSpecSchema.conf: {'path': csv_average_volume },\n", - " TaskSpecSchema.inputs: {'df_in': 'left_merge2.merged'},\n", - " TaskSpecSchema.module: \"rapids_modules\"\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In Python, a gQuant task-spec is defined as a dictionary with the following fields:\n", - "- `id`\n", - "- `type`\n", - "- `conf`\n", - "- `inputs`\n", - "- `filepath`\n", - "- `module`\n", - "\n", - "As a best practice, we recommend using the `TaskSpecSchema` class for these fields, instead of strings.\n", - "\n", - "The `id` for a given task must be unique within a task graph. To use the result(s) of other task(s) as input(s) of a different task, we use the id(s) of the former task(s) in the `inputs` field of the next task.\n", - "\n", - "The `type` field contains the node type to use for the compute task. gQuant includes a collection of node classes. These can be found in `gquant.plugin_nodes`. Click [here](#node_class_example) to see a gQuant node class example.\n", - "\n", - "The `conf` field is used to parameterise a task. It lets you access user-set parameters within a plugin (such as `self.conf['min']` in the example above). Each node defines the `conf` json schema. The gQuant UI can use this schema to generate the proper form UI for the inputs. It is recommended to use the UI to configure the `conf`. \n", - "\n", - "The `filepath` field is used to specify a python module where a custom plugin is defined. It is optional if the plugin is in `plugin_nodes` directory, and mandatory when the plugin is somewhere else. In a different tutorial, we will learn how to create custom plugins.\n", - "\n", - "The `module` is optional to tell gQuant the name of module that the node type is from. If it is not specified, gQuant will search for it among all the customized modules. \n", - "\n", - "A custom node schema will look something like this:\n", - "```\n", - "custom_task = {\n", - " TaskSpecSchema.task_id: 'custom_calc',\n", - " TaskSpecSchema.node_type: 'CustomNode',\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.inputs: ['some_other_node'],\n", - " TaskSpecSchema.filepath: 'custom_nodes.py'\n", - "}\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Below, we compose our task graph and visualize it as a graph." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from gquant.dataframe_flow import TaskGraph\n", - "\n", - "# list of nodes composing the task graph\n", - "task_list = [\n", - " task_csvdata, task_minVolume, task_sort, task_addReturn,\n", - " task_stockSymbol, task_volumeMean, task_returnMean,\n", - " task_leftMerge1, task_leftMerge2,\n", - " task_outputCsv1, task_outputCsv2]\n", - "\n", - "task_graph = TaskGraph(task_list)\n", - "task_graph.draw(show='ipynb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can visualize the ports by setting `show_ports` to `True`" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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oxgABhgkEoAe19DQkJSUdOjQoZ9++kmr1QYGBj777LNRUVFjx461hImQrtHpdL/88ktaWlpqaur169elUmlERMS8efOeffbZvnnpDAA8JiQSgJ6i1WpTU1P379+flpZmNBojIiL+8pe/PPvssy4uLrRL62du3LiRlpZ29OjRX375xcbGZvbs2bGxsZMmTUKeAxhIkEgAut/Nmzd37Nixe/dulUr1zDPPxMbGzp4929bWlnZd/V55efnhw4cPHDhw/vx5Nze3lStXLlu2DF/EAzAwIJEAdBuj0Zienv7JJ5+kpaV5eHisXLly8eLFzs7OtOsagG7cuLFz585du3Y1NTXNnTv3H//4R3BwMO2iAOCxYA0AgO6RmZk5ceLEiIiIurq6gwcP3rhxY/369YgjPWTIkCHvvfdeeXl5YmLixYsXx44dGx4enpubS7suAOg6JBKAx3X27NlJkyaFhYXZ2Njk5uZmZmbOmTOHy8WXRvU4Pp+/aNGi/Pz8EydONDQ0BAcHz5s3r6ioiHZdANAVSCQAXdfY2Lh69erQ0NCWlpbTp0+npKQEBgbSLsoSTZs27X//+9/JkycLCwuHDx++YcOGlpYW2kUBwKPBdSQAXXTixImEhAStVvvpp5/OmTOHdjlACCEGg2Hbtm2vv/66r6/vV199NXr0aNoVAUBnYY4E4JEZjcY33nhj+vTpTz311JUrVxBH+g42m/3yyy9fvHhRIpGMHz9+z549tCsCgM5CIgF4NDqdLi4u7r333tu1a9eBAwccHBxoV9QPHDx4kMVisVgsa2vrXni7IUOG/PTTT+vWrXvhhRc2btyImWCAfgFnbQAegU6ni4qKunDhwn/+858pU6bQLqefmTp1amZmplar7bV33LVr18qVK5cvX/7JJ5/02psCQNfgdgCAR7BkyZKcnJyff/551KhRtGvpFLFYPHr06MzMTNqF0LF06VI7O7vnnntu+PDhy5cvp10OADwMztoAdNauXbsOHz585MiR/hJHgBAye/bsf/3rX6tWrTp79iztWgDgYZBIADqltrb2lVdeefnll3Gypt954403Jk2atGLFCr1eT7sWAHggJBKATvniiy8IIW+++Wa3j6zT6d58801/f3+hUGhnZzdjxoxjx46ZHztramrWrl07ePBgKysrW1vb6dOnnz59mnkpKSmJ9bvCwsLnn3/e3t6e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CNClVqvPnTvHpORz5841NzePGjUqKioqKipq/PjxOFEI8HBIJNAP1NXVHTlyJDU1NSMjQ61Wjxo16tlnn42KipowYQL+ykPfpNVqf/7559TU1NTU1OLiYnt7+8jIyBkzZvzlL3/BcvgA94VEAn1XW1vbDz/8sGfPnuTkZA6HM2XKlKioqGeffdbDw4N2aQCPoKCggIkmZ86cEQqFc+bMWbx4cWhoKIvFol0aQB+CRAJ90eXLl3fv3r1///67d+9OnDhx8eLFf/3rX7E0CPR3d+/e3b9//969e/Py8gYPHhwXF/fCCy94enrSrgugT0Aigb7lxIkTH330UUZGBvP3etGiRbhzAQae3377bc+ePd9++211dfVzzz23bt26oKAg2kUBUNYj3/MJ0AVZWVkTJ06MjIxsbm7+/vvvi4qK3nzzzb4TRw4ePMhisVgs1kO+erczfSzHoUOHRo8eLRAImM/k8uXLtCvqQ0aMGPHhhx+Wl5f/97//vX37dnBwcHh4eF5eHu26AGhCIgH6ysvL//rXv4aGhlpbW58/fz4zM3PGjBl97RT7vHnzjEbjlClTHrOPhcjKypo/f/60adOUSuWNGzdwE+x9sdnsGTNmnD17Ni0traamJjg4eNWqVY2NjbTrAqADiQQoO3LkyNChQy9dunTixIkTJ04EBwfTrqg/EYvFoaGhtKu4j++++85oNK5evVosFg8ePLi0tHT48OGPP2yf3d/HNH369JycnN27dx84cGD48OFnz56lXREABUgkQNMbb7zx/PPPx8XFXbp0adq0abTLgW5TWlpKCLG3t6ddSL/BYrEWL1587dq1UaNGPfPMM19//TXtigB6G75xG6h5/fXX33333S+//PLFF1+kXQt0M71eT7uEfsnBweHYsWOvvfba0qVL2Wz2okWLaFcE0HswRwJ0pKamvv3227t27aIVR9ra2g4dOhQeHu7s7CwQCEaMGLFt2zaDwWDep6CgYNasWVKpVCQShYWFZWZm3jtOZ/o8SFJSEut3hYWFzz//vL29PfO0urqaEKJUKletWuXl5WVlZeXo6BgTE5Ofn89s++GHH7JYLLVanZWVxWzC5XIJIZs2bWKems5u/PDDD0yLg4NDh+/75Zdfml66ffv23LlzZTKZvb19dHT0zZs3O79T33//PSGEuax1woQJzEsP2Z0OfyI9tL8dfs69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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_graph.draw(show='ipynb', show_ports=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is recommended to visualize it with gQuant widget so you can interact with it by call `draw` without arguments" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "5c0113e410a44bf0bb64512a6e334123", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(cache={'height': 410.7, 'width': 1369, 'nodes': [{'width': 140, 'id': 'stock_data', 'type': 'CsvS…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will use `save_taskgraph` method to save the task graph to a **yaml file**.\n", - "\n", - "That will allow us to re-use it in the future." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "task_graph_file_name = '01_tutorial_task_graph.gq.yaml'\n", - "\n", - "task_graph.save_taskgraph(task_graph_file_name)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here is a snippet of the content in the resulting yaml file:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "- id: stock_data\n", - " type: CsvStockLoader\n", - " conf:\n", - " file: ./data/stock_price_hist.csv.gz\n", - " inputs: {}\n", - " module: rapids_modules\n", - "- id: volume_filter\n", - " type: ValueFilterNode\n", - " conf:\n", - " - column: volume\n", - " min: 50\n", - " inputs:\n", - " in: stock_data.cudf_out\n", - " module: rapids_modules\n", - "- id: sort_node\n", - " type: SortNode\n", - " conf:\n", - " keys:\n", - " - asset\n" - ] - } - ], - "source": [ - "%%bash -s \"$task_graph_file_name\"\n", - "head -n 19 $1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The yaml file describes the computation tasks. We can load it and visualize it as a graph." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "87834069146846799ab1b92dc21532c1", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph(task_graph_file_name)\n", - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Building a task graph\n", - "\n", - "Running the task graph is the next logical step. Nevertheless, it can optionally be built before running it.\n", - "\n", - "By calling `build` method, the graph is traversed without running the dataframe computations. This could be useful to inspect the column names and types, validate that the plugins can be instantiated, and check for errors.\n", - "\n", - "The output of `build` are instances of each task in a dictionary.\n", - "\n", - "In the example below, we inspect the column names and types for the inputs and outputs of the `left_merge1` task:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Output of build task graph are instances of each task in a dictionary:\n", - "\n", - "stock_data: \n", - "volume_filter: \n", - "sort_node: \n", - "add_return_feature: \n", - "stock_name: \n", - "average_volume: \n", - "average_return: \n", - "left_merge1: \n", - "left_merge2: \n", - "output_csv1: \n", - "output_csv2: \n", - "\n" - ] - } - ], - "source": [ - "from pprint import pprint\n", - "\n", - "task_graph.build()\n", - "\n", - "print('Output of build task graph are instances of each task in a dictionary:\\n')\n", - "print(str(task_graph))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "output meta in outgoing dataframe:\n", - "\n", - "MetaData(inports={'left': {}, 'right': {}}, outports={'merged': {'returns': 'float64', 'asset': 'int64', 'asset_name': 'object'}})\n" - ] - } - ], - "source": [ - "# output meta in 'left_merge_1' node\n", - "\n", - "print('output meta in outgoing dataframe:\\n')\n", - "pprint(task_graph['left_merge1'].meta_setup())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running a task graph\n", - "\n", - "To execute the graph computations, we will use the `run` method. If the `Output_Collector` task node is not added to the graph, a output list can be feeded to the run method. The result can be displayed in a rich mode if the `formated` argument is turned on.\n", - "\n", - "`run` can also takes an optional `replace` argument which is used and explained later on" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "cdb4f783594b48ac9c090132f35ffdca", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Tab(children=(Output(), Output(), Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "outputs = ['stock_data.cudf_out', 'output_csv1.df_out', 'output_csv2.df_out']\n", - "task_graph.run(outputs=outputs, formated=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result can be used as a tuple or dictionary." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "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", - "
assetvolumeasset_name
0869577154.528596CTT
1869584701.630560LPT
2869587119.878161HBP
3869589161.938559DSLV
4869590204.126667BPTH
............
499522876187.673706SIM
49962287979.648169GLQ
4997228801360.962269EXPR
499822884171.356747LTBR
499922888526.766194HIW
\n", - "

5000 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " asset volume asset_name\n", - "0 869577 154.528596 CTT\n", - "1 869584 701.630560 LPT\n", - "2 869587 119.878161 HBP\n", - "3 869589 161.938559 DSLV\n", - "4 869590 204.126667 BPTH\n", - "... ... ... ...\n", - "4995 22876 187.673706 SIM\n", - "4996 22879 79.648169 GLQ\n", - "4997 22880 1360.962269 EXPR\n", - "4998 22884 171.356747 LTBR\n", - "4999 22888 526.766194 HIW\n", - "\n", - "[5000 rows x 3 columns]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result = task_graph.run(outputs=outputs)\n", - "csv_data_df, csv_1_df, csv_2_df = result\n", - "result['output_csv2.df_out']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can profile each of the computation node running time by turning on the profiler." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:stock_data process time:3.999s\n", - "id:volume_filter process time:0.009s\n", - "id:sort_node process time:0.088s\n", - "id:add_return_feature process time:0.056s\n", - "id:average_volume process time:0.036s\n", - "id:average_return process time:0.035s\n", - "id:stock_name process time:0.012s\n", - "id:left_merge1 process time:0.002s\n", - "id:output_csv1 process time:0.028s\n", - "id:left_merge2 process time:0.002s\n", - "id:output_csv2 process time:0.025s\n" - ] - } - ], - "source": [ - "outputs = ['stock_data.cudf_out', 'output_csv1.df_out', 'output_csv2.df_out']\n", - "csv_data_df, csv_1_df, csv_2_df = task_graph.run(outputs=outputs, profile=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Where most of the time is spent on the csv file processing. This is because we have to convert the time string to the proper format via CPU. Let's inspect the content of `csv_1_df` and `csv_2_df`." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "csv_1_df content:\n", - " asset returns asset_name\n", - "0 869577 -0.000295 CTT\n", - "1 869584 0.000387 LPT\n", - "2 869587 0.027713 HBP\n", - "3 869589 0.001337 DSLV\n", - "4 869590 0.009657 BPTH\n", - "... ... ... ...\n", - "4995 707588 -0.000049 LDP\n", - "4996 707611 -0.000967 LITB\n", - "4997 707619 -0.021890 LND\n", - "4998 707624 0.001069 LOCK\n", - "4999 707647 0.001011 LXFR\n", - "\n", - "[5000 rows x 3 columns]\n", - "\n", - "csv_2_df content:\n", - " asset volume asset_name\n", - "0 869577 154.528596 CTT\n", - "1 869584 701.630560 LPT\n", - "2 869587 119.878161 HBP\n", - "3 869589 161.938559 DSLV\n", - "4 869590 204.126667 BPTH\n", - "... ... ... ...\n", - "4995 707588 99.917736 LDP\n", - "4996 707611 393.918500 LITB\n", - "4997 707619 112.800000 LND\n", - "4998 707624 1256.701650 LOCK\n", - "4999 707647 116.476103 LXFR\n", - "\n", - "[5000 rows x 3 columns]\n" - ] - } - ], - "source": [ - "print('csv_1_df content:')\n", - "print(csv_1_df)\n", - "\n", - "print('\\ncsv_2_df content:')\n", - "print(csv_2_df) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Also, please notice that two resulting csv files has been created:\n", - "- average_return.csv\n", - "- average_volume.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "csv files created:\n" - ] - } - ], - "source": [ - "print('\\ncsv files created:')\n", - "!find . -iname \"*symbol*\" " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Subgraphs\n", - "\n", - "A nice feature of task graphs is that we can evaluate any **subgraph**. For instance, if you are only interested in the `average volume` result, you can run only the tasks which are relevant for that computation.\n", - "\n", - "If we would not want to re-run tasks, we could also use the `replace` argument of the `run` function with a `load` option.\n", - "\n", - "The `replace` argument needs to be a dictionary where each key is the task/node id. The values are a replacement task-spec dictionary (i.e. each key is a spec overload, and its value is what to overload with).\n", - "\n", - "In the example below, instead of re-running the `stock_data` node to load a csv file into a `cudf` dataframe, we will use its dataframe output to load from it." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " asset volume\n", - "0 93 86.594737\n", - "1 165 67.020000\n", - "2 239 128.835141\n", - "3 281 68.450000\n", - "4 592 110.333333\n", - "... ... ...\n", - "4995 869589 161.938559\n", - "4996 869590 204.126667\n", - "4997 869592 101.423675\n", - "4998 869597 81.298788\n", - "4999 869599 83.425988\n", - "\n", - "[5000 rows x 2 columns]\n" - ] - } - ], - "source": [ - "replace = {\n", - " 'stock_data': {\n", - " 'load': {\n", - " 'cudf_out': csv_data_df\n", - " },\n", - " 'save': True\n", - " }\n", - "}\n", - "\n", - "(volume_mean_df, ) = task_graph.run(outputs=['average_volume.stock_out'],\n", - " replace=replace)\n", - "\n", - "print(volume_mean_df)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a convenience, we can save on disk the checkpoints for any of the nodes, and re-load them if needed. It is only needed to set the save option to `True`. This step will take a while depends on the disk IO speed.\n", - "\n", - "In the example above, the `replace` spec directs `run` to save on disk for the `stock_data`. If `load` was boolean then the data would be loaded from disk presuming the data was saved to disk in a prior run.\n", - "\n", - "The default directory for saving is `/.cache/.hdf5`.\n", - "\n", - "`replace` is also used to override parameters in the tasks. For instance, if we wanted to use the value `40.0` instead `50.0` in the task `volume_filter`, we would do something similar to:\n", - "```\n", - "replace_spec = {\n", - " 'volume_filter': {\n", - " 'conf': {\n", - " 'min': 40.0\n", - " }\n", - " },\n", - " 'some_task': etc...\n", - "}\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Return mean Dataframe:\n", - "\n", - " asset returns\n", - "0 93 0.241380\n", - "1 165 0.000700\n", - "2 239 0.010021\n", - "3 281 -0.088465\n", - "4 592 0.619716\n", - "... ... ...\n", - "4995 869589 0.001337\n", - "4996 869590 0.009657\n", - "4997 869592 0.001202\n", - "4998 869597 -0.003332\n", - "4999 869599 0.003291\n", - "\n", - "[5000 rows x 2 columns]\n" - ] - } - ], - "source": [ - "replace = {'stock_data': {'load': True},\n", - " 'average_return': {'save': True}}\n", - "\n", - "\n", - "(return_mean_df, ) = task_graph.run(outputs=['average_return.stock_out'], replace=replace)\n", - "\n", - "print('Return mean Dataframe:\\n')\n", - "print(return_mean_df)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we might want to load the `return_mean_df` from the saved file and evaluate only tasks that we are interested in.\n", - "\n", - "In the cells below, we compare different load approaches:\n", - "- in-memory,\n", - "- from disk, \n", - "- and not loading at all.\n", - "\n", - "When working interactively, or in situations requiring iterative and explorative task graphs, a significant amount of time is saved by just re-loading the data that do not require to be recalculated." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using in-memory dataframes for load:\n", - "CPU times: user 260 ms, sys: 67.6 ms, total: 327 ms\n", - "Wall time: 322 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "print('Using in-memory dataframes for load:')\n", - "\n", - "replace = {'stock_data': {'load': {\n", - " 'cudf_out': csv_data_df\n", - " }},\n", - " 'average return': {'load': \n", - " {'stock_out': return_mean_df}}\n", - " }\n", - "\n", - "_ = task_graph.run(outputs=['output_csv2.df_out'], replace=replace)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using cached dataframes on disk for load:\n", - "CPU times: user 2.93 s, sys: 857 ms, total: 3.79 s\n", - "Wall time: 3.77 s\n" - ] - } - ], - "source": [ - "%%time\n", - "print('Using cached dataframes on disk for load:')\n", - "\n", - "replace = {'stock_data': {'load': True},\n", - " 'average return': {'load': True}}\n", - "\n", - "_ = task_graph.run(outputs=['output_csv2.df_out'], replace=replace)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Re-running dataframes calculations instead of using load:\n", - "CPU times: user 2.92 s, sys: 885 ms, total: 3.8 s\n", - "Wall time: 3.78 s\n" - ] - } - ], - "source": [ - "%%time\n", - "print('Re-running dataframes calculations instead of using load:')\n", - "\n", - "replace = {'stock_data': {'load': True}}\n", - "\n", - "_ = task_graph.run(outputs=['output_csv2.df_out'], replace=replace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "An idiomatic way to save data, if not on disk, or load data, if present on disk, is demonstrated below." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2.96 s, sys: 837 ms, total: 3.8 s\n", - "Wall time: 3.78 s\n" - ] - } - ], - "source": [ - "%%time\n", - "import os\n", - "\n", - "loadsave_csv_data = 'load' if os.path.isfile('./.cache/stock_data.hdf5') else 'save'\n", - "loadsave_return_mean = 'load' if os.path.isfile('./.cache/average_return.hdf5') else 'save'\n", - "\n", - "replace = {'stock_data': {loadsave_csv_data: True},\n", - " 'average_return': {loadsave_return_mean: True}}\n", - "\n", - "_ = task_graph.run(outputs=['output_csv2.df_out'], replace=replace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Delete temporary files\n", - "\n", - "A few cells above, we generated a .yaml file containing the example task graph, and also a couple of CSV files.\n", - "\n", - "Let's keep our directory clean, and delete them." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "%%bash -s \"$task_graph_file_name\" \"$csv_average_return\" \"$csv_average_volume\" \n", - "rm -f $1 $2 $3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "---\n", - "\n", - "## Node class example\n", - "\n", - "Implementing custom nodes in gQuant is very straighforward.\n", - "\n", - "Data scientists only need to override five methods in the parent class `Node`:\n", - "- `init`\n", - "- `meta_setup`\n", - "- `ports_setup`\n", - "- `conf_schema`\n", - "- `process`\n", - "\n", - "`init` method is usually used to define the required column names\n", - "\n", - "`ports_setup` defines the input and output ports for the node\n", - "\n", - "`meta_setup` method is used to calculate the output meta name and types.\n", - "\n", - "`conf_schema` method is used to define the JSON schema for the node conf so the client can generate the proper UI for it.\n", - "\n", - "`process` method takes input dataframes and computes the output dataframe. \n", - "\n", - "In this way, dataframes are strongly typed, and errors can be detected early before the time-consuming computation happens.\n", - "\n", - "Below, it can be observed `ValueFilterNode` implementation details:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "class ValueFilterNode(Node, _PortTypesMixin):\n", - "\n", - " def init(self):\n", - " _PortTypesMixin.init(self)\n", - "\n", - " def meta_setup(self):\n", - " cols_required = {\"asset\": \"int64\"}\n", - " return _PortTypesMixin.meta_setup(self, required=cols_required)\n", - "\n", - " def ports_setup(self):\n", - " return _PortTypesMixin.ports_setup(self)\n", - "\n", - " def conf_schema(self):\n", - " json = {\n", - " \"title\": \"Value Filter Node configure\",\n", - " \"type\": \"array\",\n", - " \"description\": \"\"\"Filter the dataframe based on a list of\n", - " min/max values.\"\"\",\n", - " \"items\": {\n", - " \"type\": \"object\",\n", - " \"properties\": {\n", - " \"column\": {\n", - " \"type\": \"string\",\n", - " \"description\": \"dataframe column to be filered on\"\n", - " },\n", - " \"min\": {\n", - " \"type\": \"number\",\n", - " \"description\": \"min value, inclusive\"\n", - " },\n", - " \"max\": {\n", - " \"type\": \"number\",\n", - " \"description\": \"max value, inclusive\"\n", - " }\n", - " }\n", - " }\n", - " }\n", - " ui = {}\n", - " input_meta = self.get_input_meta()\n", - " if self.INPUT_PORT_NAME in input_meta:\n", - " col_from_inport = input_meta[self.INPUT_PORT_NAME]\n", - " enums = [col for col in col_from_inport.keys()]\n", - " json['items']['properties']['column']['enum'] = enums\n", - " return ConfSchema(json=json, ui=ui)\n", - " else:\n", - " return ConfSchema(json=json, ui=ui)\n", - "\n", - " def process(self, inputs):\n", - " \"\"\"\n", - " filter the dataframe based on a list of min/max values. The node's\n", - " conf is a list of column criteria. It defines the column name in\n", - " 'column`, the min value in `min` and the max value in `max`.\n", - "\n", - " Arguments\n", - " -------\n", - " inputs: list\n", - " list of input dataframes.\n", - " Returns\n", - " -------\n", - " dataframe\n", - " \"\"\"\n", - "\n", - " input_df = inputs[self.INPUT_PORT_NAME]\n", - " str_list = []\n", - " for column_item in self.conf:\n", - " column_name = column_item['column']\n", - " if 'min' in column_item:\n", - " minValue = column_item['min']\n", - " str_item = '%s >= %f' % (column_name, minValue)\n", - " str_list.append(str_item)\n", - " if 'max' in column_item:\n", - " maxValue = column_item['max']\n", - " str_item = '%s <= %f' % (column_name, maxValue)\n", - " str_list.append(str_item)\n", - " input_df = input_df.query(\" and \".join(str_list))\n", - " return {self.OUTPUT_PORT_NAME: input_df}\n", - "\n" - ] - } - ], - "source": [ - "import inspect\n", - "from rapids_modules import ValueFilterNode\n", - "\n", - "print(inspect.getsource(ValueFilterNode))" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'status': 'ok', 'restart': True}" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import IPython\n", - "app = IPython.Application.instance()\n", - "app.kernel.do_shutdown(True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "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.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/02_single_stock_trade.ipynb b/notebooks/02_single_stock_trade.ipynb deleted file mode 100644 index a50d338f..00000000 --- a/notebooks/02_single_stock_trade.ipynb +++ /dev/null @@ -1,386 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### gQuant Tutorial\n", - "First import all the necessary modules." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import sys; sys.path.insert(0, '..')\n", - "import os\n", - "import warnings\n", - "import ipywidgets as widgets\n", - "from gquant.dataframe_flow import TaskGraph\n", - "\n", - "warnings.simplefilter(\"ignore\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this tutorial, we are going to use gQuant to do a simple quant job. The task is fully described in a yaml file" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "- id: stock_data\n", - " type: CsvStockLoader\n", - " conf:\n", - " file: notebooks/data/stock_price_hist.csv.gz\n", - " inputs: {}\n", - " module: rapids_modules\n", - "- id: stock_name\n", - " type: StockNameLoader\n", - " conf:\n", - " file: notebooks/data/security_master.csv.gz\n", - " inputs: {}\n", - " module: rapids_modules\n", - "- id: stock_selector\n", - " type: AssetFilterNode\n", - " conf:\n", - " asset: 4330\n", - " inputs:\n", - " name_map: stock_name.map_data\n", - " stock_in: stock_data.cudf_out\n", - " module: rapids_modules\n", - "- id: \"\"\n", - " type: Output_Collector\n", - " conf: {}\n", - " inputs:\n", - " in1: stock_selector.stock_name\n", - " in2: lineplot.lineplot\n", - " in3: barplot.barplot\n", - " in4: sharpe_ratio.sharpe_out\n", - " in5: cumulative_return.cum_return\n", - " in6: stock_data.cudf_out\n", - " module: rapids_modules\n" - ] - } - ], - "source": [ - "!head -n 31 ../taskgraphs/simple_trade.gq.yaml" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The yaml file is describing the computation task by a graph, we can visualize it" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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VlZSx2lxDh48iJCQECQlJeGVV17B0qVLtWcCUNvw2WefYeHChbhw4YL2jgokrcceewy5ubmPdNcIIiIioiYmeAkDEemoHrS4fft2/Pbbbw81aJFaruLiYqxcuRJz5sxheUBEREREDcICgYhqkMvleO6555CcnIz3338fa9as0Q5arKqqkjoePYKPPvoIFRUVeOedd6SOQkREREStDAsEIqpT9aDFS5cuITg4GG+88QYGDRqEyMhIqaM1CplM9sBHaGio1DEbTXZ2NtauXYuFCxeiffv2UsdpNi35+/zJJ59AJpPhzJkzSE9Ph0wmw/vvvy9JFiIiIqIH4QwE0jucgfDwzp8/j0WLFuGHH36An58fPv30U3h4eEgdi+pp1qxZCAsLw4ULF2BsbCx1HCIiIiJqXTgDgYjqr1evXvj+++9x8OBB5Obmon///pg5cyaysrKkjkYPkJqaim+//RZLly5leUBERERtOqFdAAAgAElEQVRED4UFAhE1mK+vL+Lj43UGLS5YsAAlJSVSR6M6vPfee+jWrRteeuklqaMQERERUSvFAoGIHsrdgxY/+OADfPXVV+jVqxcHLbZAcXFx+PHHH7F69WoYGBhIHYeIiIiIWikWCET0SO4etDhhwgS88cYb8PT0xL59+6SORv+1YMECPP744xg7dqzUUYiIiIioFWOBQESNomPHjli7di0SExPRu3dvjB49Gv7+/khISJA6ml777bffcOjQIaxatQoymUzqOERERETUirFAIKJGdfegxVu3bqFfv3546aWXOGhRAkIIvPvuuxg7dix8fHykjkNERERErRwLBCJqEr6+voiLi8POnTtx9OhR7aDF4uJiqaPpje3bt+PMmTNYsWKF1FGIiIiIqA1ggUBETaZ60GJSUpJ20KKbmxsHLTaDyspKLF68GC+99BLc3d2ljkNEREREbQALBCJqcrUNWuzbty/27t0rdbRWTwhR6/KvvvoK6enpCA0Nbd5ARERERNRmsUAgomZTPWjx7NmzcHd3x5gxYzho8RHt3LkTL7zwAi5duqRdVlJSghUrVuDNN9+Ek5OThOmIiIiIqC1hgUBEzc7V1RXff/89Dh06hLy8PO2gxczMTKmjtTrJycnYuXMnXF1d8eabbyI7Oxsff/wxysvLsWDBAqnjEREREVEbwgKBiCTz1FNP6Qxa7NGjBwctNlBSUhLkcjmqqqrwzTffwMnJCQcOHEBISAg6dOggdTwiIiIiakNYIBCRpGQyGZ577jkkJyfjgw8+wPr169GrVy8OWqynxMREaDQaAH8NTiwvL0dcXBw+/vhjrF69GuXl5RInJCIiIqK2ggUCEbUIRkZG2kGLU6ZMwVtvvcVBiw+gVqtx7dq1WpcXFhbi3XffRffu3bFjx446hy0SEREREdUXCwQialE6dOiAVatWISEhQWfQ4pkzZ+77usTERMyaNauZUrYMV65cQWVlZZ1f12g0SE9Px9SpU3H48OFmTEZEREREbRELBCJqkaoHLcbExOD27dvo37//fQctvv322/jqq6/w4YcfNnNS6Zw7d+6+X1coFFCpVPj555/h6+vbTKmIiIiIqK1igUBELdqQIUMQHR2NnTt34o8//kD37t1rDFo8cOAADh06BAD44IMPsHnzZonSNq9z587B0NCw1q8ZGBjA2NgYhw4dwqhRo5o5GRERERG1RSwQiKjFqx60eP78eaxYsUJn0GJlZSX+8Y9/QKFQAACEEHjttdfw66+/Spy66Z0/f147QPFuSqUSVlZWiI6OxtChQyVIRkRERERtEQsEImo1DA0NMWfOHKSmpmL8+PF488034e7ujqSkJJ07Nmg0GowfPx7Hjx+XMG3TS0hIgFqt1lmmVCrh5OSEuLg4eHh4SJSMiIiIiNoiFghE1OpYW1tj3bp1iI2NRU5OTo2vCyGgVqsxatQopKamSpCwedy7bwYGBujTpw+OHTsGJycniVIRERERUVvFAoGIWq3du3ejpKSk1lsUVlVVoaSkBH5+frh586YE6ZpWZmamzhwIAwMDDBs2DL///jusra0lTEZEREREbRULBCJqlW7evImPPvqoxin8d1Or1cjMzERgYCBu377djOma3vnz57X/rlAoMGHCBERERMDMzEzCVERERETUlrFAIKJW6b333kN5efkD16usrMTZs2fx7LPP3rdsaG2qCwSZTIZZs2Zh+/btUCqVEqciIiIiorbMQOoAREQNlZmZifDwcO0dCKo/OFdWVta6vlqtRkREBF5//XV8++23j/z+xcXFqKysREFBAaqqqlBUVITKykqUlJSgvLwcpaWluHPnDsrKygAApaWltZYdd69zN5lMBktLy1rf29LSEjKZDD/++CMAYNKkSRg7diyOHDkCMzMzGBoawsTE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p5/w1FNPYcCAAYiJiYGLi4vUkfSKq6srIiMjcfXqVQQGBqKoqEjqSERERETUQrBAIKIW44svvsDEiRPx2muvYc+ePTA3N5c6kl5ydXXF4cOHcfXqVYwaNYolAhEREREBYIFARC2AEAKhoaGYM2cOPvjgA3zxxRdQKBRSx9Jrd5cIPBOBiIiIiAAWCEQkMbVajalTp2LlypXYsmULQkNDpY5E/1VdIly7do0lAhERERGxQCAi6VRWVuKFF17ATz/9hPDwcEyePFnqSHSP6pkILBGIiIiIiAUCEUmioqICEydOxP79+xEeHo6RI0dKHYnq0LNnT22J8NRTTyE/P1/qSEREREQkARYIRNTsSktLERQUhKioKEREROCpp56SOhI9QHWJkJmZCX9/f5YIRERERHqIBQIRNavy8nI888wzOHnyJA4dOoQhQ4ZIHYnqqbpEyMrKYolAREREpIdYIBBRs6mqqsKUKVNw/Phx/Prrr+jfv7/UkaiB7i0R8vLypI5ERERERM2EBQIRNQshBGbOnIm9e/ciPDwcXl5eUkeih9SjRw+WCERERER6iAUCETWLt956C1u3bsXu3bvx5JNPSh2HHlF1iXDz5k2WCERERCoD358AACAASURBVER6ggUCETW5jz76COvXr8f27dt5t4U2hCUCERERkX5hgUBETeqnn37CwoUL8a9//QvBwcFSx7mvTz75BDKZDDKZDA4ODlLHaRWqS4Ts7Ow2XyLw54OIiIj0nUwIIaQOQdScIiIiMHLkSOTl5cHKykrqOG1aXFwcvL29MXnyZHz99ddSx6m3xx57DLm5ubhx44bUUVqNq1evYsSIEbCyssLBgwfRvn17qSM1Gf58EBERkZ4SPAOBiJrE1atXMXr0aDz11FP4v//7v4fahqmpKZ544olGTkZNoWvXroiMjER+fj78/Pya5UwE/nzUH48VERERNQYWCETU6O7cuYMJEybA1tYWO3bsgEKhkDoSNYN7S4Rbt25JHYmIiIiIGhELBCJqdG+88QauXLmC//znPzA1NZU6DjWjrl27IioqCvn5+fD392eJQERERNSGsEAgoka1fv16bN68Gd999x1cXFxqfL28vByLFi1Cr169YGxsjPbt2yMoKAhhYWGoqqoC8L9hdbdv30Z0dLR2cJ2BgYHOtm7duoV58+bBxcUFhoaGsLKywqhRoxAZGVnjfe9eV6VSwcHBAX5+fti8eTPKysruu09bt27VZqh+ZGVl1fuY7NmzR+e1V69exfPPPw9LS0t06NABY8aMwaVLl3Reo1arsWvXLvj7+8PW1hZGRkbw8PDA2rVrodFo6tz2tWvX8Pzzz8PMzAwdOnTAlClTkJ+fj6tXryIoKAhmZmbo3Lkzpk+fjuLi4hpZc3JyMHv2bHTt2hWGhoawtrZGcHAwTp8+Xe/97dKlC6KiolBQUNDgMxH08eejIXmXL1+ufY+7L0n49ddftcs7duyoXV7fY0VERERUL4JIzxw4cEAAEHl5eVJHaXNOnDghVCqVWLRoUZ3rvPbaa8LCwkIcOHBAlJaWiqysLBESEiIAiMjISJ11TUxMxLBhw2rdTmZmpnB2dhY2NjYiPDxcFBYWipSUFBEcHCxkMpnYsGFDjXVtbW1FeHi4KCoqEllZWWLZsmUCgFizZo3Otj09PYW9vb32uVqtFvPmzRP+/v6P9HMzbtw4AUCMGzdOxMTEiJKSEhERESGMjIzEwIEDddYNDw8XAMSKFStEXl6eyMnJEZ9//rmQy+UiJCSkzm0HBweLuLg4UVJSIrZs2SIAiFGjRolx48aJU6dOieLiYrF+/XoBQLz99ts628jIyBBdunQRNjY2Yu/evaK4uFicPXtWeHt7i3bt2omYmJgG7e/Vq1eFs7OzeOyxx0Rubm69XqOvPx8NyXu/fffy8hIdOnSosfx+x4qIiIionjQsEEjvsEBoGoWFhaJbt24iICBAVFVV1bmes7OzGDp0aI3lPXv2bNAHxGnTpgkAYseOHTrL79y5I+zs7ISRkZHIysrSWXfXrl01thMYGHjfD4j5+fkiICBAzJkzR6jV6jr3qz6qP+SHh4frLH/22WcFAJGTk6NdFh4eLnx8fGpsY/LkyUKpVIrCwsJat713716d5e7u7gKA+P3333WWOzs7C1dXV51lU6dOFQDEtm3bdJZnZmYKlUolvLy86r+z/9XQEkFffz4aklcIFghEREQkCQ0vYSCiRjFr1iyUlJRg8+bNkMvr/k9LYGAgYmJiMGPGDBw/flx7WnpKSgp8fHzq/X67d+8GAIwePVpnuUqlgq+vL8rKyvDbb7/prDtq1Kga29m/fz/mzp1b63ukpKRg0KBBkMvl+OyzzxptGOTAgQN1njs6OgIAMjIytMvGjBlT66n2np6eqKysRFJSUq3bHjBggM5zOzu7Wpfb29vrvB/w1+UQcrkcY8aM0Vlua2sLd3d3xMfHN/jWhV26dEFkZCQKCwvrdTmDvv58NCQvERERkVRYIBDRI/v3v/+N7du3Y+PGjbC1tb3vuuvWrcOWLVtw+fJl+Pr6wtzcHIGBgdoPUPVRXl6OwsJCtGvXDmZmZjW+bmNjAwDIysp64Lp1yc/Px/jx4+Hg4ID9+/dj69at9X7tg1hYWOg8NzQ0BACd2QaFhYVYtGgRPDw8YGVlpb12/Z///CcAoLS0tNZtm5ub6zyXy+VQKBQwNjbWWa5QKHTer/o4aTQaWFhY1Lim/+TJkwCA1NTUBu9v9UyE+pQI+vjz0ZC8RERERFJigUBEjyQ1NRVvvvkm5v1/9u48rsoy8f//+xw47MjmghqomAqWuaemVopbaiM4Y6Zj61i2GjX11crPZFmajaVmTS41S1OmM5VmLpVbk2uZqTkpUK6ogIAiuLAcuH5/9JOJcC0997nh9Xw8eBQ31zn3++aB4nmf67ruxx6r8u7pmTgcDt12221asWKF8vPztXDhQhljNHjwYL3yyitVxp6Jv7+/wsLCVFRUdMaNALOzsyX9+M75+caeja+vr1asWKGPPvpIrVq10j333KNNmzZd8ON/rZtvvlkTJkzQPffco/T0dJWXl8sYo6lTp0qSjDGX9Hz+/v4KDw+Xr6+vSktLZYw540ePHj1+0fPHxsZWKhFyc3PPOK4m/nxcTN7TnE6nSkpKqozNz88/4znO9r0CAAC4GBQIAH6xsrIy3XHHHWrevLkmTpx4QY8JDw9XamqqJMnlcql3794VdxJYsmRJpbFBQUGVXiS1aNFCs2fPliQlJydLUpXHFBcXa+XKlQoMDFTfvn0rjV26dGmVPG3bttWjjz5a5XhoaKgaNmyokJAQLVq0SCEhIUpKSlJmZuYFXeevUVZWpnXr1ik6OlqjR49WnTp1Kl4Anu+OAL/G4MGD5Xa7tW7duipfmzx5smJjY+V2u3/x858uEQoKCs5aItTUn4+LyStJ9evX18GDByuNzcrK0v79+8/4/Of6XgEAAFwwq3ZfAKzCJoqXzuTJk42/v7/59ttvL/gxYWFh5oYbbjDbtm0zRUVFJjs724wfP95IMs8//3ylsf369TNhYWFm//79Zv369cbX19fs2LHDGFN11/qCgoJKu9bPnj274nlOj61fv75ZvHixKSgoMBkZGeb+++839erVM/v27at03p/vsm+MMZ9//rlxuVymc+fOpqio6GK/VcaY/210eOrUqUrHx4wZYySZLVu2VBzr2bOnkWReeuklk5OTY06ePGlWrVplYmNjjSSzfPnyC3ruvn37Gh8fnypZbrjhBhMcHFzpWHZ2tmnatKmJi4szS5cuNfn5+SYvL8/MnDnTBAUFnXGTwV9i3759Ji4uzrRu3brSxpHG1Nyfj4vJa4wxDz30kJFkZsyYYQoLC80PP/xgbrnlFtOwYcMzbqJ4ru8VAADABeIuDKh5KBAujZ07d5rAwEAzadKki3rc1q1bzahRo0xCQoIJCgoykZGRpnPnzmbOnDmmvLy80tjU1FTTvXt3ExwcbGJiYszrr79e6eu5ubkmJSXFNGnSxLhcLhMWFmb69u1rVq5cWeW8Px9bv359c+utt5r09PSKMe+9956RVOlj6tSpZsOGDVWO//73v7/gaz7T459++mljjKlyfMCAAcYYY3JycsyoUaNMTEyMcblcpl69eubOO+80Y8eOrRjbvn37sz73pk2bqhyfNGmSWbNmTZXjzzzzTEXWvLw889hjj5m4uDjjcrlMnTp1TJ8+faoUFr/W2UqEmvjz8Uvy5ufnm5EjR5r69eubwMBA061bN7Np0ybTvn37igxjxoy54O8VAADABSh3GHOJF9ICXm758uXq06ePjhw5ooiICKvj2FJZWZmuu+46ud1ubdy4US6Xy+pIsKH9+/erR48eCg0N1YoVK1S7dm2rIwEAAODsDHsgALhoU6dO1bZt2/TPf/6T8gC/WGxsrFavXq3jx48rMTHxrBsrAgAAwDtQIAC4KPv27dOzzz6rcePGqWXLllbHgc2dLhFOnDih66+/nlsVAgAAeDEKBAAX5aGHHlLDhg31xBNPWB3Fcg6H47wf48ePtzqm14uJidHq1atVUlKinj17VpsSgZ8PAABQ3fhaHQCAfcyfP19LlizRypUr5e/vb3Ucy7GFzKVzukTo0aOHevbsqVWrVik6OtrqWL8KPx8AAKC6YQYCgAuSn5+vlJQUjRw5Uj169LA6Dqqhn85E6NGjR7WZiQAAAFBdUCAAuCDPPvusysrKNHnyZKujoBo7XSK43W5KBAAAAC9DgQDgvHbs2KHXX39dEydO5NaXuOx+XiJkZmZaHQkAAACiQABwAR577DG1atVKd999t9VRUENcccUVFSVCz549KREAAAC8AAUCgHP64IMP9Nlnn2natGlyOvkrA55DiQAAAOBdeDUA4KxKSkr0//7f/9OIESPUvXt3q+OgBrriiiu0Zs0aORwOSgQAAACLUSAAOKuZM2fq0KFDeuGFF6yOghosOjpaq1atksPhYE8EAAAAC1EgADij48ePa+LEiXr44YcVExNjdRzUcKdLBB8fH/Xo0UOHDh2yOhIAAECNQ4EA4Iz+/Oc/q7i4WGPGjLE6CiCpconQs2dPSgQAAAAPo0AAUEVOTo6mTp2qsWPHKioqyuo4QIV69epRIgAAAFiEAgFAFc8++6xCQ0P18MMPWx0FqOJCS4S33npLxhgPpwMAAKi+KBAAVLJnzx7NmTNH48ePV1BQkNVxgDP6aYlwpj0Rxo0bp5EjR2rJkiUWJQQAAKh+KBAAVPL000+rcePGuuuuu6yOApzT6RLB19e3Uonwf//3f5o4caKcTqfGjx9vbUgAAIBqhAIBQIVt27Zp/vz5mjRpknx9fa2OA5zX6RLB5XKpR48eevTRR/X888/LGKPy8nJt3rxZK1eutDomAABAteAwLBBFDbN8+XL16dNHR44cUUREhNVxvMqAAQOUl5enDRs2yOFwWB0HuGCZmZm6/vrr9cMPP1Q67uvrqy5duuiLL76wKBkAAEC1YZiBAECStHXrVi1btkzjx4+nPIDtzJw5s0p5IElut1tr1qzR2rVrLUgFAABQvVAgAJAkTZgwQW3atFHfvn2tjgJclGeeeUbPPffcWb/u6+urCRMmeDARAABA9USBAEA7d+7UwoUL9X//93/MPoCtjB8//pzlgfTjLITPPvtMmzdv9lAqAACA6okCAYBeeOEFxcfHa9CgQVZHAS7YqVOnVFBQoICAgPNu+ulyuZiFAAAA8CtRIAA13K5duzR//nyNGzdOTid/JcA+AgMD9corrygjI0NPP/20QkNDz1oklJaWatGiRfrvf//r4ZQAAADVB68WgBpu0qRJatSokYYMGWJ1FOAXqV27tsaPH6+DBw9qypQpql279hnLMF9fX02cONGChAAAANUDBQJQg2VkZOif//ynnnrqqfNOAQe8XWhoqB555BEdOHBAb7zxhqKjo+V0Oiv29SgtLdX8+fOVnp5ucVIAAAB7okAAarCXXnpJ9erV04gRI6yOAlwy/v7+uvfee7Vv3z7NmjVLMTExcjgc8vHxkTFGL774otURAQAAbIkCAaihcnJy9NZbb2nMmDHy8/OzOg5wyfn5+WnkyJHavXu33nnnHTVr1kzGGL399tt64oknNHv2bBUUFFgdEwAAwDYoEIAaaubMmQoICNCdd95pdRTgsvLx8dHw4cO1Y8cOJScnq6ysTFOnTtWDDz6oZs2aKTMz0+qIAAAAtkCBANRApaWlmjVrlu677z4FBwdbHQfwiH379mnhwoWSpLKyMrndbh09epSNFQEAAC4QBQJQA82bN0/Z2dm6//77rY4CeMzOnTtljKl0rLS0VFu2bLEoEQAAgL1QIAA10IwZMzRkyBDFxMRYHQXwmGbNmlU55nK5dNVVV1mQBgAAwH4oEIAa5osvvtCmTZv0yCOPWB0F8Kgrr7xSo0aNksPhkJ+fn1wul4KDg/XUU09ZHQ0AAMAWKBCAGmb69Om67rrr1KlTJ6ujAB43c+ZMLViwQAMGDFBoaKi+++47NWrUyOpYAAAAtuBrdQAAnrNv3z599NFHmjt3rtVRAMsMGjRIrVu3VlxcnLZv364GDRpYHQkAAMAWmIEA1CAzZsxQgwYNNHjwYKujAJZq3Lix2rZtqwULFlgdBQAAwDYoEIAa4tSpU/rb3/6mBx54QL6+TD4CkpOTtXDhQpWVlVkdBQAAwBYoEIAa4t///rcKCwt1xx13WB0F8ArJycnKzs7W+vXrrY4CAABgCxQIQA0xa9YsJScnq379+lZHAbzCVVddpfj4eJYxAAAAXCAKBKAG2Llzp9avX697773X6iiAV0lOTtaCBQtkjLE6CgAAgNejQABqgDfeeENNmzZVjx49rI4CeJXk5GTt3btXW7ZssToKAACA16NAAKq5U6dO6Z133tGoUaPkdPJHHvipDh06KDY2lmUMAAAAF4BXE0A1N3/+fJ04cYLNE4EzcDgcSk5O1ocffmh1FAAAAK9HgQBUc7Nnz9bgwYNVt25dq6MAXik5OVk7duxQamqq1VEAAAC8GgUCUI2lpqZqw4YNGjlypNVRAK/VrVs31a1bl1kIAAAA50GBAFRj//jHP9SwYUPdeOONVkcBvJaPj49+85vfsA8CAADAeVAgANVUeXm53n33Xd1xxx3y8fGxOg7g1ZKTk7V582bt37/f6igAAABeiwIBqKZWrVqljIwM3XbbbVZHAbxe7969FRYWxiwEAACAc6BAAKqpf/zjH+rUqZPi4+OtjgJ4PZfLpf79+1MgAAAAnAMFAmBze/bs0bhx47R169aKY8ePH9fChQu5dSNwEZKTk7VmzRplZWVZHQUAAMArUSAANnfq1Cm98MILatu2rRo1aqQnn3xS06dPV2lpqYYOHWp1PMA2+vfvr4CAAH388cdWRwEAAPBKFAiAzblcror/379/v6ZMmaJx48apVq1amjRpkr788ksZYyxMCNhDUFCQevfuzTIGAACAs6BAAGzupwWCJLndbklSTk6Opk+frs6dO6t+/fp69NFHtXfvXgsSAvaRnJysFStW6OjRo1ZHAQAA8DoUCIDN/bxA+KnS0lJJ0uHDh/Xxxx8rKirKU7EAWxo0aJAcDoeWLVtmdRQAAACvQ4EA2Ny5CoTT/P399dFHHyk0NNQDiQD7Cg8P1w033MAyBgAAgDOgQABs7kIKhJkzZ+qqq67yQBrA/pKTk7V06VKdPHnS6igAAABehQIBsLlzFQi+vr4aNWoUt3MELsLgwYNVVFSkzz77zOooAAAAXoUCAbC5sxUILpdLzZs319SpUz2cCLC3evXqqUuXLixjAAAA+BkKBMDmzlQgOJ3OivvZBwYGWpAKsLfk5GQtWrRIJSUlVkcBAADwGhQIgM05nU45HI5Kx4wxevvttxUXF2dRKsDefvvb3yo/P1+ff/55la8dP35czZo108CBAz0fDAAAwEIUCEA14OvrW/H/Pj4+Gjt2rJKSkixMBNhb48aN1aZNmzMuYzDGqLy8XOXl5RYkAwAAsA4FAlANnC4QXC6XOnfurOeee87iRID9JScna8GCBVWKgtDQUO3atUtLly61KBkAAIA1KBCAauB0gRAWFqb333+/0owEAL/M4MGDlZ2drQ0bNlgdBQAAwCtQIAA253a75XQ65XQ69f777ys6OtrqSEC1cPXVV6tFixaVljEsXLhQDoej4qOoqOiMx/fu3auhQ4cqPDxcUVFRGjhwoHbt2mXVpQAAAFwSFAiAjb3yyiuqVauWjh07psDAQBUUFFgdCahWkpOT9cEHH8gYI0lKSkqSMUaDBg2qNO7nx1NSUpSSkqKDBw9q/vz5WrVqlYYNG+bx/AAAAJcSBQJgU8uWLdMf//hHnTp1SpJ08uRJDRkyRPv27bM4GVB9JCcna+/evdq6detFPW7kyJHq0qWLgoOD1atXLw0YMECbNm1Sbm7uZUoKAABw+VEgADa1ZMkSuVyuis+NMSorK9OqVassTAVULx07dlRMTMwZ78Zwvsf9VExMjCTp0KFDlywbAACAp1EgADbl5+cnh8NR6ZgxRv7+/hYlAqofh8OhpKQkffjhhxf1uLCwsEqf+/n5SRK3fgQAALZGgQDY1C233CK3211RIvj4+Cg0NFS9e/e2OBlQvSQnJ+u7775TWlqa1VEAAAAsRYEA2FTnzp31/vvvKzY2Vj4+PurYsaNWrFihOnXqWB0NqFauv/561alT56KXMQAAAFQ3FAiAjSUnJ2vatGkqKyvTF198ofbt21sdCah2fHx89Jvf/IYCAQAA1HgUCIDNlZaWSpJ8fX0tTgJUX8nJydq0aZPmzJkjh8Ohjz76SJIUGBioESNGaOPGjVWOjxs3TtKP+yhMnjxZktS2bVsNHDjQmosAAAD4lXjFAdic2+2Wj49PlQ0VAVw6vXr1UmhoqE6dOiVjzBnHXOxxAAAAu2EGAmBzpaWlzD4ALjN/f3/179+fZQwAAKBGo0AAbM7tdsvlclkdA6j2kpOTtWbNGh0+fNjqKAAAAJagQABszu12MwMB8ID+/fvLz89PH3/8sdVRAAAALEGBANhcaWkpMxAADwgJCVHv3r1ZxgAAAGosCgTA5piBAHhOcnKyVqxYoYKCAqujAAAAeBwFAmBzbKIIeE5SUpLKy8u1ZMkSq6MAAAB4HAUCYHNsogh4Tnh4uG644QaWMQAAgBqJAgGwOZYwAJ6VnJysJUuW6OTJk1ZHAQAA8CgKBMDmmIEAeNbgwYNVVFSk5cuXWx0FAADAoygQAJtjDwTAs6Kjo9WpUyeWMQAAgBqHAgGwOWYgAJ6XnJysjz76SKWlpVZHAQAA8BgKBMDm2AMB8Lzf/e53ys/P13/+8x+rowAAAHgMBQJgcyxhADyvSZMmat26dZVlDIWFhfriiy8sSgUAAHB5USAANscSBsAaycnJ+vDDD3X48GH99a9/1U033aSoqCiNGTPG6mgAAACXBW9bAjbHDATA8w4cOKCioiLl5eWpfv36cjgccjgccrvd8vPzszoeAADAZcGrDsDmmIEAeEZ6eroWLFigf/3rX9qyZYt8fHxUXl6u8vLySuMCAgIsSggAAHB5USAANscMBMAz5s2bp2eeeUYOh0PGGLnd7jOOCwwM9HAyAAAAz2APBMDmuAsD4Bnjxo1TYmLiOf+8ORwOZiAAAIBqiwIBsDmWMACe4XQ6NXfuXIWHh8vHx+esY/z9/T2cDAAAwDMoEACbYwkD4Dl169bVv//9bxljzvh1h8NBgQAAAKotCgTA5piBAHjWDTfcoAkTJsjprPorlBkIAACgOqNAAGyOGQiA540dO1aJiYlnLO8oEAAAQHVFgQDYHJsoAp7ndDo1b9481alTp9J+CCxhAAAA1RkFAmBzLGEArBEZGakPPvigynEKBAAAUF1RIAA2xxIGwDqdO3fWxIkT5XA4JEnGGAoEAABQbVEgADbHDATAWk888YT69esnl8ul8vJy+fn5WR0JAADgsqBAAGyOGQiAtRwOh959913VrVtXbrdbAQEBVkcCAAC4LHjVAdgcMxCAy+/YsWPKzs5Wbm6uCgsLVVBQoIKCAp08eVInTpxQfn6+OnfurAULFujtt9/W6tWrKx5bVlamgoKCSs8XHBxcaaaCy+VSSEiIfHx8VKtWLdWqVUtBQUEKDg5WeHi4QkJCFBoaqtq1a6tOnTqKiory2LUDAACcRoEA2Jzb7a60CzyAC3f06FFlZGRo37592r9/v/bv36+DBw8qKytLOTk5ys3NVW5urkpKSqo8NjQ0VMHBwQoKClJERISCg4N15ZVXqqioqNI4Hx8fxcXFVTpWUFCgsrKyis8LCwt1+PBhud1uFRYW6tixYxXlxLFjx6qc28fHR3Xq1FHt2rVVu3Zt1atXTw0bNlSjRo0UGxurmJgYxcbGqk6dOpfoOwUAAECBANheaWkpMxCAczh69KjS09OVmpqqtLQ0paenKz09XXv37lVhYWHFuNq1aysmJkYxMTGKi4tT586dq7xIr127dsUMgTMxxujQoUNq2LDhJb2G48ePq6CgQLm5ucrJydHhw4cr/j83N1eZmZlas2aN5s6dq6ysrIrHBQYGqlGjRmrevLlatGhR8d/4+HjKBQAAcNEoEACbc7vd7IEA6MelAunp6frmm2+0ZcsWbdmyRdu3b1dOTo6kH2+vePpF9M0336wmTZpUvFPfqFEjBQUF/eoMDofjkpcHkhQSEqKQkBA1aNDgvGOLioqUkZGhjIwM7d+/X3v27FF6erpWrlypN954Q8ePH5ckRURE6KqrrlLbtm3Vrl07tW3bVi1btqSQBAAAZ8WrDsDmmIGAmiorK0tr167VmjVr9PXXX2vbtm06ceKEXC6Xrr76arVr106/+c1vFB8fr+bNm6tRo0ZyOqv/3sEBAQFq1qyZmjVrdsavZ2RkVMzC+Pbbb/XVV1/pzTff1KlTp+Tv769WrVqpQ4cO6tq1q7p3765GjRp5+AoAAIC3okAAbI4ZCKgp9u3bp1WrVmnNmjVau3atvv/+e/n4+Kh169bq3Lmz7rrrLrVr105XX301t1I8h9PLNBITEyuOud1upaamVsze+Oqrr/TXv/5VJSUliomJUffu3dWtWzf16NFD8fHxFqYHAABW4lUHYHMUCKiuysrKtHXrVn388cdavHixvvnmG/n6+uqaa67R4MGD1bVrV3Xr1k0RERFWR7U9X19fXX311br66qt1++23S/pxdtO3336rFStWaO3atXr66ad19OhRNW7cWH369FGvXr3Ur18/hYaGWpweAAB4Cq86AJtjCQOqk6KiIi1dulTz5s3Tp59+qoKCArVo0UIDBgzQ5MmT1b17d2YXeIjL5VL79u3Vvn17jRkzRmVlZdq4caOWLl2qZcuWac6cOQoICFDPnj11yy23KCkp6aybSwIAgOqh+i8GBao5ZiDA7srKyvTpp5/qzjvvVHR0tG655Rbl5eXp+eef1w8//KDU1FS9/PLLSkxMpDywkI+Pj7p27aoXXnhB33zzjQ4cOKBXX31VTqdT99xzj6KjozVkyBAtWLCgyq0sAQBA9UCBeji3wwAAIABJREFUANgcMxBgV9nZ2XruuecUGxurfv36KTU1Vc8++6wyMjK0cuVKPfzww2ratKnVMXEWDRo00MiRI7Vo0SJlZmbq1VdfVV5enn73u9+pQYMGeuKJJ7Rnzx6rYwIAgEuIAgGwMWOMysrKmIEAW/nqq6902223KTY2VjNmzNAdd9yhXbt2aePGjXrkkUdUv359qyPiIkVGRmrkyJFatWqVMjIy9MQTT2j+/Pm68sorlZSUpBUrVlgdEQAAXAIUCICNud1uSaJAgC1s375dt9xyizp16qTvvvtOM2bM0L59+zRx4kTFxcVZHQ+XSIMGDfTkk09q7969WrhwoU6cOKE+ffqoc+fOWrlypdXxAADAr0CBANhYWVmZJAoEeLedO3dqyJAhat26tTIyMrRixQp98803uvfeexUUFGR1PFwmTqdTN998s5YvX65NmzYpIiJCvXr1Uq9evfTVV19ZHQ8AAPwCFAiAjZ0uEHx8fCxOAlRVWlqqyZMnq02bNtqxY4fmz5+v9evXKzEx0epo8LD27dtr2bJlWr9+vcrLy9W5c2eNGjVKhYWFVkcDAAAXgQIBsDEKBHirzZs3q0OHDpowYYKmTJmi7du3a8iQIXI4HFZHg4W6dOmiVatW6d1339WHH36oa665hv0RAACwEQoEwMYoEOCN3nrrLXXp0kVRUVH69ttv9fDDD8vp5NcN/mfYsGH67rvv1KFDB/Xp00fPPvusjDFWxwIAAOfBv+gAG6NAgDcxxujpp5/WPffco6eeekorV65kc0QvMW/ePDkcDjkcDgUEBFgdR5JUt25d/fvf/9bMmTP1/PPP66677lJJSYnVsQAAwDlQIAA2RoEAb2GM0ciRIzVlyhT9/e9/1/jx41mu4EVuvfVWGWO8cv+Je++9V4sXL9aHH36o5OTkir/XAACA96FAAGyMAgHe4plnntE///lPLVy4ULfffrvVcS6rkJAQdevWzeoY1Urfvn21atUqrV69WmPHjrU6DgAAOAsKBMDGKBDgDT7//HO98MILeu2113TTTTdZHQc21aFDB7355pt6+eWXNW/ePKvjAACAM6BAAGyMAgFWc7vdevDBBzVw4EDde++9VseBzQ0fPlwPPPCARo8erWPHjlkdBwAA/AwFAmBjFAiw2sKFC5WWlqaXX37Zo+ctLi7Wn/70J8XHxysoKEiRkZG6+eabtWjRoipr6PPy8vTYY4+padOm8vPzU0REhG666SatXr260nWc3mTQ4XAoLS1Nt9xyi6KioiqOjR07Vg6HQydOnNC6desqjvv6+l5U9p+fa+/evRo6dKjCw8MVFRWlgQMHateuXVUedyHXcVpqaqqSkpIUFham4OBgde/eXWvXrj1rppycHI0ePVqNGzeWn5+f6tSpo8GDB2vr1q0XdW2XwoQJE1RSUqI5c+Z4/NwAAODcKBAAG6NAgNXeffdd9enTR1deeaVHz/vQQw/p1Vdf1YwZM5SXl6edO3cqPj5egwYN0po1ayrGZWVlqWPHjpo7d66mT5+u3NxcffnllwoKClJiYqLefPNNSVJSUpKMMRo0aJAkadSoUXrggQeUkZGhjRs3ysfHR48//riMMQoODlbXrl1ljJExRm63+6Ky//xcKSkpSklJ0cGDBzV//nytWrVKw4YNq/SYC70OSfrhhx/UpUsXff3113r//feVnZ2tv/zlL5owYcIZi4nMzEx17NhR//rXv/SXv/xFR44c0eeff64jR46oS5cu2rBhw0Vd368VERGh4cOH69133/XoeQEAwAUwQA3z2WefGUnmyJEjVkf51Xbs2GEkme3bt1sdBTVU3bp1zdSpUz1+3iZNmpjrrruuyvHmzZub1atXV3x+5513GknmvffeqzSuqKjINGjQwAQGBpqsrKyK44MGDTKSzNKlS8967uDgYNO1a9dffQ2nz/Xxxx9XOv673/3OSDI5OTm/6DqGDBliJJn333+/0tiDBw8af39/4+/vX+n4HXfcYSSZd999t9LxzMxM4+/vb9q3b/+rr/ViLViwwDidTlNQUODxcwMAgLMqZwYCYGPMQICVSkpKlJOTo8aNG3v83P369dP69et17733auPGjRV/FtLS0nTjjTdWjFuwYIEkacCAAZUe7+/vr8TERJ06dUqffvpplee/9tprL1/4n+nYsWOlz2NiYiRJhw4dqjh2MdfxySefSPrxzgY/1aBBAzVv3rzK+RcuXCin06mBAwdWOh4dHa2rrrpKmzdv1oEDB37Jpf1iTZo0UXl5uTIzMz16XgAAcG4UCICNUSDASk7nj79Cfr7ngCe8/vrrevvtt7V7924lJiaqVq1a6tevX8ULbenHfRKOHTumgIAAhYaGVnmOevXqSfpxecDPBQcHX77wPxMWFlbpcz8/P0lSeXm5pIu7juLiYhUWFiogIEAhISFVxtatW7fS56efu7y8XGFhYZX2ZnA4HPrmm28kSd9///2vv9CLwN9tAAB4JwoEwMb4Rzas5Ovrq4YNGyo9Pd3j53Y4HLrtttu0YsUK5efna+HChTLGaPDgwXrllVck/fjufFhYmIqKilRYWFjlObKzsyX9+E77xZ7bky7mOvz9/RUaGqqioiIdP368ytgjR45Uee7w8HD5+vqqtLS0Yl+Hn3/06NHj8lzcWaSnp8vlcqlBgwYePS8AADg3CgTAxigQYLUbbrhBS5cu9fh5w8PDlZqaKklyuVzq3bt3xd0NlixZUjEuOTlZkiodk358533lypUKDAysMtX/fIKCglRSUlLxeYsWLTR79uxfeikX5GKu46abbpL0v6UMp+Xm5iotLa3Kcw8ePFhut1vr1q2r8rXJ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YKCTU7cffn5+io2NVWxsrBISEpo8npeXp8zMTO3Zs8deyrz33nsqKCiQJIWFhWnYsGEaOXKkRowYoZEjRyo4OLitdwMAAJwCCgQAgMtraGjQF198oY8//libN2/W1q1bdeTIEbm7u2vgwIEaOXKkZs2apUGDBuncc8+lKDgLwsLCFBYWptGjRzuM5+Tk2I/w+Pzzz/Xaa6/p97//vSwWi/r166eRI0dq1KhRSkhI0DnnnOOk9AAAoDkUCAAAl3TgwAGtWbNGa9eu1bp161RUVKSwsDCNGjVKt9xyi0aOHKkLLrhA/v7+zo7aqURERCgiIkKJiYn2sby8PH322WfaunWrtm7dqjvvvFNlZWXq2bOnEhIS7Lfw8HAnJgcAABQIAACXUF9fr08//VRLlizRe++9p++++07+/v66+OKLdd999ykhIUHnnnuuLBaLs6PiJ8LCwjRlyhRNmTJFklRXV6etW7faC6A33nhDtbW1Gjx4sKZNm6bp06dr8ODBTk4NAEDnQ4EAAOiwampq9MEHH2jp0qVatmyZCgoKFBcXpyuuuELJyckaOXKkrFb+qetorFarxowZozFjxuj3v/+9ysvLtX79eq1YsUJ/+9vf9OCDD6pPnz6aPn26pk+frtGjR1MMAQDQBriuEgCgw9m7d68WLFigqKgo/eIXv9CWLVt08803a8+ePdq1a5ceeughjRkzhvLARdhsNiUnJ+u5557T4cOHtWvXLl155ZVatWqVxo4dq169emnBggX67rvvnB0VAACXRoEAAOgQqqqq9Le//U2jRo1SbGys/vWvf+nWW2/V4cOHtXv3bj3wwAOKjY11dky0gbi4OD3wwAPavXu3duzYoenTp+vll19W37599Ytf/ELLly9XQ0ODs2MCAOByKBAAAO3a8ePH9dhjjyk6Olq33HKL+vTpo7Vr1+qbb77Rvffeq8jISGdHhBMNHjxYCxcu1NGjR/X3v/9dVVVVmjZtms477zz9/e9/V11dnbMjAgDgMigQAADtUklJie677z716tVL//u//6urrrpK3377rd58801NmDCBc97hwMvLS7NmzdKHH36onTt3asiQIbruuuvUr18/vfDCCxQJAACcBRQIAIB2xRijRYsWqX///vrrX/+qO+64QwcPHtSjjz7KZfzQInFxcfr73/+u/fv3a/LkyZo7d66GDh2q9evX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Q4cONbv9k71XAAB0FhQIAAC4AJvNprKyMknSjTfeqJ07d6q6ulrHjh3TY489JmOMJkyY4PCcoUOHav/+/Tp8+LA2b96srKwsjRs3TpL0yCOPKDo6WnPnztX777+v0tJS7d+/X7/+9a+Vk5OjhQsX2k8NaJx7++23a8WKFSotLVV2drZuuukm5eTkNFsg/Fjv3r31zjvvKD8/XzNmzFB1dfUp7/+p5JWkpKQkHT16VM8995zKysqUmZmp2267Td26dWt2+yd7rwAA6CwoEAAAcAGNRyB88sknGjBggGbNmqWQkBDFxsZq9erVevnll3X33Xc7POeZZ57Reeedp9jYWM2cOVMLFy5UbGyspB8O99+2bZtmz56t9PR0hYaGasSIESovL9eaNWt0ww032LfTOHfmzJm69dZb7XO///57ffrpp+rZs6ckafHixbJYLPrPf/6jI0eOyGKx6JlnntGWLVsUHx+v2tpabdmyRd7e3rriiitOaf9PJa8kPfTQQ7r++uv18MMPq1u3brrmmmt05513Kjw8XIWFhbJYLFqwYEGL3isAADoLizHGODsE0JYyMjKUlJSkoqKi075cWHsxZ84cZWVlKSMjw9lRADjZ/PnztX79en322WfOjgIAAFyT4QgEAABcQONVGAAAAFoLBQIAAC6g8RQGAACA1kKBAACAC3DFAsFisfzs7YEHHnB2TAAAOg2rswMAAIAz9+OrMLgKlmkCAKB94QgEAABcgM1mU1VVlerr650dBQAAuCgKBAAAXIDNZpMkVVRUODkJAABwVRQIAAC4gMYCwdXWQQAAAO0HBQIAAC7Az89PEgUCAABoPRQIAAC4gMYjEFxtIUUAANB+UCAAAOACOIUBAAC0NgoEAABcAAUCAABobRQIAAC4AAoEAADQ2qzODgAAAM6cp6enPDw8dOzYMX377beqqqpSRUWFSkpKdP755yskJMTZEQEAQAdHgQAAQAf029/+Vu+//74qKipUU1NjXzxxzpw5DvPc3NyUk5PjjIgAAMDFcAoDAAAd0KhRo5Sdna2ioqITXnnBYrFo2LBh6tatWxunAwAArogCAQCADujSSy+Vv7//SedYrVb98pe/bKNEAADA1VEgAADQAfn4+Oiaa66Rh4fHCefU1tZqypQpbZgKAAC4MgoEAAA6qN/+9reqra094eORkZEaOHBgGyYCAACu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e+/VqFGjdN5558nb29vZceHiunfvru7du2vKlCn2sUOHDumzzz7Thg0btGnTJr366quqq6tTr1697IVCUlKSYmJinJgcAIC2R4EAAGh1e/bs0erVq7V69Wp9+umnqq6uVlxcnMaOHavf/va3GjNmDH/dRbvRs2dP9ezZU7/61a8kSeXl5Q6FwoIFC3TTTTepb9++mjx5spKTkxUfH89pNAAAl0eBAAA46+rr6/XRRx/p3//+t1avXq3vvvtOoaGhSkxM1AsvvKBJkyYpPDzc2TGBFrHZbBo/frzGjx8v6YfTbjZt2mQvxZ5//nl5eXnpoosu0pQpU3TppZcqLCzMyakBADj7LMYY4+wQQFvKyMhQUlKSioqKFBwc7Ow4Z2TOnDnKyspSRkaGs6MAMsZo8+bNWrx4sf75z38qLy9Pw4YNU0pKipKTkzV8+HC5u7s7OyZw1uXm5trLhJUrV6qiokITJkzQrFmzNGPGDAUFBTk7IgAAZ4PhwtcAgDOSnZ2te+65R9HR0RozZozWrl2rm2++Wfv379fnn3+uBx98UBdeeCHlAVxWeHi4rrnmGi1evFh5eXl6++235efnp5tvvlnh4eGaNm2aVq5cqYaGBmdHBQDgjFAgAABOy9atWzV79mz16dNHr732mmbPnq0dO3Zo9+7duu+++3TOOec4OyLQ5nx8fHTppZfq3XffVW5url588UWVl5crNTVVAwcO1F//+leVl5c7OyYAAKeFAgEAcEree+89jR49WhdeeKEOHDigV199VQcPHtQjjzyiwYMHOzse0G4EBgbq6quvVkZGhnbt2qWLL75Yd9xxh6KiorRgwQIVFhY6OyIAAKeEAgEA0CI7d+5UQkKCpk+frvDwcK1fv16ff/65rrjiCnl6ejo7HtCuDRw4UC+++KIOHTqk+fPn6/XXX1e/fv305z//WXV1dc6OBwBAi1AgAABOqrCwUL/97W81dOhQlZWVaePGjXr33Xc1btw4Z0eDiyorK9M555yj1NRUZ0c567p06aK7775bBw4c0A033KA777xTgwcPZjFcAECHQIEAADihTz75RIMHD9ayZcv06quvasuWLRo1apSzY8HFGWPU0NDg0osO+vv7609/+pP27Nmj/v37a9KkSbrttttUXV3t7GgAAJwQBQIAoFlvvPGGEhMTdcEFF+irr77SVVddJYvF4uxY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1qzR6NGjZbFYFBERocGDB2vIkCGqUaOGyYkBANWRg9kBAABAxZWbm6u1a9dq2LBhatSokWbPnq0mTZpo1apVio+P1yeffKJRo0ZRHtxizZo109NPP63vvvtOiYmJWrFihWrXrq3JkyfL399fw4YN0/r162UYhtlRAQDVCAUCAAAo5vTp05o8ebICAgL04IMPKjs7W59++qkSExO1fPlyDR06tMhdDHD7+Pr6aujQoVq+fLnOnz+vd955R2fOnFGfPn3UuHFjzZkzR+np6WbHBABUAxQIAADA7tChQxo9erSaNGmi//znP5o2bZrOnDmjtWvX6sEHH5Szs7PZEas1b29vjRkzRjt27NCBAwc0cOBAzZ49W3fccYdmzJihxMREsyMCAKowCgQAAKDjx49ryJAhCg8P186dO7V06VL997//1YwZMxQQEGB2PJQgLCxM8+fP1+nTp/X888/r73//uxo0aKDJkyfr0qVLZscDAFRBFAgAAFRjGRkZev755xUWFqbDhw/r888/1/79+/Xoo49ytEEl4ePjo+eff16nTp3SvHnztHLlSjVt2lTvv/++bDab2fEAAFUIBQIAANXU2rVr1axZMy1dulRz587V3r17NWjQIDk48ONBZeTm5qZnnnlGR48e1aOPPqpnn31W7dq104EDB8yOBgCoIvgJAQCAaiY3N1eTJk3SwIEDFRkZqaNHj2rChAlycuLuzlWBj4+P5s2bp/3798tqtapDhw56//33zY4FAKgCKBAAAKhGzp8/ry5duujvf/+7VqxYoY8++ki1atUyOxZug6ZNm2rjxo167rnnNH78eA0dOlQ5OTlmxwIAVGIUCAAAVBOnTp3S3XffrdzcXP3yyy8aOXLkLdv2vHnzZLFYZLFYVL9+/Vu23cqao6JwdHTUK6+8og0bNuj777/XgAEDlJWVZXYsAEAlRYEAAEA1cPz4cd19993y8fHRDz/8oEaNGt3S7U+bNk2GYah169a3dLuVNUdFc88992jjxo3av3+/7r33XmVmZpodCQBQCVEgAABQxeXk5GjIkCGqW7euvv/+e9WuXdvsSBWOl5eXunXrVqXXbNWqlTZt2qSjR4/qmWeeKbd1AQBVBwUCAABV3J///GedPHlS//73v1WjRg2z48BEoaGhWr58uf75z3/qn//8p9lxAACVDAUCAABV2Pbt27Vo0SK9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cLWUyMrKUnJysvr27SsfHx95e3srICBAdevWVd26dVWvXj3VqVNHbm5ut+lTAQCg4qFAAAAAFZqnp6caN26sxo0bl9uaP/zwg3r27KlHH31UXbp0Kbd1AQCoyKrfJZABAACuo0ePHurcubPmzp1rdhQAACoMCgQAAIASTJs2TV988YUOHTpkdhQAACoECgQAAIASDBo0SKGhoXrrrbfMjgIAQIVAgQAAAFACBwcHTZkyRf/85z919uxZs+MAAGA6CgQAAIDf8cgjj6hOnTpauHCh2VEAADAdBQIAAMDvcHV11bPPPqslS5YoLS3N7DgAAJiKAgEAAOAannrqKTk6Ouq9994zOwoAAKaiQAAAALgGb29vjRs3Tm+//bays7PNjgMAgGkoEAAAAK5j8uTJunz5spYvX252FAAATEOBAAAAcB1+fn764x//qDfffFM2m83sOAAAmIICAQAAoBSmT5+u06dP6/PPPzc7CgAApqBAAAAAKIWGDRvqwQcf1BtvvCHDMMyOAwBAuaNAAAAAKKXp06dr79692rBhg9lRAAAodxQIAAAApdSuXTv16tVLc+bMMTsKAADljgIBAACgDKZPn67169dr165dZkcBAKBcUSAAAACUQWRkpO666y69+eabZkcBAKBcUSAAAACU0XPPPafPP/9cx44dMzsKAADlhgIBAACgjIYOHaqQkBDNnz/f7CgAAJQbCgQAAIAycnR01OTJk/X3v/9d8fHxZscBAKBcUCAAAADcgMcff1y+vr5atGiR2VEAACgXFAgAAAA3wM3NTc8884wWL16s9PR0s+MAAHDbUSAAAADcoGeeeUaFhYVatmyZ2VEAALjtKBAAAABukK+vr8aMGaMFCxYoLy/P7DgAANxWFAgAAAA3YcqUKUpKStKKFSt+d868efNksVhksVhUv379ckxXMXMAAConCgQAAICbEBgYqJEjR+rNN99UYWFhiXOmTZsmwzDUunXrck5XMXMAAConCgQAAICbNH36dB07dkxffvml2VFuCy8vL3Xr1q3Kr1lWlSEjANxKFAgAAAA3KTQ0VAMGDNDs2bPNjgIAwG1DgQAAAHALvPDCC/rpp5+0efNms6MAAHBbUCAAAADcAh07dlS3bt00Z86c6849cuSI+vfvLx8fH3l4eKhnz57aunVrkTkFBQVatWqV+vTpI39/f7m7uys8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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/simple_trade.gq.yaml')\n", - "task_graph.draw(show='ipynb', show_ports=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "689b7c1a98f84f668fcb815cc686c510", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b69d7d9beec64973a1cb880adfe96792", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Tab(children=(Output(), Output(), Output(), Output(), Output(), Output(), Output(layout=Layout(border='1px sol…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.run(formated=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We define a method to organize the output images" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_figures(result):\n", - " # format the figures\n", - " figure_width = '1200px'\n", - " figure_height = '400px'\n", - " bar_figure = result['barplot.barplot']\n", - " sharpe_number = result['sharpe_ratio.sharpe_out']\n", - " cum_return = result['cumulative_return.cum_return']\n", - " signals = result['lineplot.lineplot']\n", - " symbol = result['stock_selector.stock_name']\n", - "\n", - " bar_figure.layout.height = figure_height\n", - " bar_figure.layout.width = figure_width\n", - " cum_return.layout.height = figure_height\n", - " cum_return.layout.width = figure_width\n", - " cum_return.title = 'P & L %.3f' % (sharpe_number)\n", - " bar_figure.marks[0].labels = [symbol]\n", - " cum_return.marks[0].labels = [symbol]\n", - " signals.layout.height = figure_height\n", - " signals.layout.width = figure_width\n", - " bar_figure.axes = [bar_figure.axes[1]]\n", - " cum_return.axes = [cum_return.axes[0]]\n", - " output = widgets.VBox([bar_figure, cum_return, signals])\n", - "\n", - " return output" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Rerun the graph and send the computation result to the `plot_figure` method" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "202309b6665643338cf132f122f5b693", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(Figure(axes=[Axis(label='Price', orientation='vertical', scale=LinearScale(max=38.13, min=-10.1…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "result = task_graph.run()\n", - "plot_figures(result)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can change the TaskGraph node parameters interatively and hit the run button to get the updated result. It can also be done programtically, E.g. change the mean reversion parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "9efb864c81fd4aeabca1677513043b2f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(Figure(axes=[Axis(label='Price', orientation='vertical', scale=LinearScale(max=38.13, min=-10.1…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "o = task_graph.run(\n", - " outputs=(list(result.get_keys())[0:]),\n", - " replace={'stock_data': {\"load\": {'cudf_out': result['stock_data.cudf_out']}},\n", - " 'mean_reversion': {'conf': {'fast': 1, 'slow': 10}}})\n", - "figure_combo = plot_figures(o)\n", - "figure_combo" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since computation is accelerated in the GPU, we can do hyper-parameter search interatively, try to change the parameters of the `slow` and `fast` for the moving average and see if you can improve the result:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "59ff6c5fc87f41f2a0f768258c620958", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(HBox(children=(IntRangeSlider(value=(10, 30), continuous_update=False, description='MA:', max=6…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "para_selector = widgets.IntRangeSlider(value=[10, 30],\n", - " min=3,\n", - " max=60,\n", - " step=1,\n", - " description=\"MA:\",\n", - " disabled=False,\n", - " continuous_update=False,\n", - " orientation='horizontal',\n", - " readout=True)\n", - "\n", - "\n", - "def para_selection(*stocks):\n", - " with out:\n", - " print('run')\n", - " para1 = para_selector.value[0]\n", - " para2 = para_selector.value[1]\n", - " o = task_graph.run(\n", - " outputs=(list(result.get_keys())[0:]),\n", - " replace={'stock_data': {\"load\": {'cudf_out': result['stock_data.cudf_out']}},\n", - " 'mean_reversion': {'conf': {'fast': para1, 'slow': para2}}})\n", - " figure_combo = plot_figures(o)\n", - " if (len(w.children) < 2):\n", - " w.children = (w.children[0], figure_combo,)\n", - " else:\n", - " w.children[1].children[1].marks = figure_combo.children[1].marks\n", - " w.children[1].children[2].marks = figure_combo.children[2].marks\n", - " w.children[1].children[1].title = 'P & L %.3f' % (o['sharpe_ratio.sharpe_out'])\n", - "\n", - "\n", - "out = widgets.Output(layout={'border': '1px solid black'})\n", - "para_selector.observe(para_selection, 'value')\n", - "selectors = widgets.HBox([para_selector])\n", - "w = widgets.VBox([selectors])\n", - "w" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'status': 'ok', 'restart': True}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import IPython\n", - "app = IPython.Application.instance()\n", - "app.kernel.do_shutdown(True)" - ] - }, - { - "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.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/04_portfolio_trade.ipynb b/notebooks/04_portfolio_trade.ipynb deleted file mode 100644 index 2b561b50..00000000 --- a/notebooks/04_portfolio_trade.ipynb +++ /dev/null @@ -1,1154 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# gQuant - Making Quantitative Analysis Faster\n", - "\n", - "## Background\n", - "By definition, **Quantitative Finance** is the use of mathematical models and large datasets to analyze financial markets and securities, requiring massive computation to extract insight from the data. \n", - "\n", - "Many data science toolkits have been developed to help data scientists to manipulate the data. It starts with scalar number computations at the beginning. Later, the development of [Numpy](https://www.numpy.org) library helps to operate the numbers at vectors, and the popular [Pandas](https://pandas.pydata.org) library operates at a dataframe level. Manipulating data at a high level brings productivity gain for data scientists in quantitative finance.\n", - "\n", - "However, the amount of collected data is increasing exponentially over time. Also, more and more machine learning and statistical models are being developed. As a result, data scientists are facing new challenges hard to deal with traditional data science libraries.\n", - "\n", - "It is very time-consuming for CPUs to crunch massive amount of data and compute the complicated data science models. Large data set requires distributed computation, which is too complicated for data scientists to adopt.\n", - "\n", - "As a consequence, the quantitative workflow has become more complicated than ever. It integrates massive data from different sources, requiring multiple iterations to obtain significative results. \n", - "\n", - "**gQuant** has been developed to address all these challenges by organizing dataframes into graphs. It introduces the idea of **dataframe-flow**, which manipulates dataframes at graph level. An **acyclic directed graph** is defined, where the nodes are dataframe processors and the edges are the directions of passing resulting dataframes.\n", - "\n", - "With a graph approach, quant's workflow is described at a high level, letting quant analysts address the complicated workflow challenge.\n", - "\n", - "It is GPU-accelerated by leveraging [RAPIDS.ai](https://rapids.ai) technology and has **Multi-GPU and Multi-Node support**.\n", - "\n", - "We can get orders of magnitude performance boosts compared to CPU. gQuant dataframe-flow is **dataframe agnostic**, and can flow:\n", - "- Pandas dataframe, computed in the CPU.\n", - "- cuDF dataframe, computed in the GPU and producing the same result but much faster.\n", - "- dask_cuDF dataframe, being the computation automatically executed on multiple nodes and multiple GPUs." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Download example datasets\n", - "\n", - "Before getting started, let's download the example datasets if not present." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dataset is already present. No need to re-download it.\n" - ] - } - ], - "source": [ - "! ((test ! -f './data/stock_price_hist.csv.gz' || test ! -f './data/security_master.csv.gz') && \\\n", - " cd .. && bash download_data.sh) || echo \"Dataset is already present. No need to re-download it.\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prepare for running in Dask environment\n", - "\n", - "Let's start the Dask local cluster environment for distributed computation.\n", - "\n", - "Dask provides a web-based dashboard to help to track progress, identify performance issues, and debug failures. To learn more about Dask dashboard, just follow this [link](https://distributed.dask.org/en/latest/web.html).\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

Client

\n", - "\n", - "
\n", - "

Cluster

\n", - "
    \n", - "
  • Workers: 2
  • \n", - "
  • Cores: 2
  • \n", - "
  • Memory: 100.00 GB
  • \n", - "
\n", - "
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Start the Dask local cluster environment for distrubuted computation\n", - "from dask_cuda import LocalCUDACluster\n", - "from dask.distributed import Client\n", - "\n", - "cluster = LocalCUDACluster()\n", - "client = Client(cluster)\n", - "client\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Though our stock dataset is small enough to fit in a single 16G GPU, to show how to do distributed computation, we will split the dataframe into small pieces to be loaded by different workers in the cluster.\n", - "\n", - "Notice this step is need only if the dataset is not split in multiple files yet.\n", - "\n", - "First use this simple taskgraph to load data then sort it by the asset id and datatime:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "62a6b62b03944dd7803e2226e6e2a6f7", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import sys; sys.path.insert(0, '..')\n", - "from gquant.dataframe_flow import TaskGraph\n", - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/sort_stocks.gq.yaml')\n", - "input_cached, = task_graph.run()\n", - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "convert the sorted stock data into partitions and save it into csv files. Note, the data is slited in a way that the same asset belongs to the same partition" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['/home/quant/gQuant/notebooks/many-small/0.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/1.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/2.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/3.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/4.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/5.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/6.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/7.csv']" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import dask.dataframe as dd\n", - "import os\n", - "num_partitions = 8\n", - "\n", - "os.makedirs('many-small', exist_ok=True)\n", - "dd.from_pandas(input_cached.set_index('asset'), npartitions=num_partitions).reset_index().to_csv('many-small/*.csv', index=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The toy example\n", - "In this notebook, we will use a simple toy example to show how easy it is to accelerate the quant workflow in the GPU.\n", - "\n", - "To mimic the end-to-end quantitative analyst task, we are going to backtest a simple mean reversion trading strategy.\n", - "\n", - "The workflow can be divided into two steps. You can follow with me with an empty gQuant widget to build the TaskGraph:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "209bf2c2fccd48b2b3808ec0cbc9304d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox())" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "task_graph = TaskGraph()\n", - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Preprocess the dataset to remove bad points and add return feature\n", - "\n", - "\n", - "1. Load the 5000 end-of-day stocks CSV data into the dataframe and add rate of return feature to the dataframe.\n", - "\n", - "\n", - "2. Compute the average volume, min/max returns for each of the stocks\n", - "\n", - "\n", - "3. Merge the features into one dataframe, clean up the data by removing low volume stocks and extreme rate of returns stocks.\n", - "\n", - "\n", - "4. Create a composite node for this preprocess task\n", - "\n", - "\n", - "### Apply simple mean reversion algorithm and run backtest\n", - "\n", - "1. Clean up the nodes for the backtest\n", - "\n", - "\n", - "2. Compute the slow and fast exponential moving average and compute the trading signal based on it. Run backtesting and compute the returns from this strategy for each of the days and stock symbols. Run a simple portfolio optimization by averaging the stocks together for each of the trading days. Compute the sharpe ratio and cumulative return results.\n", - "\n", - "\n", - "3. Change the `slow`, `fast` parameters for the trading stratiges and re-run the backtest\n", - "\n", - "\n", - "4. Switch to run the backtest in a distributed environment by Dask\n", - "\n", - "\n", - "5. As a reference, switch to run the backtest in a CPU environment by Pandas\n", - "\n", - "\n", - "The whole workflow is organized into a TaskGraph file, which is described in a **gq.yaml** file.\n", - "\n", - "The same taskgraphs are saved in the `taskgraphs` directories. The whole workflow can be organized into a computation graph, which is described in a **yaml** file. \n", - "\n", - "Here is snippet of the yaml file:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "- id: stock_data\n", - " type: CsvStockLoader\n", - " conf:\n", - " file: notebooks/data/stock_price_hist.csv.gz\n", - " path: notebooks/many-small\n", - " inputs: {}\n", - " module: rapids_modules\n", - "- id: preprocess\n", - " type: CompositeNode\n", - " conf:\n", - " subnode_ids:\n", - " - value_filter\n", - " subnodes_conf:\n", - " value_filter:\n", - " conf:\n", - " - column: min_return\n", - " min: -10\n", - " - column: max_return\n", - "...\n" - ] - } - ], - "source": [ - "!head -n 18 ../taskgraphs/portfolio_trade.gq.yaml\n", - "print(\"...\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Lode the preprocess TaskGraph by `load_taskgraph` command" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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GhERdSu+vr547bXXsGzZMqmjEBERPTSeME9ERERERGRgWNSIiIiIiIgMDIsaERERERGRgWFRIyIiIiIiMjAsakRERERERAaGRY2IiIiIiMjAsKgREREREREZGBY1IiIiIiIiA8OiRkREREREZGBY1IiIiIiIiAwMixoREREREZGBYVEjIiIiIiIyMCxqREREREREBoZFjYiIiIiIyMCwqBERERERERkYFjUiIiIiIiIDw6JGRERERERkYFjUiIiIiIiIDAyLGhERERERkYFhUSMiIiIiIjIwLGpEREREREQGhkWNiIiIiIjIwLCoERERERERGRgWNSIiIiIiIgPDokZERERERGRgWNSIiIiIiIgMDIsaERERERGRgWFRIyIiIiIiMjAsakRERERERAaGRY2IiIiIiMjAsKgREREREREZGBY1IiIiIiIiAyMTQgipQxARET2M5cuX48CBA7jzn7KCggI4OjrC0dFRN8/MzAz/+te/EBoaKkVMIiKiTmNRIyIio/Xll19i3rx5Dxzn4OAApVIJMzOzLkhFRET06HjqIxERGa3ExERYWVndd4y5uTnmzJnDkkZEREaFRY2IiIyWXC5HfHw8zM3N7zmmubkZs2bN6sJUREREj45FjYiIjNrs2bPR0tJyz+d79eqFsWPHdmEiIiKiR8eiRkRERi02NhYKheKuz5mbmyMpKQkymayLUxERET0aFjUiIjJqFhYWmDFjBiwsLNo9x9MeiYjIWLGoERGR0XvhhRfQ1NTUbn6/fv0wePBgCRIRERE9GhY1IiIyehMnToSrq6vePHNzc8yfP1+aQERERI+IRY2IiIyeiYkJZs+erXf3x+bmZjz//PMSpiIiInp4LGpERNQtzJo1C83NzQAAmUyG4cOHo1+/fhKnIiIiejgsakRE1C2MGjUKvr6+AABTU1PMmzdP4kREREQPj0WNiIi6jblz50Imk0Gr1eK5556TOg4REdFDM5M6ABER9Wy1tbVobW1FU1MT1Go1AOD27dsQQgD46Vqzurq6e76+sbERDQ0NAABnZ2cIITBw4ECkp6frxjg6Ot7z9aamprCzs9M9tra2hpWVFWQyGRwcHAAANjY2sLS0fPiNJCIi6iSZaPuXkIiI6B5UKhWqq6tRXV2N27dvQ6VSoaGhAdXV1aivr0dDQwNqamqgVqtRX18PlUqlG1NXV4ea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0dR5XGNjY7i6ukKhUMDV1RWenp53LOFeXl6wtraW6RkgIqLGwKJGRNSGVVZWoqioCMXFxfWKw92KREVFRb09OH9kaWkJKysrODk5wcrKCpaWljA1NYWdnR0AwM7ODqampjAzM4OtrS0ASAXPwsKiXtFwdHS84wlWrK2t7ziGnUqlglarbfA2tVotfS8Q+P0kMEqlUnpuqqurodPpUFpaCgCoqKhATU0NamtrpUMIS0tLUVlZCbVaLZ0o5k706+ro6HjXItzQba6urm22/BIRtUUsakRE9MDKy8tRWVmJ8vJyqFQqVFZWorKyEkqlUiov+j1LNTU1qKmpkfbilZaWQqfToaqqSjq1u77o/LFA3V6MGqJ/rIboS2JDTExMYG9vX+c6fVnUF00A0iGC+scyMjKSxse7fU+io6MjrKysYG1tDUdHR1hbW8Pa2lra+8jDSomI6F6xqBERUavSvn17vPDCC1i6dKncUYiIiB4Yj6EgIiIiIiIyMCxqREREREREBoZFjYiIiIiIyMCwqBERERERERkYFjUiIiIiIiIDw6JGRERERERkYFjUiIiIiIiIDAyLGhERERERkYFhUSMiIiIiIjIwLGpEREREREQGhkWNiIiIiIjIwLCoERERERERGRgWNSIiIiIiIgPDokZERERERGRgWNSIiIiIiIgMDIsaERERERGRgWFRIyIiIiIiMjAsakRERERERAaGRY2IiIiIiMjAsKgREREREREZGBY1IiIiIiIiA8OiRkREREREZGBY1IiIiIiIiAwMixoREREREZGBYVEjIiIiIiIyMCxqREREREREBoZFjYiIiIiIyMCwqBERERERERkYFjUiIiIiIiIDw6JGRERERERkYFjUiIiIiIiIDAyLGhERERERkYExEkIIuUMQERE9iNdeew0HDhzA7X/KMjMz4eTkBCcnJ+k6U1NTfP311+jXr58cMYmIiO4bixoREbVY69evR2Rk5J/O5+joiMLCQpiamjZDKiIioofHQx+JiKjFmjp1KiwtLe86j5mZGSIiIljSiIioRWFRIyKiFsvGxgYTJ06EmZnZHefRaDSYNWtWM6YiIiJ6eCxqRETUos2ZMwe1tbV3vN3T0xODBw9uxkREREQPj0WNiIhatPHjx8PW1rbB28zMzDBv3jwYGRk1cyoiIqKHw6JGREQtmrm5OcLDw2Fubl7v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mpubpY40oBgMBixYsACCIGDbtm0saTTosagRERERdZG/vz/27NmDxMREPPXUU1LHGVDefvttHD58GN988w1cXFykjkMkORY1IiIiolsQFhaGb7/9Flu3bsXatWuljjMgHD16FG+88QbWr1+Pu+++W+o4RCaB31EjIiIi6oZNmzZh+fLl+Pzzz7F06VKp4/RbV65cwfjx4xEREYHvvvtO6jhEJoPT8xMRERF1w7Jly1BQUIDly5fDw8MDM2bMkDpSv2MwGPDII49AqVRi06ZNUschMiksakRERETd9NZbb6GsrAwPPvgg/v3vf+POO++UOlK/8t///d84duwYkpOT4eDgIHUcIpPCQx+JiIiIbkNTUxNiY2Nx9uxZHD9+HCNGjJA6Ur9w+PBh3HffffjnP/+JJ554Quo4RCaHRY2IiIjoNmk0GkRFRUGj0SA5ORmurq5SRzJpeXl5CA8Px4wZM/DFF19IHYfIJLGoEREREfWA8vJyTJw4Ea6urjhy5AgUCoXUkUySRqPBpEmTYG5ujmPHjkGpVEodicgkcXp+IiIioh7g4eGBffv2IScnB/Pnz0dLS4vUkUxO6+QhlZWV+Omnn1jSiG6CRY2IiIioh4wePRr79u3D4cOH8fTTT0sdx+SsXr0aBw4cwHfffQdvb2+p4xCZNBY1IiIioh5055134uuvv8Znn32G999/v9PH6XS6PkwlvS+++ALvvfcePv74Y0RGRkodh8jksagRERER9bC4uDj84x//wCuvvILt27cb3ScIAlavXo0XX3xRonS9JyEhAXV1de2Wp6amYvny5Vi5ciUef/xxCZIR9T+cTISIiIiol6xcuRIffvghEhISMG3aNDQ2NuKxxx7DF198AblcjoqKCtjb20sds0c0NzfDy8sLXl5e2L9/P1QqFYDfJlkJCwtDcHAwEhISYG5uLnFSov6BI2pEREREveSvf/0r5s+fj7lz5+L48eOIiYnB119/DQBobGzEl19+KXHCnvPjjz+isrIS586dQ3h4OPLy8lBfX48HHngAtra2+Oabb1jSiG4BR9SIiIiIelFDQwOmTJmC8+fPo6GhAU1NTQAAmUyGESNGIDs7W+KEPSMqKgrJycloaWmBpaUlFAoF7rrrLqSkpODkyZMYOXKk1BGJ+hWOqBERERH1ory8PHF0qbWkAb99V+3y5ctITk6WMF3P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YicnJ6hUKh6KSIMCixoRERFRDzAYDOIokU6nE0eNWkeUbhxdAn77Dp4gCNDr9aivrxfXAfxWGpuamowKEwCjktSR69evo6WlpcP7WstfR6ysrKBUKsXbbQuira0tLC0tYWlpKR4m6ODgADMzM9jY2EAul8PCwgJ2dnZGo4hOTk7idXt7e6PRRiK6ORY1IiIiogHKx8cHzz77LFauXCl1FCK6RTzBAxERERERkYlhUSMiIiIiIjIxLGpEREREREQmhkWNiIiIiIjIxLCoERERERERmRgWNSIiIiIiIhPDokZERERERGRiWNSIiIiIiIhMDIsaERERERGRiWFRIyIiIiIiMjEsakRERERERCaGRY2IiIiIiMjEsKgRERERERGZGBY1IiIiIiIiE8OiRkRE9P/Zu/Oopu6EfeBPCIFACCEgQlgVURQErCiIO+BeWhVHrXUda8cZ36O189pau0xn2k47M9pap5tj6ztdxtapdat1aRVwww1tVRZFFBWQfUnY9+/vjx7yMwWroHIDPJ9z7knyvTf3PjdaT57eJURERGaGRY2IiIiIiMjMsKgRERERERGZGRY1IiIiIiIiM8OiRkREREREZGZY1IiIiIiIiMwMixoREREREZGZYVEjIiIiIiIyMyxqREREREREZoZFjYiIiIiIyMywqBEREREREZkZFjUiIiIiIiIzw6JGRERERERkZljUiIiIiIiIzAyLGhERERERkZlhUSMiIiIiIjIzLGpERERERERmhkWNiIiIiIjIzMiEEELqEERERER0f55//nkcOHAAt3+1y8jIgFarhVarNY5ZWlpi8+bNGDx4sBQxiegesagRERERdQFffPEFFixYcNflHBwcUFhYCEtLyw5IRUTtxVMfiYiIiLqAmJgYKJXKX11GoVBg3rx5LGlEnQCLGhEREVEXoFKpEB0dDYVCccdl6uvrMWfOnA5MRUTtxaJGRERE1EXMnTsXDQ0Nd5yv0+kQHh7egYmIqL1Y1IiIiIi6iClTpsDOzq7VeQqFAgsXLoRMJuvgVETUHixqRERERF2ElZUVZs6cCSsrqxbzeNojUefCokZERETUhTz55JOoq6trMe7r64ugoCAJEhFRe7CoEREREXUhERERcHZ2NhlTKBRYtGiRNIGIqF1Y1IiIiIi6EAsLC8ydO9fk7o/19fWYPXu2hKmIqK1Y1IiI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p0A2KyoqQlpaWrvWOX36dADA3r17TcZra2sRGxsLGxubFqda1tTUIDEx0WQsKSkJOTk5CA4Ohk6na1eGffv2tZj3yCOP4Nlnn72vvK3R6XS4deuWyVheXh4yMzPblP1hcnBwwOXLlwEACoUC48ePN9498pf7L6W6ujrs2bMH48aNkzoKdQIsakRERHTf5HI5li5divXr16OwsFDqOHjzzTfh6OiIlStX4uDBg6ioqEBqairmzZvX6umQ9+Ktt95C7969sXLlSnz33XcoLy/HlStX8OSTTyI3NxcbNmwwnlLYTKPR4MUXX8TJkydRWVmJs2fPYt68ebCyssKGDRvaneHZZ5/F3r17UV5ejuzsbCxbtgy5ubkmRa09eVszYcIE5OTk4P3330dFRQWuXbuGZ555pk1HAzvC73//e1y8eBG1tbUoKCjAP/7xDwghzOa6SQB47733UFpaylv0072R+GYmRERE1EUYDAbRq1cvMXHiRNHQ0CB1HJGWliamTZsm7O3tjbd0/+6770RUVJQAIACIp556Spw8edL4+vapNUVFRWLlypWid+/eQqFQCI1GIyZOnChiY2NbLNt8F8XU1FQxceJEoVarhY2NjRgzZow4fvx4u/frlxl0Op144oknxJUrV9qVd+3atS32/aWXXjLO1+v1YsmSJUKn0wkbGxsxcuRIkZiYKEJCQozLr169utXP8aWXXhKJiYktxt966y1x7NixFuOvvvrqHdcjhGgx/uijjwohhDh//rxYunSpGDBggLC1tRWOjo5i2LBh4uOPPzaLn4sQQojExEShVCrF66+/LnUU6iRkQrRy4jQRERFROyQmJmLs2LGIiYnBp59+CrlcLnUkyQwaNAhFRUXIzs6WOgpJLCkpCZGRkQgJCcG+fftgYcGT2uju+LeEiIiIHpihQ4di9+7d2L59O6Kjo3l3O+r2Dhw4gFGjRmHgwIHYsWMHSxrdM/5NISIiogdq3LhxOHHiBFJTU+Hv749du3ZJHYmow1VVVeGFF15AdHQ0Jk+ejH379rX4aQKiX8OiRkRERA/coEGDcP78eURHR2P69OmYNWuWWdxkpCOsW7cOMpkMFy5cwK1btyCTyfDyyy/fcXmZTHbX6c9//nPH7QDdt++//x7+/v7417/+hQ8//BBfffUVbGxspI5FnQyvUSMiIqKHau/evfj973+P6upq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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/preprocess.gq.yaml')\n", - "task_graph.draw(show='ipynb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It can be shown in the interactive gQuant widget. Try to run it and see the preprocess results:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "69aa5783a26d47248873e753fa0fc043", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lode the whole TaskGraph by `load_taskgraph` command" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/portfolio_trade.gq.yaml')\n", - "task_graph.draw(show='ipynb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To see the input/output ports of the nodes, turn `show_ports` flag on" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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6AaiEQAAAOgGohEAAADoBqIRAAAA6AaiEQAAAOgGohEAAADoBqIRAAAA6AaiEQAAAOgGohEAAADoBqIRANxcvHiRQCAQCAQymYx3LQCA/4FoBAA3gYGBEomEw+G8cw9dXV0RERELFiywsLCgUqm6urpsNvuLL754/Pjxq41bW1tHjhzp7e39HiUDMCRANIKhiE6nOzk54V3F+0pPTx83btzWrVttbW3//PPP6urq8vLyCxcu6Orq+vj4bN68ubOzU7a9RCIRi8VisRivggFQFhCNACilK1euzJw5k8PhPH78+Ouvv54wYQKTyaTT6ba2tlu3bs3NzW1qalqyZIlsEGppaZWWll67dg3HsgFQChCNACif3NzcRYsWhYaGnjhxgk6nv9qARqOdPHmSSqV+//33g18eAMoOohEoKKFQuGPHjtGjR2OX0Hx8fKKjo7u6uqQNGhoaNmzYYGVlpampqaOj4+XllZycjM2Kiooi/K2wsHD+/Pl6enrY261btxIIhLa2ttTUVGyKhobGG4uR7fDZs2cLFixgMpl6enre3t6lpaWyLfuoClNQUODr68tgMGg0mrOzc0pKyqurq6+vX7NmzYgRIzQ1NQ0MDPz9/R89eiTbYM2aNTY2NkeOHEEIdXV1ffXVVywWi0qluru7FxUVEQiEQ4cOEQiEn3766ezZs83NzT02QSAQvNVGATDkSABQMAwGIywsbPny5QwGIz4+vr29vba2dtOmTQih5ORkrE1NTY2FhYWRkVFMTAyPxyssLPT39ycQCCdPnpT2M3fuXISQi4tLcnJyW1tbenq6urp6fX29RCKh0WgzZsx428KwDufOnZuWltba2pqQkEChUCZPnixt8MaqiouLmUymqalpfHw8n8/Pyclxd3cfMWIEiUSSdlJdXT18+HAjI6OrV6/y+fy8vDwXFxcymZyWloY1uH//PkLowoUL2NvNmzcTicRTp041Nzffvn17ypQpCKGDBw9ic7dt23b69Okem9DR0SH/RgEwBEE0AoWDRaOFhcX06dNlp9vY2EijMTg4GCEUEREhnSsQCExMTCgUSm1tLTYF+6V/7dq1V1fxPtEYExMjnTJv3jyEEBa38lQVEBCAELp8+bK0QVVVFYlEko3Gjz/+WDb5JBJJTU0NiURycHDA3u7cuZNAIDQ3N0skktraWjKZHBISIm0cGRkpG43R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v/Hjx1dUVFRVVRUWFl65cuWBV7YTCoVTpkzRaDQbN26sr69va2vLzc394IMPerIVd13XW2+9FRgY+NRTTx06dEiv1zc0NPzzn//87//+702bNvXzsc3//d//NRqNKSkp/blSAHg4/XrSD/SGy5cv29vb/+Mf/+jdaUtKSlauXDlixAjmc42TJ0/esWMHcySTUV9fn5GRERAQIBaLlUplfHx8Tk4O81BhYeH9f6/Kysqio6Plcrmvr+/27dt7kker1a5cudLX11csFru7uy9btuyll15iJg8LC2PfB2UVFhbef13M5zKHDRsmFotdXV2nT59+9OjRHubvLTU1Na6urmvXru2j+QGgV1B0H5zQAX3tjTfe+Otf/3rixIkJEybwnQV6qr29fcqUKTqd7tSpU46OjnzHAYB7QjUOSF1dXUlJSWfOnDl+/HhISAjfceDBurq6nnrqqX379p08eTI4OJjvOABwP3jC9V4AAAAgAElEQVSvcUASCoV79uwZPnx4ZGTkDz/8wHcceIDW1tbf/va3e/bs+eyzz9CLANYP1ThQOTg4HD16NDY2dvr06Z988gnfcR4adW+vv/463+l6U01NzdSpU/Pz83NycnpyNi8A8A4HVAc2s9n88ssvb9y4cf78+du2bXNzc+M7EXB8/PHHa9ascXNz279//29+8xu+4wBAj2CvcWATCARvv/324cOHT506NWrUqF27duG1jpW4du3ak08++dRTTy1durS4uBi9CDCAoBoHg7i4uJ9//nnBggWLFy+eNGnS0aNH+U5k027evLlmzZrg4ODKysoTJ05s2bJFJpPxHQoAHgKqcZBQKBTbt28vLi52c3ObPn36E088ceLECb5D2Zxbt2796U9/CgwM3L179+bNm0tLSyMiIvgOBQAPDdU4qIwdO3b//v15eXlms/nxxx8PCwtjrr3Cd67Br6Sk5Omnn/b19X3//ff/9Kc/Xbp06fnnn7ezs+M7FwD8GjgNZ9A6derUtm3b9uzZ4+jouHz58iVLlowYMYLvUIONwWD45ptvPvjgg7y8vFGjRq1atSo9Pb0fvrsDAPoUqnGQ02g0mZmZmZmZ1dXVY8eOTUtLS0lJ8fX15TvXwNbR0XH48OFdu3bt27evs7MzKSlp1apV7PVmAWCgQzXaBLPZ/MMPP+zatevLL7/U6XQRERFJSUlPPvlkaGgo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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_graph.draw(show='ipynb', show_ports=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Similarly, it can be shown in the interactive gQuant widget. Try to run it, change the parameters and play with it as shown in the animation:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "f194c058ea71469cbf3b824355841a87", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Running this toy example in a Dask distributed environment is super easy, as gQuant operates at dataframe level.\n", - "\n", - "We just need to swap cuDF dataframes to **dask_cuDF** dataframes. Try to connect the `preprocess` node to the `Dask dataframe` output port in the `stock data` node.\n", - "\n", - "Similarly, to see how fast the GPU acceleration is, we can swtich to CPU computation environment by connecting to the `Pandas dataframe` output port.\n", - "\n", - "## Benchmarks\n", - "\n", - "While running this notebook, we have obtained the following results:\n", - "\n", - "- 181.00 seconds to run in CPU (Intel(R) Xeon(R) CPU E5-2698 v4 @ 2.20GHz).\n", - "- 9.06 seconds to run in GPU (NVIDIA v100).\n", - "\n", - "We get ~20x speed up by using GPU and GPU dataframes, compared to CPU and CPU dataframes.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GQuant Task Node \n", - "\n", - "Each node is composed of:\n", - "- a unique id,\n", - "- a node type, \n", - "- configuration parameters\n", - "- from zero to many input nodes ids.\n", - "\n", - "gQuant's `load_taskgraph` takes this yaml file, and wires it into a graph.\n", - "\n", - "gQuant implementation includes some common nodes, useful for quantitative finance. With the help of [Numba](https://numba.pydata.org) library, we have implemented more than 30 technical indicators used in computing trading signals. All of them computed in the GPU.\n", - "\n", - "However, gQuant's goal is not to be comprehensive for quant applications. It provides a framework that is easy for anyone to implement his own nodes in the gQuant.\n", - "\n", - "\n", - "Data scientists only need to override five methods in the parent class `Node`:\n", - "- `init`\n", - "- `meta_setup`\n", - "- `ports_setup`\n", - "- `conf_schema`\n", - "- `process`\n", - "\n", - "`init` method is usually used to define the required column names\n", - "\n", - "`ports_setup` defines the input and output ports for the node\n", - "\n", - "`meta_setup` method is used to calculate the output meta name and types.\n", - "\n", - "`conf_schema` method is used to define the JSON schema for the node conf so the client can generate the proper UI for it.\n", - "\n", - "`process` method takes input dataframes and computes the output dataframe. \n", - "\n", - "In this way, dataframes are strongly typed, and errors can be detected early before the time-consuming computation happens.\n", - "\n", - "Here is the code example for implementing `MaxNode`, which is to compute the maximum value for a specified column in the dataframe." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from gquant.dataframe_flow import Node\n", - "from rapids_modules._port_type_node import _PortTypesMixin\n", - "from gquant.dataframe_flow.portsSpecSchema import ConfSchema\n", - "\n", - "\n", - "class MaxNode(Node, _PortTypesMixin):\n", - "\n", - " def init(self):\n", - " _PortTypesMixin.init(self)\n", - " self.INPUT_PORT_NAME = 'in'\n", - " self.OUTPUT_PORT_NAME = 'out'\n", - "\n", - " def ports_setup(self):\n", - " return _PortTypesMixin.ports_setup(self)\n", - "\n", - " def conf_schema(self):\n", - " json = {\n", - " \"title\": \"Maximum Value Node configure\",\n", - " \"type\": \"object\",\n", - " \"description\": \"Compute the maximum value of the key column\",\n", - " \"properties\": {\n", - " \"column\": {\n", - " \"type\": \"string\",\n", - " \"description\": \"column to calculate the maximum value\"\n", - " }\n", - " },\n", - " \"required\": [\"column\"],\n", - " }\n", - " input_meta = self.get_input_meta()\n", - " if self.INPUT_PORT_NAME in input_meta:\n", - " col_from_inport = input_meta[self.INPUT_PORT_NAME]\n", - " enums = [col for col in col_from_inport.keys()]\n", - " json['properties']['column']['enum'] = enums\n", - " ui = {}\n", - " return ConfSchema(json=json, ui=ui)\n", - " else:\n", - " ui = {\n", - " \"column\": {\"ui:widget\": \"text\"}\n", - " }\n", - " return ConfSchema(json=json, ui=ui)\n", - "\n", - " def process(self, inputs):\n", - " \"\"\"\n", - " Compute the maximum value of the key column which is defined in the\n", - " `column` of the node's conf\n", - "\n", - " Arguments\n", - " -------\n", - " inputs: list\n", - " list of input dataframes.\n", - " Returns\n", - " -------\n", - " dataframe\n", - " \"\"\"\n", - " input_df = inputs[self.INPUT_PORT_NAME]\n", - " max_column = self.conf['column']\n", - " volume_df = input_df[[max_column,\n", - " \"asset\"]].groupby([\"asset\"]).max().reset_index()\n", - " volume_df.columns = ['asset', max_column]\n", - " return {self.OUTPUT_PORT_NAME: volume_df}\n", - "\n", - " def meta_setup(self):\n", - " cols_required = {\"asset\": \"int64\"}\n", - " if 'column' in self.conf:\n", - " retention = {self.conf['column']: \"float64\",\n", - " \"asset\": \"int64\"}\n", - " return _PortTypesMixin.retention_meta_setup(self,\n", - " retention,\n", - " required=cols_required)\n", - " else:\n", - " retention = {\"asset\": \"int64\"}\n", - " return _PortTypesMixin.retention_meta_setup(self,\n", - " retention,\n", - " required=cols_required)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In case that there is no direct dataframe method for a particular logic, a Numba GPU kernel can be used to implement it. Some examples of customized GPU kernels in Numba can be found [here](https://github.com/rapidsai/gQuant/blob/master/notebooks/05_customize_nodes.ipynb).\n", - "\n", - "If we use customized GPU kernel functions inside the `process` method to process the dataframe instead of _normal_ dataframe API functions calls, we need to add `self.delayed_process = True` in the `meta_setup` method to let gQuant handle the dask graph integration problem. If we use _normal_ dataframe API functions inside the `process` method, nothing needs to be done as `self.delayed_process = False` by default.bgQuant automatically handles the complication of including a customized GPU kernel node into the Dask computation graph.\n", - "\n", - "Note, we set `self.delayed_process = True` for the `SortNode`. So th sort is performed at the Dask data partition level instead of sorting it globally. This has a benefits of guranteeing the sortting doens't pollute the data partition allocation, as sometimes we want to make sure the data partition remain the same during the distributed computation. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running the TaskGraph programmatically\n", - "\n", - "\n", - "To run the TaskGraph programmatically , we can specifiy a list of output ports to the TaskGraph `run` method. The `profile` flag can be used to see the computation time spent on each of the nodes:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:stock_data process time:4.093s\n", - "id:preprocess process time:0.569s\n", - "id:sort_after process time:0.052s\n", - "id:exp_mean_reversion process time:0.049s\n", - "id:backtest process time:0.002s\n", - "id:portfolio_opt process time:0.031s\n", - "id:sharpe_ratio process time:0.002s\n", - "id:cumulative_return process time:0.023s\n" - ] - } - ], - "source": [ - "import warnings; warnings.simplefilter(\"ignore\")\n", - "\n", - "o_gpu = task_graph.run(\n", - " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return','stock_data.cudf_out', 'preprocess.drop_columns@out'], profile=True)\n", - "gpu_strategy_cached = o_gpu['preprocess.drop_columns@out'] \n", - "gpu_input_cached = o_gpu['stock_data.cudf_out'] " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`o_gpu` will contain the outputs of four nodes: `sharpe_ratio`, `cumlative_return`, `stock_data`, `preprocess`.\n", - "\n", - "Similarly, the output from `stock_data` and `preprocess` nodes will be cached stored in `gpu_input_cached` and `strategy_cached` variables for later use. \n", - "\n", - "We can check how many of the stocks are filtered out by preprocessing steps:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5052 stocks in original dataset.\n", - "1558 stocks remaining after filtering.\n" - ] - } - ], - "source": [ - "print(\"{} stocks in original dataset.\".format(len(gpu_input_cached['asset'].unique())))\n", - "print(\"{} stocks remaining after filtering.\".format(len(gpu_strategy_cached['asset'].unique())))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result can be shown in IPython Rich display by turnning on the `formatted` flag:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "db4dbeca0a2d483ea7429119c0448aae", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Tab(children=(Output(), Output(), Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.run(\n", - " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return','preprocess.drop_columns@out'], formated=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This toy strategy gets a Sharpe ratio 0.338 without considering the transaction cost. Nice! \n", - "\n", - "[bqplot](https://github.com/bloomberg/bqplot) library is used to visualize the backtesting results in the JupyterLab notebooks. " - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "182dd2ea51d2426b853916ccf7e8c899", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side='left'), Axis(l…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# define the function to format the plots\n", - "def plot_figures(outputs):\n", - " # format the figures\n", - " figure_width = '1200px'\n", - " figure_height = '400px'\n", - " sharpe_number = outputs[0]\n", - " cum_return = outputs[1]\n", - " cum_return.layout.height = figure_height\n", - " cum_return.layout.width = figure_width\n", - " cum_return.title = 'P & L %.3f' % (sharpe_number)\n", - " return cum_return\n", - "\n", - "plot_figures(o_gpu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "gQuant TaskGraph can be evaluated by overwritting any of the Node's parameters. E.g. we can change the parameters to filter out the stocks:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Define some constants for the data filters.\n", - "# If using a GPU of 32G memory, you can safely \n", - "# set the `min_volume` to 5.0\n", - "min_volume = 10.0\n", - "min_rate = -10.0\n", - "max_rate = 10.0" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:stock_data process time:4.136s\n", - "id:preprocess process time:0.743s\n", - "id:sort_after process time:0.130s\n", - "id:exp_mean_reversion process time:0.076s\n", - "id:backtest process time:0.003s\n", - "id:portfolio_opt process time:0.072s\n", - "id:sharpe_ratio process time:0.001s\n", - "id:cumulative_return process time:0.023s\n", - "5052 stocks in original dataset.\n", - "4405 stocks remaining after filtering.\n", - "CPU times: user 5.17 s, sys: 743 ms, total: 5.91 s\n", - "Wall time: 5.65 s\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b50e20ee9c1b4501b2eb08632a8a0fa7", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis(label='Time', …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%%time\n", - "o_gpu = task_graph.run(\n", - " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return', 'stock_data.cudf_out', 'preprocess.drop_columns@out'], \n", - " replace={'preprocess': {\"conf\": {\n", - " \"subnodes_conf\": {\n", - " \"value_filter\": {\n", - " \"conf\": [{\"column\": \"average_volume\", \"min\": min_volume},\n", - " {\"column\": \"max_return\", \"max\": max_rate},\n", - " {\"column\": \"min_return\", \"min\": min_rate}]\n", - " }\n", - " },\n", - " \"taskgraph\": \"taskgraphs/preprocess.gq.yaml\",\n", - " \"input\": [\"sort_node.in\"],\n", - " \"output\": [\"drop_columns.out\"]\n", - " }}\n", - " }, profile=True)\n", - "\n", - "gpu_input_cached = o_gpu['stock_data.cudf_out'] \n", - "gpu_strategy_cached = o_gpu['preprocess.drop_columns@out'] \n", - "print(\"{} stocks in original dataset.\".format(len(gpu_input_cached['asset'].unique())))\n", - "print(\"{} stocks remaining after filtering.\".format(len(gpu_strategy_cached['asset'].unique())))\n", - "plot_figures(o_gpu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the example above, `preprocess` node is a composite node that use a seperate TaskGraph as input and output. Any of the node inside the composite node TaskGraph configuration can be overridden as shown in the example. We change the `filter_value` node configuration inside the composite node to filter out the stocks that are not suitable for backtesting. It will discard stocks according to the values stored in `min_volume`, `min_rate`, and `max_rate` variables.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we are going to compare the performance difference between CPU and GPU. The same computation graph can be used to flow the CPU Pandas dataframe with one change that\n", - "the preprocess node need to get input from the Pandas dataframe:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:stock_data process time:105.435s\n", - "id:preprocess process time:24.096s\n", - "id:sort_after process time:1.382s\n", - "id:exp_mean_reversion process time:10.445s\n", - "id:backtest process time:0.043s\n", - "id:portfolio_opt process time:0.472s\n", - "id:sharpe_ratio process time:0.001s\n", - "id:cumulative_return process time:0.021s\n", - "CPU times: user 2min 11s, sys: 14.5 s, total: 2min 26s\n", - "Wall time: 2min 22s\n" - ] - } - ], - "source": [ - "%%time\n", - "\n", - "o_cpu = task_graph.run(\n", - " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return'], \n", - " replace={'preprocess': {\"inputs\": {\"sort_node@in\": \"stock_data.pandas_out\"}}}, profile=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "89439c03a6cd4b0cbbd2d4d975234d4d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis(label='Time', …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_figures(o_cpu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It produces the same result as the single GPU version but a lot slower.\n", - "\n", - "While running this notebook, we have obtained the following results:\n", - "\n", - "- 181.00 seconds to run in CPU (Intel(R) Xeon(R) CPU E5-2698 v4 @ 2.20GHz).\n", - "- 9.06 seconds to run in GPU (NVIDIA v100).\n", - "\n", - "We get ~20x speed up by using GPU and GPU dataframes, compared to CPU and CPU dataframes.\n", - "\n", - "Note, the input nodes load the dataframes from the cache variables to save the disk IO time." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The distributed computation is turned on by changing the preprocess node's input dataframe to dask dataframe: " - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:stock_data process time:0.118s\n", - "id:preprocess process time:9.833s\n", - "id:backtest process time:0.016s\n", - "id:portfolio_opt process time:0.331s\n", - "id:sharpe_ratio process time:0.371s\n", - "id:cumulative_return process time:0.405s\n", - "CPU times: user 6.01 s, sys: 489 ms, total: 6.5 s\n", - "Wall time: 16.5 s\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "bedf166c923640839437c5505f30816e", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis(label='Time', …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%%time\n", - "o_dask = task_graph.run(\n", - " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return'], \n", - " replace={'preprocess': {\"inputs\": {\"sort_node@in\": \"stock_data.dask_cudf_out\"}}}, profile=True)\n", - "plot_figures(o_dask)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Again, it produces the same results. However, the performance is not better than in the single GPU scenarios.\n", - "\n", - "Distributed computation only makes sense if we have a very large dataset that cannot be fit into one GPU.\n", - "\n", - "In this example, the dataset is small enough to be loaded into a single GPU. The between-GPU communication overhead dominates in the computation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Strategy parameter search\n", - "Quantitative analysts often need to explore different parameters for their trading strategy.\n", - "\n", - "gQuant speeds up this iterative exploration process by using cached dataframes and sub-graphs evaluation.\n", - "\n", - "To find the optimal parameters for this toy mean reversion strategy, we only need the dataframe from `sort_2` node, which is cached in the `gpu_strategy_cached` variable.\n", - "\n", - "Because the GPU computation is so fast, we can make the parameter exploration interactive in the JupyterLab notebook:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7a40a498b0f74452b2effa99d0865bd3", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(HBox(children=(IntRangeSlider(value=(10, 30), continuous_update=False, description='MA:', max=6…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import ipywidgets as widgets\n", - "\n", - "para_selector = widgets.IntRangeSlider(value=[10, 30],\n", - " min=3,\n", - " max=60,\n", - " step=1,\n", - " description=\"MA:\",\n", - " disabled=False,\n", - " continuous_update=False,\n", - " orientation='horizontal',\n", - " readout=True)\n", - "\n", - "\n", - "def para_selection(*stocks):\n", - " with out:\n", - " para1 = para_selector.value[0]\n", - " para2 = para_selector.value[1]\n", - " o = task_graph.run(\n", - " outputs=['sharpe_ratio.sharpe_out', 'cumulative_return.cum_return'],\n", - " replace={'exp_mean_reversion': {'conf': {'fast': para1,\n", - " 'slow': para2}},\n", - " 'preprocess': {\"load\": {\"drop_columns@out\": gpu_strategy_cached},\n", - " \"conf\": {\n", - " \"subnodes_conf\": {\n", - " \"value_filter\": {\n", - " \"conf\": [{\"column\": \"average_volume\", \"min\": min_volume},\n", - " {\"column\": \"max_return\", \"max\": max_rate},\n", - " {\"column\": \"min_return\", \"min\": min_rate}]\n", - " }\n", - " },\n", - " \"taskgraph\": \"taskgraphs/preprocess.gq.yaml\",\n", - " \"input\": [\"sort_node.in\"],\n", - " \"output\": [\"drop_columns.out\"]\n", - " }}})\n", - "\n", - " figure_combo = plot_figures(o)\n", - " w.children = (w.children[0], figure_combo,)\n", - "\n", - "\n", - "out = widgets.Output(layout={'border': '1px solid black'})\n", - "para_selector.observe(para_selection, 'value')\n", - "selectors = widgets.HBox([para_selector])\n", - "w = widgets.VBox([selectors])\n", - "w" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d692885694be475da5cd47e6acf94417", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Output(layout=Layout(border='1px solid black'))" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "out" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'status': 'ok', 'restart': True}" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import IPython\n", - "app = IPython.Application.instance()\n", - "app.kernel.do_shutdown(True)" - ] - }, - { - "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.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/05_customize_nodes_with_ports.ipynb b/notebooks/05_customize_nodes_with_ports.ipynb deleted file mode 100644 index 10ecfeab..00000000 --- a/notebooks/05_customize_nodes_with_ports.ipynb +++ /dev/null @@ -1,1977 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Customize your own GPU Kernels in gQuant\n", - "\n", - "The gQuant is designed to accelerate quantitive finance workflows on the GPU. The acceleration on GPU is facilitated by using cuDF dataframes organized into a computation graph. The cuDF project is a continously evolving library that provides a pandas-like API. Sometimes the data scientists are facing a few challenges that cannot be easily solved:\n", - "\n", - " 1. The quantitative work needs customized logic to manipulate the data, and there are no direct methods within cuDF to support this logic.\n", - " 2. Each cuDF dataframe method call launches the GPU kernel once. For performance crtical task, it is sometimes required to wrap lots of computation steps together in a single GPU kernel to reduce the kernel launch overheads.\n", - "\n", - "The solution is to build customized GPU kernels to implement them. The code and examples below illustrate a variety of approaches to implement customized GPU kernels in Python." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import sys; sys.path.insert(0, '..')\n", - "# Load necessary Python modules\n", - "import sys\n", - "from gquant.dataframe_flow import TaskSpecSchema, TaskGraph, MetaData\n", - "from gquant.dataframe_flow import Node, NodePorts, PortsSpecSchema\n", - "from gquant.dataframe_flow import ConfSchema\n", - "import cudf\n", - "import numpy as np\n", - "from numba import cuda\n", - "import cupy\n", - "import math\n", - "import dask\n", - "import dask_cudf" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define a utility function to verify the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def verify(ground_truth, computed):\n", - " max_difference = (ground_truth - computed).abs().max()\n", - " # print('Max Difference: {}'.format(max_difference))\n", - " assert(max_difference < 1e-8)\n", - " return max_difference" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "task_graph = TaskGraph()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example Problem: Calculating the distance of points to the origin\n", - "\n", - "The sample problem is to take a list of points in 2-D space and compute their distance to the origin.\n", - "We start by creating a source `Node` in the graph that generates a cuDF dataframe containing some configurable number of random points. A custom node is defined by inheriting from the `Node` class and overriding methods `init`, `meta_setup`, `ports_setup`, `conf_schema`, `process`.\n", - "\n", - "The `ports_setup` must return an instance of `NodePorts` which encapsulates the ports specs. Ports specs are dictionaries with port attributes/options per `PortsSpecSchema`.\n", - "\n", - "In the case of the `PointNode` below the input port is an empty dictionary, since no inputs are required, and the output has two ports `points_df_out` and `points_ddf_out`. It can output two types of dataframe frames depends who connects it.\n", - "\n", - "The `process` method receives a input dictionary where keys are input ports and values are input data. It return a dictionary where the keys correspond to the output ports. \n", - "\n", - "The `meta_setup` is used to compute the output meta information. It returns a dictionary where keys correspond to the output ports.\n", - "\n", - "The `conf_schema` is used to define the Node configuration [JSON schema](https://json-schema.org/). gQuantlab UI uses [RJSF](https://github.com/rjsf-team/react-jsonschema-form) project to generate HTML form elements based on the JSON schema. [RJSF playground](https://rjsf-team.github.io/react-jsonschema-form/) is a good place to learn how to write JSON schema and visualize it. `conf_schema` returns `ConfSchema` which encapsulate the JSON schema and UI schema together.\n", - "\n", - "The `column` and `port_types` information sometimes are determined dynamically. gQuant provides a few utility functions to help get dynamical graph information. `self.get_connected_inports()` will return a dictionay where keys are connected inport names and values are inport types. \n", - "`self.get_input_meta()` will return a dictionary where keys are connected inport names and values are column name/type paris from the parent node. `self.outport_connected(port_name)` method returns a boolean if the output port `port_name` is connected. The `PointNode` uses it to determine what kind of computation it needs to do depending on the connection." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "class PointNode(Node):\n", - "\n", - " def ports_setup(self):\n", - " input_ports = {}\n", - " output_ports = {\n", - " 'points_df_out': {\n", - " PortsSpecSchema.port_type: cudf.DataFrame\n", - " },\n", - " 'points_ddf_out': {\n", - " PortsSpecSchema.port_type: dask_cudf.DataFrame\n", - " },\n", - " }\n", - " return NodePorts(inports=input_ports, outports=output_ports)\n", - "\n", - " def conf_schema(self):\n", - " json = {\n", - " \"title\": \"PointNode configure\",\n", - " \"type\": \"object\",\n", - " \"properties\": {\n", - " \"npts\": {\n", - " \"type\": \"number\",\n", - " \"description\": \"number of data points\",\n", - " \"minimum\": 10\n", - " },\n", - " \"npartitions\": {\n", - " \"type\": \"number\",\n", - " \"description\": \"num of partitions in the Dask dataframe\",\n", - " \"minimum\": 1\n", - " }\n", - "\n", - " },\n", - " \"required\": [\"npts\", \"npartitions\"],\n", - " }\n", - "\n", - " ui = {\n", - " \"npts\": {\"ui:widget\": \"updown\"},\n", - " \"npartitions\": {\"ui:widget\": \"updown\"}\n", - " }\n", - " return ConfSchema(json=json, ui=ui)\n", - "\n", - " def init(self):\n", - " pass\n", - " \n", - " def meta_setup(self):\n", - " columns_out = {\n", - " 'points_df_out': {\n", - " 'x': 'float64',\n", - " 'y': 'float64'\n", - " },\n", - " 'points_ddf_out': {\n", - " 'x': 'float64',\n", - " 'y': 'float64'\n", - " }\n", - " }\n", - " return MetaData(inports={}, outports=columns_out)\n", - "\n", - " def process(self, inputs):\n", - " npts = self.conf['npts']\n", - " df = cudf.DataFrame()\n", - " df['x'] = np.random.rand(npts)\n", - " df['y'] = np.random.rand(npts)\n", - " output = {}\n", - " if self.outport_connected('points_df_out'):\n", - " output.update({'points_df_out': df})\n", - " if self.outport_connected('points_ddf_out'):\n", - " npartitions = self.conf['npartitions']\n", - " ddf = dask_cudf.from_cudf(df, npartitions=npartitions)\n", - " output.update({'points_ddf_out': ddf})\n", - " return output" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The distance can be computed via cuDF methods. We define the `DistanceNode` to calculate the euclidean distance and add a `distance_cudf` column to the output dataframe. We will use that as the ground truth to compare and verify results later. Additionally, the distance node calculates absolute distance (Manhattan distance) in another output port. The compuation is done depending which output is connected.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "class DistanceNode(Node):\n", - "\n", - " def ports_setup(self):\n", - " port_type = PortsSpecSchema.port_type\n", - " input_ports = {\n", - " 'points_df_in': {\n", - " port_type: [cudf.DataFrame, dask_cudf.DataFrame]\n", - " }\n", - " }\n", - "\n", - " output_ports = {\n", - " 'distance_df': {\n", - " port_type: [cudf.DataFrame, dask_cudf.DataFrame]\n", - " },\n", - " 'distance_abs_df': {\n", - " PortsSpecSchema.port_type: [cudf.DataFrame, dask_cudf.DataFrame]\n", - " }\n", - " }\n", - " input_connections = self.get_connected_inports()\n", - " if 'points_df_in' in input_connections:\n", - " types = input_connections['points_df_in']\n", - " # connected, use the types passed in from parent\n", - " return NodePorts(inports={'points_df_in': {port_type: types}},\n", - " outports={'distance_df': {port_type: types},\n", - " 'distance_abs_df': {port_type: types},\n", - " })\n", - " else:\n", - " return NodePorts(inports=input_ports, outports=output_ports)\n", - "\n", - " def conf_schema(self):\n", - " return ConfSchema()\n", - "\n", - " def init(self):\n", - " self.delayed_process = True\n", - "\n", - "\n", - " def meta_setup(self):\n", - " req_cols = {\n", - " 'x': 'float64',\n", - " 'y': 'float64'\n", - " }\n", - " required = {\n", - " 'points_df_in': req_cols,\n", - " }\n", - " input_meta = self.get_input_meta()\n", - " output_cols = ({\n", - " 'distance_df': {\n", - " 'distance_cudf': 'float64',\n", - " 'x': 'float64',\n", - " 'y': 'float64'\n", - " },\n", - " 'distance_abs_df': {\n", - " 'distance_abs_cudf': 'float64',\n", - " 'x': 'float64',\n", - " 'y': 'float64'\n", - " }\n", - " })\n", - " if 'points_df_in' in input_meta:\n", - " col_from_inport = input_meta['points_df_in']\n", - " # additional ports\n", - " output_cols['distance_df'].update(col_from_inport)\n", - " output_cols['distance_abs_df'].update(col_from_inport)\n", - " return MetaData(inports=required, outports=output_cols)\n", - "\n", - " def process(self, inputs):\n", - " df = inputs['points_df_in']\n", - " output = {}\n", - " if self.outport_connected('distance_df'):\n", - " copy_df = df.copy()\n", - " copy_df['distance_cudf'] = (df['x'] ** 2 + df['y'] ** 2).sqrt()\n", - " output.update({'distance_df': copy_df})\n", - " if self.outport_connected('distance_abs_df'):\n", - " copy_df = df.copy()\n", - " copy_df['distance_abs_cudf'] = df['x'].abs() + df['y'].abs()\n", - " output.update({'distance_abs_df': copy_df})\n", - " return output" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Having these two nodes, we can construct a simple task graph to compute the distance." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Task specifications.\n", - "module_name = 'custom_nodes'\n", - "\n", - "points_tspec = {\n", - " TaskSpecSchema.task_id: 'points_task',\n", - " TaskSpecSchema.node_type: PointNode,\n", - " TaskSpecSchema.conf: {'npts': 1000},\n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {},\n", - "}\n", - "\n", - "cudf_distance_tspec = {\n", - " TaskSpecSchema.task_id: 'distance_by_cudf',\n", - " TaskSpecSchema.node_type: DistanceNode,\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'points_task.points_df_out'\n", - " }\n", - "}\n", - "\n", - "out_spec = {\n", - " TaskSpecSchema.task_id: '',\n", - " TaskSpecSchema.node_type: \"Output_Collector\",\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.inputs: {\n", - " 'in0': 'points_task.points_df_out',\n", - " 'in1': 'distance_by_cudf.distance_df',\n", - " 'in2': 'distance_by_cudf.distance_abs_df'\n", - " }\n", - "}\n", - "\n", - "task_list = [points_tspec, cudf_distance_tspec, out_spec]\n", - "task_graph = TaskGraph(task_list)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can visualize the task graph with and without ports." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WITHOUT PORTS\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print('WITHOUT PORTS')\n", - "task_graph.draw(show='ipynb')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WITH PORTS\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print('WITH PORTS')\n", - "task_graph.draw(show='ipynb', show_ports=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can draw the graph in an interactive widget. First, let's register the dynamically defined gQuant nodes so the client knows about them. Note, this step is only needed if we would like to interact with gQuant by Jupyterlab UI. " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "87cab73c7fff4b89bec965231b9f291d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox())" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "TaskGraph.register_lab_node(module_name, PointNode)\n", - "TaskGraph.register_lab_node(module_name, DistanceNode)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Draw the widget:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "8ebd29d5191d40d4b21d90cda855c411", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The next step is to run the task graph to obtain the distances. The output is identified by the `id` of the distance node:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "a4684abb3a8d412bac5203f57d966cf0", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Tab(children=(Output(), Output(), Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "r = task_graph.run()\n", - "points_df = r['points_task.points_df_out']\n", - "task_graph.run(formated=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Customized Kernel with Numba library\n", - "\n", - "Numba is an excellent python library used for accelerating numerical computations. Numba supports CUDA GPU programming by directly compiling a restricted subset of Python code into CUDA kernels and device functions. The Numba GPU kernel is written in Python and translated (JIT just-in-time compiled) into GPU code at runtime. This is achieved by decorating a Python function with `@cuda.jit`. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Just like a C/C++ CUDA GPU kernel, the `distance_kernel` function is called by thousands of threads in the GPU. The thread id is computed by `threadIdx.x`, `blockId.x` and `blockDim.x` built-in variables. Please check the [CUDA programming guild](https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#thread-hierarchy) for details." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A cuDF series can be converted to GPU arrays compatible with the Numba library via.to_gpu_array` API. The next step is to define a Node that calls this Numba kernel to compute the distance and save the result into `distance_numba` column in the output dataframe." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "import rmm\n", - "@cuda.jit\n", - "def distance_kernel(x, y, distance, array_len):\n", - " # ii - overall thread index\n", - " ii = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x\n", - " if ii < array_len:\n", - " distance[ii] = math.sqrt(x[ii] ** 2 + y[ii] ** 2)\n", - "\n", - "\n", - "class NumbaDistanceNode(Node):\n", - "\n", - " def ports_setup(self):\n", - " port_type = PortsSpecSchema.port_type\n", - " input_ports = {\n", - " 'points_df_in': {\n", - " port_type: [cudf.DataFrame,\n", - " dask_cudf.DataFrame]\n", - " }\n", - " }\n", - "\n", - " output_ports = {\n", - " 'distance_df': {\n", - " port_type: [cudf.DataFrame,\n", - " dask_cudf.DataFrame]\n", - " }\n", - " }\n", - "\n", - " input_connections = self.get_connected_inports()\n", - " if 'points_df_in' in input_connections:\n", - " types = input_connections['points_df_in']\n", - " # connected\n", - " return NodePorts(inports={'points_df_in': {port_type: types}},\n", - " outports={'distance_df': {port_type: types}})\n", - " else:\n", - " return NodePorts(inports=input_ports, outports=output_ports)\n", - " \n", - " def init(self):\n", - " self.delayed_process = True\n", - "\n", - "\n", - " def meta_setup(self,):\n", - " required_cols = {'x': 'float64',\n", - " 'y': 'float64'}\n", - " required = {\n", - " 'points_df_in': required_cols,\n", - " 'distance_df': required_cols\n", - " }\n", - " input_meta = self.get_input_meta()\n", - " output_cols = ({\n", - " 'distance_df': {\n", - " 'distance_numba': 'float64',\n", - " 'x': 'float64',\n", - " 'y': 'float64'\n", - " }\n", - " })\n", - " if 'points_df_in' in input_meta:\n", - " col_from_inport = input_meta['points_df_in']\n", - " # additional ports\n", - " output_cols['distance_df'].update(col_from_inport)\n", - " return MetaData(inports=required, outports=output_cols)\n", - "\n", - " def conf_schema(self):\n", - " return ConfSchema()\n", - "\n", - " def process(self, inputs):\n", - " df = inputs['points_df_in']\n", - " number_of_threads = 16\n", - " number_of_blocks = ((len(df) - 1) // number_of_threads) + 1\n", - " # Inits device array by setting 0 for each index.\n", - " # df['distance_numba'] = 0.0\n", - " darr = rmm.device_array(len(df))\n", - " distance_kernel[(number_of_blocks,), (number_of_threads,)](\n", - " df['x'],\n", - " df['y'],\n", - " darr,\n", - " len(df))\n", - " df['distance_numba'] = darr\n", - " return {'distance_df': df}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `self.delayed_process = True` flag in the `meta_setup` is necesary to enable the logic in the `Node` class for handling `dask_cudf` dataframes in order to use Dask (for distributed computation i.e. multi-gpu in examples later on). The `dask_cudf` dataframe does not support GPU customized kernels directly. The `to_delayed` and `from_delayed` low level interfaces of `dask_cudf` enable this support. The gQuant framework handles `dask_cudf` dataframes automatically under the hood when we set this flag." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Customized Kernel by CuPy library\n", - "\n", - "CuPy is an alternative to Numba. Numba JIT compiles Python code into GPU device code at runtime. There are some limitations in how Numba can be used as well as JIT compilation latency overhead. When a Python process calls a Numba GPU kernel for the first time Numba has to compile the Python code, and each time a new Python process is started the GPU kernel has to be recompiled. If advanced features of CUDA are needed and latency is important, CuPy is an alternative library that can be used to compile C/C++ CUDA code. CuPy caches the GPU device code on disk (default location `$(HOME)/.cupy/kernel_cache` which can be changed via `CUPY_CACHE_DIR` environment variable) thus eliminating compilation latency for subsequent Python processes.\n", - "\n", - "`CuPy` GPU kernel is esentially a C/C++ GPU kernel. Below we define the `compute_distance` kernel using `CuPy`:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using gQuant we can now define a Node that calls this CuPy kernel to compute the distance and save the results into `distance_cupy` column of a `cudf` dataframe." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "kernel_string = r'''\n", - " extern \"C\" __global__\n", - " void compute_distance(const double* x, const double* y,\n", - " double* distance, int arr_len) {\n", - " int tid = blockDim.x * blockIdx.x + threadIdx.x;\n", - " if (tid < arr_len){\n", - " distance[tid] = sqrt(x[tid]*x[tid] + y[tid]*y[tid]);\n", - " }\n", - " }\n", - "'''\n", - "\n", - "\n", - "class CupyDistanceNode(Node):\n", - "\n", - " def ports_setup(self):\n", - " port_type = PortsSpecSchema.port_type\n", - " input_ports = {\n", - " 'points_df_in': {\n", - " port_type: [cudf.DataFrame,\n", - " dask_cudf.DataFrame]\n", - " }\n", - " }\n", - "\n", - " output_ports = {\n", - " 'distance_df': {\n", - " port_type: [cudf.DataFrame,\n", - " dask_cudf.DataFrame]\n", - " }\n", - " }\n", - "\n", - " input_connections = self.get_connected_inports()\n", - " if 'points_df_in' in input_connections:\n", - " types = input_connections['points_df_in']\n", - " # connected\n", - " return NodePorts(inports={'points_df_in': {port_type: types}},\n", - " outports={'distance_df': {port_type: types}})\n", - " else:\n", - " return NodePorts(inports=input_ports, outports=output_ports)\n", - "\n", - " def init(self):\n", - " self.delayed_process = True\n", - "\n", - "\n", - " def meta_setup(self,):\n", - " cols_required = {'x': 'float64',\n", - " 'y': 'float64'}\n", - " required = {\n", - " 'points_df_in': cols_required,\n", - " 'distance_df': cols_required\n", - " }\n", - " input_meta = self.get_input_meta()\n", - " output_cols = ({\n", - " 'distance_df': {\n", - " 'distance_cupy': 'float64',\n", - " 'x': 'float64',\n", - " 'y': 'float64'\n", - " }\n", - " })\n", - " if 'points_df_in' in input_meta:\n", - " col_from_inport = input_meta['points_df_in']\n", - " # additional ports\n", - " output_cols['distance_df'].update(col_from_inport)\n", - " return MetaData(inports=required, outports=output_cols)\n", - "\n", - " def conf_schema(self):\n", - " return ConfSchema()\n", - "\n", - " def get_kernel(self):\n", - " raw_kernel = cupy.RawKernel(kernel_string, 'compute_distance')\n", - " return raw_kernel\n", - "\n", - " def process(self, inputs):\n", - " df = inputs['points_df_in']\n", - " cupy_x = cupy.asarray(df['x'])\n", - " cupy_y = cupy.asarray(df['y'])\n", - " number_of_threads = 16\n", - " number_of_blocks = (len(df) - 1) // number_of_threads + 1\n", - " dis = cupy.ndarray(len(df), dtype=cupy.float64)\n", - " self.get_kernel()((number_of_blocks,), (number_of_threads,),\n", - " (cupy_x, cupy_y, dis, len(df)))\n", - " df['distance_cupy'] = dis\n", - "\n", - " return {'distance_df': df}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `self.delayed_process = True` flag is added for the same reason as with `DistanceNumbaNode` i.e. to support `dask_cudf` data frames.\n", - "\n", - "Let's register these two added new nodes" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "TaskGraph.register_lab_node(module_name, NumbaDistanceNode)\n", - "TaskGraph.register_lab_node(module_name, CupyDistanceNode)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Computing using the Nodes with customized GPU kernels\n", - "\n", - "First we construct the computation graph for gQuant." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# For comparison to above re-use points dataframe instead\n", - "# of rand generating each time when running the task-graph.\n", - "\n", - "numba_distance_tspec = {\n", - " TaskSpecSchema.task_id: 'distance_by_numba',\n", - " TaskSpecSchema.node_type: NumbaDistanceNode,\n", - " TaskSpecSchema.conf: {}, \n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'points_task.points_df_out'\n", - " },\n", - "}\n", - "\n", - "cupy_distance_tspec = {\n", - " TaskSpecSchema.task_id: 'distance_by_cupy',\n", - " TaskSpecSchema.node_type: CupyDistanceNode,\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'points_task.points_df_out'\n", - " },\n", - "}\n", - "\n", - "out_spec = {\n", - " TaskSpecSchema.task_id: '',\n", - " TaskSpecSchema.node_type: \"Output_Collector\",\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.inputs: {\n", - " 'in0': 'distance_by_cudf.distance_df',\n", - " 'in1': 'distance_by_numba.distance_df',\n", - " 'in2': 'distance_by_cupy.distance_df'\n", - " }\n", - "}\n", - "\n", - "task_list = [\n", - " points_tspec,\n", - " cudf_distance_tspec,\n", - " numba_distance_tspec,\n", - " cupy_distance_tspec,\n", - " out_spec\n", - "]\n", - "task_graph = TaskGraph(task_list)\n", - "\n", - "task_graph.draw(show='ipynb', show_ports=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we run the task graph interatively by using the gQuantlab widget" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d78b9a4495bb4e36b8131724eaefa0cc", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or, run it programmatically" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "469f3ad4c6444e95a70106eb1fc5861f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Tab(children=(Output(), Output(), Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "out_list = [\n", - " 'distance_by_cudf.distance_df',\n", - " 'distance_by_numba.distance_df',\n", - " 'distance_by_cupy.distance_df'\n", - "]\n", - "cache_load = {\"points_task\": {\"load\": {'points_df_out': points_df}}}\n", - "(df_w_cudf, df_w_numba, df_w_cupy) = task_graph.run(out_list, replace=cache_load)\n", - "task_graph.run(out_list, replace=cache_load, formated=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use `verify` function defined above to verify the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Max Difference cudf to numba: 2.220446049250313e-16\n", - "Max Difference cudf to cupy: 2.220446049250313e-16\n" - ] - } - ], - "source": [ - "mdiff = verify(df_w_cudf['distance_cudf'], df_w_numba['distance_numba'])\n", - "print('Max Difference cudf to numba: {}'.format(mdiff))\n", - "mdiff = verify(df_w_cudf['distance_cudf'], df_w_cupy['distance_cupy'])\n", - "print('Max Difference cudf to cupy: {}'.format(mdiff))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To illustrate multi-input nodes let's create a verify node." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "class VerifyNode(Node):\n", - "\n", - " def ports_setup(self):\n", - " input_ports = {\n", - " 'df1': {\n", - " PortsSpecSchema.port_type: [cudf.DataFrame,\n", - " dask_cudf.DataFrame]\n", - " },\n", - " 'df2': {\n", - " PortsSpecSchema.port_type: [cudf.DataFrame,\n", - " dask_cudf.DataFrame]\n", - " }\n", - " }\n", - " output_ports = {\n", - " 'max_diff': {\n", - " PortsSpecSchema.port_type: float\n", - " }\n", - " }\n", - "\n", - " connections = self.get_connected_inports() \n", - " for key in input_ports:\n", - " if key in connections:\n", - " # connected\n", - " types = connections[key]\n", - " input_ports[key].update({PortsSpecSchema.port_type: types})\n", - " return NodePorts(inports=input_ports, outports=output_ports)\n", - "\n", - " def meta_setup(self):\n", - " required ={\n", - " \"df1\": {},\n", - " \"df2\": {}\n", - " }\n", - " return MetaData(inports=required, outports={'max_diff': {}})\n", - "\n", - " def conf_schema(self):\n", - " json = {\n", - " \"title\": \"VerifyNode configure\",\n", - " \"type\": \"object\",\n", - " \"properties\": {\n", - " \"df1_col\": {\n", - " \"type\": \"string\",\n", - " \"description\": \"dataframe1 column name\"\n", - " },\n", - " \"df2_col\": {\n", - " \"type\": \"string\",\n", - " \"description\": \"dataframe2 column name\"\n", - " }\n", - " },\n", - " \"required\": [\"df1_col\", \"df2_col\"],\n", - " }\n", - "\n", - " ui = {\n", - " \"df1_col\": {\"ui:widget\": \"text\"},\n", - " \"df2_col\": {\"ui:widget\": \"text\"}\n", - " }\n", - " return ConfSchema(json=json, ui=ui)\n", - "\n", - " def process(self, inputs):\n", - " df1 = inputs['df1']\n", - " df2 = inputs['df2']\n", - " col_df1 = self.conf['df1_col']\n", - " col_df2 = self.conf['df2_col']\n", - "\n", - " df1_col = df1[col_df1]\n", - " if isinstance(df1, dask_cudf.DataFrame):\n", - " # df1_col = df1_col.compute()\n", - " pass\n", - "\n", - " df2_col = df2[col_df2]\n", - " if isinstance(df2, dask_cudf.DataFrame):\n", - " # df2_col = df2_col.compute()\n", - " pass\n", - "\n", - " max_difference = (df1_col - df2_col).abs().max()\n", - "\n", - " if isinstance(max_difference, dask.dataframe.core.Scalar):\n", - " max_difference = float(max_difference.compute())\n", - " max_difference = float(max_difference)\n", - " return {'max_diff': max_difference}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Register the `VerifyNode`:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "TaskGraph.register_lab_node(module_name, VerifyNode)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define the full Taskgraph:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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2LEjtmzZInUcIqInweGliYhIeh999BHOnTuHffv2SR2FKvD2229DpVJhxYoVUkchInpibNEhIqI64YUXXoBSqcSBAwekjkL3WblyJd566y3s2bMHQUFBUschInpSbNEhIqK6Yc6cOTh48CCioqKkjkL/k5SUhHfffRfvv/8+ixwi0jts0SEiojojICAATZo0wbZt26SO0uAplUoEBgairKwMx44dg7GxsdSRiIieBlt0iIio7pg5cya2b9+OixcvSh2lwfv0009x4cIF/P777yxyiEgvsUWHiIjqDCEEfHx84Ofnh7Vr10odp8E6cuQIevfujf/+97+YOHGi1HGIiCqDw0sTEVHdsm7dOowbNw7x8fFo2bKl1HEaHIVCAT8/P/j5+bELIRHpM3ZdIyKiumXkyJFwd3fH999/L3WUBmny5MkoLi7Gzz//LHUUIqIqYaFDRER1ioGBAWbMmIGVK1fi1q1bUsdpUH777TeEhYVh1apVcHR0lDoOEVGVsNAhIqI654033kCjRo2wePFiqaM0GFevXsXUqVPx7rvvYsCAAVLHISKqMl6jQ0REddLXX3+NhQsX4vr167C1tZU6Tr2mVCrRo0cP5OXlITo6GqamplJHIiKqKl6jQ0REddOkSZMgl8uxdOlSqaPUe/Pnz0dMTAzWr1/PIoeI6g0WOkREVCdZW1tj8uTJ+P7771FQUCB1nHorMjISCxYswL///W94e3tLHYeIqNqw6xoREdVZWVlZaN68Ob788ku88847Usepd3JycuDn54c2bdpg165dkMlkUkciIqou7LpGRER1l729Pd544w18++23KC0tlTpOvTNlyhQUFhbi119/ZZFDRPUOCx0iIqrTPvjgA9y+fRsbNmyQOkq98ueff2L9+vVYuXIlnJycpI5DRFTt2HWNiIjqvHHjxuHEiROIjY2FXM7f6KoqJSUFvr6+CA0NxQ8//CB1HCKimrCLhQ4REdV5cXFx8PLywp9//omQkBCp4+g1tVqNPn36IDMzE6dOnYKZmZnUkYiIagKv0SEiorqvTZs2GDRoEL744gvw97mq+eKLL3D8+HGsX7+eRQ4R1WssdIiISC/MmTMHMTEx2L9/v9RR9FZ0dDS++OILfPPNN/D19ZU6DhFRjWLXNSIi0hvPP/881Go1i51KyM/PR4cOHeDh4YHdu3dzlDUiqu/YdY2I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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "verify_tspec = {\n", - " TaskSpecSchema.task_id: 'verify_cudf_to_numba',\n", - " TaskSpecSchema.node_type: VerifyNode,\n", - " TaskSpecSchema.conf: {\n", - " 'df1_col': 'distance_cudf',\n", - " 'df2_col': 'distance_numba'\n", - " }, \n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {\n", - " 'df1': 'distance_by_cudf.distance_df',\n", - " 'df2': 'distance_by_numba.distance_df'\n", - " }\n", - "}\n", - "\n", - "verify_tspec2 = {\n", - " TaskSpecSchema.task_id: 'verify_cudf_to_cupy',\n", - " TaskSpecSchema.node_type: VerifyNode,\n", - " TaskSpecSchema.conf: {\n", - " 'df1_col': 'distance_cudf',\n", - " 'df2_col': 'distance_cupy'\n", - " },\n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {\n", - " 'df1': 'distance_by_cudf.distance_df',\n", - " 'df2': 'distance_by_cupy.distance_df'\n", - " }\n", - "}\n", - "out_spec = {\n", - " TaskSpecSchema.task_id: '',\n", - " TaskSpecSchema.node_type: \"Output_Collector\",\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.inputs: {\n", - " 'in0': 'verify_cudf_to_numba.max_diff',\n", - " 'in1': 'verify_cudf_to_cupy.max_diff'\n", - " }\n", - "}\n", - "\n", - "task_list = [\n", - " points_tspec,\n", - " cudf_distance_tspec,\n", - " numba_distance_tspec,\n", - " cupy_distance_tspec,\n", - " out_spec,\n", - " verify_tspec, \n", - " verify_tspec2\n", - "]\n", - "task_graph = TaskGraph(task_list)\n", - "task_graph.draw(show='ipynb', show_ports=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "2662f2c4647b4c029eb99776b56cc290", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Max Difference cudf to numba: 2.220446049250313e-16\n", - "Max Difference cudf to cupy: 2.220446049250313e-16\n" - ] - } - ], - "source": [ - "(max_cudf_to_numba_diff, max_cudf_to_cupy_diff) = task_graph.run([\n", - " 'verify_cudf_to_numba.max_diff',\n", - " 'verify_cudf_to_cupy.max_diff'\n", - "])\n", - "print('Max Difference cudf to numba: {}'.format(max_cudf_to_numba_diff))\n", - "print('Max Difference cudf to cupy: {}'.format(max_cudf_to_cupy_diff))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dask distributed computation\n", - "\n", - "Using Dask and `dask-cudf` we can run the Nodes with customized GPU kernels on distributed dataframes. Under the hood of the `Node` class the Dask delayed processing API is handled for cudf dataframes when the `self.delayed_process = True` flag is set.\n", - "\n", - "We first start a distributed Dask environment. When a dask client is instantiated it registers itself as the default Dask scheduler (). Therefore all subsequent Dask distibuted dataframe operations will run in distributed fashion." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

Client

\n", - "\n", - "
\n", - "

Cluster

\n", - "
    \n", - "
  • Workers: 2
  • \n", - "
  • Cores: 2
  • \n", - "
  • Memory: 100.00 GB
  • \n", - "
\n", - "
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from dask_cuda import LocalCUDACluster\n", - "from dask.distributed import Client\n", - "\n", - "cluster = LocalCUDACluster()\n", - "client = Client(cluster)\n", - "client" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The Dask status page can be displayed in a web browser at `:8787`. The ip-address corresponds to the machine where the dask cluster (scheduler) was launched. Most likely same ip-address as where this jupyter notebook is running. Using the Dask status page is convenient for monitoring dask distributed processing. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The next step is to partition the `cudf` dataframe into a `dask_cudf` dataframe. Here we make the number of partitions corresponding to the number of workers:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "class DistributedNode(Node):\n", - "\n", - " def ports_setup(self):\n", - " input_ports = {\n", - " 'points_df_in': {\n", - " PortsSpecSchema.port_type: cudf.DataFrame\n", - " }\n", - " }\n", - "\n", - " output_ports = {\n", - " 'points_ddf_out': {\n", - " PortsSpecSchema.port_type: dask_cudf.DataFrame\n", - " }\n", - " }\n", - "\n", - " return NodePorts(inports=input_ports, outports=output_ports)\n", - "\n", - " def init(self):\n", - " pass\n", - "\n", - " def meta_setup(self,):\n", - " cols_required = {\n", - " 'x': 'float64',\n", - " 'y': 'float64'\n", - " }\n", - " required = {\n", - " 'points_df_in': cols_required,\n", - " 'points_ddf_out': cols_required\n", - " }\n", - " input_meta = self.get_input_meta()\n", - " output_cols = ({\n", - " 'points_ddf_out': {\n", - " 'x': 'float64',\n", - " 'y': 'float64'\n", - " }\n", - " })\n", - " if 'points_df_in' in input_meta:\n", - " col_from_inport = input_meta['points_df_in']\n", - " # additional ports\n", - " output_cols['points_ddf_out'].update(col_from_inport)\n", - " return MetaData(inports=required, outports=output_cols)\n", - "\n", - " def conf_schema(self):\n", - " json = {\n", - " \"title\": \"DistributedNode configure\",\n", - " \"type\": \"object\",\n", - " \"properties\": {\n", - " \"npartitions\": {\n", - " \"type\": \"number\",\n", - " \"description\": \"num of partitions in the Dask dataframe\",\n", - " \"minimum\": 1\n", - " }\n", - " },\n", - " \"required\": [\"npartitions\"],\n", - " }\n", - "\n", - " ui = {\n", - " \"npartitions\": {\"ui:widget\": \"updown\"}\n", - " }\n", - " return ConfSchema(json=json, ui=ui)\n", - "\n", - " def process(self, inputs):\n", - " npartitions = self.conf['npartitions']\n", - " df = inputs['points_df_in']\n", - " ddf = dask_cudf.from_cudf(df, npartitions=npartitions)\n", - " return {'points_ddf_out': ddf}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Register it:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "TaskGraph.register_lab_node(module_name, DistributedNode)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We add this distribution node to the computation graph to convert `cudf` dataframes into `dask-cudf` dataframes. The `dask-cudf` dataframes are handled automatically in gQuant when `self.delayed_process=True` within a `Node` implementation (setup in `meta_setup`). When using nodes with ports with `self.delayed_process=True` setting, it is required that all input and output ports be of type `cudf.DataFrame`. Otherwise don't set `self.delayed_process` and one can write custom logic to handle distributed dataframes (refer to `VerifyNode` abover for an example where `dask_cudf` dataframes are handled directly within the process method)." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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SkqKCAoKEkqlUnTt2lWsWbNGt+7s2bNi7ty5ol+/fsLCwkLY2tqKoUOHinXr1gmtVtumObnb/goLC8XcuXNF165dhampqXBychKzZs0Sb731li57QEBAi7N9//33jV77qlWrmpyrGTNmtOn13I/8/Hxhb28v5s2b99D3TR3G+zIhmrjImoiIiOgRVFVVhYEDB6JLly6IjY2Fubn5Q92/v78/ioqKkJWV9VD3Sx1fTU0Nxo0bhxs3buDs2bOwtraWOhJJYzkvoSQiIiL6LwsLC+zYsQOpqal4/PHHoVarpY5EhJqaGkyZMgVnzpzBjh07WN4ecSxwRERERLfp06cP9u/fjxMnTiAoKAjXrl2TOhI9wrKysjBq1CgcPnwYe/fuha+vr9SRSGIscERERER3CAgIwG+//Yba2lr4+/s/sO8xa7BixQrIZDKcO3cO2dnZkMlkePvttx/oPqXS8F1td/tZtmyZ1DE7hNjYWAQGBqKkpATHjh3D0KFDpY5EHQA/A0dERETUjOrqavztb3/D119/jRdeeAHvv/++7gu1iR6U4uJivP3221i7di2eeuop/Pvf/4alpaXUsahj4GfgiIiIiJqjUCiwfv16/PDDD9izZw969+6NlStXora2Vupo1AnV1dXhs88+Q69evbBjxw5s2LABmzdvZnkjPSxwRERERPcwdepUpKSkYN68eXj77bfh7e2NdevWSfp9YNR51NTUYP369fD19cUbb7yBOXPmIDU1Fc8++6zU0agDYoEjIiIiagGlUol33nkHycnJCA4OxiuvvIIePXrggw8+QGlpqdTxyADdunULH3/8MXr27ImXXnoJQ4cOxcWLF/Hhhx/CyspK6njUQfEzcERERERtkJubi08//RT//ve/odVqMXXqVMyaNQsjRoyATCaTOh51YPHx8di4cSN++OEHaLVazJkzBwsWLIC7u7vU0ajjW84CR0RERHQfbt26hfXr12PDhg04f/48vLy8MHPmTDz77LPo1q2b1PGog8jKysI333yDjRs3IjU1Ff3798esWbPwwgsvwMbGRup4ZDhY4IiIiIjaS1JSEr755hts2LABBQUF8Pb2xpQpUzBx4kQEBARIHY8esoyMDMTExGDXrl04dOgQLC0tMXXqVDzzzDMYOXKk1PHIMLHAEREREbW3mpoa7Nu3Dzt27EBMTAzy8/Ph5eWF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bPbzKv7+/igqKkJWVtZDTkaGYt++fQgPD8e3336L6dOn663j8UP3aTk/A0dERER0m8LCQjg4OEgdgwzYuHHj8PLLL+Nvf/tbo89CEd0vFjgiIiKi29y8eRO2trZSxyAD989//hP29vb461//KnUU6mRY4IiIiIhuU1JS0mSBW7FiBWQyGc6dO4fs7GzIZDK8/fbbEiR88GQy2T1/li1bZvD7fJAUCgW++uorxMTEYMuWLTx+Oti/pSFkbA4/A0dERER0myeffBLGxsbYsmWL1FGoE5g7dy5++uknJCcn89Jcag/8DBwRERHR7bRaLYyNjaWOQZ3Exx9/DHNzc7z++utSR6FOggWOiIiI6Da8OInak7W1Nb788kt88803iImJkToOdQIscERERER3kMlkUkegTiQiIgLTpk3Dyy+/jPLycqnjkIFjgSMiIiK6jZGREerr66WOQZ3M559/jurqaixevFjqKGTgWOCIiIiIbmNpaYmKigqpY1AnY29vj08++QRffPEFjh8/LnUcMmAscERERES3sbKy4mVu9EA888wzGDNmDF566SXU1dVJHYcMFAscERER0W2srKx4Bo4emDVr1uDy5cv4/PPPpY5CBooFjoiIiOg2tra2KC4uljoGdVJeXl5YuHAhli5diuzsbKnjkAFigSMiIiK6jYuLC3Jzc/l1AvTALF68GA4ODnjjjTekjkIGiAWOiIiI6DYuLi6oqalBSUkJ6uvrcenSJWzevBnLli2TOhp1EgqFAmvWrMH333+PgwcP6q2rrKzE+++/z/+BQM2SCR4dRERERKirq0NycjL27NmD1atXw9HREampqaiurgYA+Pr64vz58xKnpM5k0qRJSElJwYULF2BqaoqNGzdi0aJFKCwsRHp6Onr27Cl1ROp4lptInYCIiIhISosWLcK+ffuQnJyMmpoaGBsbQy6XIycnRzfGyMgI/fr1kzAldUaff/45vL298corryAhIQFJSUm6M2/nz59ngaMm8RJKIiIieqQ5ODjg7NmzqKmpAQDU19frzro1MDU1Ra9evaSIR52YRqOBl5cX1q1bh0uXLkGr1UIIAblcjgsXLkgdjzooFjgiIiJ6pM2fPx+enp4wNjZudkxdXR0LHLWbmzdv4q233oKPjw+Sk5MBQO974erq6nDu3Dmp4lEHxwJHREREjzRTU1N8+eWXqK+v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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "npartitions = len(client.scheduler_info()['workers'])\n", - "\n", - "\n", - "distribute_tspec = {\n", - " TaskSpecSchema.task_id: 'distributed_points',\n", - " TaskSpecSchema.node_type: DistributedNode,\n", - " TaskSpecSchema.conf: {'npartitions': npartitions},\n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'points_task.points_df_out'\n", - " }\n", - "}\n", - "\n", - "dask_cudf_distance_tspec = {\n", - " TaskSpecSchema.task_id: 'distance_by_cudf',\n", - " TaskSpecSchema.node_type: DistanceNode,\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'distributed_points.points_ddf_out'\n", - " }\n", - "}\n", - "\n", - "dask_numba_distance_tspec = {\n", - " TaskSpecSchema.task_id: 'distance_by_numba',\n", - " TaskSpecSchema.node_type: NumbaDistanceNode,\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'distributed_points.points_ddf_out'\n", - " }\n", - "}\n", - "\n", - "dask_cupy_distance_tspec = {\n", - " TaskSpecSchema.task_id: 'distance_by_cupy',\n", - " TaskSpecSchema.node_type: CupyDistanceNode,\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.module: module_name,\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'distributed_points.points_ddf_out'\n", - " }\n", - "}\n", - "\n", - "out_spec = {\n", - " TaskSpecSchema.task_id: '',\n", - " TaskSpecSchema.node_type: \"Output_Collector\",\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.inputs: {\n", - " 'in0': 'distributed_points.points_ddf_out',\n", - " 'in1': 'distance_by_cudf.distance_df',\n", - " 'in2': 'distance_by_numba.distance_df',\n", - " 'in3': 'distance_by_cupy.distance_df'\n", - " }\n", - "}\n", - "\n", - "\n", - "task_list = [\n", - " points_tspec,\n", - " distribute_tspec,\n", - " dask_cudf_distance_tspec,\n", - " dask_numba_distance_tspec,\n", - " dask_cupy_distance_tspec,\n", - " out_spec\n", - "]\n", - "\n", - "task_graph = TaskGraph(task_list)\n", - "task_graph.draw(show='ipynb', show_ports=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "c4e4038195864d72803fac1d3971937b", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the distributed computation programmatically:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "out_list = [\n", - " 'distributed_points.points_ddf_out',\n", - " 'distance_by_cudf.distance_df',\n", - " 'distance_by_numba.distance_df',\n", - " 'distance_by_cupy.distance_df'\n", - "]\n", - "\n", - "(points_ddf, ddf_w_cudf, ddf_w_numba, ddf_w_cupy) = task_graph.run(out_list)\n", - "df_w_cudf = ddf_w_cudf.compute()\n", - "df_w_numba = ddf_w_numba.compute()\n", - "df_w_cupy = ddf_w_cupy.compute()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Verify the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HEAD points_ddf:\n", - " x y\n", - "0 0.017881 0.460670\n", - "1 0.184132 0.864031\n", - "2 0.241513 0.956813\n", - "3 0.336786 0.975579\n", - "4 0.767782 0.330257\n", - "\n", - "HEAD df_w_cudf:\n", - " x y distance_cudf\n", - "0 0.017881 0.460670 0.461017\n", - "1 0.184132 0.864031 0.883433\n", - "2 0.241513 0.956813 0.986823\n", - "3 0.336786 0.975579 1.032075\n", - "4 0.767782 0.330257 0.835799\n", - "\n", - "HEAD df_w_numba:\n", - " x y distance_numba\n", - "0 0.017881 0.460670 0.461017\n", - "1 0.184132 0.864031 0.883433\n", - "2 0.241513 0.956813 0.986823\n", - "3 0.336786 0.975579 1.032075\n", - "4 0.767782 0.330257 0.835799\n", - "\n", - "HEAD df_w_cupy:\n", - " x y distance_cupy\n", - "0 0.017881 0.460670 0.461017\n", - "1 0.184132 0.864031 0.883433\n", - "2 0.241513 0.956813 0.986823\n", - "3 0.336786 0.975579 1.032075\n", - "4 0.767782 0.330257 0.835799\n", - "\n", - "Max Difference cudf to numba: 2.220446049250313e-16\n", - "Max Difference cudf to cupy: 2.220446049250313e-16\n" - ] - } - ], - "source": [ - "verify_cudf_numba_tspec = verify_tspec.copy()\n", - "verify_cudf_cupy_tspec = verify_tspec2.copy()\n", - "\n", - "task_graph.extend(\n", - " [verify_cudf_numba_tspec,\n", - " verify_cudf_cupy_tspec],\n", - " replace=True)\n", - "task_graph.draw(show='ipynb', show_ports=True)\n", - "\n", - "# Use results above and avoid re-running dask\n", - "replace_spec = {\n", - " 'distance_by_cudf': {\n", - " TaskSpecSchema.load: {\n", - " 'distance_df': ddf_w_cudf\n", - " }\n", - " },\n", - " 'distance_by_numba': {\n", - " TaskSpecSchema.load: {\n", - " 'distance_df': ddf_w_numba\n", - " }\n", - " },\n", - " 'distance_by_cupy': {\n", - " TaskSpecSchema.load: {\n", - " 'distance_df': ddf_w_cupy\n", - " }\n", - " }\n", - "}\n", - "\n", - "(max_cudf_to_numba_diff, max_cudf_to_cupy_diff) = task_graph.run(\n", - " ['verify_cudf_to_numba.max_diff',\n", - " 'verify_cudf_to_cupy.max_diff'],\n", - " replace=replace_spec\n", - ")\n", - "\n", - "print('HEAD points_ddf:\\n{}\\n'.format(points_ddf.head()))\n", - "print('HEAD df_w_cudf:\\n{}\\n'.format(ddf_w_cudf.head()))\n", - "print('HEAD df_w_numba:\\n{}\\n'.format(ddf_w_numba.head()))\n", - "print('HEAD df_w_cupy:\\n{}\\n'.format(ddf_w_cupy.head()))\n", - "print('Max Difference cudf to numba: {}'.format(max_cudf_to_numba_diff))\n", - "print('Max Difference cudf to cupy: {}'.format(max_cudf_to_cupy_diff))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One limitation to be aware of when using customized kernels within Nodes in the Dask environment, is that each GPU kernel works on one partition of the dataframe. Therefore if the computation depends on other partitions of the dataframe the approach above does not work." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Saving Custom Nodes and Kernels\n", - "\n", - "The gQuant examples already implement a number of `Nodes`. These can be found in `gquant.plugin_nodes` submodules.\n", - "\n", - "The customized kernels and nodes can be saved to your own python modules for future re-use instead of having to re-define them at runtime. The nodes we defined above were to a written to a python module \"custom_port_nodes.py\" (the `DistanceNode` was simplified to ommit the absolute distance calculation). We will re-run our workflow importing the Nodes from the custom module we wrote out.\n", - "\n", - "When defining the tasks we specify `filepath` for the path to the python module that has the Node definition. Notice, that the `node_type` is specified as a string instead of class. The string is the class name of the node that will be imported for running a task." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "npartitions = len(client.scheduler_info()['workers'])\n", - "\n", - "points_tspec = {\n", - " TaskSpecSchema.task_id: 'points_task',\n", - " TaskSpecSchema.node_type: 'PointNode',\n", - " TaskSpecSchema.filepath: '/home/quant/gQuant/notebooks/custom_port_nodes.py',\n", - " TaskSpecSchema.conf: {'npts': 1000},\n", - " TaskSpecSchema.inputs: {},\n", - "}\n", - "\n", - "distribute_tspec = {\n", - " TaskSpecSchema.task_id: 'distributed_points',\n", - " TaskSpecSchema.node_type: 'DistributedNode',\n", - " TaskSpecSchema.filepath: '/home/quant/gQuant/notebooks/custom_port_nodes.py',\n", - " TaskSpecSchema.conf: {'npartitions': npartitions},\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'points_task.points_df_out'\n", - " }\n", - "}\n", - "\n", - "dask_cudf_distance_tspec = {\n", - " TaskSpecSchema.task_id: 'distance_by_cudf',\n", - " TaskSpecSchema.node_type: 'DistanceNode',\n", - " TaskSpecSchema.filepath: '/home/quant/gQuant/notebooks/custom_port_nodes.py',\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'distributed_points.points_ddf_out'\n", - " }\n", - "}\n", - "\n", - "dask_numba_distance_tspec = {\n", - " TaskSpecSchema.task_id: 'distance_by_numba',\n", - " TaskSpecSchema.node_type: 'NumbaDistanceNode',\n", - " TaskSpecSchema.filepath: '/home/quant/gQuant/notebooks/custom_port_nodes.py',\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'distributed_points.points_ddf_out'\n", - " }\n", - "}\n", - "\n", - "dask_cupy_distance_tspec = {\n", - " TaskSpecSchema.task_id: 'distance_by_cupy',\n", - " TaskSpecSchema.node_type: 'CupyDistanceNode',\n", - " TaskSpecSchema.filepath: '/home/quant/gQuant/notebooks/custom_port_nodes.py',\n", - " TaskSpecSchema.conf: {},\n", - " TaskSpecSchema.inputs: {\n", - " 'points_df_in': 'distributed_points.points_ddf_out'\n", - " }\n", - "}\n", - "\n", - "verify_cudf_to_numba_tspec = {\n", - " TaskSpecSchema.task_id: 'verify_cudf_to_numba',\n", - " TaskSpecSchema.node_type: 'VerifyNode',\n", - " TaskSpecSchema.filepath: '/home/quant/gQuant/notebooks/custom_port_nodes.py',\n", - " TaskSpecSchema.conf: {\n", - " 'df1_col': 'distance_cudf',\n", - " 'df2_col': 'distance_numba'\n", - " }, \n", - " TaskSpecSchema.inputs: {\n", - " 'df1': 'distance_by_cudf.distance_df',\n", - " 'df2': 'distance_by_numba.distance_df'\n", - " }\n", - "}\n", - "\n", - "verify_cudf_to_cupy_tspec = {\n", - " TaskSpecSchema.task_id: 'verify_cudf_to_cupy',\n", - " TaskSpecSchema.node_type: 'VerifyNode',\n", - " TaskSpecSchema.filepath: '/home/quant/gQuant/notebooks/custom_port_nodes.py',\n", - " TaskSpecSchema.conf: {\n", - " 'df1_col': 'distance_cudf',\n", - " 'df2_col': 'distance_cupy'\n", - " }, \n", - " TaskSpecSchema.inputs: {\n", - " 'df1': 'distance_by_cudf.distance_df',\n", - " 'df2': 'distance_by_cupy.distance_df'\n", - " }\n", - "}\n", - "\n", - "task_list = [\n", - " points_tspec,\n", - " distribute_tspec,\n", - " dask_cudf_distance_tspec,\n", - " dask_numba_distance_tspec,\n", - " dask_cupy_distance_tspec,\n", - " verify_cudf_to_numba_tspec,\n", - " verify_cudf_to_cupy_tspec\n", - "]\n", - "\n", - "task_graph = TaskGraph(task_list)\n", - "task_graph.draw(show='ipynb', show_ports=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "75d07ac3c6274bf19dc453c8f0407eda", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HEAD df_w_cudf:\n", - " x y distance_cudf\n", - "0 0.438593 0.505563 0.669296\n", - "1 0.714780 0.531261 0.890589\n", - "2 0.174467 0.734742 0.755171\n", - "3 0.964969 0.986593 1.380048\n", - "4 0.631274 0.819636 1.034558\n", - "\n", - "HEAD df_w_numba:\n", - " x y distance_numba\n", - "0 0.438593 0.505563 0.669296\n", - "1 0.714780 0.531261 0.890589\n", - "2 0.174467 0.734742 0.755171\n", - "3 0.964969 0.986593 1.380048\n", - "4 0.631274 0.819636 1.034558\n", - "\n", - "HEAD df_w_cupy:\n", - " x y distance_cupy\n", - "0 0.438593 0.505563 0.669296\n", - "1 0.714780 0.531261 0.890589\n", - "2 0.174467 0.734742 0.755171\n", - "3 0.964969 0.986593 1.380048\n", - "4 0.631274 0.819636 1.034558\n", - "\n", - "Max Difference cudf to numba: 2.220446049250313e-16\n", - "Max Difference cudf to cupy: 2.220446049250313e-16\n" - ] - } - ], - "source": [ - "out_list = [\n", - " 'distance_by_cudf.distance_df',\n", - " 'distance_by_numba.distance_df',\n", - " 'distance_by_cupy.distance_df',\n", - " 'verify_cudf_to_numba.max_diff',\n", - " 'verify_cudf_to_cupy.max_diff'\n", - "]\n", - "\n", - "(ddf_w_cudf, ddf_w_numba, ddf_w_cupy,\n", - " mdiff_cudf_to_numba, mdiff_cudf_to_cupy) = task_graph.run(out_list)\n", - "\n", - "print('HEAD df_w_cudf:\\n{}\\n'.format(ddf_w_cudf.head()))\n", - "print('HEAD df_w_numba:\\n{}\\n'.format(ddf_w_numba.head()))\n", - "print('HEAD df_w_cupy:\\n{}\\n'.format(ddf_w_cupy.head()))\n", - "print('Max Difference cudf to numba: {}'.format(mdiff_cudf_to_numba))\n", - "print('Max Difference cudf to cupy: {}'.format(mdiff_cudf_to_cupy))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final illustration is how to save and load a task graph to a file for re-use." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "task_graph.save_taskgraph('custom_wflow.gq.yaml')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The gQuant TaskGraph file is created and saved. You can double click on it to open it up in the JupyterLab to edit it.\n", - "\n", - "Or you can display it by gQuant widget and play with it interactively " - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "5a0fa6ed517045268a59f0049393b31a", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'points_task'), ('type', 'PointNode'), ('conf', {'npts': 1…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph('custom_wflow.gq.yaml')\n", - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course you can run it by callign `run` method." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3bffa81276594ac2a655de9e7ee62fb3", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Tab(children=(Output(), Output(), Output(), Output(), Output(), Output(layout=Layout(border='1px solid black')…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "# update npartitions in case the scheduler is running with\n", - "# different number of workers than what was saved.\n", - "npartitions = len(client.scheduler_info()['workers'])\n", - "replace_spec = {\n", - " 'distributed_points': {\n", - " TaskSpecSchema.conf: {'npartitions': npartitions},\n", - " }\n", - "}\n", - "\n", - "out_list = [\n", - " 'distance_by_cudf.distance_df',\n", - " 'distance_by_numba.distance_df',\n", - " 'distance_by_cupy.distance_df',\n", - " 'verify_cudf_to_numba.max_diff',\n", - " 'verify_cudf_to_cupy.max_diff'\n", - "]\n", - "\n", - "task_graph.run(out_list, replace=replace_spec, formated=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HEAD df_w_cudf:\n", - " x y distance_cudf\n", - "0 0.438593 0.505563 0.669296\n", - "1 0.714780 0.531261 0.890589\n", - "2 0.174467 0.734742 0.755171\n", - "3 0.964969 0.986593 1.380048\n", - "4 0.631274 0.819636 1.034558\n", - "\n", - "HEAD df_w_numba:\n", - " x y distance_numba\n", - "0 0.438593 0.505563 0.669296\n", - "1 0.714780 0.531261 0.890589\n", - "2 0.174467 0.734742 0.755171\n", - "3 0.964969 0.986593 1.380048\n", - "4 0.631274 0.819636 1.034558\n", - "\n", - "HEAD df_w_cupy:\n", - " x y distance_cupy\n", - "0 0.438593 0.505563 0.669296\n", - "1 0.714780 0.531261 0.890589\n", - "2 0.174467 0.734742 0.755171\n", - "3 0.964969 0.986593 1.380048\n", - "4 0.631274 0.819636 1.034558\n", - "\n" - ] - } - ], - "source": [ - "\n", - "print('HEAD df_w_cudf:\\n{}\\n'.format(ddf_w_cudf.head()))\n", - "print('HEAD df_w_numba:\\n{}\\n'.format(ddf_w_numba.head()))\n", - "print('HEAD df_w_cupy:\\n{}\\n'.format(ddf_w_cupy.head()))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Conclusion\n", - "\n", - "Using customized GPU kernels allows data scientists to implement and incorporate advanced algorithms. We demonstrated implementations using Numba and CuPy.\n", - "\n", - "The Numba approach enables data scientists to write GPU kernels directly in the Python language. Numba is easy to use for implementing and accelerating computations. However there is some overhead incurred for compiling the kernels whenever the Numba GPU kernels are used for the first time in a Python process. Currently Numba library only supports primitive data types. Some advanced CUDA programming features, such as function pointers and function recursions are not supported. \n", - "\n", - "The Cupy method is very flexible, because data scientists are writing C/C++ GPU kernels with CUDA directly. All the CUDA programming features are supported. CuPy compiles the kernel and caches the device code to the filesystem. The launch overhead is low. Also, the GPU kernel is built statically resulting in runtime efficiency. However it might be harder for data scientists to use, because C/C++ programming is more complicated. \n", - "\n", - "Below is a brief summary comparison table:\n", - "\n", - "| Methods | Development Difficulty | Flexibility | Efficiency | Latency |\n", - "|---|---|---|---|---|\n", - "| Numba method | medium | medium | low | high |\n", - "| CuPy method | hard | high | high | low |\n", - "\n", - "We recommend that the data scientists select the approach appropriate for their task taking into consideration the efficiency, latency, difficulty and flexibility of their workflow. \n", - "\n", - "In this blog, we showed how to wrap the customized GPU kernels in gQuant nodes. Also, by taking advantage of having the gQuant handle the low-level Dask interfaces for the developer, we demonstrated how to use the gQuant workflow with Dask distributed computations." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "# Clean up\n", - "\n", - "# Shutdown the Dask cluster\n", - "client.close()\n", - "cluster.close()" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'status': 'ok', 'restart': True}" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import IPython\n", - "app = IPython.Application.instance()\n", - "app.kernel.do_shutdown(True)\n" - ] - }, - { - "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.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/06_xgboost_trade.ipynb b/notebooks/06_xgboost_trade.ipynb deleted file mode 100644 index 30529fd0..00000000 --- a/notebooks/06_xgboost_trade.ipynb +++ /dev/null @@ -1,1277 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Trade with XGBoost algorithm\n", - "## Background\n", - "In the [portfolio trade example](https://github.com/rapidsai/gQuant/blob/master/notebooks/04_portfolio_trade.ipynb), we use gQuant to backtest a simple mean reversion trading strategy on 5000 stocks.\n", - "It shows decent performance by tweaking the moving average window size. Searching for alpha signal is the ultimate goal for the trading companies. A lot of different methods are used to do so. Machine learning approach\n", - "is one of those. It has the benefits of extracting important information in the data automatically given enough computation. There are a few popular machine learning algrithoms, including SVM, Random forest tree etc. Amoung those, XGBoost is known to be a very powerful machine \n", - "learning method that is winning a lot of [ML competitions](https://medium.com/syncedreview/tree-boosting-with-xgboost-why-does-xgboost-win-every-machine-learning-competition-ca8034c0b283). Luckily, the [RAPIDS library](https://github.com/rapidsai) accelerates the XGBoost ML algorithm in the GPU so that we can easily take advantage of it in the gQuant. \n", - "\n", - "In this notebook, we are going to demo how to use gQuant to backtest a XGBoost based trading stragty.\n", - "\n", - "\n", - "## Environment Preparation\n", - "\n", - "### Download the example Datasets\n", - "Before getting started, let's download the example datasets if not presen" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dataset is already present. No need to re-download it.\n" - ] - } - ], - "source": [ - "! ((test ! -f './data/stock_price_hist.csv.gz' || test ! -f './data/security_master.csv.gz') && \\\n", - " cd .. && bash download_data.sh) || echo \"Dataset is already present. No need to re-download it.\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Prepare for running in Dask environment\n", - "\n", - "Let's start the Dask local cluster environment for distributed computation.\n", - "\n", - "Dask provides a web-based dashboard to help to track progress, identify performance issues, and debug failures. To learn more about Dask dashboard, just follow this [link](https://distributed.dask.org/en/latest/web.html).\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

Client

\n", - "\n", - "
\n", - "

Cluster

\n", - "
    \n", - "
  • Workers: 2
  • \n", - "
  • Cores: 2
  • \n", - "
  • Memory: 100.00 GB
  • \n", - "
\n", - "
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Start the Dask local cluster environment for distrubuted computation\n", - "from dask_cuda import LocalCUDACluster\n", - "from dask.distributed import Client\n", - "\n", - "cluster = LocalCUDACluster()\n", - "client = Client(cluster)\n", - "client\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Though our stock dataset is small enough to fit in a single 16G GPU, to show how to do distributed computation, we will split the dataframe into small pieces to be loaded by different workers in the cluster.\n", - "\n", - "Notice this step is need only if the dataset is not split in multiple files yet.\n", - "\n", - "First use this simple taskgraph to load data then sort it by the asset id and datatime:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "4d38e117bbd3413590030532513d321b", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import sys; sys.path.insert(0, '..')\n", - "import warnings\n", - "from gquant.dataframe_flow import TaskGraph\n", - "import ipywidgets as widgets\n", - "import os\n", - "warnings.simplefilter(\"ignore\")\n", - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/sort_stocks.gq.yaml')\n", - "input_cached, = task_graph.run()\n", - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "convert the sorted stock data into partitions and save it into csv files. Note, the data is slited in a way that the same asset belongs to the same partition" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['/home/quant/gQuant/notebooks/many-small/0.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/1.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/2.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/3.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/4.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/5.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/6.csv',\n", - " '/home/quant/gQuant/notebooks/many-small/7.csv']" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import dask.dataframe as dd\n", - "import os\n", - "num_partitions = 8\n", - "\n", - "os.makedirs('many-small', exist_ok=True)\n", - "dd.from_pandas(input_cached.set_index('asset'), npartitions=num_partitions).reset_index().to_csv('many-small/*.csv', index=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note, this notebook requires `cudf` of version >=0.8.0. It can be checked by following command" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.14.0\n" - ] - } - ], - "source": [ - "import cudf\n", - "print(cudf.__version__)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The toy example\n", - "To mimic the end-to-end quantitative analyst task, we are going to backtest a XGBoost trading strategy. \n", - "\n", - "We will reuse the preprocessing steps as shown in the portfolio trade notebook example. \n", - "\n", - "The workflow includes following steps:\n", - "\n", - "1. Preprocess the datasets.\n", - "\n", - "4. Compute the features based on different technical indicators \n", - "\n", - "5. Split the data in training and testing and build a XGBoost model based on the training data. From the XGBoost model, compute the trading signals for all the data points.\n", - "\n", - "5. Run backtesting and compute the returns from this strategy for each of the days and stock symbols \n", - "\n", - "6. Run a simple portfolio optimization by averaging the stocks together for each of the trading days.\n", - "\n", - "7. Compute the sharpe ratio and cumulative return results for both training and testing datasets\n", - "\n", - "The whole workflow can be organized into a TaskGraph, which are fully described in a `.gq.yaml` file.\n", - "\n", - "Each nodes has a unique id, a node type, configuration parameters and input nodes ids. gQuant takes this yaml file, wires it into a graph to visualize it.\n", - "\n", - "First let's load the proprocess TaskGraph:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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GhERdSu+vr547bXXsGzZMqmjEBERPTSeME9ERERERGRgWNSIiIiIiIgMDIsaERERERGRgWFRIyIiIiIiMjAsakRERERERAaGRY2IiIiIiMjAsKgREREREREZGBY1IiIiIiIiA8OiRkREREREZGBY1IiIiIiIiAwMixoREREREZGBYVEjIiIiIiIyMCxqREREREREBoZFjYiIiIiIyMCwqBERERERERkYFjUiIiIiIiIDw6JGRERERERkYFjUiIiIiIiIDAyLGhERERERkYFhUSMiIiIiIjIwLGpEREREREQGhkWNiIiIiIjIwLCoERERERERGRgWNSIiIiIiIgPDokZERERERGRgWNSIiIiIiIgMDIsaERERERGRgWFRIyIiIiIiMjAsakRERERERAaGRY2IiIiIiMjAsKgREREREREZGBY1IiIiIiIiAyMTQgipQxARET2M5cuX48CBA7jzn7KCggI4OjrC0dFRN8/MzAz/+te/EBoaKkVMIiKiTmNRIyIio/Xll19i3rx5Dxzn4OAApVIJMzOzLkhFRET06HjqIxERGa3ExERYWVndd4y5uTnmzJnDkkZEREaFRY2IiIyWXC5HfHw8zM3N7zmmubkZs2bN6sJUREREj45FjYiIjNrs2bPR0tJyz+d79eqFsWPHdmEiIiKiR8eiRkRERi02NhYKheKuz5mbmyMpKQkymayLUxERET0aFjUiIjJqFhYWmDFjBiwsLNo9x9MeiYjIWLGoERGR0XvhhRfQ1NTUbn6/fv0wePBgCRIRERE9GhY1IiIyehMnToSrq6vePHNzc8yfP1+aQERERI+IRY2IiIyeiYkJZs+erXf3x+bmZjz//PMSpiIiInp4LGpERNQtzJo1C83NzQAAmUyG4cOHo1+/fhKnIiIiejgsakRE1C2MGjUKvr6+AABTU1PMmzdP4kREREQPj0WNiIi6jblz50Imk0Gr1eK5556TOg4REdFDM5M6ABER9Wy1tbVobW1FU1MT1Go1AOD27dsQQgD46Vqzurq6e76+sbERDQ0NAABnZ2cIITBw4ECkp6frxjg6Ot7z9aamprCzs9M9tra2hpWVFWQyGRwcHAAANjY2sLS0fPiNJCIi6iSZaPuXkIiI6B5UKhWqq6tRXV2N27dvQ6VSoaGhAdXV1aivr0dDQwNqamqgVqtRX18PlUqlG1NXV4ea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0dR5XGNjY7i6ukKhUMDV1RWenp53LOFeXl6wtraW6RkgIqLGwKJGRNSGVVZWoqioCMXFxfWKw92KREVFRb09OH9kaWkJKysrODk5wcrKCpaWljA1NYWdnR0AwM7ODqampjAzM4OtrS0ASAXPwsKiXtFwdHS84wlWrK2t7ziGnUqlglarbfA2tVotfS8Q+P0kMEqlUnpuqqurodPpUFpaCgCoqKhATU0NamtrpUMIS0tLUVlZCbVaLZ0o5k706+ro6HjXItzQba6urm22/BIRtUUsakRE9MDKy8tRWVmJ8vJyqFQqVFZWorKyEkqlUiov+j1LNTU1qKmpkfbilZaWQqfToaqqSjq1u77o/LFA3V6MGqJ/rIboS2JDTExMYG9vX+c6fVnUF00A0iGC+scyMjKSxse7fU+io6MjrKysYG1tDUdHR1hbW8Pa2lra+8jDSomI6F6xqBERUavSvn17vPDCC1i6dKncUYiIiB4Yj6EgIiIiIiIyMCxqREREREREBoZFjYiIiIiIyMCwqBERERERERkYFjUiIiIiIiIDw6JGRERERERkYFjUiIiIiIiIDAyLGhERERERkYFhUSMiIiIiIjIwLGpEREREREQGhkWNiIiIiIjIwLCoERERERERGRgWNSIiIiIiIgPDokZERERERGRgWNSIiIiIiIgMDIsaERERERGRgWFRIyIiIiIiMjAsakRERERERAaGRY2IiIiIiMjAsKgREREREREZGBY1IiIiIiIiA8OiRkREREREZGBY1IiIiIiIiAwMixoREREREZGBYVEjIiIiIiIyMCxqREREREREBoZFjYiIiIiIyMCwqBERERERERkYFjUiIiIiIiIDw6JGRERERERkYFjUiIiIiIiIDAyLGhERERERkYExEkIIuUMQERE9iNdeew0HDhzA7X/KMjMz4eTkBCcnJ+k6U1NTfP311+jXr58cMYmIiO4bixoREbVY69evR2Rk5J/O5+joiMLCQpiamjZDKiIioofHQx+JiKjFmjp1KiwtLe86j5mZGSIiIljSiIioRWFRIyKiFsvGxgYTJ06EmZnZHefRaDSYNWtWM6YiIiJ6eCxqRETUos2ZMwe1tbV3vN3T0xODBw9uxkREREQPj0WNiIhatPHjx8PW1rbB28zMzDBv3jwYGRk1cyoiIqKHw6JGREQtmrm5OcLDw2Fubl7v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mpubpY40oBgMBixYsACCIGDbtm0saTTosagRERERdZG/vz/27NmDxMREPPXUU1LHGVDefvttHD58GN988w1cXFykjkMkORY1IiIiolsQFhaGb7/9Flu3bsXatWuljjMgHD16FG+88QbWr1+Pu+++W+o4RCaB31EjIiIi6oZNmzZh+fLl+Pzzz7F06VKp4/RbV65cwfjx4xEREYHvvvtO6jhEJoPT8xMRERF1w7Jly1BQUIDly5fDw8MDM2bMkDpSv2MwGPDII49AqVRi06ZNUschMiksakRERETd9NZbb6GsrAwPPvgg/v3vf+POO++UOlK/8t///d84duwYkpOT4eDgIHUcIpPCQx+JiIiIbkNTUxNiY2Nx9uxZHD9+HCNGjJA6Ur9w+PBh3HffffjnP/+JJ554Quo4RCaHRY2IiIjoNmk0GkRFRUGj0SA5ORmurq5SRzJpeXl5CA8Px4wZM/DFF19IHYfIJLGoEREREfWA8vJyTJw4Ea6urjhy5AgUCoXUkUySRqPBpEmTYG5ujmPHjkGpVEodicgkcXp+IiIioh7g4eGBffv2IScnB/Pnz0dLS4vUkUxO6+QhlZWV+Omnn1jSiG6CRY2IiIioh4wePRr79u3D4cOH8fTTT0sdx+SsXr0aBw4cwHfffQdvb2+p4xCZNBY1IiIioh5055134uuvv8Znn32G999/v9PH6XS6PkwlvS+++ALvvfcePv74Y0RGRkodh8jksagRERER9bC4uDj84x//wCuvvILt27cb3ScIAlavXo0XX3xRonS9JyEhAXV1de2Wp6amYvny5Vi5ciUef/xxCZIR9T+cTISIiIiol6xcuRIffvghEhISMG3aNDQ2NuKxxx7DF198AblcjoqKCtjb20sds0c0NzfDy8sLXl5e2L9/P1QqFYDfJlkJCwtDcHAwEhISYG5uLnFSov6BI2pEREREveSvf/0r5s+fj7lz5+L48eOIiYnB119/DQBobGzEl19+KXHCnvPjjz+isrIS586dQ3h4OPLy8lBfX48HHngAtra2+Oabb1jSiG4BR9SIiIiIelFDQwOmTJmC8+fPo6GhAU1NTQAAmUyGESNGIDs7W+KEPSMqKgrJycloaWmBpaUlFAoF7rrrLqSkpODkyZMYOXKk1BGJ+hWOqBERERH1ory8PHF0qbWkAb99V+3y5ctITk6WMF3P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YicnJ6hUKh6KSIMCixoRERFRDzAYDOIokU6nE0eNWkeUbhxdAn77Dp4gCNDr9aivrxfXAfxWGpuamowKEwCjktSR69evo6WlpcP7WstfR6ysrKBUKsXbbQuira0tLC0tYWlpKR4m6ODgADMzM9jY2EAul8PCwgJ2dnZGo4hOTk7idXt7e6PRRiK6ORY1IiIiogHKx8cHzz77LFauXCl1FCK6RTzBAxERERERkYlhUSMiIiIiIjIxLGpEREREREQmhkWNiIiIiIjIxLCoERERERERmRgWNSIiIiIiIhPDokZERERERGRiWNSIiIiIiIhMDIsaERERERGRiWFRIyIiIiIiMjEsakRERERERCaGRY2IiIiIiMjEsKgRERERERGZGBY1IiIiIiIiE8OiRkRE9P/Zu/Oopu6EfeBPCIFACCEgQlgVURQErCiIO+BeWhVHrXUda8cZ36O189pau0xn2k47M9pap5tj6ztdxtapdat1aRVwww1tVRZFFBWQfUnY9+/vjx7yMwWroHIDPJ9z7knyvTf3PjdaT57eJURERGaGRY2IiIiIiMjMsKgRERERERGZGRY1IiIiIiIiM8OiRkREREREZGZY1IiIiIiIiMwMixoREREREZGZYVEjIiIiIiIyMyxqREREREREZoZFjYiIiIiIyMywqBEREREREZkZFjUiIiIiIiIzw6JGRERERERkZljUiIiIiIiIzAyLGhERERERkZlhUSMiIiIiIjIzLGpERERERERmhkWNiIiIiIjIzMiEEELqEERERER0f55//nkcOHAAt3+1y8jIgFarhVarNY5ZWlpi8+bNGDx4sBQxiegesagRERERdQFffPEFFixYcNflHBwcUFhYCEtLyw5IRUTtxVMfiYiIiLqAmJgYKJXKX11GoVBg3rx5LGlEnQCLGhEREVEXoFKpEB0dDYVCccdl6uvrMWfOnA5MRUTtxaJGRERE1EXMnTsXDQ0Nd5yv0+kQHh7egYmIqL1Y1IiIiIi6iClTpsDOzq7VeQqFAgsXLoRMJuvgVETUHixqRERERF2ElZUVZs6cCSsrqxbzeNojUefCokZERETUhTz55JOoq6trMe7r64ugoCAJEhFRe7CoEREREXUhERERcHZ2NhlTKBRYtGiRNIGIqF1Y1IiIiIi6EAsLC8ydO9fk7o/19fWYPXu2hKmIqK1Y1IiIiIi6mDlz5qC+vh4AIJPJEBISAl9fX4lTEVFbsKgRERERdTGhoaHw9vYGAMjlcixYsEDiRETUVixqRERERF3Q/PnzIZPJ0NTUhFmzZkkdh4jayFLqAERERER0dw0NDSgvL0dFRQVqampQVlYGADAYDGhqajJZ1mAwwMnJCUII+Pv749ixY7CxsYFSqTRZztbWFtbW1lAoFLCzs4NarYZSqYRare6w/SKi1smEEELqEERERETdRWlpKXJycpCXl4fCwkKUlJQYp+LiYpPnVVVVqKioQHl5ORoaGjo0p0qlglKphEajgVqthqOjIxwdHdGjRw84OjrCycnJZMzDwwM6na7V33AjorZjUSMiIiJ6QKqrq5GRkYFr167h+vXryMrKQl5eHrKyspCbm4vs7GxUV1cbl7ewsGhRem5/bmdnB5VKBbVaDWtra9jb20OlUsHa2hoODg4Afi5UvyxHdnZ2UCgU2LBhAxYuXAgHB4dWy15ZWRkaGxtRV1eHyspKlJWVoba2FuXl5aisrERNTQ0MBgPKy8uN5bF5an5dWVlpsk4XFxe4urrCw8MDbm5ucHd3h5eXF3x8fODj4wMPDw/IZLKH9CdA1HWwqBERERG1QX19PdLS0pCSkoLLly8bi1lGRgZyc3ONy+l0OuNRJk9PT7i6usLT0xM6nQ7u7u5wdXWFk5PTQ83a0NAAS8uHe6VLbW0tCgsLkZ2dbSyjubm5uHXrFnJycpCTk4MbN26gqqoKAGBtbY3evXvDx8cHffr0QZ8+fRAQEICBAwfC1dX1oWYl6kxY1IiIiIjuIDMzEz/++CNSUlKQlJSElJQUpKWlob6+HpaWlsay0dqjra2t1PHNSl5eHq5du2Ystc2PV65cQVFREQDAyckJgYGBxuIWGBiIQYMGQaVSSZyeqOOxqBERERHh59MAL168iHPnziEhIQHHjh1DXl4egJ+PjgUEBMDf39/4OHjwYJaxB6S0tBQpKSlITU01Pl64cAGFhYWQy+Xw8/NDSEiIcQoNDeW1cNTlsagRERFRt5Sfn4/4+HjExcXhyJEjuHLlCgCgV69eCA0NxdChQxEaGopHHnmEd0GUyPXr15GYmIgzZ84gMTER586dQ2VlJWxtbREWFoaIiAhERkYiNDQUCoVC6rhEDxSLGhEREXULlZWVOHjwIOLi4hAXF4fU1FTI5XKEhoYiIiIC4eHhGDp0KHr27Cl1VLqDxsZGpKam4syZMzh69Cji4+ORlZUFOzs7jBw5EpGRkRg/fjwGDRokdVSi+8aiRkRERF1WUVER9u3bh++++w779u1DdXU1+vfvj5EjR2LcuHEYP3688e6J1DllZGTg+PHjSEhIwP79+5GVlQUvLy9MmjQJ0dHRmDhxIk+TpE6JRY2IiIi6lPz8fGzZsgVff/01EhMToVQqMWHCBDz++OOIjo6Gs7Oz1BHpIRFC4Ny5c9i9ezd2796NpKQkaLVaTJkyBfPmzcP48eMhl8uljkl0T1jUiIiIqNOrr6/H3r178e9//xv79++Hra0tYmJiMG3aNIwfPx42NjZSRyQJZGRkYPfu3di+fTsSEhLg7u6OBQsWYOHChfDz85M6HtGvYlEjIiKiTisvLw///Oc/8cknn6C4uBhRUVFYuHAhYmJiWM7IxJUrV/DZZ5/h888/R3Z2NkaMGIFnn30W06dPh4WFhdTxiFpgUSMiIqJO58qVK3j77bfx2WefwcHBAcuWLcNvf/tbeHp6Sh2NzFxjYyMOHTqEjRs34ttvv4Wvry9WrVqFBQsWwNraWup4REYsakRERNRpZGZmYvXq1fj666/h4+ODVatWYeHChVAqlVJHo04oLS0Na9euxX/+8x9otVq8+uqrePrpp3kdG5kFHuclIiIis1ddXY3XXnsNAwYMwI8//oitW7ciLS0NS5cuZUmjdvPz88Mnn3yC69ev44knnsCKFSswZMgQHDt2TOpoRCxqREREZN7i4uLg7++PdevW4dVXX0VSUhJmzpzJ64rogdHpdFi/fj0uXrwIFxcXjBkzBvPnz0dZWZnU0agb479wREREZJaEEHjzzTcxYcIEhISE4PLly3j++ec71W9irVu3DjKZDDKZDB4eHlLHuaNLly5h9uzZcHV1haWlpTHzL39jrrPsT3v1798fBw4cwK5duxAbG4uhQ4ciKSlJ6ljUTbGoERERkdkpKyvDY489hr/85S9455138M0338DNzU3qWG22atUqCCEQHBwsdZQ7unHjBsLDw3Hp0iXs2LEDZWVlKCsrw9dff93iqGVn2J8H4fHHH8ePP/4InU6HYcOGYcuWLVJHom6IRY2IiIjMisFgwMSJE/Hjjz/iyJEjWLFihdSRurRNmzbBYDDggw8+wPDhw2Frawu1Wo2ZM2eipKSkTeuys7PDyJEjH1LSjuXq6opDhw5h2bJlmD9/PjZt2iR1JOpmLKUOQERERNSssbERTzzxBDIzM3H48GH069dP6khdXnp6OgAgKChI4iTmx9LSEmvXroW9vT3+8Ic/wM3NDdHR0VLHom6CRY2IiIjMxtq1a3H48GEcPXqUJa2D1NfXAwB/Q+xXvPLKK7h+/Trmz5+PS5cuwdXVVepI1A3w1EciIiIyCzk5OXjttdfw6quvYujQoR22Xb1eb7xBRvP0xhtvAAAaGhpMxn/zm98Yx//73/9i/PjxcHV1hY2NDQIDA7FhwwY0NTXddZtvvPGGcZ23nyp44MAB43iPHj1avK+wsBArVqxAr169YGVlBWdnZ8TExOD8+fNt3u9du3ZBJpNh9+7dAAAbG5sWn4NMJsOiRYvuuq7mm4xUVlYiISHB+F5LS9NjAveSvzlX85SWloZZs2bBycnJOFZUVNTm/b1f7733HrRaLV544YUO3zZ1U4KIiIjIDLz00kvC1dVV1NTUSLL9SZMmCQsLC3H16tUW88LDw8WXX35pfL1nzx4BQLz55puipKREFBYWin/+85/CwsJCrFq1qsX7g4ODhbu7e4txlUolRowY0WI8JCREODk5mYzl5OQIb29v4eLiIvbu3SvKy8tFcnKyGDNmjFAqleLEiRPt2W0xdepUAUBUV1ebjBcWFgoAYuHChfe9P+3J35xrzJgxIj4+XlRWVopTp04JuVwuCgsL27Wv9+uzzz4TCoVC5OTkSLJ96l54RI2IiIjMwrfffos5c+ZIdgreqlWr0NTUhHfeecdkPCEhAbdu3cLMmTNNxseOHYs1a9ZAq9WiR48eWL58OZ588kls2LDhofz+1po1a3Dz5k288847mDJlCuzs7BAQEICtW7dCCIHly5c/8G0+SO3Nv3r1aowdOxa2trYICwtDQ0NDq0cbO8KsWbNgaWmJffv2SbJ96l5Y1IiIiEhyTU1NSE1NRVhYmGQZoqKi8Mgjj+DTTz9FcXGxcXzt2rVYuXKlyWl80dHRiI+Pb7GO4OBg1NfXIyUl5YHn27VrFywsLFrczMLV1RUBAQE4d+4csrOzH/h2H5T25g8NDe2oiHelVCoxaNAgJCcnSx2FugEWNSIiIpJcVVUVGhsboVarJc3xv//7v6iqqsKHH34IALhy5QqOHj2KJUuWmCxnMBjwpz/9CYGBgdBqtcZrp5577jkAP+/Pg1RbWwuDwYCmpiZoNJoW15H9+OOPAP7/HRzNzf3kV6lUHR33V9nb2z+UI6ZEv8SiRkRERJKzs7ODSqXCrVu3JM0xe/ZseHp64v3330dtbS3efvttPP300y0K5GOPPYbXX38dTz/9NK5cuYKmpiYIIbB+/XoAgBDinrZnYWGBurq6FuN6vd7ktbW1NRwcHGBpaYn6+noIIVqdIiIi2rnnD4ZMJmt1vLPkvxfZ2dm86yN1CBY1IiIiMgvDhw/HwYMHJc1gaWmJZ555BgUFBXj77bexdevWFj+43djYiISEBLi6umLFihVwdnY2FpTq6uo2bU+n07Uop3l5ecjMzGyxbExMDBoaGpCQkNBi3t///nd4eXmhoaGheDupLwAAIABJREFUTdt/0GxtbU2Kp5+fn/GHojtD/rvJzs5Gamoqhg8fLnUU6gZY1IiIiMgszJ07F7t27Wq1pHSk3/3ud9BoNHj55Zcxbdo0uLu7m8yXy+UYO3Ys8vLysHbtWhQVFaG6uhrx8fHYuHFjm7Y1YcIE5OTk4P3330dFRQWuXbuGZ555Bj179myx7FtvvYU+ffpg8eLF2L9/PwwGA0pKSvCvf/0Lr732GtatW9fidvgdbfDgwbhy5QqysrJw8uRJZGRkYNSoUZ0m/9289957cHFxwbhx46SOQt1Bx99okoiIiKil2tpa0a9fP/H4449LHUU899xzAoC4cOFCq/MLCwvF0qVLhaenp1AoFMLFxUUsWrRIvPDCCwKAACBCQkLE2rVrja+bp5deesm4Hr1eL5YsWSJ0Op2wsbERI0eOFImJiSIkJMS4/OrVq43LFxcXiz/+8Y/Cx8dHKBQK4ezsLCZMmCAOHjzY5n3cuXNni2xz584VQggxceLEFvOOHTt21/25fPmyGDVqlFCpVMLT01N88MEHJtu8l/wnT55ssQ1z+MqampoqrK2txbvvvit1FOomZELc40nURERERA/ZkSNHEBUVhTfffBPPP/+81HGIAPx8zWB4eDgcHBxw/PhxyOVyqSNRN2Dex5eJiIioWxkzZgzefvttPPvss9BoNFi6dKnUkaibMxgMmDx5MsrLyxEbG8uSRh2GRY2IiIjMyjPPPIPy8nL84Q9/QHp6Ov72t7+Z/bVL1DVdunQJM2bMQFlZGeLi4uDm5iZ1JOpGeDMRIiIiMjsvv/wyvvjiC2zcuBGRkZHIycmROlKn8cvfKGtt+vOf/yx1TLO3a9cuhIeHw87ODgkJCejXr5/Ukaib4TVqREREZLaSk5MxY8YMlJaW4s0338TixYthYcH/z0wPz61bt/D888/jq6++wooVK7B27VooFAqpY1E3xH/piIiIyGwNHDgQiYmJmDNnDv7whz8gNDQUJ06ckDoWdUE1NTX461//Cj8/P5w+fRrffvst3n33XZY0kgyLGhEREZk1e3t7bNiwAefPn4dWq8XIkSMxY8YMnDlzRupo1AVUVVXhgw8+wIABA/DWW2/hpZdeQkpKCqKjo6WORt0cixoRERF1CgEBATh48CB27dqFrKwshIWFISIiAgcOHACv5KC2Ki4uxmuvvYZevXrhueeew+TJk5GWloY1a9bA2tpa6nhEvEaNiIiIOqf4+Hj84x//wPfff48BAwZg8eLFmDdvHlxcXKSORmZKCIFjx47h3//+N7Zt2wYrKyv8z//8D5YvX46ePXtKHY/IBIsaERERdWoXLlzAxo0bsXXrVlRUVGDy5MlYtGgRoqOjYWVlJXU8MgOZmZn47LPP8Nlnn+HatWsYPHgwfvvb32LRokWws7OTOh5Rq1jUiIiIqEuora3FDz/8gC+++AI7d+6EtbU1IiIiMHPmTEydOhUajUbqiNSBMjIysGfPHmzbtg0nT56ERqPBzJkzsXTpUgwePFjqeER3xaJGREREXU52djZ27NiB3bt34+jRo7CwsEBERASmTp2K8ePHw9fXV+qI9IDV1NTg5MmT2LdvH3bv3o309HS4urrisccew7Rp0zB+/HjewZE6FRY1IiIi6tJKSkqMX94PHDiAiooKeHp6IiIiApGRkYiIiICXl5fUMamN6uvrcebMGcTHxyM+Ph4nTpxATU0N/Pz8MHXqVEydOhXDhg3j7+5Rp8WiRkRERN1G85f7uLg4xMfH4+TJk6ipqUGfPn0QHh6OoUOHIjQ0FIMGDYJSqZQ6Lt0mJycHZ86cQWJiIk6fPo1Tp06hsrLSWLqbizdLN3UVLGpERETUbTWfLnf48GGcOXMGZ86cQUlJCRQKBYKCghAaGorBgwcjMDAQ/v7+UKvVUkfuFm7evImUlBRcuHABiYmJOHPmDG7dugULCwv4+fkhNDQUI0aMQEREBE9jpS6LRY2IiIjoNunp6cZycObMGVy4cAFVVVWQyWTw9vZGQEAABg4ciICAAPj7+6NPnz5wcHCQOnan09jYiOzsbKSnpyM5ORkpKSlITk5GamoqysrKAACenp4YMmQIhg4dirCwMAwZMgT29vYSJyfqGCxqRERERL+iqakJ169fN5aJpKQkpKam4vLly6irqwMAODk5oU+fPvDx8UGfPn2Mk4eHB9zc3LrtaZRFRUXIy8vD9evXce3aNZPpxo0bxs+vR48eCAwMNCnBAwcOZAGmbo1FjYiIiKgdGhoakJGRgYyMDGP5aH6ekZGBqqoq47JOTk7Q6XTw8PCAq6ur8dHJyQlOTk7o0aMHHB0d4eTkZNa/69XY2IiSkhIUFxebPBYUFODWrVvIzc3FrVu3kJOTg9zcXNTU1Bjf6+rqalJim0utr68vnJ2dJdwrIvPEokZERET0ENxeWppLTHZ2NvLy8pCVlYX8/HwUFxejqanJ5H1WVlZwcnKCo6MjbG1todFoYGNjA6VSCQcHByiVStja2sLe3h5yuRwAoNVqW6xDpVIZXwshoNfrTZapqalBdXU1AKCqqgo1NTXQ6/XGcb1ej9raWlRWVsJgMKCoqKjFOgDAxsYGzs7O8PDwgE6ng7u7O9zc3ODm5gZ3d3fodDp4e3vD1tb2gXyuRN0FixoRERGRhEpLS1FcXGw8OnX7karmwlRdXY2amhqUlpYai5TBYEBTUxMaGxuN13Q1a17+dhqNxuRW9ZaWlsabozQXQa1WC6VSCRsbG2g0GiiVSqhUKmg0GvTo0cNYIJuP/jk6OsLGxubhf0hE3RCLGhEREVEX5e3tjeXLl2PVqlVSRyGiNuIvABIREREREZkZFjUiIiIiIiIzw6JGRERERERkZljUiIiIiIiIzAyLGhERERERkZlhUSMiIiIiIjIzLGpERERERERmhkWNiIiIiIjIzLCoERERERERmRkWNSIiIiIiIjPDokZERERERGRmWNSIiIiIiIjMDIsaERERERGRmWFRIyIiIiIiMjMsakRERERERGaGRY2IiIiIiMjMsKgRERERERGZGRY1IiIiIiIiM8OiRkREREREZGZY1IiIiIiIiMwMixoREREREZGZYVEjIiIiIiIyMyxqREREREREZoZFjYiIiIiIyMywqBEREREREZkZFjUiIiIiIiIzw6JGRERERERkZljUiIiIiIiIzAyLGhERERERkZlhUSMiIiIiIjIzLGpERERERERmhkWNiIiIiIjIzMiEEELqEERERER0f55//nkcOHAAt3+1y8jIgFarhVarNY5ZWlpi8+bNGDx4sBQxiegesagRERERdQFffPEFFixYcNflHBwcUFhYCEtLyw5IRUTtxVMfiYiIiLqAmJgYKJXKX11GoVBg3rx5LGlEnQCLGhEREVEXoFKpEB0dDYVCccdl6uvrMWfOnA5MRUTtxaJGRERE1EXMnTsXDQ0Nd5yv0+kQHh7egYmIqL1Y1IiIiIi6iClTpsDOzq7VeQqFAgsXLoRMJuvgVETUHixqRERERF2ElZUVZs6cCSsrqxbzeNojUefCokZERETUhTz55JOoq6trMe7r64ugoCAJEhFRe7CoEREREXUhERERcHZ2NhlTKBRYtGiRNIGIqF1Y1IiIiIi6EAsLC8ydO9fk7o/19fWYPXu2hKmIqK1Y1IiIiIi6mDlz5qC+vh4AIJPJEBISAl9fX4lTEVFbsKgRERERdTGhoaHw9vYGAMjlcixYsEDiRETUVixqRERERF3Q/PnzIZPJ0NTUhFmzZkkdh4jayFLqAERERER0ZxUVFaivr4fBYEBjYyP0ej2An687q6ioaLF8bW0tqqqq4OTkBCEE/P39cezYMchkMjg4OLRY3sLCAhqNBgBgbW0NW1tb2NrawtraGmq1GpaW/LpIJAWZEEJIHYKIiIioqxFCoLCw0DiVlJTAYDDAYDBAr9cbn9/+urS0FHV1daisrER1dTVqamqk3g0AgEajgVwuh4ODA5RKJTQajXFycHAwTs2vNRoNHB0d4eLiAhcXF9ja2kq9C0SdDosaERERURvU1NQgOzsb2dnZyMzMxK1bt1BQUIDCwkLk5+cjPz/fWM4aGxtN3mtnZ2dSZn75XKvVGo9q2djYQKlUws7ODgqFAvb29sayJJPJ7niETC6Xw97eHgCwYcMGLFy4EA4ODnc9Ate8b9XV1aiqqkJtbS3Ky8vR0NAAg8GApqYmlJaWora21qRo6vV649T8uqGhwWQbtra2xtLm7OyMnj17wtXVFT179oSXlxc8PDzg4eEBV1fXB/XHRNTpsagRERER3aa6uhrp6em4evUqrl27huzsbNy8edNYzvLz843LWltbw83NDa6uriYFxNnZGc7OztDpdMbnTk5OkMvlHbovDQ0Nkpy6WFlZiZKSEuTm5hpLa15eXotC2zw1s7a2NpY2Ly8veHp6wtvbG76+vujbty88PDwgk8k6fH+IpMCiRkRERN1OY2Mjrl69ikuXLhlLWfNjdnY2hBCwsLCAu7s7vLy8TI76eHt7w93dnUeAHpDa2lpkZWUhOzsbWVlZJs8zMzNx48YNlJWVAQBsbGyMpe32x8DAQDg5OUm8J0QPFosaERERdWmlpaVISUnBuXPnkJqaipSUFJw/fx6VlZUAAK1WCx8fH/j7+yMgIAA+Pj7w8fFB//79oVKpJE5PwM9/hhkZGcYpJSUFqampSE9PN5Y4rVYLf39/hISEICAgAP7+/hg8eDCvj6NOi0WNiIiIuoySkhKcPn3aOJ09exZFRUUAABcXFwQGBppM/v7+/CLfyWVnZyMlJQUXL15EcnIykpKSkJqaitraWlhaWsLPzw+hoaEICwvDsGHDEBAQwDtZUqfAokZERESdUlNTE5KSknD8+HFjMbty5QoAwMfHB8OGDcOQIUMQFBSEoKAgODs7S5yYOkpDQwPS09ORlJSE8+fP49SpUzh79izKy8uhUqkQEhKC0NBQhIeHY/To0ejRo4fUkYlaYFEjIiKiTiMjIwOHDh3C8ePHERsbi5ycHKjVagQFBSEkJAQjR47EmDFj0LNnT6mjkhnKyMjA8ePHce7cOZw7dw6JiYmoq6uDj48Pxo0bh3HjxmH8+PGt3k2TqKOxqBEREZHZqqysxIEDB7Bnzx7ExsYiOzsbdnZ2GDNmDCIjIxEZGYmgoCBYWFhIHZU6obKyMhw5cgSxsbGIi4tDcnIy5HI5hg4diokTJ2LatGkIDg6WOiZ1UyxqREREZFaKi4vx3XffYefOnfjhhx9QV1eH4cOHY8KECYiMjERoaCivMaKHoqCgAPHx8YiLi8O+ffuQnZ0NHx8fTJ8+HdOnT0d4eDj/pwB1GBY1IiIiklxNTQ22b9+OTz/9FIcPH4ZcLkdUVBSmT5+OqVOn8voy6nBCCCQmJmLnzp3YuXMn0tLS4OLigtmzZ2Px4sU80kYPHYsaERERSeb8+fPYvHkztmzZgoqKCkyZMgVz5szBlClToFarpY5HZJSamoodO3bg888/R3p6OoYMGYKnnnoKc+bMgUajkToedUEsakRERNShmpqasGPHDvz973/H2bNn0a9fPyxevBgLFy7kD0iT2RNC4OjRo9i8eTO++eYbyGQyzJs3Dy+88AJ69+4tdTzqQljUiIiIqEM0NTXh66+/xl//+lekpqYiJiYGy5cvx6hRoyCTyaSOR9Rmer0eW7ZswTvvvIOsrCzMmzcPL774Inx9faWORl0Ar4YkIiKih27//v0YOHAg5s2bh8DAQCQlJWHbtm0YPXo0Sxp1Wg4ODvif//kfpKWlYdOmTTh+/DgGDBiAxYsXo7CwUOp41MmxqBEREdFDU1RUhPnz52PKlCkIDAxESkoKvvzyS/j7+3d4lq1bt0Imk0Emk0GpVHb49s3VunXrjJ+Lh4eH1HE6JUtLSyxatAiXLl3Cp59+ikOHDsHf3x9btmyROhp1Yjz1kYiIiB6Kb775BsuWLYNSqcSHH36I6OhoqSMBAMaNG4fjx4+jpqZG6ihmZdCgQSgqKkJ2drbUUTq98vJyrFmzBh999BEmTZqETz75BDqdTupY1MnwiBoRERE9UEIIvPTSS5g1axZmzJiB5ORksylpRB1BrVbj/fffx9GjR5Geno7Q0FCcP39e6ljUybCoERER0QO1cuVKrFu3Dps3b8ZHH30Ee3t7qSMRSWLEiBE4ffo0/Pz8EBkZiR9//FHqSNSJsKgRERHRA7N+/Xp8+OGH+PLLL/Hb3/5W6jhEktNqtdi7dy9CQ0MxZcoU5ObmSh2JOgkWNSIiInogkpOTsXr1avz1r3/FjBkzpI6Dy5cvY9q0adBoNFCpVBg1ahSOHz/eYrldu3YZb6Yhk8mQlpaGWbNmwcnJyThWVFQEACguLsYf//hH9OnTB1ZWVtBqtZg8eTLi4+ON6/vlzTkSExMRFRUFtVoNW1tbREREICEhod37dXsGa2treHh4YNy4cfj0009RXV19x2XvlPdO3njjDeN+jBw50jh+4MAB43iPHj3u+DnevHkTs2fPhlqthpOTE+bPn4/S0lLcuHEDjz32GNRqNXQ6HZ5++mmUl5ffcT03btzA7Nmz4eDgACcnJ0RHR+PatWsmWWtra/GnP/0J/fv3h62tLRwdHfHYY4/h22+/RWNjY3s/6gfG2toa27Ztg0ajwVNPPSV1HOosBBEREdEDMH36dDF48GDR1NQkdRSRnp4uHBwchLu7u/jhhx9EeXm5uHjxopgwYYLo1auXsLa2bvGeqVOnCgBizJgxIj4+XlRWVopTp04JuVwuCgsLRW5urujdu7dwcXERe/bsEQaDQaSlpYmYmBghk8nExx9/bLK+4OBgoVKpRHh4uDhx4oSoqKgQiYmJIigoSFhZWYnDhw+3eb+aM7i6uoo9e/aIsrIykZeXJ15//XUBQKxfv77Fsm3J6+7u3mKbKpVKjBgxosV4SEiIcHJyuuPnGBMTI86ePSsqKirE559/LgCIyZMni6lTp4qffvpJlJeXi40bNwoA4tlnn73jeqZOnWr8/A4ePChsbGzE0KFDTZZdsmSJ0Gg04ocffhBVVVUiLy9PrFq1SgAQ8fHx9/rxPnSHDx8WAMSRI0ekjkKdAIsaERER3bfS0lKhUCjEli1bpI4ihBBi5syZAoD45ptvTMZv3bolrK2tf7Wo7du3r9V1Llq0SAAQX331lcl4TU2NcHNzEzY2NiIvL884HhwcLACIn376yWT5ixcvCgAiODi4zfvVnOG///1vi3mTJk0yKWrtyfsgi9revXtNxgMCAlotKb179xZ+fn53XM+ePXtMxn/zm98IAKKwsNBkHcOHD2+xjn79+plVURNCiKFDh4olS5ZIHYM6AZ76SERERPft4sWLqK+vR2RkpNRRAPx8eh4ATJw40WTczc0N/fr1+9X3hoaGtjq+c+dOAMCjjz5qMm5tbY2oqChUV1fj+++/N5mnUqkwaNAgk7HAwEC4ubnhwoULbb5eqTnD5MmTW8zbv38/Vq5ceV95H6QhQ4aYvHZzc2t13N3dHTk5OXdcz9ChQ01ee3p6AoDJeyZNmoQTJ07gd7/7HU6dOmU83TEtLQ1jx45t9z48DFFRUTh79qzUMagTYFEjIiKi+2YwGAAADg4OEif5+Xql8vJyKJVK2NnZtZjfs2fPX32/SqVqdZ0GgwFKpRJqtbrFfBcXFwBAXl6eyfidPo/mDAUFBb+apS0ZHkTeB+mXd/u0sLCAXC6Hra2tybhcLkdTU9Md16PRaExeW1lZAYDJez744AN8/vnnyMjIQFRUFOzt7TFp0iRjWTUnWq3W+N8L0a9hUSMiIqL71ny05Pr16xIn+fmIkVqtRk1NDSoqKlrMLykpadc6NRoNampqTG580Sw/Px8A4OrqajJeXFwMIUSL5ZsL2t1KY1syPIi8rbGwsEBdXV2Lcb1ef4/JHz6ZTIb58+fj0KFD0Ov12LVrF4QQiImJwTvvvCN1PBMZGRnw8PCQOgZ1AixqREREdN8GDRoEZ2dnbN++XeooAP7/qYHNp0A2KyoqQlpaWrvWOX36dADA3r17TcZra2sRGxsLGxubFqda1tTUIDEx0WQsKSkJOTk5CA4Ohk6na1eGffv2tZj3yCOP4Nlnn72vvK3R6XS4deuWyVheXh4yMzPblP1hcnBwwOXLlwEACoUC48ePN9498pf7L6W6ujrs2bMH48aNkzoKdQIsakRERHTf5HI5li5divXr16OwsFDqOHjzzTfh6OiIlStX4uDBg6ioqEBqairmzZvX6umQ9+Ktt95C7969sXLlSnz33XcoLy/HlStX8OSTTyI3NxcbNmwwnlLYTKPR4MUXX8TJkydRWVmJs2fPYt68ebCyssKGDRvaneHZZ5/F3r17UV5ejuzsbCxbtgy5ubkmRa09eVszYcIE5OTk4P3330dFRQWuXbuGZ555pk1HAzvC73//e1y8eBG1tbUoKCjAP/7xDwghzOa6SQB47733UFpaylv0072R+GYmRERE1EUYDAbRq1cvMXHiRNHQ0CB1HJGWliamTZsm7O3tjbd0/+6770RUVJQAIACIp556Spw8edL4+vapNUVFRWLlypWid+/eQqFQCI1GIyZOnChiY2NbLNt8F8XU1FQxceJEoVarhY2NjRgzZow4fvx4u/frlxl0Op144oknxJUrV9qVd+3atS32/aWXXjLO1+v1YsmSJUKn0wkbGxsxcuRIkZiYKEJCQozLr169utXP8aWXXhKJiYktxt966y1x7NixFuOvvvrqHdcjhGgx/uijjwohhDh//rxYunSpGDBggLC1tRWOjo5i2LBh4uOPPzaLn4sQQojExEShVCrF66+/LnUU6iRkQrRy4jQRERFROyQmJmLs2LGIiYnBp59+CrlcLnUkyQwaNAhFRUXIzs6WOgpJLCkpCZGRkQgJCcG+fftgYcGT2uju+LeEiIiIHpihQ4di9+7d2L59O6Kjo3l3O+r2Dhw4gFGjRmHgwIHYsWMHSxrdM/5NISIiogdq3LhxOHHiBFJTU+Hv749du3ZJHYmow1VVVeGFF15AdHQ0Jk+ejH379rX4aQKiX8OiRkRERA/coEGDcP78eURHR2P69OmYNWuWWdxkpCOsW7cOMpkMFy5cwK1btyCTyfDyyy/fcXmZTHbX6c9//nPH7QDdt++//x7+/v7417/+hQ8//BBfffUVbGxspI5FnQyvUSMiIqKHau/evfj973+P6upqrFy5EsuXL2/xI8ZEXUFiYiJef/117NmzB7Nnz8Y///lPs7s7JnUePKJGRERED9Wjjz6KlJQULFu2DG+//TZ69eqFP//5zygtLZU6GtEDkZCQgMmTJyM0NBQFBQXYv38/tm7dypJG94VH1IiIiKjD6PV6vPfee3j33XdRX1+PefPm4amnnkJISIjU0YjapKqqCtu2bcPHH3+MhIQEjBw5Eq+88gomTJggdTTqIljUiIiIqMOVl5fj448/xscff4zLly9j0KBBWLJkCebOnQsHBwep4xHd0blz5/DJJ5/gq6++QnV1NR5//HEsW7YMERERUkejLoZFjYiIiCSVkJCATz75BNu2bUNjYyMmTZqE6dOnIzo6Go6OjlLHI8JPP/2EnTt3YufOnUhOTsaAAQOwZMkSzJ8/H87OzlLHoy6KRY2IiIjMQllZGbZt24bt27cjLi4OjY2NGDNmDKZPn46pU6fCw8ND6ojUTTQ2NiIhIQE7d+7Erl27cOPGDXh6emLatGl44oknMHz4cKkjUjfAokZERERmp6qqCrGxsdi2bRu+/fZbGAwG+Pj4YNy4cRg3bhyioqJ4tI0eqIyMDBw6dAiHDh1CbGwsSkpK4OPjg+joaMycORMjRoyATCaTOiZ1IyxqREREZNZqa2sRHx+P2NhYxMXF4fz585DJZAgJCUFkZCRGjx6NsLAwFje6Z01NTUhLS8PJkycRFxeHuLg45ObmwsHBAWPGjEFkZCQmTpwIPz8/qaNSN8aiRkRERJ1KcXExDh8+bPyCffnyZQBAv379EBoaitDQUISFhWHQoEGwsrKSOC2Zg/z8fJw+fRpnzpzB6dOnkZiYCIPBABsbG4wYMQJRUVGIjIxESEgI5HK51HGJALCoERERUSdXWFho/ALe/KjX62FtbY2goCAEBwcjMDAQAwcORHBwMJycnKSOTA9JY2Mj0tPTkZSUhIsXLyI5ORk//fQTbt68CZlMBj8/P2ORDwsLQ1BQEBQKhdSxiVrFokZERERdihACaWlpOH36NM6dO4fk5GRcuHABJSUlAACdTofAwEAEBQVhwIAB6Nu3L/r16wcXFxeJk9O9qqurQ0ZGBtLT03HlyhUkJyfj4sWLSE1NRU1NDeRyOXx9fREYGIjg4GAMHToUYWFh/OkH6lRY1IiIiKhbyMnJMR5pSUpKQnJyMi5fvozq6moAgFqthq+vL/r27Wvy6O3tDZ1OB0tLS4n3oHspLy9HZmYmbty4gfT0dKSnp+Pq1atIT09HZmYmGhsbAfxcvAMCAhAUFISBAwciKCgI/v7+sLGxkXgPiO4PixoRERF1W0IIZGdnGwvA1atXjVN6ejpqamoAAHK5HDqdDl5eXvD09ISHhwe8vLzg5eUFNzc36HQ69OjRg+XgHhUXF6OgoAD5+fnIzMxEVlYWsrKykJ2djZs3byIrKwsGg8G4vIuLC/r16wdfX1+TEu3r6wu1Wi3hnhA9PCxqRERERK0QQiAnJwc3b95EdnY2srKykJmZiczMTGRnZyM7Oxt5eXkm77Gzs4Orqyt69uwJZ2dnuLi4wMXFBc7OztBqtdBoNHBwcDB51Gg0Eu3h/aurq4PBYIBerzc+lpaWwmAwoLi4GPn5+SgsLERhYSHy8vKMz+vr643rsLa2blF+PTw84OnpCW9vb3h5ebGMUbfEokZERETUTrW1tcjJyTEpIbc/z8/PR0FBAQoLC1FaWora2tpW16NN2DTcAAAcmklEQVTVao3FTaFQGB/t7OxgbW0NW1tb2NjYQKlUQqVSGe9m2bzML6nV6hanalZWVqKurs5krLGxEWVlZcbX5eXlaGhogMFgQGNjI/R6vXGZ+vp6VFRUoKqqyljMqqqqWt0fjUYDR0dHY0l1dnaGq6ur8fntBdbV1bVNnzlRd8GiRkRERNRBampqjCXn9iNRpaWlxucNDQ3Q6/VoaGhAeXk5amtrUVVVhaqqKtTW1hrLFABUV1cbT8+8XWlpaYsxpVLZ6qmZGo0GFhYWAH4+IthcFC0sLKDVaiGXy2Fvbw8rKyuoVCrY2tq2OCp4+6ODgwN/GJroAWBRIyIiIuqivL29sXz5cqxatUrqKETURhZSByAiIiIiIiJTLGpERERERERmhkWNiIiIiIjIzLCoERERERERmRkWNSIiIiIiIjPDokZERERERGRmWNSIiIiIiIjMDIsaERERERGRmWFRIyIiIiIiMjMsakRERERERGaGRY2IiIiIiMjMsKgRERERERGZGRY1IiIiIiIiM8OiRkREREREZGZY1IiIiIiIiMwMixoREREREZGZYVEjIiIiIiIyMyxqREREREREZoZFjYiIiIiIyMywqBEREREREZkZFjUiIiIiIiIzw6JGRERERERkZljUiIiIiIiIzAyLGhERERERkZlhUSMiIiIiIjIzLGpERERERERmhkWNiIiIiIjIzLCoERERERERmRkWNSIiIiIiIjPDokZERERERGRmWNSIiIiIiIjMDIsaERERERGRmZEJIYTUIYiIiIjo/jz//PM4cOAAbv9ql5GRAa1WC61WaxyztLTE5s2bMXjwYCliEtE9YlEjIiIi6gK++OILLFiw4K7LOTg4oLCwEJaWlh2Qiojai6c+EhEREXUBMTExUCqVv7qMQqHAvHnzWNKIOgEWNSIiIqIuQKVSITo6GgqF4o7L1NfXY86cOR2Yiojai0WNiIiIqIuYO3cuGhoa7jhfp9MhPDy8AxMRUXuxqBERERF1EVOmTIGdnV2r8xQKBRYuXAiZTNbBqYioPVjUiIiIiLoIKysrzJw5E1ZWVi3m8bRHos6FRY2IiIioC3nyySdRV1fXYtzX1xdBQUESJCKi9mBRIyIiIupCIiIi4OzsbDKmUCiwaNEiaQIRUbuwqBERERF1IRYWFpg7d67J3R/r6+sxe/ZsCVMRUVuxqBERERF1MXPmzEF9fT0AQCaTISQkBL6+vhKnIqK2YFEjIiIi6mJCQ0Ph7e0NAJDL5ViwYIHEiYiorVjUiIiIiLqg+fPnQyaToampCbNmzZI6DhG1kaXUAYiIiIjIlF6vhxACFRUVqK+vR01NDaqrqwEAjY2NKCsra/V9Qgjo9XoAgJOTE4QQ8Pf3x7FjxwD8fPt+lUrV6nstLS2hVquNrx0cHCCTyWBnZweFQgGlUgkbG5sHuZtE9CtkQgghdQgiIiKizqqsrAwlJSUoLi5GaWkpDAYDKioqUFlZifLycuj1euPriooKlJaWGp9XVlaitrYWVVVVv1rAzMnthU6r1cLCwgIajQZqtRp2dnZQqVTQaDSwt7eHSqWCnZ0d7O3todFojPMcHR3h6OgIJyenVn/zjYhY1IiIiIiM6urqUFBQgNzcXOTl5SE/Px/5+fkoKSkxTsXFxSbPGxoaWqzH1tYWKpUKarUaDg4OUKlUd3ytUChgZ2cHmUwGBwcHAIC9vT3kcjlsbW1hbW3d4kiYRqOBhUXrV7Co1WpYWv580tSGDRuwcOFC43orKytb/Y01AKiurkZNTQ0A0yNzZWVlaGxsRFVVFWpra1sUy+ZHg8GAyspKVFZW3vF1U1NTi+3a2dmZFLfmqfl1z5494ebmBhcXF7i4uMDJyele/ziJOjUWNSIiIuryhBDIzc3FzZs3kZmZiezsbNy6dQuFhYXIyckxFrKioiKT96nVari6uhpLw+2F4pfPnZycoNVqjacMmoOGhgZjaTMH1dXVMBgMLUrv7Y+/fF5QUGC8gyXw8+mbt5c3V1dX6HQ66HQ6eHl5wdvbG97e3rCzs5NwT4nuH4saERERdXpNTU3IysrC1atXkZmZiZs3bxpLWfPUfCRJLpdDp9PB3d0dPXv2NH7R79mzZ4sxXpNlHgoKClBQUIC8vDzk5uaioKCgRdG+deuW8Sgg8PM1el5eXiblzcvLC7169ULfvn2h0Wgk3COiu2NRIyIiok6jtLQUGRkZyMjIQEpKClJTU5GRkYHLly+jsrISAGBtbQ13d3f4+PhAp9PBzc0NPj4+xsnT09Pkx6Cp66ipqUFOTo7x70hOTg5yc3ONr2/evInGxkYAP19f1/x3wt/fHwEBAfDx8YGfnx+PxpFZYFEjIiIis1NcXIwLFy4gKSkJSUlJuHDhAtLS0lBeXg7g5+ua+vbtazL169cPvr6+cHZ2ljg9mau6ujpkZmYiPT0dV65cwZUrV5Ceno709HRkZmaiqakJMpkMnp6eCAgIQFBQEIKCghAYGIj+/fuz4FOHYlEjIiIiyTQ1NSEtLQ3nzp0zFrKkpCTk5OQAAJydnREcHIzAwED4+/sbS5mbm5vEyamrqa2txbVr14wFLikpCcnJyUhNTUVdXR2srKzQv39/BAYGIigoCMHBwQgNDYVWq5U6OnVRLGpERETUYQwGAxITE3H8+HGcO3cOJ0+eRHFxMRQKBfr27YuAgAD4+/sjJCTEeCoakZQaGhqQmZmJlJQUnDt3DqmpqUhJScGlS5cghIBOp8PIkSMxYsQIhISEYMiQIVAqlVLHpi6ARY2IiIgemvT0dMTGxuLIkSM4ffo0rl+/DplMBj8/P4SGhiIsLAxhYWEICgriaWXUqRQWFuLMmTM4ffq08VGv10OpVOKRRx5BeHg4oqKiMHr0aF7zRu3CokZEREQPTG5uLuLi4hAbG4vY2FhkZmbCzs4Oo0ePxrBhw4zlrPl3vYi6CiEE0tLSjMXt2LFjSE5OhqWlJcLCwhAVFYWoqCiEhYXxR77pnrCoERERUbsJIZCYmIgdO3bgu+++Q0pKCqysrBAWFoZx48YZv5ia0295EXWU/Px8k/9xcePGDahUKowdOxbTp0/H1KlT0aNHD6ljkpliUSMiIqI2aWxsREJCArZv346dO3ciKysLvXv3xvTp0zFu3DiMHj0aKpVK6phEZufatWuIjY3F/v378f3336Ourg6jR49GTEwMpk+fDnd3d6kjkhlhUSMiIqJ7cvnyZfzrX//Cl19+iYKCAvj7+yMmJgYxMTF45JFHpI5H1KlUVlZi37592L59O/bt24eKigqEh4djyZIlmD17NmxtbaWOSBJjUSMiIqI7qq+vx86dO7Fx40YcPnwYvXr1wuLFizFjxgwMGDBA6nhEXUJNTQ0OHjyIL7/8Ejt27ICtrS0WLlyIpUuX8r+zboxFjYiIiFrQ6/XYsGEDNm7ciMLCQjz66KP4/e9/j4kTJ8LCwkLqeERdVkFBAf79739j06ZNuH79OsaOHYtXXnkFERERUkejDsZ/aYmIiMioqqoKf/nLX9CrVy9s2LABTz31FDIyMrB7925MnjxZkpJ29uxZLFq0CL169YJSqYSDgwOGDh2K1157DXq9vsPzdBaJiYlYtGgRevfuDRsbGzg6OmLgwIGYMWMGPvroI1y7dq1d6123bh1kMhlkMhk8PDzuOk5t07NnT6xevRrp6enYt28fFAoFIiMjMWnSJPz0009Sx6MOxKJGREREAIBvvvkG/fv3x/r167Fq1SrcuHEDb7zxBry8vCTLtGbNGgwbNgxarRbfffcd9Ho9rl+/jldffRU7d+5Ev379kJCQIFk+c9TU1ITnnnsOw4cPR8+ePbF//37o9XpcunQJ69evR1lZGZYtWwZfX180NDS0ef2rVq2CEALBwcH3NE7tY2FhgUmTJuH7779HXFwc9Ho9hgwZgrlz5+LWrVtSx6OOIIiIiKhbKy0tFU888YSQyWRi8eLFIi8vT+pIQgghXn/9dQFAbNy4sdX5lZWVIiQkRKjVanHp0qX73p5KpRIjRoy47/VIvf0XX3xRABCbNm1qdX5DQ4OYPHmyACDq6+vbvZ3g4GDh7u5+z+MPi9R/bh2lqalJbN++XfTt21dotVqxdetWqSPRQ8YjakRERN1YRkYGwsPDcfToURw4cACbN2+Gi4uL1LFw9epV/OUvf8HgwYOxdOnSVpextbXF+vXrUV5ejhUrVnRwQvN0+fJl/O1vf0NISAiefvrpVpeRy+V45ZVXOjgZ3S+ZTIaYmBicP38eTz75JObMmYMXX3wRgreb6LL465NERETdVFZWFiIiIuDg4IBTp07B09NT6khGGzduRENDA2bOnPmry40aNQpubm44ePAgMjIy4OPj00EJzdOmTZvQ1NR0188tPDycX/A7KVtbW7z//vsYNWoUFi1aBL1ejw8//FDqWPQQ8IgaERFRN1RbW4tJkybByckJR48eNauSBgBHjhwBgHu63ql5mWPHjgEA3njjDeNNLUaOHGlc7sCBA8bxHj16GMebb4JRWVmJhIQE4zKWlpYm85tvkpGYmIioqCio1WrY2toiIiLC5Dq5B739tjh69CgAICgoqM3vBYDi4mL88Y9/RJ8+fWBlZQWtVovJkycjPj6+Xeu7XWFhIVasWIFevXrBysoKzs7OxiNEv5bD2toaHh4eGDduHD799FNUV1cDuPfP7V72adeuXcb3y2QypKWlYdasWXBycjKOFRUV3fdn8CDNnj0bW7ZswaZNm/DBBx9IHYceBqnPvSQiIqKO99prrwm1Wi0yMzOljtIqnU4nAIjTp0/fddl58+YJAOLNN980Gb/TtUshISHCycmpxfjdrnUKDg4WKpVKhIeHixMnToiKigqRmJgogoKChJWVlTh8+PBD3f69aMvn9ku5ubmid+/ewsXFRezZs0cYDAaRlpYmYmJihEwmEx9//LHJ8m25Ri0nJ0d4e3sLFxcXsXfvXlFeXi6Sk5PFmDFjhFKpFCdOnGiRw9XVVezZs0eUlZWJvLw84zWL69evN1n3r31ubd2nqVOnCgBizJgxIj4+XlRWVopTp04JuVwuCgsL2/R5dpQ//elPws7OTuTk5EgdhR4wHlEjIiLqZhoaGvDRRx/h2WefNbsjab8kk8keyrLtVVlZiQ8//BDh4eFQqVQYMmQI/vOf/6Curg7PPPPMQ9/+vWrPZ7FmzRpcv34d7777LqKjo2Fvb49+/frhyy+/hE6nw4oVK5Cfn9+uPGvWrMHNmzfxzjvvYMqUKbCzs0NAQAC2bt0KIQSWL1/eIseGDRsQHR0NtVoNFxcXvPzyy5g0aVKH7NPq1asxduxY2NraIiwsDA0NDSZHQc3Jiy++CBsbG/zf//2f1FHoAWNRIyIi6mauXr2K3NxcxMTESB3ljtzc3AD8fNra3TQv0/yeh0mlUmHQoEEmY4GBgXBzc8OFCxeQm5v70DP8mubPoD2n6e3cuRMA8Oijj5qMW1tbIyoqCtXV1fj+++/blWvXrl2wsLBA9P9r715j2ir/OIB/Cy23UspFCoWs4z7lVhEFMjGbQIbLNFGmZDqX8cI4THzBjHEzmmgW3xhNdFETWIwvjDMhc+PFgBln440Ny20bl2YDdcC4dsB641JaeP4vlvZvx2XgxsrG95OcwDl9zjm/c1KS8+U55znPPuuxPDo6GmlpaWhtbcXAwIBHHTt37lywnTNnzqCiomLF+/2vx5STk7PifXibv78/du3a5b71lx4cDGpEREQbzMTEBAAgIiLCy5Usbdu2bQCw6PNLt7p06RIAYPv27WtZEgAgNDR00eUqlQoAYDQa17yG5bjOW3t7+6rWs9vtMJvNCAgIgEKhWPC5ayTQkZGRVdfk2vb8/DyUSqXHs2ASiQRtbW0AgJ6entvWca+OSS6X39G+77XIyMgV/VOD7i8MakRERBtMXFwcgJtDua9XBw4cgFQqxYkTJ5Zt19DQgKGhITz33HMLXszt4+OD2dnZBeuYTKZFt7WS2wXHx8cXHS3RFdBcgW2t9n87rvP2ww8/LNvunXfegY+Pj/s74O/vD6VSiZmZGVit1gXtXbcHRkdHr7omf39/hIaGQiqVwuFwQAix6PT000/fto7FLHXe1vKY1huDwYD4+Hhvl0F3GYMaERHRBhMTE4Pc3FxUVVV5u5QlpaSk4IMPPkBbW9uSdU5NTaGiogIRERH4/PPPF3yuVqsxODjosWxkZAT9/f2Lbi8oKMgjWG3ZsgXHjh3zaDMzM4Pm5maPZR0dHRgaGoJWq4VarV7T/d+O67y1tLQs+czSlStXUFVVhdLSUjz88MPu5S+88AIAoK6uzqO93W6HTqdDYGAgiouLV1WPS0lJCZxOp8fomC4ff/wxNBoNnE6nRx319fUL2mZlZeHgwYMey5Y7b2t5TOvF1atX8dNPP63rW5npP/LeOCZERETkLXV1dQKAqKmp8XYpy3r33XeFr6+vOHjwoOjs7BQzMzPixo0b4vTp0yIrK0vExsaKlpaWRdd98803BQDxxRdfCKvVKv766y9RWloqYmNjFx118ZlnnhFKpVL09/eL8+fPC6lUKgwGg/tzrVYrlEqlKCwsXNGoj3d7/6tx+PBhIZPJxKFDh8SVK1eE3W4XAwMD4uuvvxZqtVrk5+cLm83msc6tIyRaLBaPERKPHTvm0X41oz6Ojo6KxMREkZCQIOrr64XJZBLj4+OisrJSBAUFierq6gV1qNVqUVtbKywWi7h27Zp44403RFRUlOjr61vxeVvtMblGfZyenl79SfcCh8MhCgoKRHp6urDb7d4uh+4yBjUiIqIN6vXXXxdBQUHi999/93Ypy2pubhb79+8XmzdvFn5+fkKhUIjHH39cfPTRR8JkMi25nslkEq+99ppQq9UiMDBQ5Ofni+bmZpGdnS0ACADi0KFD7vaXL18WTz31lJDL5WLTpk3iq6++8tieK4AYDAZRXFwsFAqFCAwMFNu2bRMNDQ1rvv/VampqEvv27RObNm0SMplMKBQKkZeXJ44ePbrkRf3Y2JioqKgQ8fHxQiaTCaVSKYqLi4VOp3O3+eSTT9z1u6b33ntvyeUu4+Pj4q233hIJCQlCJpOJyMhIsWPHDnH27Nnb1qFWq8WePXtEd3f3gra3O28rOabGxsYFta/3/gyn0yn2798v5HK5aG1t9XY5tAYkQvC19ERERBuR0+nEnj17UFdXh2+++QYvv/yyt0ta1x599FGMjY25Ryck8haz2Yy9e/dCp9OhpqZm1a8toPsDn1EjIiLaoKRSKaqrq1FeXo5XXnkFZWVlMJvN3i6LiJbx66+/QqvVorW1Fb/88gtD2gOMQY2IiGgD8/X1xWeffYb6+nqcPXsWiYmJOHr0KObm5rxdGhH9S3d3N0pLS1FQUIDU1FS0tbUhLy/P22XRGmJQIyIiIuzcuROdnZ3Yu3cv3n77bWRmZuLbb79lYAPw6aefQiKR4NKlSxgcHIREIsH7779/z/Z/63vHFps+/PDDe1YP3VvXr1/H4cOHkZGRgc7OTlRXV6O+vt5jhFF6MPEZNSIiIvJgMBhw5MgRnDhxAklJSThw4ADKysoQHh7u7dKINgy9Xo/KykpUV1cjMjISR44cwb59++Djw36WjYJBjYiIiBZlMBjw5Zdf4vjx45idncVLL72E8vJybN261dulET2QrFYrjh8/jqqqKly8eBFarRbl5eUoKytDQECAt8uje4xBjYiIiJZls9nw/fffo7KyEhcuXEBqaipefPFFlJSUQKvVers8ovva1NQUzpw5g5MnT+L06dOYm5tDaWkpysvL+QzaBsegRkRERCum1+vx3XffoaamBoODg0hKSkJJSQl2796NJ554AhKJxNslEq17ZrMZtbW1OHXqFH788UfY7Xbk5+dj9+7dePXVVxEWFubtEmkdYFAjIiKiVRNCQK/X49SpUzh58iT++ecfxMbGorCwEIWFhSgqKkJMTIy3yyRaF5xOJ1paWqDT6aDT6XD+/HnMz8+joKAAJSUleP7556FSqbxdJq0zDGpERER0xy5evIja2lrodDo0NjbCbrfjkUceQUFBAQoLC7F9+3b2EtCGIYRAV1eXO5j99ttvsFgsiImJQWFhIXbs2IFdu3bxb4KWxaBGREREd9X09DTOnTuHn3/+GQ0NDWhqaoLD4UBCQgKefPJJZGdnIzs7Gzk5OfDz8/N2uUR3zGKxoL29HefOnUNDQwP+/PNPjI2NITg4GHl5eSgqKkJRUREee+wx3h5MK8agRkRERGtqYmICf/zxB5qamtDY2IiWlhZYrVbI5XJkZ2cjNzcXOTk5yMzMRGJiInx9fb1dMtGSLBYLOjs7ceHCBej1euj1enR3dwMAkpKS3N/nrVu3Iisri99n+s8Y1IiIiOiemp+fh8FgcF/k6vV6dHV1YW5uDoGBgUhLS0NmZiYyMjKQkZEBrVaLhx56yNtl0wbjdDrR09ODjo4OtLe3o6OjAx0dHbh69SoAIDQ01B3KcnNzkZuby+8p3VUMakREROR1MzMz6OrqQnt7Ozo7O9He3o729nYYjUYAQHR0NFJTU5GcnIzk5GSkpKQgJSUF8fHxvH2S7sjExAS6u7vR09Pj8dNgMMBut0MqlWLLli1IT0+HVqtFRkYG0tPTERcX5+3S6QHHoEZERETr1ujoqLtH4/Lly+jp6UFPTw8GBwcBAFKpFJs3b3aHt6SkJMTFxUGj0UCj0XCwBoLT6cTQ0BD6+/vR29uL3t5ej1A2Pj4OAPD390dSUhJSUlKQnJyM9PR0pKenIy0tjf8MIK9gUCMiIqL7js1mc4c210V3d3c3/v77b1y/ft3dTqFQQKPRYPPmze7w5pqPiopCTEwM5HK5F4+E7oQQAkajEUajEdeuXUN/f7976uvrQ19fH4aHh+F0OgEAfn5+0Gg0Hr2yrl5ajUYDHx8fLx8R0f8xqBEREdEDZXp6Gr29vejv73dfvLsu2vv7+zEwMACHw+FuL5fLERsbi6ioKERHR0OtVrtDnEqlQlRUFCIiIhAREQGFQuHFI9sYnE4nJiYmMDExgfHxcYyMjGBoaAhGoxFDQ0MYHR3F8PAwRkZGYDQa3SEMuPncmCuILxbO1Wo1R12k+waDGhEREW0o8/PzGBkZwfDwMIaHh2E0GjE4OOgRBFyfT01Neawrk8kQHh7uniIiIjzmw8PDERISArlcjuDgYISFhbl/l8vlG+JWTLvdDpvNBrPZDKvVCpvNhsnJSZjNZlgsFlitVncIcwUy1/z4+DgsFsuCbapUKqhUKsTExCA6OtojSMfGxrp/hoSEeOGIidYGgxoRERHREmw2G0ZGRjwCxWIh49+T1WqF3W5fcpuu0BYcHIzQ0FAAN3uCJBIJgoODIZPJEBAQgMDAQEilUncv3q0hz7XOrWQyGYKDgxcsn5+fh9lsXrSmmZkZTE9Pu+ftdjumpqYwNzfnDk4mkwlCCNhsNjgcDkxPT2NmZgZ2ux2Tk5MwmUywWq0ePVy3CgkJgUKhWDTs3hp6XfMqlQoymWzJbRI9qBjUiIiIiO4yh8MBm82GGzduuHuUbDabO8z8u5dJCAGTyQTg5ju65ubmMDU1BbvdjtnZWUxOTi4IWU6nE1arddF9uwLUYpRK5aLPYfn6+nr0RrnCnkQicYfJkJAQ+Pr6IigoCP7+/vDz84NcLne3DQsLWxBCFQqFe5lSqfzP55NoI2JQIyIiIiIiWmc4tA0REREREdE6w6BGRERERES0zjCoERERERERrTNSACe8XQQRERERERH93/8AFiPzDfjFu/8AAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/preprocess.gq.yaml')\n", - "task_graph.draw(show='ipynb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It can be shown in the interactive gQuant widget. Try to run it and see the preprocess results:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d75c661b3bbb429d80bf407571d4d0d4", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lode the whole TaskGraph by `load_taskgraph` command. Note the preprocess TaskGraph is included inside the `preprocess` `Composite Node`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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UCYBAFxba2urVqxYoT//+c/asGGDrrnmGs2cOVP33nuvBg8ebHY8AN9CZmam/vGPf+jdd99VcXGxRo0apR/+8Ie67bbb5OHhYXY8AABcXQaLzgEALqm5uVl/+ctfFB8fr9tvv12+vr766KOPdOrUKS1YsKDTFEnLli2Tm5ub41FfX292pO/kpZdecpxLjx49zI7Tzvvvv+/I5+vra3Ycl5WUlKQ//OEPys/P1/LlyxUUFKQZM2aob9++evPNN9XU1GR2RAAAXBplEgDA5Xz44Yfq16+f5s2bp9GjR+vAgQNasWKFpkyZIi8vL7PjXVFTp06VYRiaMmXKZRujpqZGffr00c0333zZxjjr8ccfl2EYSkpK+tbHuJx577rrLhmGoTFjxlzRcTsrT09P3XzzzVq6dKmys7M1YcIE/eQnP1FCQoI++OADs+MBAOCyKJMAAC4jLy9PN998s+68805dd911ysrK0sKFCxUfH292NAd/f3+lpKSYHeOSMgxDra2tam1tNTuKU8zKa8a4rvjzdiG9e/fWa6+9puzsbKWmpmrWrFmaMGGCjh8/bnY0AABcDvc5BgC4hLVr12r27Nnq0qWLNm7cqJEjR5odqdMICAjQkSNHzI7hNLPydrTvqaOKjo7W22+/rQceeEAPPvigBg8erEWLFjEjDACAS4iZSQCADu/f//630tLSNH78eO3cuZMiCYBGjBihnTt3atq0abr11lv1+uuvmx0JAACXQZkEAOjQ1q1bp1mzZumxxx7TO++8Iz8/P7MjndfZC0fX1tYqPT3dcZFmT8+2k4RLSkr0yCOPqGfPnvL29lZoaKhuv/127d27t90xy8rK9Nhjj6lXr17y8fFRjx49NHbsWP3973+X3W4/b47CwkLNmDFDQUFBuuaaa3TzzTe3mS1z7gW7jx8/flH7n3uBb2czNjc364MPPtC4ceMUHh4ui8Wi/v37a8GCBZd0WdiF8l7seZ+VlZWlqVOnymazyc/PT6mpqdqyZYvT416u78nZn7evjuvt7a3g4GBNmjRJn3766QWzZ2dna/r06brmmmsc20pLS7/df5DLzNfXVwsXLtT//u//6kc/+pGWL19udiQAAFyDAQBAB1VdXW1069bNmDVrltlRnObn52ckJyef972CggIjOjraCAsLM1atWmVUV1cb+/fvN0aNGmX4+voaW7dudex7+vRpIyYmxggPDzdWrFhhVFVVGYWFhcYzzzxjSDL++Mc/tjn2lClTDEnGlClTjK1btxo1NTXGJ598YgQGBhrXXXdduyzn23/dunWGxWL52v3tdvu3yrhixQpDkvHss88aZ86cMUpKSoyXX37ZcHd3Nx5//PF24yUlJRkRERHf/IVfwPnyXux55+bmGkFBQUZERISxdu1ao7q62ti3b58xfvx4o2fPnoaPj4/p39PX/bydHTcsLMxYsWKFUVlZaWRnZxu333674ebmZrz11lvnzT5q1Cjj008/NWpra43PP//c8PDwMEpKSr75SzfZ/fffb3Tp0sU4c+aM2VEAAOjotlImAQA6rFdffdXw8/MzysrKzI7itK/7x/29995rSDLeeeedNttPnz5t+Pj4GEOGDHFs+973vmdIMj744IN2x5k4ceIFy6QVK1a02T5r1ixDUrsy4EL7T5s27Wv3/2pJcjEZV6xYYYwePbrdfnfffbfh5eVlVFZWttl+ucskZ877zjvvNCQZS5YsabPvqVOnDB8fH6fLpMv5PX3dz9vZcd9777022+vr643u3bsbFovFKCwsbJd99erV5z3e1a6qqsoICgoyXnzxRbOjAADQ0W1lmRsAoMPasGGDJk2apJCQELOjXBLLli2Tu7t7uwsFh4eHq1+/ftq1a5fy8/MlSUuXLpUkTZo0qd1x1qxZo0cfffS8Y1x33XVtXkdEREiSCgoKnNo/MjLya/f/qovJePPNN7dZWnVWUlKSmpqadODAgW8c71Jy5rw//vhjSdKECRPa7Nu9e3f17dvX6bHM+p7OjpuWltZmu4+Pj8aMGSO73a7//ve/7T43bNgwp8e4mgQEBOjWW2/Vhg0bzI4CAECHx93cAAAdVllZmRITE82OcUk0NDSosrJSkmSz2S64X25urkJDQ1VZWSlfX18FBARc1DjnHtvd/cvfK13oukTn7u/t7f21+5919nyczVhZWanf//73Wrp0qfLz81VRUdHm/bq6um88xqX0Tefd0NCg6upq+fr6yt/fv93nu3btqpycnG8cx6zv6ZvGDQsLk/TlNbbOdbVel8wZYWFhOnjwoNkxAADo8JiZBADosGJjY7Vv3z6zY1wUNze382738fFRUFCQPD091dTUJMMwzvu48cYb5ePjI5vNpvr6elVXV1/hM3DOxWa85ZZb9Mwzz+iBBx5QTk6OWltbZRiG/vjHP0qSDMO43JEvio+PjwICAlRfX6+ampp27585c8bp41zO7+nrft6+btyioiJJX86KcyWZmZnq3bu32TEAAOjwKJMAAB3WzJkzlZ6erm3btpkdxWlWq1WNjY2O13FxcVq4cKEk6fbbb1dzc7PS09Pbfe75559XVFSUmpubJUm33XabJGn16tXt9h00aJB++tOfXo74F8XZjC0tLUpPT1d4eLgeeeQRhYaGOkqQC92V7mpwdlna2eVuZ5WWlio7O9vp41zO7+nrft7Ojrtq1ao2n2loaNAnn3wii8XSbglfR5aZman169frrrvuMjsKAAAdHmUSAKDDGjNmjMaNG6c5c+aorKzM7DhOGTx4sHJycpSXl6eMjAwdPXpUqampkqTf/e536tWrl+6//36tWbNGlZWVOnPmjN58803Nnz9fL730kuPW7r/73e8UExOjn/70p1q1apWqq6uVn5+vefPm6fTp01dFmeRsRg8PD40ePVqFhYV68cUXVVpaKrvdrk8//VRvvPGGyWdxYc8++6xCQkL06KOPat26daqpqdHBgwd19913n3fp24Vczu/pm37eYmJi9Oijj2rlypWqrq5WTk6OZs2apdOnT2vBggWO5W4dXUVFhWbPnq3k5GTdcsstZscBAKDjM+vS3wAAXAoFBQVGz549jYEDBxqnT582O843ysrKMlJTUw0/Pz8jMjLSePXVV9u8X1ZWZjz22GNGbGys4eXlZYSGhhrjx4831q1b1+5YpaWlxqOPPmrExMQYXl5eRrdu3Yy77rrLyMnJceyTkZFhSGrzePLJJw3DMNptT0tLu+j9ly5d2m777NmzLyqjYRhGSUmJ8dBDDxmRkZGGl5eXERYWZnzve98zfv7znzuOO2TIEOPFF1+8YD5nXCjvxZ73WdnZ2cbUqVONwMBAw2KxGNddd52xcuVKY8yYMY79586de8W/p7O+6eft3HFtNpsxYcIE45NPPvnan6GO9FfIkpIS47rrrjN69OhhnDhxwuw4AAC4gq1uhnGVXYQAAICLdOLECY0bN061tbV67733NHLkSLMjAbgKZGRkaMaMGfLw8NC6deu4XhIAAJdGBsvcAAAdXnR0tHbs2KFhw4bpxhtv1Lx589rd5QpA51FVVaVHHnlEqampGjBggHbt2kWRBADAJUSZBABwCTabTUuXLtWy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l5dsNpuCgoJks9nk4eFhxqkAAAB0WCxzAwAApissLNThw4eVn5+voqIiFRQU6PTp0yosLFRBQYEqKipUWVmpmpqaSz62n5+fbDabgoODFR4eru7duzv+DAsLU48ePRQbG6uIiIhLPjYAAEAHlEGZBAAAroj6+nodOHBAmZmZys7O1pEjR3T48GEdPnxYtbW1kiRPT0917dpV3bp1U7du3RylTnBwsAIDA2Wz2RyzigIDA+Xp6ang4GDHGF5eXvL399f8+fP19NNPq7a2Vo2NjY73y8vL1dLSosrKSkdBVVVV5ZjtdG6JVVxcrObmZkmS1WpVr1691KtXL/Xu3Vt9+/ZVUlKSrr32Wlmt1iv7ZQIAAJiHMgkAAFx6tbW12r59uz7//HNlZmZq3759ysnJUUtLi/z8/BQXF+coZXr37u143q1bN7m7f/dLOjY3N8vT87uv5jcMQ6dPn3aUXl8twLKzs1VbWysPDw/17t1bAwYMUFJSkoYPH67rr79e/v7+33l8AACAqxBlEgAA+O5KS0u1ceNGpaenKz09XXv27FFzc7OioqI0cOBADRgwwFG29O7d+5IURmZrbW3VkSNHHGXZvn37tHfvXp04cUKenp5KSkpScnKykpOTNXr0aHXt2tXsyAAAAJcCZRIAALh4ra2t2rNnj9avX6/169dr48aNMgxDcXFxSklJUXJyslJTUxUTE2N21CuusLBQO3bsUHp6urZs2aIdO3aosbFRiYmJuuWWWzR27FiNGjVKXl5eZkcFAAD4NiiTAACAc1paWrRhwwa9//77+s9//qOysjJFR0dr4sSJmjhxosaMGaOAgACzY151ampq9Omnn2rNmjX6+OOPdezYMQUHB+vWW2/VXXfdpbFjx16SJXkAAABXCGUSAAD4ep9//rneeecdLV68WEVFRRo6dKimT5+utLQ0JSYmmh2vw8nOztaqVau0ePFibdu2TV26dNG0adM0e/ZsJScnmx0PAADgm1AmAQCA9hoaGrR8+XL98Y9/VEZGhhISEjR9+nTNnDlTcXFxZsdzGSdPntTSpUu1ePFipaenKz4+Xg8//LDmzp3LBbwBAMDVijIJAAD8n6KiIr300kv661//qrq6Ot15552aN2+ebrjhBrOjubydO3fqtdde0/vvvy9vb2/df//9euKJJ9StWzezowEAAHwVZRIAAPjybmwv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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/xgboost_trade.gq.yaml')\n", - "task_graph.draw(show='ipynb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To see the input/output ports of the nodes, turn show_ports flag on" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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LVzqBgCVxybKJAAAAFS4lJQUffnll1q4cKG+//57eXh4KDo6Wv369VN0dLTq1atndUT8ScYY7dmzRytWrNDChQv1ww8/yN/fX7169VL//v3Vp08feXt7l3pfTk6O4uLitHTpUn311VdKSUlRw4YN1adPHw0cOFC33nqratSoYcEWAQD+F2USAAAArJWamqrFixdr4cKFiouLU35+vlq0aKHu3bsrMjJSXbt2VUBAgNUx4YKDBw8qLi7O8Th+/Lhq166tO+64Q/3791f37t3l6enp8vqMMdq+fbuWLl2qRYsWaffu3QoJCdHdd9+tQYMGqUuXLnJzY+YOAKhglEkAAACoPHJycvT9998rLi5Oa9as0a5du2Sz2dSuXTt16tRJHTt2VKdOnXTNNddYHbXaKyws1K5du7R582Zt2bJFGzduVFJSknx8fNS5c2dFRkYqMjJSbdu2vWSFz3//+18tWbJEX3zxhTZs2KDatWsrJiZGAwcOVExMjNzd3S/J5wAAzosyCQAAAJVXWlqa1q5dq3Xr1mnz5s3atWuXCgoKFBQUpDZt2qhbt25q27atWrZsqUaNGlkd94pVUFCghIQE7d27V9u2bdOWLVu0fft25ebmKiAgQB06dFCnTp10++236+abby7X2UcX66efftLnn3+uzz//XPv371f9+vU1YMAADRkyRB06dLjsnw8A1RhlEgAAAKqOnTt3auLEiYqLi1N4eLjy8/N18OBBSVJAQIBatWqlli1bqnXr1rruuut07bXXKjQ01NrQVUhhYaEOHjyohIQE7dmzR3v27NHevXsVHx+vM2fOyG6367rrrnOcJdaxY0c1b97c8kvN9u3b5yiW4uPjdd111+n+++/XsGHDFBYWZmk2ALgCUSYBAACg8jt48KBefvllffjhh2rWrJkmTZqkYcOGyc3NTSdPnnSUHrt373b8nJmZKUny8/NTkyZN1LRpU6dHw4YNVb9+fXl5eVm8dRUrMzNThw8f1sGDB3XgwAGnx6+//qqCggJJUsOGDdWqVSvHo2XLlmrRooU8PDws3oLz2759u+bOnatPP/1UGRkZ6tatm4YPH64BAwbIx8fH6ngAcCWgTAIAAEDllZKSoilTpmjOnDm65pprNHnyZN17770unQlz6NAhp6IkKSnJ8b9ZWVmOcbVr11ZYWJgaNmyoevXqqX79+goNDVXd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qL4yMzO1cOFCLViwQCkpKerSpYumTp2q0aNHKzw83Op4qEKXLl3SunXrtGjRIi1btkweHh4aN26cpk2bph49elgdDwCAuoQyCQAAVD+HDh3S3LlztXjxYvn5+WnSpEmaNm2aOnbsaHU0VAM5OTn6+OOP9eGHH+rgwYPq2LGjnn76ad199918KxwAADffNherEwAAAFyxY8cOjRo1Sh06dFBSUpI++OADpaen680336RIgl2DBg00c+ZMHThwQDt27FBUVJQmTZqkNm3a6MMPP9Tly5etjggAQK1GmQQAACz33XffKT4+Xj169FBmZqaWLFmigwcPaurUqfLy8rI6Hqqxbt266bPPPtO3336rO+64Qw8//LCioqK0ZMkSq6MBAFBrUSYBAADLFBcX6/e//73atWunY8eOad26ddq+fbvi4+Nls9msjocapFWrVvrggw907Ngx9e7dW3fddZfi4uJ09OhRq6MBAFDrUCYBAABL7N+/Xx06dNBrr72mF154Qfv27dPgwYOtjoUaLjw8XP/85z+1efNmpaenKzo6Wn/+85+tjgUAQK1CmQQAAKrcxx9/rNtvv11NmzZVcnKynnzySbm7u1sdC7VInz59tGfPHj333HN64oknNGnSJF28eNHqWAAA1AqUSQAAoMoYY/Sb3/xGU6dO1cMPP6z169erSZMmVsdCLeXm5qbZs2dr7dq1Wr9+vXr27Kn09HSrYwEAUOPZjDHG6hAAAKBumDlzpv76179q4cKFGj9+vNVxUIecPHlScXFxMsboX//6l0JCQqyOBABATbWNO5MAAECVePfdd/XWW2/pk08+oUhClWvWrJkSEhJ0+fJljR07VmVlZVZHAgCgxqJMAgAAN92JEyf0+OOPa/bs2Ro7dqzVcVBHhYWFacmSJdq5c6def/11q+MAAFBjUSYBAICbbs6cOWrevLn+53/+p0qPO2/ePNlsNtlsNjVt2lS7du1SbGys/P395ePjo/79+ysxMdE+f+nSpfb5NptNKSkpuueee9SgQQP7WHZ2tiQpKytLjz76qJo3by4PDw+FhIRozJgx2rdvX5UcPycnR48//rhatGghDw8P1atXT3Fxcdq0aVOl6/DjuZ6enmratKkGDhyojz76SJcuXXKY68x5SVJJSYmee+45tW7dWj4+Pqpfv75Gjhyp5cuXq7y8/JrnVZUOHTpo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AK4PZRIAAKi9KioqlJSUpI0bN2rFihXatm2bXFxcFBMTo169eql3797q37+/goODrY5aK5WVlWn//v3asmWLEhMTtWnTJmVnZyskJET9+vXTiBEjdOedd173+lEAAMASlEkAAKB2KSsr08aNG/XZZ59p9erVysrKUrNmzRQXF6fhw4drwIAB3HVkEWOMkpKStGbNGq1atUo7d+6Ui4uLevfurbFjx2rs2LEUewAAVH+USQAAoOYzxigxMVGfffaZPv/8c2VlZal79+4aM2aMhg0bpvbt21sdEVeRk5OjdevWafny5VqxYoVKS0s1aNAgTZgwQfHx8fL397c6IgAAqIwyCQAA1Fx5eXlasGCB3nnnHR07dkzt27fX+PHjNWHCBN16661Wx8M1KCoq0rJly7Ro0SKtX79e7u7umjx5sh555BHKQAAAqhfKJAAAUPN8++23evPNN/XPf/5TNptNU6dO1YMPPqjo6Giro+EGOH/+vD799FO99dZbSklJUf/+/TVjxgzdeeedcnV1tToeAAB13TYXqxMAAAA46/vvv7eXRhs2bNCcOXN08uRJvfXWWxRJtUj9+vX1yCOPKDk5Wd98842Cg4M1duxYRUdH64svvhD/FgoAgLUokwAAQLWXlpamBx54QK1atdKWLVu0ePFipaSk6KmnnlK9evWsjoebqHfv3vr888915MgRxcTEaPz48erWrZvWr19vdTQAAOosyiQAAFBtGWP03nvvqW3btlq/fr3efvttHThwQHfddZdcXPg1pi6JjIzUokWLdODAAUVERGjo0KEaOXKk0tPTrY4GAECdw5pJAACgWjp27JimTZumbdu26ZlnntGzzz4rDw8Pq2OhmtiwYYMeeOABFRUV6S9/+YsmTJhgdSQAAOoK1kwCAADVz8qVK9WpUyfl5+dr586deuGFFyiS4GDQoEE6ePCgxo4dq0mTJmn69OkqKyuzOhYAAHUCZRIAAKhW3nnnHY0aNUrjx4/Xzp071bFjR6sj1RqLFy9Wx44d5e3tLZvNJpvNpkOHDlkd67r5+/vrnXfe0bJly/Tpp59qxIgRKigosDoWAAC1HmUSAACoNl544QU98sgjevHFF/X+++/L3d3d6ki1RmJioiZMmKDBgwcrKytLx44dU9OmTa2OdUOMHDlSmzdv1oEDB9SvXz8VFRVZHQkAgFqNMgkAAFQLH374oV544QW9//77euaZZ6yOc1P5+fmpd+/eVXrML774QsYYzZw5U35+fmrRooXS0tLUvn17S/LcaF26dFFiYqJOnz6t++67TywLCgDAzUOZBAAALPftt99qxowZmj17tqZNm2Z1nFopLS1NktSgQQOLk9w8ERER+uKLL7R06VLNnTvX6jgAANRalEkAAMByM2fOVNu2bfX8889bHaXWKi8vtzpClbjjjjv0yiuv6IUXXtB3331ndRwAAGolyiQAAGCpnTt3asOGDZo3b57c3Nyq7LglJSV67rnn1Lp1a/n4+Kh+/foaOXKkli9fXql4ycnJ0eOPP64WLVrIw8ND9erVU1xcnDZt2mSfs3TpUvui1jabTSkpKbrnnnvUoEED+9jTTz8tm82moqIiJSYm2sev57zLysq0ePFiDRo0SI0aNZK3t7eio6M1f/58VVRUVMq1bNkySbIvvt2jRw/NmzfPqTxZWVl69NFH1bx5c3l4eCgkJERjxozRvn37run8s7Ozr/k8r8fMmTPVpEkT/elPf6qS4wEAUNdQJgEAAEt9+umnatu2rfr161elx33kkUf0l7/8RW+++aZycnL07bffqnXr1oqPj9c333xjn5eZmamuXbvq008/1fz585Wdna0dO3bIx8dHsbGx+uCDDyRJo0aNkjFG8fHxkqQHH3xQDz/8sNLS0rR9+3a5urrqiSeekDFGvr6+6tWrl4wxMsZc11far127VuPHj9eAAQP07bffKi0tTdOnT9fjjz+up556yj7v33NdunRJxhht377dqTwZGRnq2rWrPv/8c73zzjs6f/68vv76a50/f149e/bUtm3bnD7/quLu7q4HHnhAixYtcijWAADAjUGZBAAALJWYmKjBgwdX+XETEhLUrl07DRo0SN7e3goNDdVrr72myMhIh3nPPPOMvvvuO/35z3/WiBEjFBAQoMjISH366acKCwvTo48+qrNnz1ba/1NPPaV+/frJx8dH3bt3V1lZmYKDg2/oOfTr10/PPPOM6tWrp+DgYM2YMUMTJ07U/PnzlZ+ff0OO8cwzz+jkyZN6/fXXNWzYMPn5+aldu3b67LPPZIzRjBkzrrpdVZz/fzJkyBCdP39eycnJVXZMAADqCsokAABgqfT0dDVv3rzKjzt06FBt3bpV06dP1/bt2+2PtqWkpDjcJbVkyRJJ0vDhwx229/T0VGxsrC5duqR169ZV2n+3bt1uXnhJI0aMcHjM7oqYmBiVlpbq8OHDN+Q4S5culYuLi0aMGOEw3qhRI7Vr10579uzR6dOnK213s8//50REREjSVbMBAIBfhjIJAABYysXFxZLFod9++20tXLhQJ06cUGxsrAICAjR06FB7eST9sK5SXl6evLy85O/vX2kfoaGhkn54FO7f+fr63rzwkvLy8vTcc88pOjpa9erVs69L9OSTT0qSLl68+IuPceX8KyoqFBgY6LAmks1m0969eyVJR48erbTtzT7/n3PlZ6oqH68DAKCuoEwCAACWatas2VXLiJvNZrNpypQp2rhxo3Jzc7V06VIZYzRmzBi9/vrrkn64+ygwMFDFxcUqKCiotI8rj7c1atTomo/9S40cOVIvvviiHnjgAaWmpqqiokLGGL3xxhuSJGPML87j6empoKAgubm5qbS01L6m0r+/+vfv/4vP50ZLTU2V9MPPFwAAuLEokwAAgKX69u2rNWvWVPlCyUFBQfb1dNzd3TVo0CD7N5KtWrXKPm/06NGS5DAm/XDXTkJCgry9vTVkyJBrOraPj48uX75sfx8VFaX33nvP6e3Ly8uVmJioRo0a6dFHH1VISIi9ELp06dI1Zfm5PGPGjFFZWZkSExMrbTd37lzdcsst17WA+M22cuVKNW3aVC1btrQ6CgAAtQ5lEgAAsNTUqVN16tQpLV26tMqP/dBDD+nAgQMqKSnRuXPn9Mc//lHGGA0YMMA+59VXX1VERIRmzZqllStXqqCgQKmpqZo4caIyMjI0f/58++NuzurcubNSU1OVlpambdu26cSJE+rTp4/T27u6uqpfv37KzMzUa6+9puzsbF26dEmbNm3S3/72t2vK8nN5Xn31VbVo0UK//vWvtWbNGuXl5en8+fN699139fvf/17z5s2Tm5vbNR/zZiosLNQHH3yge++91+ooAADUSjZzLfdAAwAA3ASTJk3Sjh07tH///ipba2f//v3661//qn/96186efKkvLy8FBkZqWnTpmnatGkOj37l5OTopZde0rJly3T69Gn5+PioR48e+u1vf2svnrZv366ePXtWOs7VftVKSUnRAw88oL1796p+/fp6+umn9fDDD19T/uzsbM2ZM0erV69WZmam6tevr7i4ODVq1Eh/+MMfJEldunTRnDlz7HdX/di2bdvU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HTp0SCdPnlRaWpqOHTumnj172tYOCgrSww8/rOTkZOXm5urChQuaPXu2/vd//1evvfaanJycbOd6/PHHtXv3bhUWFiorK0uvvvqqDMNQdHS03WvebKWlpfr4448VHx9fLesBAIDvMQAAAGqwiIgIIzY29qavM2PGDEOSIclo0qSJsWXLFiMqKsrw9PQ03NzcjF69ehmpqanljsnOzjbGjx9vNGvWzLBarYa/v7/x0EMPGc8995ztXF26dLHNP3funDFp0iSjZcuWhtVqNQIDA41hw4YZhw4dss2ZP3++7dhrrzfffNNIS0urMD5y5Ejbcenp6UbPnj0NDw8Po1mzZsasWbPKZT1//rwxefJko1WrVobVajUaNmxo3HPPPcaqVavKzdu5c6cxfvx4o3379oa7u7tRr14948477zTefvtto6ysrNzcn1vzZpo3b57h6OhY7rcDAADVYqPFMP67mR8AAKAGWr9+vaKiovT222/r4YcfNjsOaoCMjAx17NhRCQkJmj17ttlxAACoa9IokwAAQI333HPP6a9//au2bt2q9u3bmx0HJiorK1OfPn30zTff6Ouvv67S0/EAAMANQZkEAABqvuLiYvXq1Utnz57V6tWr1aJFC7MjwQSlpaV67LHH9MEHHygtLU2dOnUyOxIAAHVRGjfgBgAANZ7VatWyZcvUoEED3XXXXdq/f7/ZkVDNSktL9fDDD+uDDz7Qxx9/TJEEAICJKJMAAECt4OfnpxUrVqh58+aKiorSypUrzY6EanL27FnFxcXpk08+0RdffKEBAwaYHQkAgDqNMgkAANQavr6+WrVqlXr37q2+ffvqf/7nf1RcXGx2LNxEK1asUGhoqI4dO6a1a9cqOjra7EgAANR5lEkAAKBW8fT01AcffKB3331Xf//73xUWFqYNGzaYHQs3WHZ2tsaPH6+4uDj17t1bX3/9tbp27Wp2LAAAIMokAABQSz300EPavn27GjRooJ49e2rEiBE6efKk2bHwCxUXFyspKUlt2rTRsmXL9MEHH2jevHny9vY2OxoAAPgvyiQAAFBrtWnTRitXrtSSJUu0detWtWvXTs8884xOnTpldjRUUVFRkd59913dcccdeu655zRhwgSlp6dr+PDhZkcDAAA/QJkEAABqvQEDBmjv3r1KTEzUokWLFBQUpIcffljp6elmR8PPKCgo0BtvvKGgoCD9+te/VkREhPbv36+XX35Znp6eZscDAACVsBiGYZgdAgAA4EYpLi7W/Pnz9corr+jgwYPq0aOHxowZo1GjRsnd3d3sePiv7du36/3339e8efNUWFioRx55RFOmTFGzZs3MjgYAAH5aGmUSAAC4JZWVlWnZsmX65z//qWXLlsnLy0sjR47UqFGj1L17d1ksFrMj1jlnzpzRwoUL9e6772r37t26/fbb9cgjj+ihhx5SvXr1zI4HAADsQ5kEAABufZmZmXrvvfc0d+5cHTx4UE2bNlVCQoLuu+8+9erVS46OjmZHvGUdPXpUn376qRYvXqzNmzfLw8NDQ4cO1SOPPKIePXqYHQ8AAFQdZRIAAKhbdu7cqcWLF2vx4sXas2eP6tevrz59+igmJkYxMTFq3ry52RFrtYKCAq1fv16rV6/WqlWrbL9x//79dd999+mee+6Rq6ur2TEBAMD1o0wCAAB115EjR7R48WKtWrVKqampunLlilq3bq2YmBjdfffdCgsLU1BQkNkxa7ScnBxt3bpVGzdu1OrVq7Vp0yaVlJQoODhYvXv3Vr9+/dSrVy85OTmZHRUAANwYlEkAAACSdPXqVaWlpSklJUVffvmltm/fruLiYjVo0EDdu3e3vUJDQ9W4cWOz45qioKBA+/bt07Zt27RlyxZt2bJFBw8elGEYatGihaKjoxUTE6Po6GgFBASYHRcAANwclEkAAACVuXLlinbs2KEtW7Zo8+bN2rx5s44fPy5J8vPz0x133KHg4GDdcccduv3229W6dev/Z+/O46qqE/+Pvy+ryO4GKi64p5GSWimaC26kllouWZo2ZZZL5pTltIzTni2mRYttjuOkpqZILuSCKYtWmpqOgHsuIKhsIiDL+f3Rj/sNQQUFDsjr+Xjch/K5557P+9577ky8Pedz1bBhQ9nY2Jic/MYlJyfr6NGjOnDggPbt26f9+/dr3759OnbsmAzDkLu7e6GC7Y477qA8AgCg+qBMAgAAKKlz585p7969+t///leoZElOTpYkOTg4qHHjxvL19ZWvr6+aNm0qHx8f1atXTw0aNFDdunVVr149UwuntLQ0xcfHKzExUWfOnNHp06d17NgxHTt2TEePHtWxY8eUkpJifT6tW7dW27Zt5efnZ/2zefPmfBseAADVF2USAADAjUpISNDhw4d19OhR662gnImP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KDg4WEeOHNE999yj559/Xt27d6+g5AAAoBrh29wAAAAqg/Xr18vPz09vvfWWnn32WcXGxurRRx+9ZpEkSR4eHnrmmWcUFxenVatWKSUlRXfffbcCAgK0evVq8W+HAACgLFEmAQAAmOjUqVMaO3asgoKC1KZNG+3bt08vv/yynJ2dS70vGxsb3XvvvYqIiNC2bdtUq1YtDRkyRLfeeqsWLVqkvLy8cngGAACguqFMAgAAMEFOTo7mzp2rW265RdHR0Vq7dq1CQ0PVpEmTMtl/t27dFBoaqr1796pjx44aN26cbr31Vn377bd8AxwAALghlEkAAAAV7KeffpK/v79mzpyp6dOn6/fff1dQUFC5zHXrrbdq4cKFOnjwoO6++2498sgj1jHOVAIAANeDMgkAAKCCxMfHa+zYserVq5d8fX21f/9+zZo1SzVq1Cj3uX19ffX5559r3759uv322/Xoo4+qffv2WrlyZbnPDQAAbi6USQAAAOXMMAwFBwerdevWioiIUEhIiEJDQ+Xr61vhWVq3bq1FixZp3759uvXWW3X//ferW7duio6OrvAsAACgaqJMAgAAKEeHDh1Sz549NW3aNE2ePFn79+/X4MGDzY6lNm3aaMmSJfr555/l4OCgrl27avDgwTp48KDZ0QAAQCVHmQQAAFAO8vPzNX/+fPn7+ys5OVnR0dF688035eTkZHa0Qjp16qTNmzcrNDRUR44cUbt27TRlyhSdPXvW7GgAAKCSokwCAAAoYzExMQoICNCUKVM0Y8YM7dy5U506dTI71lUNGjRIv//+u7788kutWLFCLVu21Ny5c1mkGwAAFEGZBAAAUEYMw9Cnn36qjh07Ki8vTzt37tTLL78se3t7s6OViI2NjcaOHatDhw7p6aef1owZM3THHXfo559/NjsaAACoRCiTAAAAykBSUpKGDBmiKVOmaMqUKYqIiNCtt95qdqzrUrNmTc2aNUt79+6Vp6enunTporFjx+rcuXNmRwMAAJUAZRIAAMANCgsLU/v27bVnzx5t3rxZb7/9thwcHMyOdcNat26tDRs26KuvvtL69et166236ttvvzU7FgAAMBllEgAAwHXKzs7WpEmTFBQUpL59+2rv3r26++67zY5VpiwWi8aNG6eYmBgNGTJEDz/8sO6//34lJSWZPOB1GQAAIABJREFUHQ0AAJjEYhiGYXYIAACAqub48eMaPny4YmNjNX/+fI0cOdLsSBUiMjJSjzzyiNLT0/X5559ryJAhZkcCAAAVK5ozkwAAAEpp8+bNuuOOO5Senq7o6OhqUyRJUkBAgHbt2qUhQ4Zo6NChGjFihJKTk82OBQAAKhBlEgAAQAkZhqF33nlHffv2Vd++ffXrr7+qbdu2ZseqcG5ubvr888+1du1aRUREyN/fX+Hh4WbHAgAAFYQyCQAAoARSU1MVFBSkf/7znwoODtaiRYvk7OxsdixTBQUFac+ePbr99tsVGBioF154QXl5eWbHAgAA5Yw1kwAAAK7h+PHjGjhwoJKTk7Vq1Sp17tzZ7EiVzqeffqpnnnlGPXr00H//+1/VqVPH7EgAAKB8sGYSAADA1ezevVvdunWTxWJRdHQ0RdIVPPnkk4qIiFBcXJxuv/12/fbbb2ZHAgAA5YQyCQAA4ApWrVqlgIAA3XLLLYqIiFDjxo3NjlSpderUSTt37lTr1q3VvXt3rVy50uxIAACgHFAmAQAAFGPu3Lm6//77NWbMGK1du1bu7u5mR6oSatWqpXXr1umRRx7RAw88oLffftvsSAAAoIzZmR0AAACgspk1a5ZeffVVvf3225oxY4bZcaocOzs7BQcH65ZbbtG0adN0+vRpffjhh7Kx4d8xAQC4GfD/6AAAAP+fYRh69tln9frrr+vzzz+v9EXSe++9J4vFIovFIh8fH7PjFDF58mStWLFCX3zxhYYPH66srCyzI5W7yv6eAABQFvg2NwAAAEn5+fmaOHGivv76a3399dcaO3as2ZFKrEOHDjp79qxOnjxZZvu8cOGC/P391bp1a/3www83tK8tW7bovvvuU6dOnbRy5Uq5ubmVUcrKq7K/JwAA3AC+zQ0AACAvL09jxozRf/7zH61cufK6iyQXFxd169atjNOZwzAM5efnKz8//4b31bNnT23evFn79u1Tv379lJKSUgYJS4b3BACAsseaSQAAoForKJJCQkK0Zs0a9e7d2+xIlYKrq6sOHz5cZvvr2LGjtm3bpsDAQPXt21c//vijPD09y2z/1UFZvycAAFwvzkwCAADVVl5ensaPH69Vq1Zp9erVFEnlrFWrVtq2bZvOnTun3r176+zZs2ZHAgAA14EyCQAAVEsFRdLy5cu1evVqBQYGFrtddna2XnnlFbVp00Y1a9ZUrVq1NHjwYK1evVp5eXmS/m/R5YyMDEVGRloXYLazK3wS+Llz5zR9+nQ1b95cDg4O8vT0VFBQkMLDw4vM+9dtHR0d5ePjoz59+mjBggXKzMy86nNbtGiRNUPBLSEhocSvzapVqwo9tmDh7MvHjx07ppEjR8rDw0O1a9fWoEGDrnnmTNOmTRUeHq60tDT16dNHSUlJJc5VgPekbN8TAABKzQAAAKhm8vPzjbFjxxo1atQwfvzxx6tu+9hjjxnu7u7Gjz/+aFy8eNFISEgwnn32WUOSER4eXmhbZ2dnIyAgoNj9xMfHG76+voaXl5cRGhpqpKamGrGxscawYcMMi8VifPHFF0W29fb2NkJDQ420tDQjISHBeO211wxJxpw5cwrtu3379kbDhg2tP+fm5hrTp083+vbta5w/f76Ur87/ue+++wxJRmZmZrHj9913nxEVFWVcuHDB2LBhg+Hk5GR07ty5RPs+duyY0axZM6N9+/alzsh7Uj7vCQAAJRRFmQQAAKqdqVOnGg4ODsa6deuuua2vr6/RtWvXIuOtWrUqVXExbtw4Q5KxePHiQuNZWVlGgwYNDCcnJyMhIaHQtkuXLi2ynwEDBly1uEhOTjb69+9vPP3000Zubu41n9/VXKu4CA0NLTT+wAMPGJKMpKSkEu3/2LFjRuPGjY0777zTSEtLK3Eu3pPye08AACiBKC5zAwAA1cqrr76qjz/+WAsXLtSAAQOuuf2AAQMUFRWlCRMmaPv27dbLqGJjY9WzZ88Sz7ty5UpJ0sCBAwuNOzo6KjAwUJmZmQoLCyu0bVBQUJH9rFu3TtOmTSt2jtjYWN15552ysbHRhx9+KFtb2xLnux6dO3cu9HOjRo0kSadPny7R45s0aaJNmzbpjz/+UFBQkDIyMkr0ON6TK7vR9wQAgJKgTAIAANXGp59+qn/+85+aM2eORo4cWaLHBAcHa+HChTpy5IgCAwPl5uamAQMGWMuFksjOzlZqaqpq1KghV1fXIvd7eXlJkhISEq657ZUkJydryJAh8vHx0bp167Ro0aISP/Z6ubu7F/rZwcFBkkr11fUtWrRQWFiYYmJiNGzYMGVnZ1/zMbwnV1YW7wkAANdCmQQAAKqFxYsXa/LkyXrjjTc0derUEj/OYrFozJgx2rhxo1JSUrRq1SoZhqFhw4bpgw8+KLJtcRwdHeXu7q6srCylp6cXuf/MmTOSJG9v72tueyV2dnbauHGjQkJC5Ofnp8cff1y//PJLiR9vJj8/P61bt07bt2/XuHHjrll88J4AAGAuyiQAAHDT27hxo8aPH6+nnnpK//jHP0r1WA8PD8XExEiS7O3t1bdvX+s3aK1Zs6bQtjVr1tSlS5esP7du3Vrz58+XJA0dOlSSijwmOztbmzZtkpOTk/r3719o27Vr1xbJ4+/vr2eeeabIuKurqxo2bCgXFxetXr1aLi4uGjJkiOLj40v1fM3SuXNnrVq1SitXrtSzzz571W15TwAAMBdlEgAAuKnt2LFDQ4cO1fDhwzV37tzr2sfEiRO1d+9eZWdnKzExUbNnz5ZhGOrdu3eh7W6//XbFxcXpxIkTio6O1pEjR9S9e3dJ0ltvvSVfX19NmzZNP/zwg9LT0xUXF6fRo0crPj5ec+fOtV5aVbDtM888ozVr1ig9PV0nT57UU089pfj4+GKLi79q2rSpli9frqSkpBJfOlYZ9OrVSwsXLtTcuXP13nvvXXVb3hMAAExk7gLgAAAA5ef33383atWqZQwePNjIycm5rn3s3r3beOKJJ4xbbrnFqFmzplGrVi3jrrvuMr744gsjPz+/0LYxMTFG9+7dDWdnZ6NRo0ZGcHBwofvPnj1rTJs2zfD19TXs7e0Nd3d3o3///samTZuKzHv5tvXr1zdGjRplxMXFWbdZvHixIanQbc6cOUZ0dHSR8YceeqjEz3nlypXFPr64/b744ouGYRhFxgcOHFial7mQ4OBgw2KxGAsWLCj2ft6Tin9PAAD4iyiLYRhG+VVVAAAA5jh69Ki6deumli1bav369apRo4bZkVAKzz33nObNm6ewsLBSfUMbAAAod9GUSQAA4KaTnJysrl27ysnJSVu2bJGbm5vZkVBKhmFo5MiR2rx5s3bs2KHmzZubHQkAAPyJMgkAANxccnJyFBQUpAMHDmjHjh3y8fExOxKuU2Zmpnr06KH09HRFR0fLw8PD7EgAAECKZgFuAABwU5kyZYp27NihtWvXUiRdxmKxXPM2a9Yss2NaOTk5adWqVUpPT9eoUaOUl5dndqQyV9XeEwAAJMnO7AAAAABl5a233tIXX3yhlStXqn379mbHqXSq4gnpDRo0UEhIiO6++2698MILevfdd82OVKaq4nsCAABnJgEAgJvCihUr9NJLL+nDDz/Uvffea3YclKGOHTtqwYIFev/99/XFF1+YHQcAgGqPNZMAAECVt3PnTvXo0UOjR4/W/PnzzY6DcjJz5ky9//772rBhg3r06GF2HAAAqisW4AYAAFXbqVOndOedd8rPz0+hoaGys+Mq/ptVfn6+hg0bpsjISO3YsUPNmjUzOxIAANURZRIAAKi60tPT1a1bN+Xl5SkyMlLu7u5mR0I5u3DhggICAmSxWBQZGSlnZ2ezIwEAUN3wbW4AAKBqysvL04gRI5SUlKS1a9dSJFUTLi4uCgkJ0alTp/TEE0+YHQcAgGqJMgkAAFRJL774orZs2aKQkBA1btzY7DioQE2bNtWSJUu0ZMkS1sgCAMAElEkAAKDKWblypWbPnq3g4GB17tzZ7DgwQWBgoGbOnKmpU6dq165dZscBAKBaYc0kAABQpRw4cEB33XWXHnnkEc2bN8/sODBRfn6+BgwYoCNHjmjnzp1c6ggAQMVgAW4AAFB1JCcn64477lC9evUUHh4uBwcHsyPBZImJifL391fHjh0VEhIii8VidiQAAG52LMANAAAql4sXLxY7np+fr4cfflgZGRlatmwZRRIkSfXq1dO3336rdevWae7cuUXuP3TokL799lsTkgEAcPOiTAIAAJXKO++8o0ceeUQZGRmFxl9++WVt2LBBy5YtU4MGDUxKh8qoR48e+te//qUZM2YoMjLSOj5//nzddttteuutt0xMBwDAzYfL3AAAQKXSpk0bxcbGqmXLllq5cqXatWunkJAQDR06VPPnz9djjz1mdkRUQoZhaOjQodq1a5fCwsL097//XevXr7feHx8fLy8vLxMTAgBw02DNJAAAUHkcOnRILVu2lCTZ2dnJYrHoueee08cff6yHHnpIn3zyickJUZmdO3dOnTt31vnz53Xx4kXl5ORIkmxsbLRgwQKNGTPG5IQAANwUWDMJAABUHt9//73s7OwkSbm5ucrJydFbb70ld3d3vfHGGyanQ2V28eJFzZo1S0ePHlV6erq1SJL+LJPWrVtnYjoAAG4unJkEAAAqjU6dOmnXrl26/D9P7O3t1bhxY61cuVJ+fn4mpUNltWPHDo0aNUonT55Ubm5usdu4u7vr/PnzsrHh31IBALhBnJkEAAAqh/j4+GKLJEnKycnRsWPH1LlzZy1YsKDiw6HSWrhwobp27ao//vjjikWSJKWmpmrXrl0VmAwAgJsXZRIAAKgUQkJCrnrWSF5eni5duqTx48dr6dKlFZgMldmoUaP0zDPPyDCMqx4/Dg4OCgsLq8BkAADcvCiTAABApfDdd99d9X57e3t5enpqxYoVGjlyZAWlQmXn4OCg9957Txs2bFCdOnVkb29f7HY5OTn64YcfKjgdAAA3J9ZMAgAApktJSVHdunWLvUzJxsZG+fn5uv/++/XZZ5+pTp06JiREVZCUlKRHHnlEYWFhys/PL3K/ra2tzp07J3d3dxPSAQBw02DNJAAAYL7Q0NBif/m3t7eXu7u7li9fruXLl1Mk4arq1q2rNWvW6NNPP5Wjo6P1mwEL5Ofna9OmTSalAwDg5kGZBAAATLdixYpC691YLBZJ0r333qvY2Fjdf//9ZkVDFWOxWDRhwgTt3LlTLVu2LFQo2dnZsW4SAABlgMvcAACAqTIzM1WrVi1lZWVJ+vNspBo1aig4OFhjxowxOR2qsqysLM2YMUMfffSR9XJJb29vxcfHmx0NAICqjMvcAACAuX788UdlZWVZz0a65557dOjQIYok3LAaNWpo3rx5WrFihVxcXGRjY6OEhAQdOHDA7GgAAFRpdtfeBAAAVCdZWVlKSUlRamqq0tLSlJqaquTkZKWlpSknJ0epqanWbbOzs3Xx4kXrz05OTqpRo4b1Zzc3N+u6R56ennJzc5O7u7vc3Nzk6empGjVq6Pvvv5ckubq66rPPPtODDz5YcU8WN7WsrCxlZmbK399foaGhmjp1qvbs2aOPPvpIffr0KXQ8Z2ZmWs+OK2AYhlJSUors187OTq6urkXGXV1dZWdnJ1tbW7m5ualGjRpycnKSq6ur7O3t5eHhIQcHBzk7O8vNzU22trbl88QBAChnXOYGAEA1cunSJR05ckSHDx/WoUOHdOrUKSUkJOj06dNKSEhQfHy8zp8/X+xjC35R9vDwsJ5FZG9vLxcXF+s2Fy5cUE5OjqT/+0U8Ly9PaWlpxe7T09NTaWlp8vT0VI8ePdS0aVM1atRIzZo1U4sWLdSsWTM5OjqW8auAqig1NVXx8fFKTEzU6dOndebMGZ07d04pKSlKTk5WcnKy9e8Ff2ZmZl51nxaLRR4eHpKKHssFiit9CkqqyyUnJ0uScnNzlZ6efs3nVFCqenh4yNPTs9DfPTw8VKdOHTVo0ED16tVT/fr15e3tXaisBQDAJNGUSQAA3IQuXLigffv2ae/evdqzZ49iY2N1+PBhnThxQnl5eZIkb29v+fj4WH9JbdCggby8vNSwYUPrWURubm7y8PAoVCBdj4Ji6fKznX7++WcdOHBAdevWtRYEJ06csK5pY2NjIx8fHzVv3lytWrVShw4ddNttt8nPz6/YM0NQNZ05c0bHjx/X8ePH9ccff1j//Gtx9NezhmxtbVWvXj3Vrl27SAlz+d+dnJzk4eEhe3t7ubq6ysnJSYcOHVKXLl2KfNtbWSs42yktLU25ublKSUnRpUuXlJGRobS0tCIl2OV/T0pKKlLuuru7q379+qpXr54aNmwoHx8fNWnSRE2aNFHTpk3VpEkTPhsAgPJGmQQAQFV36dIl7dy5U5GRkdq+fbv27NmjI0eOKD8/X25ubvLz81Pbtm3VvHlztWjRwvpncWdhVBYZGRk6dOiQ9QyqQ4cO6cCBA/r999+Vmpoqi8UiX19fdejQQXfeeacCAgLUqVMnzmKqpAzD0PHjxxUbG6uYmBjFxMTo6NGj1gKp4CwfGxsb1a9fX02bNlXjxo3l5eUlb29veXt7y8vLy3qWTr169Qp9+9/NLDs7W4mJiTp16pQSExOtZxAWjJ04cULHjx/XuXPnrI+pVauWtWBq2bKlWrdurTZt2qhNmzaqXbu2ic8GAHCToEwCAKCqycrK0rZt27R582ZFRkbql19+UVZWlry8vNSlSxf5+/vrtttu02233SZfX98bOqOoMjp69Kj27t2rvXv3avfu3YqOjlZ8fLwcHR3VqVMnBQQEqHfv3rr77rvl5ORkdtxqxTAMHTlyRL/99pv27dunmJgYxcbGKi4uzrq2Vt26dXXLLbeoWbNm1jNpCm4+Pj5ycHAw+VlUTRcuXNDx48d17Ngxa0l3/PhxHTx4ULGxscrIyJAk1alTx1ostW7dWu3bt5e/v7/q1Klj8jMAAFQhlEkAAFQFhw8f1vr167Vu3TqFh4fr4sWLuuWWWxQQEKBu3bqpa9euatmypdkxTXP48GFFRUUpMjJSERER2r9/v5ycnNSzZ08NGDBAQUFB1fr1KQ85OTnav3+/du/erd9++027d+/W7t27lZaWJltbWzVv3ly33HKLWrdurdatW1v/XqtWLbOjVzuGYejEiROFzgyLjY3VgQMHdPr0aUmSj4+POnToIH9/f3Xo0EEdOnRQs2bNTE4OAKikKJMAAKisTpw4oe+//17Lli1TZGSknJ2d1aVLFw0aNEhDhgxRkyZNzI5YaSUmJuqnn35SaGiofvjhByUnJ6tt27YaPny4Ro8erVatWpkdscpJT0/Xjh07FBERocjISEVGRiozM1P29vZq2bKlOnbsaL35+/vL2dnZ7MgogZSUFO3bt087d+603mJjY5WXlyd3d3d17tzZWlp369aNBcABABJlEgAAlUtaWpoWLVqkRYsWafv27apVq5YeeOABjRgxQt27d5e9vb3ZEauc3NxcRUZG6rvvvtPy5cuVmJioO+64Qw899JDGjh1r/TYvFJacnKyNGzcqPDzcerZXfn6+2rRpo65du6pbt26644471Lp163JfyBoVKyMjQ3v27NH27du1bds2RUVFKTExUU5OTurcubO6d++uPn36KCAggP9NAoDqiTIJAIDKYN++ffrkk0+0aNEi5eXladiwYXrwwQfVt29fflkrQ7m5udq8ebOWLFmi5cuXKz8/X6NHj9akSZPUvn17s+OZKi8vT7/++qvCwsK0fv16/fzzz7JYLIXOTOnatavq1q1rdlSYIC4uTlFRUYqIiNDWrVt18OBBubq6qnfv3urfv7/69+/PZXEAUH1QJgEAYKaffvpJ//rXvxQeHq5WrVpp4sSJGj9+PGfLVIC0tDT95z//UXBwsA4cOKC7775br7zyigIDA82OVmFycnK0YcMGLV26VGvWrNG5c+fUqFEjaznQp08fjkUU6+jRo1q/fr3CwsK0efNmpaenq1WrVho2bJhGjhypDh06mB0RAFB+KJMAADBDZGSkXnnlFW3evFmBgYF6/vnn1adPn5vum9eqAsMwFB4ertmzZyssLEx33323Xn31VfXo0cPsaOUiLy9P4eHhWrJkiVauXKnk5GR16dJFw4YNU1BQkNq2bWt2RFQxOTk5ioyM1Nq1a7Vs2TIdO3ZMrVu31siRIzVy5EiOKQC4+VAmAQBQkU6cOKGpU6dq1apVN31pURX9teQbOHCgPv74YzVt2tTsWGXi5MmT+vzzz/Xll18qISFBHTt21MiRIzVixAgWc0eZMQxDO3bs0NKlS7Vs2TKdOnVKt99+uyZNmqQHH3xQTk5OZkcEANw4yiQAACpCXl6ePvroI7388suqX7++PvroI/Xv39/sWLiCzZs3a/Lkyfrjjz80a9YsTZs2rUouMl1w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FrH9UigUPZ582dfXFy4uLr0+/+rn2e122O12p6t/ivX2pac2WQyBgP+G5jdCDNh8fX2hUqmg0Wjg7u4utYlubm7QarVQqVRQq9VS2yi2neLsMcdbX+0+ERGNSQyTiIjGCnGvtTjDR9yrLQ7iHAMfcUAnPkckzgbqic1mk6441djYiPfeew/r16/HuHHjADjPGriaOMC5+r7jrCkxqBIHSo5Bl5+fnxSAEdHoJ7ZNjqGLYygttnOO7Zo4gwdwbq9EPS272tUB99dff438/Hxs3rxZWibOqOqLGO70tkycqQXAqW1zbCvFWVwAnGZrERERDQGGSURENPAuXryI2NhYnD59GrNnz5a7HCKiQfHMM8/gjTfewMWLF+UuhYiIaCjlKuWugIiIiIiIiIiIRg6GSURERERERERE1G8Mk4iIiIiIiIiIqN8YJhERERERERERUb8xTCIiIiIiIiIion5jmERERERERERERP3GMImIiIiIiIiIiPqNYRIREREREREREfUbwyQiIiIiIiIiIuo3hklERERERERERNRvDJOIiIiIiIiIiKjfGCYREREREREREVG/MUwiIiIiIiIiIqJ+Y5hERERERERERET9xjCJiIiIiIiIiIj6jWESERERERERERH1G8MkIiIiIiIiIiLqN4ZJRERERERERETUbwyTiIiIiIiIiIio3xgmERERERERERFRvzFMIiIiIiIiIiKifmOYRERERERERERE/cYwiYiIiIiIiIiI+o1hEhERjVnPP/88FAoFFAoFIiIi5C6HiGjAsZ0jIqLBwDCJiIjGrCeeeAKCIGDmzJlyl0JENCjYzhER0WBgmERERMOGj48P4uPj5S5jROB3RTQy8W+3//hdERENXwyTiIiIiIiIiIio3xgmERERERERERFRvzFMIiKiQdXZ2Ynf/OY3mDp1Kry8vODv7w+9Xo+MjAzYbDYA/z1BbGtrK06ePCmdLNbV1dXpterq6vD4448jJiYGbm5u8PPzw6pVq/DJJ590e1/Hdd3d3REREYHExES8+eabaG9v77Pmt99+W6pBvJlMpuv+7P2p9w9/+IP0Ho6Hc3z44YfS8nHjxknL+/tdEdHQYTvHdo6IaMwRiIiIBlhBQYEAQDh9+rTw4IMPChqNRvjoo4+EtrY2wWQyCU888YQAQPjkk0+cnuft7S0sXry4x9esrKwU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FKBBgwbo0qULunbtii5dusDBwQFmZmZixyV6o7y8PMTGxuLvv//G+fPn8ffffyMuLg6CIKBp06Z4//330bVrV/Tq1Qv29va8eomIiOjdsEwiIiKq7TIzM3HixAkcP34cx48fx9WrV6GpqYmOHTsqi6OuXbuiWbNmYkclqjSZmZk4f/68slw6d+4c0tLSYGpqit69e6Nv377o27cvWrRoIXZUIiKimoZlEhERUW0UFRWFAwcOICQkBJGRkRAEAfb29spfoJ2dnTlUjeoUQRBw+fJlZal66tQpZGdno0mTJpDJZJDL5RgwYABXjyMiInozlklERES1gUKhQEREBPbt24d9+/bhzp07aNq0KQYMGIC+ffuiT58+MDU1FTsmkcooKCjA+fPncfz4cYSEhCAiIgI6OjoYOHAghg4dCjc3N9SrV0/smERERKqIZRIREVFNdunSJWzcuBH79u1DUlISWrVqhaFDh2Lo0KHo1KmT2PGIaozk5GQcOHAA+/btQ1hYGNTU1CCTyeDl5YUhQ4ZAU1NT7IhERESqgmUSERFRTZObm4tdu3Zh3bp1OH/+PN577z0MHz4cH374Idq0aSN2PKIa7/Hjxzh06BD27t2LoKAg1K9fH2PHjsX48eNhbW0tdjwiIiKxsUwiIiKqKe7du4eVK1di06ZNyMnJwZAhQzBhwgT06tULEolE7HhEtdL9+/exYcMGbNy4EcnJyRgwYAC+/vpr9O3bV+xoREREYonguqhEREQq7sGDB/D29kaLFi3w559/YsaMGbh37x527twJFxcXUYqkyMhIjB49GtbW1tDW1oaRkRE6d+6M77//HhkZGdWep6a4cOECRo8eDRsbG+jo6MDExARt27bFhx9+iLVr1+L27dsVut3ly5dDIpFAIpHAysrqjdvp7TVu3Bjff/897t69iz179iA/Px8ymQyurq6IiooSOx4REZEoWCYRERGpqLy8PCxcuBCtW7fGsWPHsHr1aty8eROzZ8+Gubm5aLlmz56N999/H8bGxggMDERGRgYSEhIwf/587N+/Hy1btkR4eLho+VSRQqHAjBkz0L17d5iZmeHo0aPIyMjAtWvXsGLFCmRlZWHixIlo3rw5CgsLy33706dPhyAI6NChw1ttp/JTV1fH0KFDERoaipMnTyInJwedO3fGxx9/XOESkIiIqKZimURERKSCLl26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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_graph.draw(show='ipynb', show_ports=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Similarly, it can be shown in the interactive gQuant widget. Try to run it, change the parameters and play with it" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "dfcd077b6b4c4f3ea348138d6310d947", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The features used for XGBoost algorithm are prepared in the `xgboost` Task node, where `cuIndicator` module is used to compute the technical indicators in the GPU for all the stock symbols. `xgboost` is the Task node that is used to compute the trading signals from the stock technical indicators. Each of the gQuant Task node is implemented by overwriting `meta_setup`, `process`, `ports_setup`, `conf_chema` methods of the Node base class. Please refer to [customize nodes notebook](https://github.com/rapidsai/gQuant/blob/master/notebooks/05_customize_nodes.ipynb) for details. Following is the source code for \"XGBoostStrategyNode\":" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "class XGBoostStrategyNode(Node):\n", - " \"\"\"\n", - " This is the Node used to compute trading signal from XGBoost Strategy.\n", - " It requires the following conf fields:\n", - " \"train_date\": a date string of \"Y-m-d\" format. All the data points\n", - " before this date is considered as training, otherwise as testing. If\n", - " not provided, all the data points are considered as training.\n", - " \"xgboost_parameters\": a dictionary of any legal parameters for XGBoost\n", - " models. It overwrites the default parameters used in the process method\n", - " \"no_feature\": specifying a list of columns in the input dataframe that\n", - " should NOT be considered as training features.\n", - " \"target\": the column that is considered as \"target\" in machine learning\n", - " algorithm\n", - " It requires the \"datetime\" column for spliting the data points and adds a\n", - " new column \"signal\" to be used for backtesting.\n", - " The detailed computation steps are listed in the process method's docstring\n", - " \"\"\"\n", - "\n", - " def init(self):\n", - " _PortTypesMixin.init(self)\n", - " self.INPUT_PORT_NAME = 'stock_in'\n", - " self.OUTPUT_PORT_NAME = 'stock_out'\n", - "\n", - " def meta_setup(self):\n", - " # if 'no_feature' in self.conf:\n", - " # retention = self.conf['no_feature']\n", - " # else:\n", - " cols_required = {'datetime': 'date',\n", - " \"asset\": \"int64\"}\n", - " # self.delayed_process = True\n", - " required = {\n", - " self.INPUT_PORT_NAME: cols_required\n", - " }\n", - " retention = {}\n", - " retention['signal'] = 'float64'\n", - " # _PortTypesMixin.retention_meta_setup(self, retention)\n", - "\n", - " input_meta = self.get_input_meta()\n", - " if self.INPUT_PORT_NAME not in input_meta:\n", - " col_from_inport = required[self.INPUT_PORT_NAME]\n", - " else:\n", - " col_from_inport = input_meta[self.INPUT_PORT_NAME]\n", - " # delete the columns from the inputs\n", - " if 'no_feature' in self.conf:\n", - " for key in self.conf['no_feature']:\n", - " if key in col_from_inport:\n", - " retention[key] = col_from_inport[key]\n", - " metadata = MetaData(inports=required,\n", - " outports={self.OUTPUT_PORT_NAME: retention})\n", - " return metadata\n", - "\n", - " def ports_setup(self):\n", - " types = [cudf.DataFrame,\n", - " dask_cudf.DataFrame]\n", - " return _PortTypesMixin.ports_setup_from_types(self, types)\n", - "\n", - " def conf_schema(self):\n", - " json = {\n", - " \"title\": \"XGBoost Node configure\",\n", - " \"type\": \"object\",\n", - " \"description\": \"\"\"Split the data into training and testing based on\n", - " 'train_data', train a XGBoost model based on the training data, \n", - " make predictions for all the data points, compute the trading.\n", - " \"\"\",\n", - " \"properties\": {\n", - " \"num_of_rounds\": {\n", - " \"type\": \"number\",\n", - " \"description\": \"\"\"The number of rounds for boosting\"\"\",\n", - " \"default\": 100\n", - " },\n", - " \"train_date\": {\n", - " \"type\": \"string\",\n", - " \"description\": \"\"\"the date to splite train and validation\n", - " dataset\"\"\"\n", - " },\n", - " \"target\": {\n", - " \"type\": \"string\",\n", - " \"description\": \"the column used as dependent variable\"\n", - " },\n", - " \"no_feature\": {\n", - " \"type\": \"array\",\n", - " \"items\": {\n", - " \"type\": \"string\",\n", - " },\n", - " \"description\": \"\"\"columns in the input dataframe that\n", - " should NOT be considered as training features.\"\"\"\n", - " },\n", - " \"xgboost_parameters\": {\n", - " \"type\": \"object\",\n", - " \"description\": \"xgoobst parameters\",\n", - " \"properties\": {\n", - " 'max_depth': {\n", - " \"type\": \"number\",\n", - " \"description\": \"Maximum depth of a tree.\",\n", - " \"default\": 8\n", - " }, \n", - " \"max_leaves\": {\n", - " \"type\": \"number\",\n", - " \"description\": \"maximum number of tree leaves\",\n", - " \"default\": 2**8\n", - " },\n", - " \"gamma\": {\n", - " \"type\": \"number\",\n", - " \"description\": \"\"\"Minimum loss reduction required\n", - " to make a further partition on a leaf node of the\n", - " tree.\"\"\",\n", - " \"default\": 0\n", - " },\n", - " \"objective\": {\n", - " \"type\": \"string\",\n", - " \"enum\": [\"reg:squarederror\", \"reg:squaredlogerror\",\n", - " \"reg:logistic\", \"reg:pseudohubererror\"],\n", - " \"description\": \"\"\"Specify the learning task and\n", - " the corresponding learning objective.\"\"\",\n", - " \"default\": \"reg:squarederror\"\n", - " }\n", - " }\n", - " }\n", - " },\n", - " \"required\": [\"target\", \"num_of_rounds\"],\n", - " }\n", - " ui = {\n", - " \"train_date\": {\n", - " \"ui:widget\": \"alt-date\",\n", - " \"ui:options\": {\n", - " \"yearsRange\": [1985, 2025],\n", - " \"hideNowButton\": True,\n", - " \"hideClearButton\": True,\n", - " },\n", - " },\n", - " }\n", - " input_meta = self.get_input_meta()\n", - " if self.INPUT_PORT_NAME in input_meta:\n", - " col_from_inport = input_meta[self.INPUT_PORT_NAME]\n", - " enums = [col for col in col_from_inport.keys()]\n", - " json['properties']['no_feature']['items']['enum'] = enums\n", - " json['properties']['target']['enum'] = enums\n", - " return ConfSchema(json=json, ui=ui)\n", - " else:\n", - " return ConfSchema(json=json, ui=ui)\n", - "\n", - " def process(self, inputs):\n", - " \"\"\"\n", - " The process is doing following things:\n", - " 1. split the data into training and testing based on provided\n", - " conf['train_date']. If it is not provided, all the data is\n", - " treated as training data.\n", - " 2. train a XGBoost model based on the training data\n", - " 3. Make predictions for all the data points including training and\n", - " testing.\n", - " 4. From the prediction of returns, compute the trading signals that\n", - " can be used in the backtesting.\n", - " Arguments\n", - " -------\n", - " inputs: list\n", - " list of input dataframes.\n", - " Returns\n", - " -------\n", - " dataframe\n", - " \"\"\"\n", - " dxgb_params = {\n", - " 'max_depth': 8,\n", - " 'max_leaves': 2 ** 8,\n", - " 'tree_method': 'gpu_hist',\n", - " 'objective': 'reg:squarederror',\n", - " 'grow_policy': 'lossguide',\n", - " }\n", - " # num_of_rounds = 100\n", - " if 'xgboost_parameters' in self.conf:\n", - " dxgb_params.update(self.conf['xgboost_parameters'])\n", - " input_df = inputs[self.INPUT_PORT_NAME]\n", - " model_df = input_df\n", - " train_cols = set(model_df.columns) - set(\n", - " self.conf['no_feature'])\n", - " train_cols = list(train_cols - set([self.conf['target']]))\n", - "\n", - " if isinstance(input_df, dask_cudf.DataFrame):\n", - " # get the client\n", - " client = dask.distributed.client.default_client()\n", - " if 'train_date' in self.conf:\n", - " train_date = datetime.datetime.strptime(self.conf['train_date'], # noqa: F841, E501\n", - " '%Y-%m-%d')\n", - " model_df = model_df[model_df.datetime < train_date]\n", - " train = model_df[train_cols]\n", - " target = model_df[self.conf['target']]\n", - " dmatrix = xgb.dask.DaskDMatrix(client, train, label=target)\n", - " bst = xgb.dask.train(client, dxgb_params, dmatrix,\n", - " num_boost_round=self.conf[\"num_of_rounds\"])\n", - "\n", - " dtrain = xgb.dask.DaskDMatrix(client, input_df[train_cols])\n", - " prediction = xgb.dask.predict(client, bst, dtrain).persist()\n", - " pred_df = dask_cudf.from_dask_dataframe(\n", - " prediction.to_dask_dataframe())\n", - " pred_df.index = input_df.index\n", - " input_df['signal'] = pred_df\n", - " elif isinstance(input_df, cudf.DataFrame):\n", - " if 'train_date' in self.conf:\n", - " train_date = datetime.datetime.strptime(self.conf['train_date'], # noqa: F841, E501\n", - " '%Y-%m-%d')\n", - " model_df = model_df.query('datetime<@train_date')\n", - " train = model_df[train_cols]\n", - " target = model_df[self.conf['target']]\n", - " dmatrix = xgb.DMatrix(train, label=target)\n", - " bst = xgb.train(dxgb_params, dmatrix,\n", - " num_boost_round=self.conf[\"num_of_rounds\"])\n", - " infer_dmatrix = xgb.DMatrix(input_df[train_cols])\n", - " prediction = cudf.Series(bst.predict(infer_dmatrix),\n", - " nan_as_null=False,\n", - " index=input_df.index\n", - " ).astype('float64')\n", - " input_df['signal'] = prediction\n", - "\n", - " input_df['tmp'] = (input_df['asset'] -\n", - " input_df['asset'].shift(1)).fillna(1)\n", - " input_df['tmp'] = (input_df['tmp'] != 0).astype('int32')\n", - " tmp = input_df['tmp']\n", - " input_df['tmp'] = tmp.where(tmp != 1, None)\n", - " input_df = input_df.dropna(subset=['tmp'])\n", - " input_df = input_df.drop('tmp', axis=1)\n", - "\n", - " # convert the signal to trading action\n", - " # 1 is buy and -1 is sell\n", - " # It predicts the tomorrow's return (shift -1)\n", - " # We shift 1 for trading actions so that it acts on the second day\n", - " input_df['signal'] = ((\n", - " input_df['signal'] >= 0).astype('float') * 2 - 1).shift(1)\n", - "\n", - " # remove the bad datapints\n", - " input_df = input_df.dropna()\n", - " remaining = list(self.conf['no_feature']) + ['signal']\n", - " return {self.OUTPUT_PORT_NAME: input_df[remaining]}\n", - "\n" - ] - } - ], - "source": [ - "import inspect\n", - "from rapids_modules import XGBoostStrategyNode\n", - "\n", - "print(inspect.getsource(XGBoostStrategyNode))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### XGBoost Trading Strategy Performance\n", - "Similar to tensorflow, gQuant graph is evaluated by specifying the output nodes and input nodes replacement. We first look at the column result from data preparation node." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "output meta of node node_technical_indicator:\n", - "MetaData(inports={'stock_in': {'indicator': 'int32', 'high': 'float64', 'low': 'float64', 'close': 'float64', 'volume': 'float64', 'returns': 'float64'}}, outports={'stock_out': {'CH_OS_10_20': 'float64', 'BO_BA_b1_10': 'float64', 'BO_BA_b2_10': 'float64', 'SHIFT_-1': 'float64', 'indicator': 'int32', 'returns': 'float64', 'datetime': 'date', 'asset': 'int64', 'volume': 'float64', 'close': 'float64', 'open': 'float64', 'high': 'float64', 'low': 'float64'}})\n" - ] - } - ], - "source": [ - "from pprint import pprint\n", - "print('output meta of node node_technical_indicator:')\n", - "task_graph.build()\n", - "pprint(task_graph['technical_indicator'].meta_setup())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It adds the columns \"BO_BA_b1_10\", \"BO_BA_b2_10\", 'CH_OS_10_20\" as features and \"SHFIT_-1\" as the target, which is the return of next day. A good feature should be the one that provides highest information about the next day return. In the case we have no prior information about it,\n", - "we can compute as many features as we like and leave it to the XGBoost to find the right combination of those features. \n", - "\n", - "Evaluate the leaf nodes of the backtesting graph by gQuant `run` method." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:stock_data process time:4.398s\n", - "id:preprocess process time:0.568s\n", - "id:sort_after process time:0.054s\n", - "id:technical_indicator process time:0.116s\n", - "id:xgboost process time:2.268s\n", - "id:backtest process time:0.002s\n", - "id:train_df process time:0.007s\n", - "id:portfolio_opt_train process time:0.024s\n", - "id:sharpe_ratio_trn process time:0.001s\n", - "id:cumulative_return_trn process time:0.023s\n", - "id:validation_df process time:0.006s\n", - "id:portfolio_opt_validation process time:0.019s\n", - "id:sharpe_ratio_val process time:0.001s\n", - "id:cumulative_return_val process time:0.022s\n", - "CPU times: user 7.36 s, sys: 1.33 s, total: 8.7 s\n", - "Wall time: 8.31 s\n" - ] - } - ], - "source": [ - "%%time\n", - "output_list = ['sharpe_ratio_trn.sharpe_out',\n", - " 'cumulative_return_trn.cum_return',\n", - " 'sharpe_ratio_val.sharpe_out',\n", - " 'cumulative_return_val.cum_return',\n", - " 'sort_after.out']\n", - "o_gpu = task_graph.run(output_list, profile=True)\n", - "cached_sort = o_gpu['sort_after.out']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define a function to organized the plot results. " - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "da9ca5b730cd4cb58b7c84ba0a0b558b", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side=…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# define the function to format the plots\n", - "def plot_figures(o):\n", - " # format the figures\n", - " figure_width = '1200px'\n", - " figure_height = '400px'\n", - " sharpe_number = o['sharpe_ratio_trn.sharpe_out']\n", - " cum_return_train = o['cumulative_return_trn.cum_return']\n", - " cum_return_train.layout.height = figure_height\n", - " cum_return_train.layout.width = figure_width\n", - " cum_return_train.title = 'Training P & L %.3f' % (sharpe_number)\n", - " sharpe_number = o['sharpe_ratio_val.sharpe_out']\n", - " cum_return_test = o['cumulative_return_val.cum_return']\n", - " cum_return_test.layout.height = figure_height\n", - " cum_return_test.layout.width = figure_width\n", - " cum_return_test.title = 'Testing P & L %.3f' % (sharpe_number)\n", - "\n", - " return widgets.VBox([cum_return_train, cum_return_test])\n", - "plot_figures(o_gpu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The XGBoost model does a good job to predict the next day of return. It overfits in the training dataset and gets Sharpe Ratio of 5 as shown in the figure above. In the testing period, it gets Sharpe Ratio of 1.\n", - "\n", - "The example model runs in a single GPU because of the small dataset. But in real world, the dataset usually is so large that it doesn't fit in a single GPU. Luckily, the XGBoost library natively supports multiple nodes and multiple GPU training by using Dask. You can scale out the computation using Dask dataframe.\n", - "\n", - "To show how easy it is to do distributed computation, let's run the above exmaple in the Dask environment for educational purpose. \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run the whole workflow, simply change the `preprocess` node to get Dask Dataframe and run the graph again. Here we look at the testing results:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:stock_data process time:0.012s\n", - "id:preprocess process time:10.520s\n", - "id:xgboost process time:4.284s\n", - "id:backtest process time:0.013s\n", - "id:train_df process time:0.160s\n", - "id:portfolio_opt_train process time:0.040s\n", - "id:sharpe_ratio_trn process time:1.833s\n", - "id:cumulative_return_trn process time:1.462s\n", - "id:validation_df process time:0.007s\n", - "id:portfolio_opt_validation process time:0.042s\n", - "id:sharpe_ratio_val process time:1.401s\n", - "id:cumulative_return_val process time:1.400s\n", - "CPU times: user 12 s, sys: 690 ms, total: 12.7 s\n", - "Wall time: 35.8 s\n" - ] - } - ], - "source": [ - "%%time\n", - "\n", - "replace_spec = {'preprocess': {\"inputs\": {\"sort_node@in\": \"stock_data.dask_cudf_out\"}}}\n", - "o_gpu = task_graph.run(replace=replace_spec, profile=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "5bce35d115d64011bfa699b9404d32c9", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side=…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_figures(o_gpu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Clearly, 3 feautres is way too little here. gQuant implmented 36 technical indicators. We can change the configuration of node_technical_indicator node to include more features." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "chaikin_para0 = 10\n", - "chaikin_para1 = 20\n", - "bollinger_para = 10\n", - "macd_para0 = 2\n", - "macd_para1 = 3\n", - "rsi_para0 = 5\n", - "atr_para0 = 10\n", - "sod_para = 2\n", - "mflow_para = 3\n", - "findex_para = 5\n", - "adis_para = 5\n", - "ccindex_para = 5\n", - "bvol_para = 3\n", - "vindex_para = 3\n", - "mindex_para0 = 10\n", - "mindex_para1 = 15\n", - "tindex_para0 = 5\n", - "tindex_para1 = 10\n", - "emove_para = 5\n", - "cc_para = 15\n", - "kchannel_para = 10\n", - "indicator_conf = {\n", - " \"indicators\": [\n", - " {\"function\": \"port_chaikin_oscillator\",\n", - " \"columns\": [\"high\", \"low\", \"close\", \"volume\"],\n", - " \"args\": [chaikin_para0, chaikin_para1]\n", - " },\n", - " {\"function\": \"port_bollinger_bands\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [bollinger_para],\n", - " \"outputs\": [\"b1\", \"b2\"]\n", - " },\n", - " {\"function\": \"port_macd\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [macd_para0, macd_para1],\n", - " \"outputs\": [\"MACDsign\", \"MACDdiff\"]\n", - " },\n", - " {\"function\": \"port_relative_strength_index\",\n", - " \"columns\": [\"high\", \"low\"],\n", - " \"args\": [rsi_para0],\n", - " },\n", - " {\"function\": \"port_average_true_range\",\n", - " \"columns\": [\"high\", \"low\", \"close\"],\n", - " \"args\": [atr_para0],\n", - " },\n", - " {\"function\": \"port_stochastic_oscillator_k\",\n", - " \"columns\": [\"high\", \"low\", \"close\"],\n", - " \"args\": [],\n", - " },\n", - " {\"function\": \"port_stochastic_oscillator_d\",\n", - " \"columns\": [\"high\", \"low\", \"close\"],\n", - " \"args\": [sod_para],\n", - " },\n", - " {\"function\": \"port_money_flow_index\",\n", - " \"columns\": [\"high\", \"low\", \"close\", \"volume\"],\n", - " \"args\": [mflow_para],\n", - " },\n", - " {\"function\": \"port_force_index\",\n", - " \"columns\": [\"close\", \"volume\"],\n", - " \"args\": [findex_para],\n", - " },\n", - " {\"function\": \"port_ultimate_oscillator\",\n", - " \"columns\": [\"high\",\"low\",\"close\"],\n", - " \"args\": [],\n", - " },\n", - " {\"function\": \"port_accumulation_distribution\",\n", - " \"columns\": [\"high\",\"low\",\"close\",\"volume\"],\n", - " \"args\": [adis_para],\n", - " },\n", - " {\"function\": \"port_commodity_channel_index\",\n", - " \"columns\": [\"high\",\"low\",\"close\"],\n", - " \"args\": [ccindex_para],\n", - " },\n", - " {\"function\": \"port_on_balance_volume\",\n", - " \"columns\": [\"close\", \"volume\"],\n", - " \"args\": [bvol_para],\n", - " },\n", - " {\"function\": \"port_vortex_indicator\",\n", - " \"columns\": [\"high\", \"low\", \"close\"],\n", - " \"args\": [vindex_para],\n", - " },\n", - " {\"function\": \"port_kst_oscillator\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [3, 4, 5, 6, 7, 8, 9, 10],\n", - " },\n", - " {\"function\": \"port_mass_index\",\n", - " \"columns\": [\"high\", \"low\"],\n", - " \"args\": [mindex_para0, mindex_para1],\n", - " },\n", - " {\"function\": \"port_true_strength_index\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [tindex_para0, tindex_para1],\n", - " },\n", - " {\"function\": \"port_ease_of_movement\",\n", - " \"columns\": [\"high\", \"low\", \"volume\"],\n", - " \"args\": [emove_para],\n", - " },\n", - " {\"function\": \"port_coppock_curve\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [cc_para],\n", - " },\n", - " {\"function\": \"port_keltner_channel\",\n", - " \"columns\": [\"high\", \"low\", \"close\"],\n", - " \"args\": [kchannel_para],\n", - " \"outputs\": [\"KelChD\", \"KelChM\", \"KelChU\"]\n", - " },\n", - " {\"function\": \"port_ppsr\",\n", - " \"columns\": [\"high\", \"low\", \"close\"],\n", - " \"args\": [],\n", - " \"outputs\": [\"PP\", \"R1\", \"S1\", \"R2\", \"S2\", \"R3\", \"S3\"]\n", - " },\n", - " {\"function\": \"port_shift\",\n", - " \"columns\": [\"returns\"],\n", - " \"args\": [-1]\n", - " } \n", - " ],\n", - " \"remove_na\": True\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "dfcd077b6b4c4f3ea348138d6310d947", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(cache={'height': 410.7, 'width': 1369, 'nodes': [{'width': 140, 'id': 'stock_data', 'type': 'CsvS…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the backtesting again" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:technical_indicator process time:5.200s\n", - "id:xgboost process time:6.102s\n", - "id:backtest process time:0.003s\n", - "id:train_df process time:0.007s\n", - "id:portfolio_opt_train process time:0.024s\n", - "id:sharpe_ratio_trn process time:0.001s\n", - "id:cumulative_return_trn process time:0.023s\n", - "id:validation_df process time:0.005s\n", - "id:portfolio_opt_validation process time:0.018s\n", - "id:sharpe_ratio_val process time:0.001s\n", - "id:cumulative_return_val process time:0.023s\n", - "CPU times: user 10.4 s, sys: 2.37 s, total: 12.8 s\n", - "Wall time: 12.2 s\n" - ] - } - ], - "source": [ - "%%time\n", - "replace_spec = {}\n", - "replace_spec['technical_indicator'] = {\"conf\": indicator_conf}\n", - "\n", - "replace_spec['sort_after'] = {\"load\": {'out': cached_sort}}\n", - "\n", - "o_gpu = task_graph.run(replace=replace_spec, profile=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "4e70cea236204b8a9033b190f4d7cd94", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side=…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_figures(o_gpu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We get Sharpe Ratio of `1.93` in the testing dataset, not bad!\n", - "\n", - "Using `min_volume=400.0`, it selects 1558 stocks. Setting a lower threshhold, it can include more stocks for the backtesting and hence increase the Sharpe Ratio. But it runs out of memory of single GPU. We have shown Dask can help to break down the large task into small tasks and schedule them a distributed environment. So we can handle dataset of any sizes in this way:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:stock_data process time:0.011s\n", - "id:preprocess process time:8.173s\n", - "id:xgboost process time:8.112s\n", - "id:backtest process time:0.010s\n", - "id:train_df process time:0.008s\n", - "id:portfolio_opt_train process time:0.041s\n", - "id:sharpe_ratio_trn process time:2.313s\n", - "id:cumulative_return_trn process time:2.392s\n", - "id:validation_df process time:0.008s\n", - "id:portfolio_opt_validation process time:0.042s\n", - "id:sharpe_ratio_val process time:2.314s\n", - "id:cumulative_return_val process time:2.251s\n", - "CPU times: user 12.5 s, sys: 1.47 s, total: 14 s\n", - "Wall time: 47.7 s\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d3f9031bdd434290a8692e1156378e19", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%%time\n", - "min_volume = 4.0\n", - "min_rate = -10.0\n", - "max_rate = 10.0\n", - "replace_spec={}\n", - "replace_spec['technical_indicator'] = {\"conf\": indicator_conf}\n", - "\n", - "replace_spec['node_filterValue']={\"conf\": [{\"column\": \"volume_mean\", \"min\": min_volume},\n", - " {\"column\": \"returns_max\", \"max\": max_rate},\n", - " {\"column\": \"returns_min\", \"min\": min_rate}]}\n", - "replace_spec['preprocess'] = {\"conf\": {\"subnodes_conf\": {\n", - " \"value_filter\": {\n", - " \"conf\": [{\"column\": \"average_volume\", \"min\": min_volume},\n", - " {\"column\": \"max_return\", \"max\": max_rate},\n", - " {\"column\": \"min_return\", \"min\": min_rate}]\n", - " },\n", - " \"drop_columns\": {\n", - " \"conf\": {\n", - " \"columns\": [\"average_volume\", \"min_return\", \"max_return\"]\n", - " }\n", - " }\n", - " },\n", - " \"taskgraph\": \"taskgraphs/preprocess.gq.yaml\",\n", - " \"input\": [\"sort_node.in\"],\n", - " \"output\": [\"drop_columns.out\"]\n", - " },\n", - " \"inputs\": {\"sort_node@in\": \"stock_data.dask_cudf_out\"}}\n", - "\n", - "o_gpu = task_graph.run(replace=replace_spec, profile=True)\n", - "plot_figures(o_gpu)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "8640f861899747c5995a54dd8e2fe68b", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale(), side=…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_figures(o_gpu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We get Sharpe Ratio of `4.7` in the testing dataset. This is a great improvement!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Strategy parameter search\n", - "Quantitative analyst usually need to explore different parameters for their trading strategy. The exploration process is an iterative process. gQuant help to speed up this by allowing using cached dataframe and evaluating the sub-graphs.\n", - "\n", - "To find the optimal technical indicator parameters for this XGBoost strategy, we build a wiget to search the parameter interactively. " - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "e4c2a1671bd54563b66c26e87864017a", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(VBox(children=(IntRangeSlider(value=(10, 20), continuous_update=False, description='Chaikin', m…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import plotutils\n", - "replace_spec={}\n", - "replace_spec['technical_indicator'] = {\"conf\": indicator_conf}\n", - "replace_spec['sort_after'] = {\"load\": {'out': cached_sort}}\n", - "plotutils.getXGBoostWidget(replace_spec, task_graph, plot_figures)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Conclusions\n", - "In this notebook, we demoed how to use gQuant to backtest XGBoost trading strategy. It is convenient and efficient to use indicator node from the gQuant to compute features for all the stocks in the dataset in the GPU. The XGBoost training are computed in the GPU, so we can get the results quickly. This example shows the XGBoost algorithm's power in finding trading signals. We can achieve close to 2 raw Sharpe ratio in the testing time period." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'status': 'ok', 'restart': True}" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import IPython\n", - "app = IPython.Application.instance()\n", - "app.kernel.do_shutdown(True)" - ] - }, - { - "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.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/07_fractional_differencing.ipynb b/notebooks/07_fractional_differencing.ipynb deleted file mode 100644 index 3c6c22c9..00000000 --- a/notebooks/07_fractional_differencing.ipynb +++ /dev/null @@ -1,825 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Fractional Differencing\n", - "\n", - "### Background\n", - "Fractional Differencing is a signal processing technique that is used to remove the non-stationarity from the time series while maintaining as much memory as possible. It is widely used in FSI to prepare training data for machine learning algorithms. In this [open-source project](https://github.com/ritchieng/fractional_differencing_gpu/blob/master/notebooks/gpu_fractional_differencing.ipynb) done by Ensemble Capital, fractional differencing computation is accelerated via `cudf.appy_chunk` method in the GPU. It achieves hundreds of times acceleration compared with CPU implementation in their [report](https://www.researchgate.net/publication/335159299_GFD_GPU_Fractional_Differencing_for_Rapid_Large-scale_Stationarizing_of_Time_Series_Data_while_Minimizing_Memory_Loss). \n", - "Using `apply_rows` and `apply_chunks` method from the cudf library is the easiest way of customizing GPU computations as covered in this [blog](https://medium.com/rapids-ai/user-defined-functions-in-rapids-cudf-2d7c3fc2728d). However, it is not the most efficient way.\n", - "\n", - "In this notebook, we are going to show how to use Numba to do fractional differencing computation efficiently. As gQuant wrap the fractional differencing function in the computation node, we are going to show it is easy for data scientists to compute fractional differencing signals and use them to generate alpha signals. \n", - "\n", - "### Environment Preparation" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import sys; sys.path.insert(0, '..')\n", - "\n", - "import warnings\n", - "import gquant\n", - "import ipywidgets as widgets\n", - "import os\n", - "import time\n", - "import numpy as np\n", - "from numba import cuda\n", - "import cudf\n", - "import inspect\n", - "from numba import njit\n", - "from numba import prange\n", - "from gquant.dataframe_flow.task import load_modules\n", - "load_modules(os.environ['MODULEPATH']+'/rapids_modules')\n", - "from rapids_modules.cuindicator import get_weights_floored, fractional_diff\n", - "warnings.simplefilter(\"ignore\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Copy the fractional differencing code from the [open-source project](https://github.com/ritchieng/fractional_differencing_gpu/blob/master/notebooks/gpu_fractional_differencing.ipynb). We will use this as our benchmark reference" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def moving_dot_product_kernel(in_data, out, window_size, weights):\n", - " # Set the first window_size-1 rows in each chunk to np.nan due \n", - " # insufficient history\n", - " for i in range(cuda.threadIdx.x, window_size - 1, cuda.blockDim.x):\n", - " out[i] = np.nan\n", - " \n", - " # Compute dot product of preceding window_size rows\n", - " for i in range(cuda.threadIdx.x + window_size - 1, in_data.size, cuda.blockDim.x):\n", - " rolling_dot_product = 0.0\n", - " \n", - " k = 0\n", - " for j in range(i - window_size + 1, i + 1):\n", - " rolling_dot_product += in_data[j] * weights[k][0]\n", - " k += 1\n", - " \n", - " out[i] = rolling_dot_product \n", - " \n", - "def frac_diff_gpu(df, d, floor=1e-3):\n", - " r\"\"\"Fractionally difference time series via GPU.\n", - " \n", - " Args:\n", - " df (pd.DataFrame): dataframe of raw time series values.\n", - " d (float): differencing value from 0 to 1 where > 1 has no FD.\n", - " floor (float): minimum value of weights, ignoring anything smaller.\n", - " \"\"\"\n", - " \n", - " # Bring dataframe to GPU, reset index for GPU dot product kernel\n", - " # gdf_raw = cudf.from_pandas(df).reset_index(drop=True)\n", - " gdf_raw = df\n", - " gdf_raw.columns = ['in_data']\n", - "\n", - " # Get weights window\n", - " weights = get_weights_floored(d=d, num_k=len(gdf_raw), floor=floor)\n", - " weights_window_size = len(weights)\n", - " \n", - " # Reverse weights and as contiguous\n", - " weights = np.ascontiguousarray(weights[::-1])\n", - " \n", - " # Bring weights to GPU\n", - " gdf_weights = cudf.DataFrame()\n", - " gdf_weights[gdf_raw.columns[0]] = weights.reshape(-1)\n", - "\n", - " # Length of data\n", - " data_length = len(gdf_raw)\n", - "\n", - " # T4: max of 518 threads per block.\n", - " # V100: max 1024 threads per block\n", - " threads_per_block = 518\n", - "\n", - " # Chunk size split\n", - " # This has to be improved, but as a v0.1, it's sufficient to show speed-up\n", - " # Up to easily 100 million data points\n", - " trunk_size = data_length\n", - "\n", - " # Get fractionally differenced time series through GPU function\n", - " gdf_raw_fd = gdf_raw.apply_chunks(moving_dot_product_kernel,\n", - " incols=['in_data'],\n", - " outcols=dict(out=np.float64),\n", - " kwargs=dict(window_size=weights_window_size, weights=weights),\n", - " chunks=list(range(0, data_length, trunk_size)) + [data_length],\n", - " tpb=threads_per_block)\n", - " \n", - " # Bring to CPU for normal manipulation\n", - " # df_raw_fd = gdf_raw_fd.to_pandas().dropna().iloc[:-1, 1]\n", - " \n", - " return gdf_raw_fd, weights" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Following is the gQuant's fractional differencing implementation via Numba library" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def fractional_diff(input_arr, d=0.5, floor=1e-3, min_periods=None,\n", - " thread_tile=2, number_of_threads=512):\n", - " \"\"\"\n", - " The fractional difference computation method.\n", - "\n", - " Arguments:\n", - " -------\n", - " input_arr: numba.cuda.DeviceNDArray or cudf.Series\n", - " the input array to compute the fractional difference\n", - " d: float\n", - " the differencing value. range from 0 to 1\n", - " floor: float\n", - " minimum value for the weights for computational efficiency.\n", - " min_periods: int\n", - " default the lengths of the weights. Need at least min_periods of\n", - " non-na elements to get fractional difference value\n", - " thread_tile: int\n", - " each thread will be responsible for `thread_tile` number of\n", - " elements in window computation\n", - " number_of_threads: int\n", - " number of threads in a block for CUDA computation\n", - "\n", - " Returns\n", - " -------\n", - " (numba.cuda.DeviceNDArray, np.array)\n", - " the computed fractional difference array and the weight array tuple\n", - "\n", - " \"\"\"\n", - " if isinstance(input_arr, numba.cuda.cudadrv.devicearray.DeviceNDArray):\n", - " gpu_in = input_arr\n", - " else:\n", - " gpu_in = input_arr.to_gpu_array()\n", - "\n", - " # compute the weights for the fractional difference\n", - " weights = get_weights_floored(d=d,\n", - " num_k=len(input_arr),\n", - " floor=floor)[::-1, 0]\n", - " weights_out = np.ascontiguousarray(weights)\n", - " weights = numba.cuda.to_device(weights_out)\n", - "\n", - " window = len(weights)\n", - "\n", - " if min_periods is None:\n", - " min_periods = window\n", - " else:\n", - " min_periods = min_periods\n", - "\n", - " number_of_threads = number_of_threads\n", - " array_len = len(gpu_in)\n", - "\n", - " # allocate the output array\n", - " gpu_out = numba.cuda.device_array_like(gpu_in)\n", - "\n", - " number_of_blocks = \\\n", - " (array_len + (number_of_threads * thread_tile - 1)) // \\\n", - " (number_of_threads * thread_tile)\n", - "\n", - " shared_buffer_size = (number_of_threads * thread_tile +\n", - " window - 1 + window)\n", - "\n", - " # call the conv kernel\n", - " kernel[(number_of_blocks,),\n", - " (number_of_threads,),\n", - " 0,\n", - " shared_buffer_size * 8](gpu_in,\n", - " weights,\n", - " gpu_out,\n", - " window,\n", - " array_len,\n", - " thread_tile,\n", - " min_periods)\n", - " return gpu_out, weights_out\n", - "\n" - ] - } - ], - "source": [ - "print(inspect.getsource(fractional_diff))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It launches the Numba kernel, which defined as:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "@cuda.jit(device=True)\n", - "def conv_window(shared, history_len, out_arr, window_size,\n", - " arr_len, offset, offset2, min_size):\n", - " \"\"\"\n", - " This function is to do convolution for one thread\n", - "\n", - " Arguments:\n", - " ------\n", - " shared: numba.cuda.DeviceNDArray\n", - " 3 chunks of data are stored in the shared memory\n", - " the first [0, window_size) elements is the chunk of data that is\n", - " necessary to compute the first convolution element.\n", - " then [window_size, window_size + thread_tile * blockDim) elements\n", - " are the inputs allocated for this block of threads\n", - " the last [window_size + thread_tile,\n", - " window_size + thread_tile + window_size) is to store the kernel values\n", - " history_len: int\n", - " total number of historical elements available for this chunk of data\n", - " out_arr: numba.cuda.DeviceNDArray\n", - " output gpu_array of size of `thread_tile`\n", - " window_size: int\n", - " the number of elements in the kernel\n", - " arr_len: int\n", - " the chunk array length, same as `thread_tile`\n", - " offset: int\n", - " indicate the starting index of the chunk array in the shared for\n", - " this thread.\n", - " offset: int\n", - " indicate the starting position of the weights/kernel array\n", - " min_size: int\n", - " the minimum number of non-na elements\n", - " \"\"\"\n", - " for i in range(arr_len):\n", - " if i + history_len < window_size-1:\n", - " out_arr[i] = np.nan\n", - " else:\n", - " s = 0.0\n", - " average_size = 0\n", - " for j in range(0, window_size):\n", - " if not (cmath.isnan(\n", - " shared[offset + i - j])):\n", - " s += (shared[offset + i - j] *\n", - " shared[offset2 + window_size - 1 - j])\n", - " average_size += 1\n", - " if average_size >= min_size:\n", - " out_arr[i] = s\n", - " else:\n", - " out_arr[i] = np.nan\n", - "\n", - " \n", - "@cuda.jit\n", - "def kernel(in_arr, weight_arr, out_arr, window,\n", - " arr_len, thread_tile, min_size):\n", - " \"\"\"\n", - " This kernel is to do 1D convlution on `in_arr` array with `weight_arr`\n", - " as kernel. The results is saved on `out_arr`.\n", - "\n", - " Arguments:\n", - " ------\n", - " in_arr: numba.cuda.DeviceNDArray\n", - " input gpu array\n", - " weight_arr: numba.cuda.DeviceNDArray\n", - " convolution kernel gpu array\n", - " out_arr: numba.cuda.DeviceNDArray\n", - " output gpu_array\n", - " window: int\n", - " the number of elements in the weight_arr\n", - " arr_len: int\n", - " the input/output array length\n", - " thread_tile: int\n", - " each thread is responsible for `thread_tile` number of elements\n", - " min_size: int\n", - " the minimum number of non-na elements\n", - " \"\"\"\n", - " shared = cuda.shared.array(shape=0,\n", - " dtype=numba.float64)\n", - " block_size = cuda.blockDim.x # total number of threads\n", - " tx = cuda.threadIdx.x\n", - " # Block id in a 1D grid\n", - " bid = cuda.blockIdx.x\n", - " starting_id = bid * block_size * thread_tile\n", - "\n", - " # copy the thread_tile * number_of_thread_per_block into the shared\n", - " for j in range(thread_tile):\n", - " offset = tx + j * block_size\n", - " if (starting_id + offset) < arr_len:\n", - " shared[offset + window - 1] = in_arr[\n", - " starting_id + offset]\n", - " cuda.syncthreads()\n", - "\n", - " # copy the window - 1 into the shared\n", - " for j in range(0, window - 1, block_size):\n", - " if (((tx + j) <\n", - " window - 1) and (\n", - " starting_id - window + 1 + tx + j >= 0)):\n", - " shared[tx + j] = \\\n", - " in_arr[starting_id - window + 1 + tx + j]\n", - " cuda.syncthreads()\n", - " # copy the weights into the shared\n", - " for j in range(0, window, block_size):\n", - " element_id = tx + j\n", - " if (((tx + j) < window) and (element_id < window)):\n", - " shared[thread_tile * block_size + window - 1 + tx +\n", - " j] = weight_arr[tx + j]\n", - " cuda.syncthreads()\n", - " # slice the shared memory for each threads\n", - " start_shared = tx * thread_tile\n", - " his_len = min(window - 1,\n", - " starting_id + tx * thread_tile)\n", - " # slice the global memory for each threads\n", - " start = starting_id + tx * thread_tile\n", - " end = min(starting_id + (tx + 1) * thread_tile, arr_len)\n", - " sub_outarr = out_arr[start:end]\n", - " sub_len = end - start\n", - " conv_window(shared, his_len, sub_outarr,\n", - " window, sub_len,\n", - " window - 1 + start_shared,\n", - " thread_tile * block_size + window - 1,\n", - " min_size)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Fractional differencing is essentially doing 1D convolution computation with the kernel values set to be the weights computed from get_weights_floored. Check the original notebook for the details of the meanings of the weights. To make convolution computation faster, we divide the long input array into small chunks and send to different thread blocks. All the array chunks and the weights are loaded into the GPU shared memory for fast IO. The device function conv_window is doing the convolution computation for one thread.\n", - "\n", - "To make a fair comparsion with CPU implementation, we implemented an efficient CPU version of the fractional differencing calculation. It is accelerated by numba.njit that take advantage of multiple cores of the CPU and fastmath compiler optimization." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "@njit(fastmath=True, parallel=True)\n", - "def moving_dot_product_cpu(in_data, out, window_size, weights):\n", - " # Set the first window_size-1 rows in each chunk to np.nan due \n", - " # insufficient history\n", - " for i in prange(0, window_size - 1):\n", - " out[i] = np.nan\n", - " \n", - " # Compute dot product of preceding window_size rows\n", - " for i in prange(window_size - 1, len(in_data)):\n", - " rolling_dot_product = 0.0\n", - " \n", - " k = 0\n", - " for j in range(i - window_size + 1, i + 1):\n", - " rolling_dot_product += in_data[j] * weights[k]\n", - " k += 1\n", - " \n", - " out[i] = rolling_dot_product \n", - "\n", - "def cpu_fractional_diff(input_arr, d=0.5, floor=1e-3):\n", - "\n", - " # compute the weights for the fractional difference\n", - " weights = get_weights_floored(d=d,\n", - " num_k=len(input_arr),\n", - " floor=floor)[::-1, 0]\n", - " weights_out = np.ascontiguousarray(weights)\n", - " weights = weights_out\n", - " weights_window_size = len(weights)\n", - " window = len(weights)\n", - " out = np.zeros_like(input_arr)\n", - " moving_dot_product_cpu(input_arr, out, weights_window_size, weights)\n", - " return out" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Fractional differencing is essentially doing 1D convolution computation with the kernel values set to be the weights computed from `get_weights_floored`. Check the original [notebook](https://github.com/ritchieng/fractional_differencing_gpu/blob/master/notebooks/gpu_fractional_differencing.ipynb) for the details of the meanings of the weights. To make convolution computation faster, we divide the long input array into small chunks and send to different thread blocks. All the array chunks and the weights are loaded into the GPU shared memory for fast IO. The device function `conv_window` is doing the convolution computation for one thread.\n", - "\n", - "We can compare the performance of gQuant GPU implementation vs the original one and CPU implementation:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "array size 100000, Ensemble: time 0.503 s, gQuant GPU Time 0.537 s, gQuant CPU Time 0.942, speed up 0.94, speed up vs CPU 1.75, error 0.0000 \n", - "array size 1000000, Ensemble: time 0.138 s, gQuant GPU Time 0.018 s, gQuant CPU Time 0.044, speed up 7.74, speed up vs CPU 2.48, error 0.0000 \n", - "array size 10000000, Ensemble: time 0.994 s, gQuant GPU Time 0.032 s, gQuant CPU Time 0.134, speed up 31.11, speed up vs CPU 4.19, error 0.0000 \n", - "array size 100000000, Ensemble: time 9.350 s, gQuant GPU Time 0.263 s, gQuant CPU Time 1.162, speed up 35.54, speed up vs CPU 4.42, error 0.0000 \n" - ] - } - ], - "source": [ - "for i in range(5, 9):\n", - " df_raw = cudf.DataFrame()\n", - " ran_array = np.random.rand(10**int(i))\n", - " df_raw['in'] = ran_array\n", - " df_raw2 = cudf.DataFrame()\n", - " df_raw2['in'] = ran_array\n", - "\n", - " # Start timer\n", - " start = time.time()\n", - " df_raw_fd_from_gpu, weights = frac_diff_gpu(df_raw, d=0.5, floor=5e-5)\n", - " # End timer\n", - " end = time.time()\n", - " duration = end - start\n", - "\n", - " start = time.time()\n", - " gquant_gpu, weights = fractional_diff(df_raw2['in'], d=0.5, floor=5e-5)\n", - " cuda.synchronize()\n", - " end = time.time()\n", - " optimized_duration = end - start\n", - " #(df_raw_fd_from_gpu.values)\n", - " \n", - " \n", - " start = time.time()\n", - " cpu_result = cpu_fractional_diff(ran_array, d=0.5, floor=5e-5)\n", - " end = time.time()\n", - " cpu_duration = end - start\n", - " \n", - " err = np.abs(df_raw_fd_from_gpu['out'].to_array()[weights.size-1:] - np.array(gquant_gpu)[weights.size-1:]).max()\n", - " err = max(np.abs(df_raw_fd_from_gpu['out'].to_array()[weights.size-1:] - cpu_result[weights.size-1:]).max(), err)\n", - " print('array size %d, Ensemble: time %.3f s, gQuant GPU Time %.3f s, gQuant CPU Time %.3f, speed up %.2f, speed up vs CPU %.2f, error %.4f ' % (10**int(i), duration, optimized_duration, cpu_duration, duration / optimized_duration, cpu_duration/optimized_duration, err))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the array of length 100m, gQuant can achieve 100x speedup compare with the Ensemble Capitial's GPU implementatoin and 30x speed up compared with multiple core CPU." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Use the fractional differencing signal to trade stocks\n", - "\n", - "We will use the same [XGBoost example](https://github.com/rapidsai/gQuant/blob/master/notebooks/06_xgboost_trade.ipynbx) to do backtest with fractional differencing signals. The workflow includes the following steps:\n", - "\n", - "1. Preprocess the datasets.\n", - "\n", - "2. Compute the features based on different fractional differencing signals of the closing prices of the stocks \n", - "\n", - "3. Split the data in training and testing and build a XGBoost model based on the training data. From the XGBoost model, compute the trading signals for all the data points.\n", - "\n", - "4. Run backtesting and compute the returns from this strategy for each of the days and stock symbols \n", - "\n", - "5. Run a simple portfolio optimization by averaging the stocks together for each of the trading days.\n", - "\n", - "6. Compute the Sharpe ratio and cumulative return results for both training and testing datasets\n", - "\n", - "The whole workflow can be organized into a computation graph, which are fully described in a yaml file. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each nodes has a unique id, a node type, configuration parameters and input nodes ids. gQuant takes this yaml file, wires it into a graph to visualize it. " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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UCYBAFxba2urVqxYoT//+c/asGGDrrnmGs2cOVP33nuvBg8ebHY8AN9CZmam/vGPf+jdd99VcXGxRo0apR/+8Ie67bbb5OHhYXY8AABcXQaLzgEALqm5uVl/+ctfFB8fr9tvv12+vr766KOPdOrUKS1YsKDTFEnLli2Tm5ub41FfX292pO/kpZdecpxLjx49zI7Tzvvvv+/I5+vra3Ycl5WUlKQ//OEPys/P1/LlyxUUFKQZM2aob9++evPNN9XU1GR2RAAAXBplEgDA5Xz44Yfq16+f5s2bp9GjR+vAgQNasWKFpkyZIi8vL7PjXVFTp06VYRiaMmXKZRujpqZGffr00c0333zZxjjr8ccfl2EYSkpK+tbHuJx577rrLhmGoTFjxlzRcTsrT09P3XzzzVq6dKmys7M1YcIE/eQnP1FCQoI++OADs+MBAOCyKJMAAC4jLy9PN998s+68805dd911ysrK0sKFCxUfH292NAd/f3+lpKSYHeOSMgxDra2tam1tNTuKU8zKa8a4rvjzdiG9e/fWa6+9puzsbKWmpmrWrFmaMGGCjh8/bnY0AABcDvc5BgC4hLVr12r27Nnq0qWLNm7cqJEjR5odqdMICAjQkSNHzI7hNLPydrTvqaOKjo7W22+/rQceeEAPPvigBg8erEWLFjEjDACAS4iZSQCADu/f//630tLSNH78eO3cuZMiCYBGjBihnTt3atq0abr11lv1+uuvmx0JAACXQZkEAOjQ1q1bp1mzZumxxx7TO++8Iz8/P7MjndfZC0fX1tYqPT3dcZFmT8+2k4RLSkr0yCOPqGfPnvL29lZoaKhuv/127d27t90xy8rK9Nhjj6lXr17y8fFRjx49NHbsWP3973+X3W4/b47CwkLNmDFDQUFBuuaaa3TzzTe3mS1z7gW7jx8/flH7n3uBb2czNjc364MPPtC4ceMUHh4ui8Wi/v37a8GCBZd0WdiF8l7seZ+VlZWlqVOnymazyc/PT6mpqdqyZYvT416u78nZn7evjuvt7a3g4GBNmjRJn3766QWzZ2dna/r06brmmmsc20pLS7/df5DLzNfXVwsXLtT//u//6kc/+pGWL19udiQAAFyDAQBAB1VdXW1069bNmDVrltlRnObn52ckJyef972CggIjOjraCAsLM1atWmVUV1cb+/fvN0aNGmX4+voaW7dudex7+vRpIyYmxggPDzdWrFhhVFVVGYWFhcYzzzxjSDL++Mc/tjn2lClTDEnGlClTjK1btxo1NTXGJ598YgQGBhrXXXdduyzn23/dunWGxWL52v3tdvu3yrhixQpDkvHss88aZ86cMUpKSoyXX37ZcHd3Nx5//PF24yUlJRkRERHf/IVfwPnyXux55+bmGkFBQUZERISxdu1ao7q62ti3b58xfvx4o2fPnoaPj4/p39PX/bydHTcsLMxYsWKFUVlZaWRnZxu333674ebmZrz11lvnzT5q1Cjj008/NWpra43PP//c8PDwMEpKSr75SzfZ/fffb3Tp0sU4c+aM2VEAAOjotlImAQA6rFdffdXw8/MzysrKzI7itK/7x/29995rSDLeeeedNttPnz5t+Pj4GEOGDHFs+973vmdIMj744IN2x5k4ceIFy6QVK1a02T5r1ixDUrsy4EL7T5s27Wv3/2pJcjEZV6xYYYwePbrdfnfffbfh5eVlVFZWttl+ucskZ877zjvvNCQZS5YsabPvqVOnDB8fH6fLpMv5PX3dz9vZcd9777022+vr643u3bsbFovFKCwsbJd99erV5z3e1a6qqsoICgoyXnzxRbOjAADQ0W1lmRsAoMPasGGDJk2apJCQELOjXBLLli2Tu7t7uwsFh4eHq1+/ftq1a5fy8/MlSUuXLpUkTZo0qd1x1qxZo0cfffS8Y1x33XVtXkdEREiSCgoKnNo/MjLya/f/qovJePPNN7dZWnVWUlKSmpqadODAgW8c71Jy5rw//vhjSdKECRPa7Nu9e3f17dvX6bHM+p7OjpuWltZmu4+Pj8aMGSO73a7//ve/7T43bNgwp8e4mgQEBOjWW2/Vhg0bzI4CAECHx93cAAAdVllZmRITE82OcUk0NDSosrJSkmSz2S64X25urkJDQ1VZWSlfX18FBARc1DjnHtvd/cvfK13oukTn7u/t7f21+5919nyczVhZWanf//73Wrp0qfLz81VRUdHm/bq6um88xqX0Tefd0NCg6upq+fr6yt/fv93nu3btqpycnG8cx6zv6ZvGDQsLk/TlNbbOdbVel8wZYWFhOnjwoNkxAADo8JiZBADosGJjY7Vv3z6zY1wUNze382738fFRUFCQPD091dTUJMMwzvu48cYb5ePjI5vNpvr6elVXV1/hM3DOxWa85ZZb9Mwzz+iBBx5QTk6OWltbZRiG/vjHP0qSDMO43JEvio+PjwICAlRfX6+ampp27585c8bp41zO7+nrft6+btyioiJJX86KcyWZmZnq3bu32TEAAOjwKJMAAB3WzJkzlZ6erm3btpkdxWlWq1WNjY2O13FxcVq4cKEk6fbbb1dzc7PS09Pbfe75559XVFSUmpubJUm33XabJGn16tXt9h00aJB++tOfXo74F8XZjC0tLUpPT1d4eLgeeeQRhYaGOkqQC92V7mpwdlna2eVuZ5WWlio7O9vp41zO7+nrft7Ojrtq1ao2n2loaNAnn3wii8XSbglfR5aZman169frrrvuMjsKAAAdHmUSAKDDGjNmjMaNG6c5c+aorKzM7DhOGTx4sHJycpSXl6eMjAwdPXpUqampkqTf/e536tWrl+6//36tWbNGlZWVOnPmjN58803Nnz9fL730kuPW7r/73e8UExOjn/70p1q1apWqq6uVn5+vefPm6fTp01dFmeRsRg8PD40ePVqFhYV68cUXVVpaKrvdrk8//VRvvPGGyWdxYc8++6xCQkL06KOPat26daqpqdHBgwd19913n3fp24Vczu/pm37eYmJi9Oijj2rlypWqrq5WTk6OZs2apdOnT2vBggWO5W4dXUVFhWbPnq3k5GTdcsstZscBAKDjM+vS3wAAXAoFBQVGz549jYEDBxqnT582O843ysrKMlJTUw0/Pz8jMjLSePXVV9u8X1ZWZjz22GNGbGys4eXlZYSGhhrjx4831q1b1+5YpaWlxqOPPmrExMQYXl5eRrdu3Yy77rrLyMnJceyTkZFhSGrzePLJJw3DMNptT0tLu+j9ly5d2m777NmzLyqjYRhGSUmJ8dBDDxmRkZGGl5eXERYWZnzve98zfv7znzuOO2TIEOPFF1+8YD5nXCjvxZ73WdnZ2cbUqVONwMBAw2KxGNddd52xcuVKY8yYMY79586de8W/p7O+6eft3HFtNpsxYcIE45NPPvnan6GO9FfIkpIS47rrrjN69OhhnDhxwuw4AAC4gq1uhnGVXYQAAICLdOLECY0bN061tbV67733NHLkSLMjAbgKZGRkaMaMGfLw8NC6deu4XhIAAJdGBsvcAAAdXnR0tHbs2KFhw4bpxhtv1Lx589rd5QpA51FVVaVHHnlEqampGjBggHbt2kWRBADAJUSZBABwCTabTUuXLtWy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l5dsNpuCgoJks9nk4eFhxqkAAAB0WCxzAwAApissLNThw4eVn5+voqIiFRQU6PTp0yosLFRBQYEqKipUWVmpmpqaSz62n5+fbDabgoODFR4eru7duzv+DAsLU48ePRQbG6uIiIhLPjYAAEAHlEGZBAAAroj6+nodOHBAmZmZys7O1pEjR3T48GEdPnxYtbW1kiRPT0917dpV3bp1U7du3RylTnBwsAIDA2Wz2RyzigIDA+Xp6ang4GDHGF5eXvL399f8+fP19NNPq7a2Vo2NjY73y8vL1dLSosrKSkdBVVVV5ZjtdG6JVVxcrObmZkmS1WpVr1691KtXL/Xu3Vt9+/ZVUlKSrr32Wlmt1iv7ZQIAAJiHMgkAAFx6tbW12r59uz7//HNlZmZq3759ysnJUUtLi/z8/BQXF+coZXr37u143q1bN7m7f/dLOjY3N8vT87uv5jcMQ6dPn3aUXl8twLKzs1VbWysPDw/17t1bAwYMUFJSkoYPH67rr79e/v7+33l8AACAqxBlEgAA+O5KS0u1ceNGpaenKz09XXv27FFzc7OioqI0cOBADRgwwFG29O7d+5IURmZrbW3VkSNHHGXZvn37tHfvXp04cUKenp5KSkpScnKykpOTNXr0aHXt2tXsyAAAAJcCZRIAALh4ra2t2rNnj9avX6/169dr48aNMgxDcXFxSklJUXJyslJTUxUTE2N21CuusLBQO3bsUHp6urZs2aIdO3aosbFRiYmJuuWWWzR27FiNGjVKXl5eZkcFAAD4NiiTAACAc1paWrRhwwa9//77+s9//qOysjJFR0dr4sSJmjhxosaMGaOAgACzY151ampq9Omnn2rNmjX6+OOPdezYMQUHB+vWW2/VXXfdpbFjx16SJXkAAABXCGUSAAD4ep9//rneeecdLV68WEVFRRo6dKimT5+utLQ0JSYmmh2vw8nOztaqVau0ePFibdu2TV26dNG0adM0e/ZsJScnmx0PAADgm1AmAQCA9hoaGrR8+XL98Y9/VEZGhhISEjR9+nTNnDlTcXFxZsdzGSdPntTSpUu1ePFipaenKz4+Xg8//LDmzp3LBbwBAMDVijIJAAD8n6KiIr300kv661//qrq6Ot15552aN2+ebrjhBrOjubydO3fqtdde0/vvvy9vb2/df//9euKJJ9StWzezowEAAHwVZRIAAPjybmwvvPCCXnvtNQUGBuqRRx7R3LlzFRoaana0TqesrEx/+9vf9PLLL6usrEwPP/ywfvaznyksLMzsaAAAABJlEgAAnVtjY6NeeOEFPf/887JarfrZz36mH/zgB7JYLGZH6/Tq6+u1cOFCPffcc6qqqtL//M//6Be/+IV8fX3NjgYAADo3yiQAADqrTZs26eGHH9aJEyf05JNP6ic/+Yn8/PzMjoVz2O12/fnPf9Yzzzyj8PBwvfHGG7rpppvMjgUAADqvDHezEwAAgCuroaFB8+bN0+jRoxUbG6sDBw7ol7/8JUXSVcpiseiJJ57QgQMH1K9fP40dO1YPPPCA6uvrzY4GAAA6KWYmAQDQieTn52vatGk6dOiQFi5cqBkzZpgdCRdp6dKlmjt3rmJiYvThhx+qZ8+eZkcCAACdCzOTAADoLHbs2KGhQ4equrpa27dvp0jqoG677Tbt2LFDLS0tGjp0qLZs2WJ2JAAA0MlQJgEA0Ans2bNHEyZM0ODBg/X5558rLi7O7EhOeemll+Tm5iY3Nzf16NHD7DhXjV69emnr1q0aOXKk0tLStH37drMjAQCAToRlbgAAuLiDBw9q1KhRGjRokJYvX94h7wY2cOBAlZaWKj8/3+woV5XGxkbdcccdSk9P18aNGzVgwACzIwEAANfHMjcAAFxZY2OjZs6cqb59+2rZsmUdskjqiPz9/ZWSknLZx/H29tbixYuVlJSkGTNmyG63X/YxAQAAKJMAAHBh8+fP15EjR/SPf/xDVqvV7Di4DHx9ffXOO++oqKhITz31lNlxAABAJ0CZBACAizpy5Iief/55vfDCC+rdu7fZcXAZde/eXX/4wx/0pz/9SQcPHjQ7DgAAcHGUSQAAuKgFCxYoOjpaDz300GUdJyUlxXGRbDc3N919992SpLFjx7bZXlFR4fhMVlaWpk6dKpvNJqvVqmHDhmnlypVtPvP973+/3VhZWVlKS0tzfO7GG29Uenp6u/3Kysr02GOPqVevXvL29lZwcLAmTZqkTz/99Fvv29DQoKefflrx8fGyWq0KCQnRLbfcouXLl6ulpUXS/10wvLa2Vunp6Y5z8fT0/E7fsTPuvfdeJSQk6A9/+MNlHwsAAHRulEkAALggwzC0ePFi3XffffLw8LisY23ZskV79+6Vn5+fkpKS9Oabb0qSVq1apeuvv17vvfeeDMNQUFCQJOnw4cO64YYbtHPnTi1ZskTFxcV6++23tWDBAu3bt08+Pj4yDEN/+ctf2oxTU1OjefPm6Ze//KVOnTqlTZs26cyZM7rpppv02WefOfYrLCzUddddp3fffVcLFixQaWmptm3bJqvVqjFjxrQ57sXs+6Mf/Ugvv/yyXnnlFZWVlenQoUOKj4/XlClTtHnzZknS448/LsMw5Ofnp+TkZBmGIcMw1NzcfNm+/7Pc3Nx0//3366OPProi4wEAgM6Lu7kBAOCCcnNz1bdvX23btk3Dhg27ImMuXrxY06dP1+23364lS5bovvvuU0REhH7729+22W/69OlavHixlixZojvuuMOxvaSkRD179lRLS4vq6+vbfGbgwIHKzMxURkaGhg8f7tj+xRdfaMCAAUpKStLevXslSffdd5/+/ve/67333tNdd93l2LehoUGxsbEqLy/XsWPHFBYWdlH7xsbGqlu3bu1mQsXFxenNN9/U6NGjHdv8/f01cOBAbdmy5dt/od/C/v371b9/f+3du1dJSUlXdGwAANBpcDc3AABc0dGjRyV9WXRcKXfeeaeefPJJffTRR0pJSVFZWZmeeeaZdvt9/PHHkqQJEya02R4aGqr4+PgLHt/X11fXX399m239+/dX9+7dlZmZqdOnT0uSli5dKklKS0trs6+Pj4/GjBkju92u//73vxe978SJE7V161Y9+OCD+vzzzx1L27Kzs9sUSWaKi4uTm5ubjhw5YnYUAADgwiiTAABwQWdvEW+xWK7ouM8884yuv/56bd26VXfeeafc3dv+VaOhoUHV1dXy9fWVv79/u88HBwdf8NjXXHON3Nzc2m3v2rWrJKm4uFgNDQ2qrKyUr6+vAgIC2u0bFhYm6cvlbRezryS9+uqrWrRokY4ePaoxY8YoMDBQEydOdBRSVwMvLy95eXmprq7O7CgAAMCFUSYBAOCCzpYyZ86cuaLjbty4UZWVlerfv7/mzZunzMzMNu/7+PgoICBA9fX1qqmpaff54uLiCx67srLyvNvPfqZr167y8fGRzWZTfX29qqur2+1bVFQkSQoPD7+ofaUvr0k0Z84crV+/XhUVFVq2bJkMw9Dtt9/e7qLX5yu9roSqqio1NjYqJCTElPEBAEDnQJkEAIAL6tevnyRp165dV2zMY8eOae7cufrwww+1fPlyWSwWTZkyRSUlJW32mzRpkqT/W+52VmFhoXJyci54/Jqamnbl1BdffKGCggIlJSWpW7dukqTbbrtN0pcXAP+qhoYGffLJJ7JYLI4ldhezb1BQkLKysiR9OQNo3LhxWrZsmdzc3Np93mq1qrGx0fE6Li5OCxcuvOC5XSpn/3v379//so8FAAA6L8okAABcUJcuXTR48GD95z//uSLj1dTUaOrUqfrTn/6kxMRE9ezZU0uWLFFBQYGmTZumpqYmx77PPvusQkJC9Oijj2rdunWqqanR/v37dd999zlmAZ2Pn5+ffvSjH2nbtm2qra3Vzp07dffdd8vb21sLFixw7Pe73/1OMTExevTRR7Vy5UpVV1crJydHs2bN0unTp7VgwQLHEraL2VeSHn74Ye3bt08NDQ0qLi7WCy+8IMMwdNNNN7XJOnjwYOXk5CgvL08ZGRk6evSoUlNTL9XXfUHLli1TQkKCIiMjL/tYAACgEzMAAIBLevnllw2r1WoUFxdf1nF++MMfGpIcjy+++MIoKSlps02S8cwzzzg+k52dbUydOtUIDAw0rFarMWLECOOzzz4zRo8ebVitVsd+L774ouPzERERxvbt240bb7zR8Pf3NywWizFq1Chjy5Yt7TKVlpYajz76qBETE2N4eXkZNpvNmDBhgvHJJ59863337t1rPPTQQ0ZCQoJhtVqNkJAQY/jw4cZbb71ltLa2ttk3KyvLSE1NNfz8/IzIyEjj1Vdf/a5f8zcqLy83bDab8dxzz132sQAAQKe21c0wDMO0JgsAAFw2dXV16tu3r0aPHq1//etfZsdxSnx8vOx2u06cOGF2lA7ngQce0PLly5WTkyObzWZ2HAAA4LoyWOYGAICLslqt+vvf/653331XS5YsMTuOQ2FhoUJCQtosfZOk48eP68iRI+2WjOGbrVu3Tn/961/12muvUSQBAIDLjjIJAAAXNnbsWH3/+9/XAw88oD179pgdx6G8vFwPPfSQ8vLyVFdXp+3bt2vGjBkKDAzU//7v/5odr0PZv3+/Zs2apbvvvlt33HGH2XEAAEAnQJkEAICL+/Of/6wRI0Zo/Pjx2r9/v9lxFB4ervXr16uiokIjR45UcHCwbr31VvXp00fbt29XbGys2RE7jMOHD2v8+PGKi4vT66+/bnYcAADQSXDNJAAAOoG6ujpNnjxZhw4d0uLFizVy5EizI+E7ysjI0LRp0xQVFaW1a9cqICDA7EgAAKBz4JpJAAB0BlarVStXrlRqaqrGjBmjP/3pT2ZHwnfw2muvafTo0Ro8eLA+/vhjiiQAAHBFUSYBANBJ+Pv7a/HixfrNb36jxx9/XLfddptOnTpldixchNOnT2v69On68Y9/rCeffFLLly/ngtsAAOCKo0wCAKATcXNz089+9jOtW7dO+/fvV2Jiol555RW1tLSYHQ1fo7W1VW+88YYSExO1c+dOffzxx3r66afl5uZmdjQAANAJUSYBANAJ3Xjjjdq3b59+/OMf6/HHH9fQoUO1YsUKs2PhPNasWaPhw4frxz/+sR588EHt379f48aNMzsWAADoxCiTAADopCwWi37zm99oz549io6O1pQpUzRs2DCtWbPG7GiQtG7dOo0YMUKTJ09WWFiYdu/ereeff15Wq9XsaAAAoJOjTAIAoJNLTEzUsmXLlJmZqZ49eyotLU0JCQlasGCBampqzI7XqTQ0NGjx4sUaMWKExo8fLz8/P23btk0rVqxQ//79zY4HAAAgSXIzDMMwOwQAALh67Nq1S6+88oo++OAD+fj46Hvf+57mzp1LmXEZHTx4UH/729/09ttvq7a2VtOmTdMjjzyiYcOGmR0NAADgXBmUSQAA4LxKS0v117/+VW+++aaOHTumfv36acaMGbrrrrvUp08fs+N1eMeOHdP777+v999/X/v27VNkZKQeeughPfDAA+ratavZ8QAAAC6EMgkAAHw9wzCUnp6u999/X0uWLFFRUZEGDx6syZMna9KkSbr++uvl4eFhdsyrXmtrq3bs2KE1a9Zo9erV2rFjh7p06aJp06bprrvuUmpqqtzduQIBAAC46lEmAQAA57W0tGjDhg366KOP9PHHH+v48eMKCQnRuHHjNH78eCUnJysuLs7smFeN3Nxcbd26VWvXrtXatWtVWlqqqKgoTZw4UbfddpvGjh0rT09Ps2MCAABcDMokAADw7WVlZWnNmjVas2aNtmzZIrvdrtDQUI0YMULJycm64YYblJSUpICAALOjXnY1NTXat2+fMjIytGXLFmVkZKioqEi+vr5KTk7WxIkTNWnSJPXr18/sqAAAAN8FZRIAALg0mpqatGvXLkeZsnXrVhUWFsrNzU2xsbEaOHCgkpKSNGDAACUmJqpnz57y8vIyO/ZFa2pq0vHjx3Xo0CHt27dPmZmZ2rt3r44eParW1lZ17dpVI0aMUEpKikaMGKEhQ4bI29vb7NgAAACXCmUSAAC4fI4fP67MzMx2pYthGPL09FRUVJR69eqlXr16qXfv3oqIiFBERIS6du2qHj16yM/P74pnrq2tVUFBgQoLC1VQUKBTp07p8OHDOnLkiA4fPqyTJ0+qublZkhQTE6OBAwdqwIABSkpK0sCBAxUTE3PFMwMAAFxBlEkAAODKqq6uVm5urqOcOXLkiON5YWGho6iRJD8/P/Xo0UNBQUEKDAxUUFCQ43lgYKB8fHzk6+sri8UiSXJzc1NQUJDj85WVlWptbZUk1dfXy263q7GxUZWVlaqqqlJFRUWb5/n5+aqpqXF83sPDQ+Hh4Y7C62zp1atXL/Xp00c2m+0KfWsAAABXDcokAABw9WhtbVVxcbEKCwt16tQpFRcXKz8/X5WVlY7H2QKosrJSTU1Nqq2tVWNjoySpublZ1dXVjuMFBAQ4LnDt5eUlf39/eXl5KTAwUDabTcHBwY7nNptNERERCg8PV/fu3RUeHq6wsDDusAYAANAWZRIAAHAtubm56tu3r3bv3q1BgwaZHQcAAMDVZPCrNgAAAAAAADiNMgkAAAAAAABOo0wCAAAAAACA0yiTAAAAAAAA4DTKJAAAAAAAADiNMgkAAAAAAABOo0wCAAAAAACA0yiTAAAAAAAA4DTKJAAAAAAAADiNMgkAAAAAAABOo0wCAAAAAACA0yiTAAAAAAAA4DTKJAAAAAAAADiNMgkAAAAAAABOo0wCAAAAAACA0yiTAAAAAAAA4DTKJAAAAAAAADiNMgkAAAAAAABOo0wCAAAAAACA0yiTAAAAAAAA4DTKJAAAAAAAADiNMgkAAAAAAABOo0wCAAAAAACA0yiTAAAAAAAA4DTKJAAAAAAAADiNMgkAAAAAAABOo0wCAAAAAACA0yiTAAAAAAAA4DTKJAAAAAAAADiNMgkAAAAAAABOo0wCAAAAAACA0yiTAAAAAAAA4DQ3wzAMs0MAAAB8G62trRo7dqxKSkoc25qamnTs2DFFR0fLx8fHsd1ms2nDhg3y9vY2IyoAAICryPA0OwEAAMC35e7urqioKG3cuFHn/n4sNzfX8dzN7f9j787jasof/4G/bvu+MK1oJ0kq2QuRJYQwlH1fBoOxfczyNcb4DDM+zCczZiwz3/ExhgojsivhoyKikGRKCmmTbvt+fn/Mr/vVlBmZ6tTt9Xw87qM693Tfr9ucM/Ry3u8jgbe3N4skIiIiogbAaW5ERETUok2ZMqVWkVSX6dOnN0EaIiIiIvnHaW5ERETUolVWVsLQ0BA5OTmv3UdDQwMvXryAmppaEyYjIiIikkuRvDKJiIiIWjRFRUVMnTr1tVPYlJWV4ePjwyKJiIiIqIGwTCIiIqIWb/LkySgrK6vzufLyckyZMqWJExERERHJL05zIyIiohZPEASYmZnh6dOntZ7T19dHZmYmlJR43xEiIiKiBsBpbkRERNTySSQSTJ8+HcrKyjW2q6ioYPr06SySiIiIiBoQyyQiIiKSC9OmTUN5eXmNbWVlZZg8ebJIiYiIiIjkE6e5ERERkdyws7PDgwcPZF+3b98eqampkEgkIqYiIiIikiuc5kZERETyY8aMGbKpbioqKpg5cyaLJCIiIqIGxiuTiIiISG6kpKTA0tIS1X+9uXv3Lrp27SpyKiIiIiK5wiuTiIiISH6Ym5vDxcUFAGBra8siiYiIiKgR8NYmRERE1GLk5uYiPz8f+fn5KC4uRlFREUpLS2XPFxYWwsHBATdv3oSLiwuOHz8OTU1N2fMqKirQ1NSEuro6tLW1oa2tDT09PTHeChEREVGLxWluREREJJqCggIkJycjNTUVmZmZeP78OTIzM5GVlSX7vLpAysvLa7QcOjo60NbWhq6uLgwMDGBqagpDQ0PZ5wYGBjAzM4OlpSW0tbUbLQcRERFRCxDJMomIiIgaVV5eHuLj43Hv3j0kJiYiOTlZ9sjKypLtp6GhAWNjYxgbG8PAwAAmJiYwMjKCrq6urOip/lxLSwuamppQVVWFhoaG7DXU1NSgrq6OjRs3Yv369SguLkZJSYns+eqvi4qKZFc4SaVS5OXlIT8/H7m5uTVKrYyMDKSnp6OwsFD2Gu+88w4sLS1lDxsbG9jb26NLly7Q1dVtmh8qERERkXhYJhEREVHDefjwIaKiohAbG4t79+4hPj4eKSkpAH4vizp27FijiKl+mJubQ0tLq8FyVFRUQEmp4WbzFxYWIiUlpUYRVv347bffZGVThw4d0KVLF3Tt2hXdunVD79690alTJ95RjoiIiOQJyyQiIiJ6O3l5eQgPD8f169dx/fp1REVFIScnByoqKrIrdbp27Sr7aGFhAQUF+bv3hyAIePz4MeLi4mo9SktLoaenh969e6NXr17o3bs33NzceAUTERERtWQsk4iIiOjNVFRUIDY2FiEhIQgJCcGVK1dQVlYGExMTuLi4wM3NDa6urnBxcYG6urrYcUVXUVGBhIQEREdHIzw8HFevXsWDBw8gkUjg5OSEIUOGYMiQIXBzc4OamprYcYmIiIjeFMskIiIier0XL17gxIkT+PXXX3Hx4kUUFRXBysoKHh4e8PDwwKBBg2BoaCh2zBYjOzsbly5dQmhoKEJDQ/Hbb79BXV0d7u7uGDduHLy9vWFgYCB2TCIiIqI/wzKJiIiIasrMzMThw4dx7NgxXL58GUpKShg6dCjGjBkDDw8PWFpaih1RbqSmpiIkJATBwcE4d+4cysrK4ObmhvHjx2PixIkwMTEROyIRERHRH7FMIiIiIqCqqgoXL17Enj17cPz4cSgqKsLDwwMTJ06Et7c3dHR0xI4o94qLixESEoLDhw/jxIkTKCgowKBBg7BgwQJ4e3tDWVlZ7IhEREREAMskIiKi1i0rKwvffvstfvzxR6SlpWHAgAGYO3cuJkyYAA0NDbHjtVolJSU4duwYfvzxR4SFhcHQ0BBz5szBsmXLYGRkJHY8IiIiat1YJhEREbVGqamp2LZtG3744Qdoampi/vz5mD17NmxsbMSORn+QnJyMffv2Yffu3ZBKpZg9ezbWrFnD6YZEREQkFpZJRERErUlGRgY++eQT/Oc//4GJiQlWrVqFefPm8SqkFqCkpAQ//fQTtm7diidPnmDq1Kn45z//iXbt2okdjYiIiFqXSAWxExAREVHjKysrw9atW9GpUyecO3cOe/fuRWJiIpYtW8YiqYVQU1PDe++9h4cPH2Lfvn24cuUKbG1t8cUXX6CkpETseERERNSK8MokIiIiORcZGYmZM2fi2bNnWLt2LdasWcMCSQ6UlJRg+/bt2Lx5MwwMDLBv3z4MGDBA7FhEREQk/3hlEhERkbyqqqrC5s2bMWDAAHTs2BEPHjzAp59+yiJJTqipqeGjjz5CQkICHB0dMXjwYGzYsAGVlZViRyMiIiI5xyuTiIiI5FBeXh7effddXL58GVu2bMGKFSsgkUjEjkWN6LvvvsOqVavQu3dv/Prrr2jTpo3YkYiIiEg+8cokIiIieZOTkwMPDw/cv38fERER+OCDDxq0SPrXv/4FiUQCiUSC9u3bN9jrttQczcXixYtx/fp1PH78GIMHD0ZmZqbYkYiIiEhO8cokIiIiOZKdnQ0PDw/k5eUhJCQE1tbWjTaWk5MTsrOz8fTp00YboyXlaC5SU1MxZMgQKCoqIiwsDMbGxmJHIiIiIvnCK5OIiIjkhSAImDFjBvLy8nDlypVGLZJaMi0tLbi5ucntmGZmZrh8+TIqKysxZcoUVFVVNcm4RERE1HqwTCIiIpIT27dvx4ULF3Dw4EF06NBB7DgkIhMTExw9ehTXrl3D5s2bxY5DREREcoZlEhERkRxISUnBxx9/jM8//xx9+/YVOw41Aw4ODti8eTM2bNiAhIQEseMQERGRHGGZREREJAe2bt2K9u3bY9WqVU0+9oMHDzBq1Cjo6upCQ0MDgwYNQnh4eI19KioqEBAQgKFDh8LY2Bjq6upwcHCAn59fndOwXrx4gZUrV8La2hqqqqpo3749hgwZgn379qG4uPhP8xw4cEC2MHf1Iz09XbZgd2FhIcLDw2XPKSkp1fj+rKwsLFu2DBYWFlBRUYGBgQHGjx+PmJiYGvuVlpZi/fr16Ny5MzQ0NNCmTRuMHj0aJ06cQGVlJQC88ZiNZenSpejYsSO+/PLLJhmPiIiIWgeWSURERFeA6rIAACAASURBVC1ceXk5Dh06hIULF0JZWblJxy4oKMDixYvx0Ucf4dmzZ7hy5QpycnIwePBgXL58Wbbf2bNn4evri8GDByM+Ph5PnjzBggULsHLlSvzjH/+o8Zrp6eno2bMnDh06BD8/P2RnZyM6Ohru7u6YPXs2du/e/aeZJk+ejJUrV2Lo0KHIycmBIAgwNjbG6tWrIQgCNDU14erqCkEQIAgCKioqZN/7/Plz9OzZE4GBgfjuu++Qk5ODS5cuIScnB3379kVkZKRs36VLl2LHjh345ptv8OLFC8THx6Nz584YO3Ys/vvf/wLAG43ZmBQVFbF48WIcPnz4L0s4IiIiojfFMomIiKiFu3v3LnJycjBq1KgmH1sqleKLL76Aq6srtLS00KNHDxw4cABlZWVYvnx5jX3d3d3x4YcfQl9fH++88w7ef/99TJkyBX5+fsjLy5Pt9+GHHyI5ORl+fn7w8vKCtrY2jIyM8Mknn8DT0/NP8+Tm5mLUqFGorKzEmTNnoK+vX6/38+GHHyIlJQXbt2/HyJEjoaWlBXt7e/j7+0MQBLz//vuyfUNDQ2Fvb4+hQ4dCXV0dRkZG2Lp1Kzp16lSvMRubl5cXCgoKcPPmTbGjEBERkZxgmURERNTC/fbbb1BUVETnzp2bfGw1NTX07t27xjYHBweYmpoiNjYWz58/B/B7oREWFlbr+x0dHVFeXo64uDjZtmPHjgEARowYUWv/M2fOYMWKFXVmSUhIQO/evaGgoIB///vfUFRUrPf7CQoKgoKCAry8vGpsNzY2hr29PaKjo/H06VMAgKenJyIiIrBgwQJcu3ZNNrUtISEB7u7u9R67sVhYWEBTUxOJiYliRyEiIiI5wTKJiIiohSsqKoKamhoUFJr+j/W2bdtCIpHU2m5oaAgAyMzMBPD7FUzr16+Hg4MD9PX1ZWsHrVmzBsDv7wH4fR0iqVQKNTU1aGtrv3GOly9fwtvbG+3bt8eZM2dw4MCBer+X6rGrqqqgq6tba92lW7duAfi9vAOAnTt3Yv/+/Xj06BE8PDygo6MDT09PWRnWnGhpaaGwsFDsGERERCQnWCYRERG1cG3btkVhYaGskGlKUqm0zu3VJVJ1qTR69Gh8/vnnmD9/Ph4+fIiqqioIgoCvv/4aACAIAgBAVVUVurq6KCkpQX5+/hvnUFJSQkhICI4fPw4HBwfMnz8fN27cqHPfusqv6rH19PSgpKSE8vJy2fpGf3wMGjRI9jrTp09HSEgIcnNzERQUBEEQMH78eGzfvv2NxmwK5eXlyMnJQdu2bUXLQERERPKFZRIREVEL161bNwBAVFRUk49dUFCA2NjYGtvu3r2LtLQ0ODo6wsTEBJWVlQgPD4exsTGWLVsGAwMDWblS16LQ48aNAwCcPn261nPOzs744IMPam3X1tZGu3btoKWlhRMnTkBLSwve3t6yaXav0tDQQFlZmexrW1tb7NmzBwAwfvx4VFRU1LobHQB8+eWXMDMzky2eraenhwcPHgAAlJWVMXToUAQFBUEikeDUqVNvPGZju337NsrLy+Ho6Ngk4xEREZH8Y5lERETUwllYWMDe3h4BAQFNPrampiaWLl2K69evo7CwEDdv3sS0adOgoqICPz8/AL/fUczd3R3p6enYunUrsrOzUVxcjLCwMOzatavWa27evBmWlpb44IMPcOrUKeTn5+Pp06dYvHgxnj9/XmeZ9CoLCwscOXIEWVlZGD9+PEpLS2s83717dzx8+BBPnjxBZGQkHj16hP79+8vGtra2xpw5c3DmzBlIpVLk5ORg9+7d2LhxI/71r39BSUlJ9lqLFi3CnTt3UFpaiszMTHz11VcQBAGDBw9+4zEbm7+/P6ysrGBnZ9ck4xEREVErIBAREVGLt2PHDkFdXV149uxZo4+1detWAYAAQGjXrp0QFRUlDBo0SNDS0hLU1dWFgQMHClevXq3xPVlZWcLChQuFDh06CMrKyoKRkZEwa9YsYd26dbLXcnFxke2fnZ0trFixQrC0tBSUlZUFExMTwdfXV3j48KFsn0OHDsm+t/rx9ddfC5GRkbW2T506VfZ9Dx48EPr37y9oamoKHTp0EHbu3Fkj64sXL4SVK1cKVlZWgrKysmBgYCAMGzZMuHDhQo39YmJihIULFwp2dnaChoaG0KZNG6FPnz7C3r17haqqqhr7/tWYjSUrK0vQ1tYWvvzyyyYZj4iIiFqFCIkg/P9FCoiIiKjFKikpgb29PTp16oTTp0+LukYPNR8TJkxAVFQU4uPjoaWlJXYcIiIikg+RnOZGREQkB9TU1ODv74+LFy/WWvyZWqedO3ciKCgI//nPf1gkERERUYNimURERCQnevbsiU2bNmHdunU4dOiQ2HFIRMeOHcPKlSvx6aef1lq/iYiIiOjvUvrrXYiIiKilWLNmDfLy8jB9+nQUFxdjzpw5YkeiJhYQEIDp06dj7ty5+OSTT8SOQ0RERHKIZRIREZGc+fzzz6GgoIB58+YhOTkZn376aY07kJF8qqysxObNm7FhwwZ88MEH+Oqrr7h2FhERETUKLsBNREQkp/bu3Yvly5fD2dkZBw8ehLm5udiRqJE8e/YM06ZNw7Vr1/DVV1/h/fffFzsSERERyS8uwE1ERCSv5s+fjxs3biAvLw9OTk749ttvUVFRIXYsakCVlZXYvXs3HB0dkZ6ejsjISBZJRERE1OhYJhEREckxe3t7REVFYeHChVi9ejWcnJwQEhIidixqAJcvX0aPHj3w/vvvY+bMmbh58yacnJzEjkVEREStAMskIiIiOaeuro4tW7bg3r17sLGxwdChQ+Hp6YnLly+LHY3eQkREBEaPHg13d3eYmJjg7t272LZtGzQ1NcWORkRERK0EyyQiIqJWwsbGBkFBQQgJCUFJSQnc3d3Rr18/nDhxAlxCsXkTBAGnT5/GgAED4OrqipycHJw5cwanT5+Gra2t2PGIiIiolWGZRERE1Mp4eHjg0qVLiI6Oho2NDcaNGwdzc3OsW7cOjx8/FjsevSI9PR1+fn5wdHTEqFGjUFVVhRMnTiA8PByenp5ixyMiIqJWindzIyIiauXu37+PvXv34sCBA3j58iU8PT0xa9YsjBw5EhoaGmLHa3WKi4tx7tw57Nu3D6dOnYK2tjamTp2KBQsWwMHBQex4RERERJEsk4iIiAgAUFpaihMnTuDHH39ESEgIVFVVMXz4cIwbNw5eXl7Q19cXO6LckkqlOHXqFI4dO4YzZ86guLgY7u7umDt3LsaPHw81NTWxIxIRERFVY5lEREREtWVmZuL48eP49ddfcfHiRQiCgP79+2PIkCHw8PCAi4sLFBUVxY7ZYlVVVeH27dsIDQ1FSEgILl++DEEQ4O7ujvHjx2Ps2LEwMTEROyYRERFRXVgmERER0Z+TSqU4efIkzpw5g9DQUKSnp0NPTw/u7u4YPHgw+vTpAycnJygrK4sdtdkqLy/HnTt3cO3aNYSFhSEsLAw5OTkwMjLC4MGD4enpidGjR/PqLyIiImoJWCYRERFR/cTFxSE0NBShoaG4cuUKcnNzoaqqCmdnZ/Tq1Qu9evWCi4sLbGxsoKSkJHbcJldRUYGkpCTcunULUVFRiIqKwq1bt1BSUgIdHR0MGDAAHh4e8PDwQNeuXSGRSMSOTERERFQfLJOIiIjo7QmCgISEBFlpcv36dcTGxqK8vBwqKiqws7NDly5d4ODggC5dusDW1hYWFhZysQZQaWkpHj9+jIcPH+LOnTuIj49HXFwc4uPjUVpaCmVlZTg4OKB3796ykq1z585QUODNdImIiKhFY5lEREREDaukpAT3799HXFwc4uLicO/ePcTFxSElJQXVf+0wMTGBlZUVzM3NYWFhAQsLCxgbG8PAwACmpqYwNDQUtXAqLS1FZmYm0tLSkJmZiYyMDKSmpiI5OVn2eP78uez9KCkpwd7eHsOHD0eXLl3QtWtXdOnSBerq6qK9ByIiIqJGwjKJiIiImkZ+fj6SkpKQnJyMx48fIzk5GcePH0deXh4qKyuRn59fY39dXV2YmJhAR0cHOjo60NPTg5aWFrS1taGtrQ0dHR3ZftVX+ygqKsq2V49ZUVEB4PerqHJzc2XbX33k5uYiPz8fUqkU6enpsv2qaWlpwczMDJaWlrC0tISFhYXsc3Nzc3z11Vf46quvMG3aNOzatQsaGhqN9nMkIiIiEhnLJCIiImp6giDg/fffx969e3HkyBGMHj0axcXFyMjIwPPnz5GVlYWMjAykp6cjLy8PeXl5ssLn1cerBREAlJWVobCwUPa1hoYGVFVVZV9XF0+vllLa2trQ19eXFVTGxsayq6SMjY1hZGT0RuXQiRMnMHv2bBgZGeHw4cOwt7dv2B8aERERUfPAMomIiIia3j/+8Q9s27YNBw8exKRJk8SO02BSU1Ph6+uLu3fvYvfu3ZgyZYrYkYiIiIgaWiRXgCQiIqIm9fHHH2Pbtm3Yv3+/XBVJAGBmZoYrV65gyZIlmDZtGmbMmIGioiKxYxERERE1KF6ZRERERE1mw4YN2LhxI/bs2YN58+aJHadRHT9+HLNnz4a5uTkCAwPRsWNHsSMRERERNQRemURERERNY/v27di4cSO+//57uS+SAGDs2LGIiYmBmpoaXFxc4O/vL3YkIiIiogbBMomIiIganZ+fH1avXo1vvvkGCxcuFDtOkzEzM8OlS5cwe/ZsTJ48GTNmzEBxcbHYsYiIiIj+Fk5zIyIiokb1ww8/YMGCBdiyZQvWrl0rdhzRBAUFYfbs2bC0tERgYCBsbGzEjkRERET0NjjNjYiIiBrPTz/9hIULF2LTpk2tukgCAG9vb8TExEBFRQUuLi4ICAgQOxIRERHRW2GZRERERI3i559/xrx587B+/Xp89NFHYsdpFszNzXH58mXMmjULvr6+WLhwIUpLS8WORURERFQvnOZGREREDe7o0aPw9fXFsmXLsG3bNrHjNEvHjh3DnDlzYGVlhcDAQFhbW4sdiYiIiOhNcJobERERNaygoCBMnjwZS5YsYZH0J8aNG4eoqChUVVWhe/fuCAwMFDsSERER0RthmUREREQN5ty5c/D19cXMmTPx9ddfix2n2evYsSMiIyMxa9Ys+Pj4YOHChSgrKxM7FhEREdGf4jQ3IiIiahAhISEYPXo0Jk+ejB9++AEKCvw3q/o4evQo5s6dCxsbGwQGBsLKykrsSERERER14TQ3IiIi+vuuXr0Kb29vTJw4kUXSW5owYQKioqJQUVEBZ2dnHDlyROxIRERERHXi3/SIiIjob4mMjMTIkSPh6emJ//3f/2WR9Dd06tQJ165dw6xZszBp0iQsX76c096IiIio2eE0NyIiInprt2/fhoeHBwYOHIjAwEAoKyuLHUluHDhwAO+99x46d+6MwMBAWFpaih2JiIiICOA0NyIiInpbsbGxGDJkCHr16gV/f38WSQ1s2rRpuHnzJsrKyuDs7IyjR4+KHYmIiIgIAKe5ERER0Vu4e/cuhgwZgu7duyMoKAiqqqpiR5JLtra2uH79OmbOnImJEydi+fLlKC8vFzsWERERtXKc5kZERET18vDhQ7i7u8Pa2hpnz56Fpqam2JFahf3792Px4sXo0qULAgICOO2NiIiIxMJpbkRERPTmEhMTMWjQIFhYWOD06dMskprQjBkzcPPmTZSUlKBnz544ffq02JGIiIiolWKZRERERG8kNTUVQ4cOhZGREU6dOgVtbW2xI7U6nTt3xvXr1zFu3Dh4eXlx2hsRERGJgtPciIiI6C89ffoUAwcOhLa2Ni5evIg2bdqIHanVq572Zm9vj4CAAFhYWIgdiYiIiFoHTnMjIiKiP5eRkYGhQ4dCU1MTISEhLJKaiRkzZuDGjRsoKipCz549cebMGbEjERERUSvBMomIiIheKysrC4MHD0ZVVRXOnz+Pd955R+xI9Ao7OztERkZi+PDhGDVqFKe9ERERUZPgNDciIiKqU25uLjw8PJCXl4fLly/D1NRU7Ej0J/bv34/33nsPPXr0wKFDh/jfi4iIiBoLp7kRERFRbVKpFEOHDkV2djYuXLjAYqIFqJ729uLFCzg5OeHs2bNiRyIiIiI5xTKJiIiIasjLy8OwYcOQnp6OsLAwLuzcgnTp0gWRkZEYMmQIRo4ciXXr1qGyslLsWERERCRnOM2NiIiIZIqKijBixAgkJCTg0qVL6Ny5s9iR6C1VT3vr2bMnDh48yKvLiIiIqKFwmhsRERH9rri4GF5eXoiPj8fFixdZJLVwM2bMwNWrV/Hs2TM4OTnh3LlzYkciIiIiOcEyiYiIiFBWVoZ3330Xt2/fxrlz59ClSxexI1EDcHZ2xq1bt+Dh4YERI0Zw2hsRERE1CE5zIyIiauXKy8sxYcIEXLlyBSEhIejRo4fYkagR7N+/H4sWLULv3r1x8OBBmJiYiB2JiIiIWiZOcyMiImrNKisrMX36dFy+fBnnz59nkSTHqqe9PX36FE5OTrhw4YLYkYiIiKiFYplERETUSlVWVmLGjBkIDg5GcHAwevXqJXYkamTdu3dHdHQ0Bg0ahBEjRmDDhg2oqqoSOxYRERG1MJzmRkRE1AoJgoAFCxbgl19+walTpzBo0CCxI1ET27NnD5YtW4Z+/frh4MGDMDY2FjsSERERtQyc5kZERNTaCIKAxYsXY//+/Thy5AiLpFZqwYIFiIiIQGpqKhwdHRESEiJ2JCIiImohWCYRERHJobi4uDq3C4KA999/Hz/++COOHDmCkSNHNnEyak66d++OW7duYeDAgfD09OS0NyIiInojLJOIiIjkTHFxMdzd3bF+/fpaz61btw67du3Czz//jNGjR4uQjpobHR0dBAYG4rvvvsPmzZsxbNgwZGRkvHb/1NRUZGdnN2FCIiIiam5YJhEREcmZffv2IScnB5s2bcLatWtl2z/++GNs27YN+/fvh4+Pj4gJqTlasGABwsPDkZycjB49euDq1au19ikvL8eECROwePFiERISERFRc8EFuImIiORIZWUlrK2tkZqaCkEQoKCggPnz58PIyAiff/459uzZg3nz5okdk5oxqVSKefPmISgoCB9//DHWr18PBYXf//1x1apV+Pe//42qqiocOXIEEyZMEDktERERiSCSZRIREZEc8ff3x5QpU/DqH+8KCgpQU1ODn58fiyR6I4IgYMeOHVi7di0GDBiAAwcO4MaNGxgzZoyspNTR0UFCQgIMDQ3FjktERERNi2USERGRPOnWrRvu37+PysrKGtsVFRUxceJE/Pzzz1BSUhIpHbU0kZGR8PX1hZKSEl68eIH8/HzZAt3KysoYM2YMjhw5InJKIiIiamKRXDOJiIhITpw/fx53796tVSQBv09/O3z4MKZMmYKKigoR0lFL1LdvX1y/fh1KSkooKiqqcae38vJyHD16FIcPHxYxIREREYmBZRIREZGc2Lx5859edVRZWYlff/0VkyZNQnl5eRMmo5Zs8+bNSEpKqvOYkUgkWLBgwZ/e/Y2IiIjkD8skIiIiORAdHY1Lly796VVHCgoKqKqqwt27d3Hnzp0mTEct1cmTJ/HNN9/UebUb8PvaSoWFhZg/f34TJyMiIiIxsUwiIiKSA5s3b4aysnKdzykoKEAikaBdu3bYtWsX4uPj4eLi0sQJqaVJTk7G5MmT/3K/8vJyBAcHIzAwsAlSERERUXPAMomIiKiFe/ToEY4dO1ZrGtIfS6RHjx5hwYIFXICb3kh4eDiMjY0hCAKUlZUhkUheu69EIsHChQuRmZnZhAmJiIhILCyTiIiIWrgvv/wSioqKsq//WCIlJyezRKJ6mzZtGn777TckJSVh69at6NmzJyQSCRQVFaGgUPOvkNXT3ebOnStSWiIiImpKEkEQBLFDEBERtXR5eXnIy8uDVCpFSUkJ8vLyZOvMVFVVQSqVyvZVVFSEjo6O7Gs1NTWoq6tDW1sburq60NHRgbq6+huNm5GRATMzM5SVlUFBQQGCIMDKygobN26Er69vrV/6if6OJ0+e4MyZM/j1118REhIi2/7qmkr+/v7w8fF5q9eXSqUoLy9HXl4eSkpKUFxcDADIzc3FH//KWlpaiqKiolqvoa6uDjU1tVrb9fX1Afzf+aajowNlZWXo6uq+VVYiIqJWLJJlEhER0Wvk5+cjMTERT548QVpaGtLT0/H8+XPZIzs7G1KptM5fdP8uFRUV6OjoQF9fH4aGhjAxMYGpqSmMjIzQrl07GBsbw9LSEj/99BO2bNkCALC2tmaJRE0mOzsbx48fx5EjRxAaGoqKigoIggBtbW3s27cPlZWVyM3NxcuXL2UfX/08NzcXxcXFKCgoQFFREUpLS0V7L6qqqtDQ0ICWlhbU1NSgr68PPT29Gh9f/bxt27YwNDSEoaEhDAwM/nQKIBERkRximURERK1bVVUVHj16hNjYWMTHxyMxMVE2tefV2523adMGJiYmMDY2lpU6BgYG0NPTg56eHnR0dKCjowNdXV2oq6tDU1MTKioqsu+vvioC+H3B4oKCAtnXhYWFKCsrg1QqlV3hVH2V08uXL5GZmSkrsNLT05GWllbjigxlZWXY2trC1dUVHTt2RLdu3dCtWzcYGRk18k+PWov8/HykpKTg8ePHSElJkR2HGRkZspI1IyOj1l3f/qyQ0dfXh5qaGrS0tKChoQFVVVXo6upCSUkJurq6soIHALS0tGotMK+kpARtbe06s/7xroavnnPVxVVeXh7Ky8shlUpRVlaGwsJCFBYWori4+LUFWPXnf8xhaGgIY2NjmJiYwNDQEKampjA2NoaFhQXMzc1hbm5e42pEIiKiFo5lEhERtR5VVVWIi4tDeHg4YmJiEBsbi3v37qGgoACKioqwsrKCjY1NrYe5uTlUVVXFjl+DVCrF/v37kZSUBENDQyQlJSExMREJCQmyEszIyAjdunWDk5MTXFxc4Orqivbt24ucnJqjqqoqpKSkICEhAQkJCUhOTkZKSorskZOTI9u3bdu2Na6UMzIygqmpqaxE0dPTQ3x8PAYNGgQTExMR31Xjyc7ORmZmJjIzM5GWlib7mJGRgYyMDKSlpcmuXqymr68vK5bMzc1hYWGBzp07w9bWFubm5jXWPSMiImrmWCYREZH8KisrQ2RkJP773/8iIiICERERkEql0NHRgbOzs+wKHkdHR9jb28uugmjpsrKyEBsbi9jYWNy5cwd37tzBvXv3UFFRAXNzc7i5uaFfv34YMGAAunbtKnZcakJlZWWIi4vDgwcPEB8fLyuPEhISUFJSAuD3EtLKygrm5uYwMzOrUX6Ym5tDS0tL5HfRchQWFsqu5qp+pKamIiUlBY8ePUJ6ejqA36fZderUCba2trC1tYWdnR3s7OzQtWvXGlc4EhERNRMsk4iISL48fvwY58+fR0hICM6fPw+pVAoTExO4uLjAzc0Nrq6u6N27d60pM/KuqKgIt27dQnh4OK5evYqIiAjk5OTAyMgIAwYMgJeXF0aPHl1jOh61bPn5+YiNjcX9+/cRFxeH6OhoREdHo6SkBMrKyujQoQOsrKzQpUsX2Nvbw8rKCg4ODpwe2YSkUikSExPx6NEjxMXF4f79+3j06BHi4+NRVFQEJSUldOrUCS4uLrC3t0eXLl3Qp08fGBgYiB2diIhaN5ZJRETU8iUkJODQoUMIDAxEfHw8tLS04OHhAU9PT3h6esLCwkLsiM1OVVUVoqOjcfbsWZw5cwZRUVGQSCQYMGAAfH19MWHCBLRp00bsmPSGBEHA/fv3ER4ejvDwcERERCApKQmCIKBt27ZwdnaGk5OT7GOnTp2gpKQkdmx6jYqKCiQmJuL27duIiYmRfczKygLw+2L7ffv2haurK9zc3NClSxcuuk9ERE2JZRIREbVMaWlpOHDgAPz9/XH79m2YmJhg0qRJGDNmDNzc3Dg1pJ5ycnJw4cIFHDlyBKdOnUJFRQWGDRsmK5bU1dXFjkivqKysRFRUFC5fviwrj3JycqClpYXevXvD1dUVLi4ucHZ2RocOHcSOSw3k6dOniImJQXR0NCIiIhAZGYn8/Hzo6emhX79+cHV1xYABA9CnTx+WhURE1JhYJhERUcsSHR0NPz8/+Pv7Q1NTE6NHj8bEiRMxYsQI/vLUQIqLi3Hy5Ens378f58+fh7q6Onx8fLBixQrY2dmJHa/VysjIwJUrVxAcHIyTJ0/i5cuXMDY2Ro8ePWRTOHv16sUitRWprKzEgwcPZNNXr169iuTkZGhqaqJv377w8vKCt7c3zM3NxY5KRETyhWUSERE1f+Xl5fj555+xfft2xMXFoU+fPliyZAkmTpzY7O6yJm/S09Pxww8/YM+ePXj27Bk8PT3x4Ycfws3NTexorcKNGzdw+PBhnD59GnFxcdDQ0MDAgQMxfPhweHp6wtbWVuyI1Mz89ttvOHfuHM6dO4ewsDAUFhbCzs4OI0eOxMSJE9GrVy9IJBKxYxIRUcvGMomIiJqvyspKHDhwAJ9//jlSU1Mxffp0LF26FM7OzmJHa3UqKioQHBwMPz8/XL58GcOGDcNnn32GPn36iB1N7ty5cwcBAQEICAhAUlISbGxsMHbsWAwfPhz9+/eHmpqa2BGphSgtLcXVq1dx9uxZnDhxAg8fPoSFhQV8fHzg4+PD/5cSEdHbYplERETN09mzZ7FixQokJSVhxowZ+J//+R8upN1MXLx4EevXr0d4eDi8vLzg5+cHKysrsWO1aDk5Ofjpp5/w448/Ij4+HmZmZpg0aRJ8fHzQo0cPseORnLh9+7asqHz8+DE6deqEOXPmYO7cuXjnnXfEjkdERC0HyyQiImpe0tPTsWLFCgQEBODdd9/F5s2bYWNjI3YsqsO5c+ewatUqJCcnY/369Vi5ciWUlZXFjtWi3Lp1Czt37sShQ4egrKyM6dOnY8qUKejbty+nIlGjEQQBUVFROHjwIPbve1qMewAAIABJREFU34+SkhL4+PhgyZIl6Nmzp9jxiIio+WOZREREzUdAQAAWLVoEPT097Ny5EyNHjhQ7Ev2F8vJybN26FZs2bULHjh0RGBjIdXzeQGhoKD799FOEh4fD3t4eS5YswbRp06CtrS12NGplCgsL8csvv2Dnzp24c+cOevfujc8++wzDhw8XOxoRETVfkQpiJyAiIqqoqMDq1asxefJkTJs2DXFxcSySWghlZWV89NFHuHv3LjQ1NdGrVy8cO3ZM7FjN1s2bNzF06FAMGTIEOjo6CAsLw7179/Dee++xSCJRaGpqYsGCBYiNjcWVK1dgYGAAT09PDBo0CJGRkWLHIyKiZoplEhERiaqgoADDhw/H999/j59//hnffPMNNDQ0xI5F9WRtbY1Lly5hypQpmDBhAj777DOxIzUrGRkZ8PHxQa9evVBUVITLly/j9OnTcHd3FzsakUz//v0RHByM8PBwVFVVoV+/fhg3bhzS0tLEjkZERM0MyyQiIhJNUVERvLy8cP/+fYSHh2Pq1KliR2rx/P39IZFIIJFIXnvXr4CAADg5OUFdXV2277179/722CoqKvj++++xe/dubNy4ERs3bvzbrykPjh8/jm7duuHmzZsICgpCeHg4BgwYIHasevvXv/4lO17at2//1q/zJsdoayTmuftH/fr1kxWe9+/fh4ODAwIDAxt8HCIiarlYJhERkSjKysrg7e2NuLg4hISEwMnJSexIf1tBQQE6duwILy8v0TL4+vpCEAR4eHjU+Xx4eDgmT56MYcOGISsrC4mJiX+rGKjL/PnzsXv3bmzYsAHbtm1r0NduSYqLizF37lx4e3tj9OjRiImJwZgxY8SO9dZWr14NQRDg6OhY67n6HPt/dYw2lOZwPtZHczh3/2jEiBG4ffs2fHx84Ovri2nTpqGgoKBRxyQiopZBSewARETUOm3atAmRkZH473//C3t7+0YbR0tLC05OTrh69WqjjVFNEARUVVWhqqqq0cd6W4cPH4YgCFi+fDm0tLSgpaWFJ0+eNPg48+bNQ35+PtasWYN+/fqhb9++DT5Gc5aTk4MxY8YgPj4eQUFBGDt2rNiRGpVYx/6fnd8t4Xysj6Y6d/9IQ0MD3333HcaMGYOZM2di8ODBOHXqFAwMDBp9bCIiar5YJhERUZO7ffs2tmzZAj8/P7m4IqmatrY2kpKSxI7xp6p/+Wzbtm2jj/XBBx8gJCQE06ZNQ2xsLLS0tBp9zOagqKgIo0aNQlpaGq5evQo7OzuxIzW65njsN8dMf0dTnrt18fT0RHh4OIYPHw5PT09cunSJi8YTEbVinOZGRERNbtGiRejfvz8WLVokdpRWp7KysknH27t3L3JycrB9+/YmHVdMixYtQmJiIi5cuNAqiiRqGk197tbFxsYGFy5cQFpaGmbPni12HCIiEhHLJCIialJXrlxBVFQUtmzZAolE0mjjVC8WXFhYiPDwcNlitUpKv1+UGxQUJNsmkUiQkJCASZMmoW3btrJt2dnZqKioQEBAAIYOHQpjY2Ooq6vDwcEBfn5+NabP/PH1SkpK6tz++PFj+Pj4QE9PD23btoWXl9ffunriwYMH8Pb2hq6uLjQ1NdG/f/86p/xU5zh+/DgAyBbw7dOnz1uP/SZMTU2xfPlyfPPNNygrK2vUsZqDU6dO4cCBA9i/fz86derU5OPn5ubWON4kEgk2bdoEAKioqKix/d1335Vtf5Nj/HVed+xXe9NjtD5Z6nt+/zHTixcvsHLlSlhbW0NFRQX6+voYMWIEwsLCXvu+Wtu5+zpWVlY4ePAgjh07hiNHjoiSgYiImgGBiIioCS1ZskRwdHRssvE0NTUFV1fX1z4/duxYAYAwcOBAISwsTCgsLBSuXbsmKCoqCllZWUJwcLAAQPjiiy+EnJwcISsrS9ixY4egoKAgrF69+rWvV1xcXOf2sWPHChEREUJBQYFw4cIFQV1dXejZs+dbvbfffvtN0NPTE9q1ayecP39eyM/PF+7cuSMMGzZMsLCwEFRVVd84X2NKSUkRJBKJcPr06SYbUyy9evUSxo0bJ3YMwdPTU1BQUBASExNrPde3b1/h4MGDsq/re4w7OjoK7dq1q7W9rmOrvsdofbO86fn9aqbnz58LlpaWgpGRkRAcHCxIpVIhISFBGD9+vCCRSIS9e/fW+Rqt8dz9M1OnThW6du0qdgwiIhJHBMskIiJqUk5OTnX+UthY3vSXzdcVHcHBwYK7u3ut7dOmTROUlZUFqVRa5+u9rkwKDg6usf3dd98VAAhZWVlv+pZkJk6cKAAQjhw5UmP7s2fPBFVV1Wb1C6mdnZ3w0UcfNemYTe3x48cCAOHChQtiRxFCQkIEAMLixYtrbL969apgZmYmlJeXy7bV9xivT5lU32O0vlnepkyaNWuWAEA4dOhQjX1LSkoEU1NTQV1dXUhPT6/1Gq313H2d8PBwAYBw//59saMQEVHTi+A0NyIialKPHj1C586dxY5RS69everc7uXlVWPqSzVHR0eUl5cjLi6uXuP07NmzxtcdOnQAAKSlpdXrdQDg7NmzAIDhw4fX2G5qairKFKs/Y2dnh0ePHokdo1HFxMRAIpGgf//+YkeBh4cHnJ2dsW/fPrx48UK2fevWrVixYoVsOhjQ8Mf4q+p7jDZmlmrHjh0DAIwaNarGdlVVVXh4eKC4uBjnzp2r9X2t9dx9nd69e0NFRQW3b98WOwoREYmAZRIRETWp4uJiqKurix2jFk1NzTq3S6VSrF+/Hg4ODtDX15etn7JmzRoAv9+5qz50dXVrfK2iogIA9b59eWlpKfLz86GmplbnXdIMDQ3r9XqNTUNDo94/q5YmLy8PqqqqUFVVFTsKAGDVqlUoKirCd999BwB4+PAhrly5gnnz5tXYr6GP8Wpvc4w2VpZXM0mlUqipqdV5JzIjIyMAQHp6eq3nWuu5+zqKiorQ0dGBVCoVOwoREYmAZRIRETUpfX39GldKNLa/u8j36NGj8fnnn2P+/Pl4+PAhqqqqIAgCvv76awCAIAgNEbPeVFVVoa2tjZKSEhQUFNR6PicnR4RUr5ednY02bdqIHaNRmZiYoKSkBJmZmWJHAQD4+PigQ4cO+Pbbb1FaWopt27Zh/vz5tUqUxjrG3+YYrW+W+p7fqqqq0NXVRUlJCfLz82s9n5GRAQAwNjau1+vWN0NLOndfJz8/Hzk5OWjXrp3YUYiISAQsk4iIqEnZ29vj1q1bTTaehoZGjbuI2draYs+ePW/0vZWVlQgPD4exsTGWLVsGAwMD2S+vxcXFjZK3PkaMGAHg/6bMVMvOzkZCQoIYkeokCAJu3bqFrl27ih2lUfXp0weqqqoIDg4WOwoAQElJCcuXL0dmZia2bdsGf39/LFu2rMY+jX2M1+cYfZssb3N+jxs3DsDvd957VWlpKUJDQ6Gurl5r+llDaynn7p85efIkJBIJ3NzcxI5CREQiYJlERERNatiwYTh16hTKy8ubZLzu3bvj4cOHePLkCSIjI/Ho0aM3XtNGUVER7u7uSE9Px9atW5GdnY3i4mKEhYVh165djZz8r33xxRdo06YNVqxYgQsXLqCgoAD379/HtGnT6pw+I5aIiAhkZmZi2LBhYkdpVFpaWvD19cXWrVtrFBxiWrBgAXR1dfHJJ5/A29u71lUkjX2M1+cYfZssb3N+b968GZaWllixYgVOnjyJ/Px8PHz4EFOmTMHz58/h5+cnm+7WWFrKufs6FRUV2LJlC8aPHy/3VxwSEdFriLj6NxERtUKpqamCsrKysG/fviYZ78GDB0L//v0FTU1NoUOHDsLOnTsFQRCEyMhIAUCtxx9lZWUJCxcuFDp06CAoKysLRkZGwqxZs4R169bJvsfFxUU4duxYrdeaOnVqneN8/PHHgiAItbaPGjWq3u8vISFB8Pb2FnR0dGS3Kj958qTg4eEhe925c+fWmQ+AEBkZ+fd+wG9g4sSJgouLS6OP0xwkJSUJWlpawtq1a8WOIrNmzRoBgBAbG1vn8296jG/durXOY/l1x361Nz1G65Ol2uvO77/KlJ2dLaxYsUKwtLQUlJWVBV1dXWH48OFCaGiobB+eu6+3YcMGQV1dXXjw4IFoGYiISFQREkEQabEHIiJqtRYuXIjg4GDcvXsXbdu2FTsONaLz58/D09MTQUFBGDNmjNhxmsS+ffswZ84c7N27F3PnzhU7DlGDOnDgAGbMmIGdO3fivffeEzsOERGJI5JlEhERNTmpVIpu3brB1dUVBw8eFDsONZLq/85ubm745ZdfxI7TpD777DNs3LgR27Ztw4oVK8SOQ9Qgdu3ahaVLl2L16tXYsmWL2HGIiEg8kYobNmzYIHYKIiJqXdTU1NClSxd8+OGH0NDQgKurq9iRqIGVlJRg/PjxSE9Px8mTJ6Guri52pCbl7u4OPT09rFq1Cvfu3YOHhwc0NDTEjkX0VvLy8rBs2TJs3LgRa9euZZFERERPuQA3ERGJYvjw4dixYwfWrl2Lbdu2iR2n2ZBIJH/5aO7/DlReXo5JkyYhKioKwcHBrXaB3uXLl+PcuXO4du0aunbtitOnT4sdiRqRPJy7dYmMjISLiwuCgoJw/PhxFklERAQAUBI7ABERtV5Lly5FcXEx1qxZg6KiInzyySeyW4G3Vi199vnLly8xZcoUhIeH48KFC3BxcRE7kqiGDBmC2NhYvPfee/Dy8sKUKVPw2WefwdraWuxo1MBa+rn7R48fP8aGDRvw888/Y8yYMdizZw8MDAzEjkVERM0Er0wiIiJRrVmzBt9++y02bdoEb29vSKVSsSPRW4qJiUGPHj0QFxeH0NBQ9O7dW+xIzUKbNm0QEBCAI0eOIDo6GnZ2dli8eDHS0tLEjkZUS0ZGBpYtWwZbW1uEh4fjl19+wbFjx1gkERFRDSyTiIhIdIsXL0ZYWBhu3rwJFxcXhIaGih2J6qGiogLbtm1Dv379YG5ujujoaPTs2VPsWM3O+PHjcffuXXz//fc4efIkOnbsiEWLFuHOnTtiRyNCXFwcFi9eDGtraxw9ehQ7duzA/fv34evrK3Y0IiJqhlgmERFRs9CvXz9ER0fDwcEBQ4YMwYwZM5CVlSV2LPoLN27cQK9evfDxxx9j3bp1OH/+PK9g+BNKSkqYO3cuHj58iC+//BKXLl2Co6MjBg4ciMDAQJSXl4sdkVqRiooKHD16FIMHD0bXrl0REhKCf/7zn0hMTMTChQuhrKwsdkQiImqmWCYREVGzYWxsjGPHjiEoKAiXLl1C586dsWXLFhQUFIgdjf7g0aNHmDNnDvr27Qs9PT3cuXMH69evh5ISl2N8E2pqali6dCni4+Nx/vx5tGnTBlOmTIGZmRmWLVuG8PBwuVuDh5oHQRBw7do1fPDBBzA3N8ekSZOgqamJs2fP4sGDB1i+fHmru/siERHVn0Tg31SIiKgZys/Px5dffokdO3ZATU0Na9euxeLFi3l7dZGlpKRg06ZN+M9//gNzc3N89tlnmDx5cqtfOL0hpKam4qeffkJAQADi4+PRoUMHTJo0CT4+Ppw2SH9bdHQ0AgICEBgYiJSUFNja2sLHxwezZs2CpaWl2PGIiKhliWSZREREzdqLFy/wzTff4Ouvv4ZEIsHMmTOxfPlyWFlZiR2tVYmOjoafnx/8/f1hamqKjz76CHPmzOGVSI0kLi4Ohw8fhr+/PxISEmBoaIiBAwfCy8sLXl5eaNOmjdgRqZkrLCzExYsXcfLkSZw9exapqakwMzODt7c3Jk6cCDc3N7EjEhFRy8UyiYiIWobMzEzs2bMHu3btwvPnzzFixAgsWrQIw4cP57oejSQnJwcBAQH47rvvcO/ePfTu3RtLly6Fj48Pf+ZN6NatWzhz5gzOnj2La9euQRAE9OrVC56enhg8eDB69OgBNTU1sWOSyEpLSxEdHY2wsLBax8qIESMwYsQI9OjRQ+yYREQkH1gmERFRy1JRUYHjx49j586duHTpEvT19TFhwgRMnjwZAwYMgKKiotgRW7T8/HwcP34c/v7+uHDhAhQVFeHr64slS5bAxcVF7HitXm5uLkJDQ3Hu3DmcO3cOqampUFFRQY8ePdCvXz+4ubmhb9++MDQ0FDsqNbLs7GxEREQgPDwc4eHhiI6ORklJCdq1a4fhw4fD09MTQ4YMgb6+vthRiYhI/rBMIiKiluvx48cICAiAv78/YmJiYGJiAi8vL9kvUTo6OmJHbBFSUlJkV76cP38eFRUVGDZsGHx8fDB27Fj+HJuxx48f4+rVq4iIiMDVq1cRFxeHqqoqdOrUCd27d4ezs7Ps8c4774gdl97SixcvcPv2bcTExOD27du4desWEhISIJFIYGdnB1dXV9nD2tpa7LhERCT/WCYREZF8ePDgAQ4fPozTp0/jxo0bUFBQQL9+/eDp6YkBAwbAxcUFqqqqYsdsFnJychARESGbDnP//n1oaWlh8ODB8PLywoQJE7gmTwsllUoRERGByMhI3Lp1CzExMXj27BkAoH379nB2doaTkxO6du0KW1tbdOrUiXfuakZKSkrw8OFDJCQkIC4uTlYgpaamAgBMTExk5WDfvn3Rr18/XnlERERiYJlERETy58WLFzh//jzOnDmDCxcuID09HWpqanBxcZH9672LiwvatWsndtRGV1lZiYSEBERFRSE8PBwRERGIj48HANjb28PT0xOenp5wc3Nj2SanMjMzZVe0VJcTSUlJqKiogIKCAszMzGBrawtbW1t07twZtra2sLS0RPv27bk2ViOoqKjA06dPkZycjISEBCQkJODBgwdISEhASkoKqqqqoKioCCsrK1lx5OTkBGdnZxgZGYkdn4iICGCZRERErUFiYmKNtUXi4+NRVVWFd955B46OjrJH165dYWNj02KndT1//hwJCQm4e/cu7ty5g5iYGMTFxaG4uBjq6uro0aOHrEzr27cv2rZtK3ZkEklZWRmSkpIQHx8vuxKm+vOXL18CABQVFWFqagpzc3NYWlrC3Nwc5ubmsLCwgKmpKYyNjXkFWx1evnyJ9PR0pKWlISUlBY8fP5Y9UlJS8OzZM1RWVgIAdHV1ZSVe586d0alTJ3Tu3BkdO3aEioqKyO+EiIjotVgmERFR65Obm4vY2FjExsbWKF1KSkoAAIaGhrC2toa1tTVsbGxgYWEBIyMjtGvXDkZGRqIsblxeXo7MzEw8e/YM6enpePbsGZKTk5GUlITExEQkJSWhsLAQAKCvrw8nJyc4OjqiW7ducHR0hIODA68yoTeSmZmJ5ORkpKSkyB6vFiLVxxkAqKqqwsDAAO3atYOhoSGMjIxgamoKAwMDtG3bFnp6etDX15c99PT0WlRJUl5ejpcvX+Lly5fIzc2VfZ6Tk4PMzEw8f/4c6enpyMrKwrNnz5CZmYnS0lLZ92toaMDCwgIWFhayIq66lLO0tOSVRkRE1FKxTCIiIgJ+n3ry6NGjGuVM9ceUlBQUFxfL9lVRUYGhoSEMDQ2hp6cHXV1d6OjoyB7a2tpQVFSscYWTlpaWrMwpKiqS/cJZVVUFqVQKQRCQm5sLqVSKvLw85OXlQSqVIjc3F5mZmcjMzMSrf2S3adMGFhYWsLGxkRVf1eVX+/btm+inRq1Rdna2rERJT0/H/2PvzuOiOu/9gX8GZtiHYSDsiwoSZVFjwBajIFHjyoAaR5NoTRqz9bY/TdvY2iRtTdtXbto0txfbksTem6YmZOnEBQeXiFrBhcS4xIVFBdxw2IRhZ1jP7w/vnDICCggcBj7v12teDGdmznznzPAw53Oe5znl5eUwGAxdwpWqqiq0tbV1ebyzs7MYLtnb28PNzQ0KhQIuLi5wcnKCvb09XF1doVAooFKpxMd1NzeQq6urxRkczX9PdzL3tgKA2tpatLa2oqamBi0tLWhoaEBDQwNaWlpQXV2N5uZmMTiqr6/vsi65XA61Wg0vLy/4+PjAx8cHXl5e8PPzswjUfHx84Onp2eftS0REZAUYJhEREfXGzp07sWzZMvzqV79CaGgoysrKUF5ejurqajH4Mf8075h27sFRU1ODjo4OALd7czg5OYm3ubm5QSaTWQRT5p9ubm7w8vKCv78/fHx8xJ1UBweHId8GRH1VV1dn0aPnzh4+LS0tMBqNaG1tRX19vRi01tTUoLW1FbW1tQBuz/1lvm5mDmDvpFKpYGNjY7GsubkZzs7OUCqVUCqVUCgUYi8pZ2dnODs7w87ODm5ubmLAdWePKvN1pVI5eBuMiIjIOjBMIiIiupdbt25h8uTJmDFjBnQ6ndTlEFEfLV++HEajEQcPHpS6FCIiopEg2+be9yEiIhrd1q5dC7lcji1btkhdChH1w6pVq3D48GEUFxdLXQoREdGIwDCJiIjoLlJSUpCeno6tW7d2O2cLEQ1/ixcvhlqtxqeffip1KURERCMCwyQiIqIe5ObmYsOGDXj99dcRHx8vdTlE1E92dnZYtmwZUlNTpS6FiIhoROCcSURERN1obm5GTEwMFAoFjh07Jp6JjYisU2ZmJuLj43H+/HlERkZKXQ4REZE145xJRERE3dm4cSMKCgqQmprKIIloBIiLi8PYsWPxySefSF0KERGR1WOYREREdIeMjAwkJycjJSUFoaGhUpdDRANAJpPhiSeeQGpqKjo6OqQuh4iIyKpxmBsREVEnt27dwuTJkzFjxgzodDqpyyGiAZSbm4uIiAhkZmYiLi5O6nKIiIisFYe5ERERdbZ27VrI5XJs2bJF6lKIaICFh4dj8uTJnIibiIjoPjFMIiIi+j8pKSlIT0/H1q1boVarpS6HiAbBqlWroNPp0NzcLHUpREREVothEhEREW4Pf9mwYQNef/11xMfHS10OEQ2S1atXo7a2Fnv37pW6FCIiIqvFOZOIiGjUa25uRkxMDBQKBY4dO8aztxGNcLNnz4aHhwfnRSMiIuofzplERES0ceNGFBQUIDU1lUES0SiwatUqpKeno7q6WupSiIiIrBLDJCIiGtUyMjKQnJyMlJQUhIaGSl0OEQ0BrVYLmUyG7du3S10KERGRVeIwNyIiGrVu3bqFyZMnY8aMGRzuQjTKLF++HEajEQcPHpS6FCIiImvDYW5ERDR6rV27FnK5HFu2bJG6FCIaYqtWrcLhw4dRXFwsdSlERERWh2ESERGNSikpKUhPT8fWrVuhVqulLoeIhtjixYuhVqvx6aefSl0KERGR1WGYREREo05ubi42bNiA119/HfHx8VKXQ0QSsLOzw7Jly5Camip1KURERFaHcyYREdGo0tzcjJiYGCgUChw7doxnbyMaxTIzMxEfH4/z588jMjJS6nKIiIisBedMIiKi0WXjxo0oKChAamoqgySiUS4uLg5jx47FJ598InUpREREVoVhEhERjRoZGRlITk5GSkoKQkNDpS6HiCQmk8nwxBNPIDU1FR0dHVKXQ0REZDU4zI2IiEaFW7duYfLkyZgxYwZ0Op3U5RDRMJGbm4uIiAhkZmYiLi5O6nKIiIisAYe5ERHR6LB27VrI5XJs2bJF6lKIaBgJDw/H5MmTORE3ERFRHzBMIiKiES8lJQXp6enYunUr1Gq11OUQ0TCzatUq6HQ6NDc3S10KERGRVWCYREREI1pubi42bNiA119/HfHx8VKXQ0TD0OrVq1FbW4u9e/dKXQoREZFV4JxJREQ0YjU3NyMmJgYKhQLHjh3j2duIqEezZ8+Gh4cH51QjIiK6N86ZREREI9fGjRtRUFCA1NRUBklEdFerVq1Ceno6qqurpS6FiIho2GOYREREI1JGRgaSk5ORkpKC0NBQqcshomFOq9VCJpNh+/btUpdCREQ07HGYGxERjTi3bt3C5MmTMWPGDA5ZIaJeW758OYxGIw4ePCh1KURERMMZh7kREdHIs3btWsjlcmzZskXqUojIiqxatQqHDx9GcXGx1KUQERENawyTiIhoRElJSUF6ejq2bt0KtVotdTlEZEUWL14MtVqNTz/9VOpSiIiIhjWGSURENGLk5uZiw4YNeP311xEfHy91OURkZezs7LBs2TKkpqZ2e3tbW9sQV0RERDQ8MUwiIiKrYjKZ0Nzc3GV5c3MzVq1ahYiICLz++usSVEZEI8GqVatw9uxZXLhwAQBQUFCAN954A6Ghofj2228lro6IiGh4kEtdABERUV/s27cPmzZtwieffILw8HBx+caNG1FQUIDTp09DoVBIWCERWbO4uDgEBgbiJz/5CaqqqnDq1CnI5XK0tbWB560hIiK6jT2TiIjIquzZswdnz57F1KlT8e6770IQBGRkZCA5ORkpKSkIDQ2VukQiskImkwl6vR7Lly/HzZs3cfDgQZw5cwbAv4e3dXR0SFkiERHRsCETeIiFiIishCAI8PHxQXl5OQBAJpMhLi4O+fn5iI2NhU6nk7hCIrI2JSUl2LBhA7Zv347m5mbY2Nj0ODfS8ePHMX369CGukIiIaNjJ5jA3IiKyGmfPnhWDJOB2uHT8+HHY2tpCq9VKWBkRWSsfHx/U1dXBZDJBEIS79j7iMVgiIqLbOMyNiIisxp49e7rMh9Ta2oqWlhasXLkS69at63ZybiKinshkMqSmpmLixIn3nG+Nw9yIiIhuY5hERERWIy0trdvhJ+YdvJSUFDz88MPIzc0d6tKIyIq5uLhgz549cHJygo1Nz1+P2TOJiIjoNoZJRERkFaqqqnDy5Mm77sx1dHQgNzcXycnJQ1gZEY0EY8eOxRdffHHX+7BnEhER0W0Mk4iIyCrs27fvrkGSQqGAk5MTPvroI7z//vtDWBkRjRRz587F73//e8hksm5vZ5hERER0G8MkIiKyCrt374Zc3v15I2xsbBATE4O8vDysXr16iCsjopHklVdewZo1a7ptbzjMjYiI6DaGSURENOy1t7dj9+7daG1ttVgul8tha2uLX/7ylzh8+DACAwMlqpCIRpL33nuGJFUwAAAgAElEQVQPkZGRXSbkZs8kIiKi2xgmERHRsPf111+jpqbGYplcLsfYsWPxzTffYNOmTXedNJeIqC8cHBywa9cuKJVK2NraisvZM4mIiOg2fvMmIqJhb8+ePWIPAXNo9P3vfx9nz57F1KlTpSyNiEaowMBA6PV6i/mT2DOJiIjoNoZJREQ07KWlpaG1tRUKhQLu7u7Yt28ftmzZAicnJ6lLI6IR7JFHHsHmzZvF3xkmERER3db9TKZERDSq1dfXo7W1FS0tLWhoaAAAVFdXi0M8TCYTmpqaenx8TU3NXXe6XFxcusxFYmZrawtXV1fx94aGBuTk5AAA5syZgz//+c8ICQnp82siotGtrq4ObW1tAIDa2lq0t7cDsGzbAKCxsRHNzc3i76GhoVi4cCH27t2L06dPQ6FQoL29HbW1tfd8ThsbG6hUqnve78420c7ODs7OzgBuD7lzdHQEADg6OsLBwaEXr5aIiGhwyQQO/iYislo1NTUwGo0wGo2oqqpCXV0dGhsbUV9fj5qaGjQ0NKCxsRE1NTWor6/vcpvJZBKDIUEQUF1dLfVL6hPzjpU5gDLvuLm4uMDZ2RnOzs5wc3ODk5MTnJycur1NqVRCrVbD3d0darW6xzPGEdHAamtrQ11dHYxGI2pra1FXVweTyYTq6moxyDYHOzU1NWhra0NNTQ2am5vR2NiIhoYGtLS0oLq6Gm1tbWK4Y14O/DsYH4mcnJxgb28PAHB2doadnZ3YBprDKPNylUoFhUIBV1dX2Nvbw8nJSQyw3NzcoFAooFQq4eLiAqVSCVdXVyiVSri5uUn8KomIaJjKZphERDQMtLe3o6KiAhUVFSgtLUVZWRkqKipQVVUlBkWdQyPzdfOR9c4UCgVcXFygUqnEEMXNzQ3Ozs5wcnISdxTMt5nvDwBubm6QyWTiTopcLodSqQQAuLq6ihPR3utoe+ednDvdK7S6s9dTcnIy4uPj4e3tjcbGRovHm3cUW1tbUV9fL+6c1tbWorGxEY2NjTAajeL12tpai1CtO0qlUgyWOodM5uteXl7w9PSEp6cnfH194eXlJfYaIBpN6uvrUVVVJV4qKytRWVmJmpoaVFdXi3+L5p81NTWoqakRf79b70Zz4NE5DJHL5RZBibmdcXV1hUKhENukzr13ugtcAMueQEql0iJEvrN3pFl5eTlu3rwpztPWuU3syb16cQK3h87deYKBpqYmmEwmAJY9pXoKysy9rsw9pszPa75P58CtuzDubrsDrq6uYrhk/qlWqy1+d3V1hbu7Ozw8PODu7m5x6el/ARERWTWGSUREg8lkMuH69eu4efMmbty4geLiYpSXl6OiogIlJSXi9YqKCosv83Z2dvD09ISHh0ePoUZ3y5RKZY/Dx6irmpoa1NbW9hjY3bmsqqoK5eXlXYIoFxcX+Pj4wNvbG56envDx8YGXlxd8fHwQGBiIwMBABAQEwMPDQ6JXSnR3TU1NKC8vF9slc6BdWVlpERh1vphDjc7c3d3h5uYGNzc3MWgwhw0qlQoqlarL8s73dXR07NWwMBpY5hCqvr4edXV1YuBXXV1tEQiafxqNRov71dTUoKqqqtuQ3tnZuUvA5OHhIQZPXl5e8PLygp+fHzw9PeHl5XXPkI6IiCTHMImIqL8EQYDBYEBRURGuXbuGmzdvori4GNeuXUNxcTGKi4tRUVEh3t/BwQF+fn7w8fGBp6cnvL294e3tDS8vL/G6ebm7u7uEr4zupfOOtzkM7BwOmpeXlJSgqqpKfJyjoyPGjBmDgIAA+Pv7i9cDAgIwbtw4jBs3jkfxacB0dHSgrKwMN27cEHs8lpaWory8XPy9vLwcBoMBdXV1Fo91dXUV26LuLt31QHF3d7c48xmNPi0tLd0Gj3eGkubfKysrUV5eLvbCAgCZTCb2APXx8RH/Z/r6+or/JwMDA+Hv7w+1Wi3hqyUiGtUYJhER3U1raytu3LiBoqKiLpeLFy+KR2EVCgUeeOAB+Pn5ITg4GL6+vl2ujx07VjytPY0eJpMJBoMBBoMBJSUlKCoq6va6mVqtRnBwsHgJDw9HREQExo8fzx4bZMFoNN71c3X16lU0NjaK93dwcIBarYafn5/YLvn6+losU6vVCAwM7HaYF9FgaWpqgtFoRElJifg5NhgMFsuMRiOKi4stJj43H6Tp7n+u+bqvry9DTiKigccwiYgIuP1FNjc3F7m5ucjJyUFOTg5yc3Nx/fp18ew/Hh4eCAkJ6fbCL6t0P2pra1FUVITCwkKLS0FBAYqLi8W5sTw9PTFhwgREREQgIiIC4eHhiIyMhLe3t8SvgAZDdXU1CgsLLT4b5jDbYDBYDDPz8fERe7wFBQVZXPf394evry/n9qIRoaamRhw6bv555/XOgZOzszPGjBmD4OBghISEiD9DQkLYG5SIqP8YJhHR6NLR0YH8/Hx8++23uHDhAnJzc3HhwgVcuXIFHR0dsLOzQ1hYGMLCwhAZGYnx48eLXzrZnZ6k0NLSgitXrojhUl5envi5NQ+h8/DwQGRkpBguTZo0CVOnThUnVqfhq7KyErm5ubh8+XKX4Mj8/tra2iIwMFBsi4KDgxEQECCGRn5+ftwhJuqkrq7OImS6du2axd9XeXk5gNtD6gICAiwCpuDgYEyYMAETJ05kAEtE1DOGSUQ0shkMBpw6dUq8HD9+HFVVVZDL5QgKChKHEJl/RkZGcqeMrIbRaBR70Zl/njt3TtxRCg4OxowZMxAVFYWoqCg8/PDDcHJykrjq0anze1VUVGRxHbh99jJ/f3+LIY7mS1hYGN83ogHU3NyMmzdvdhm+npOTg0uXLok9kn19fS2+I4SHh2PKlCniWU6JiEYxhklENHLU1dXhyJEjyMrKwtdff43Tp0+jtrYWCoUCkyZNQlRUFKKjoxEdHY1JkybxrGc0Yl27dg0nT57EqVOncPLkSZw8eRJGoxFyuRxhYWGIjo5GXFwcZs2ahXHjxkld7ojS3NyM8+fP49SpUzh9+jRycnKQl5cn9jJyd3dHWFgYwsPDERYWhoiICEycOBFBQUESV05EwO25EgsKCpCbm4u8vDzk5OQgPz8feXl5aG5uBgCMGTMGEydOxOTJk/Hwww8jKioK48eP53B3IhpNGCYRkfWqqanBkSNHkJmZiczMTJw+fRrt7e0ICwvD9OnTER0djaioKEyZMoW9jWjUKywsFAOmr7/+GidOnIDJZEJQUBBmzZolXsaPHy91qVajubkZ586ds+j9eOHCBbS2tkKpVGLq1Kni/FbmAMnHx0fqsomoH9rb23HlyhUxIDb3BM3JyUFbWxtUKpUYLJkvDJiIaARjmERE1kMQBJw8eRK7du3C3r178e2336KjowPh4eEWO8OcjJjo3kwmE06cOIHDhw8jMzMT2dnZaGpqgr+/Px577DFoNBrMmzeP8y51UlZWhqysLGRlZeHYsWMWwdGdO5GhoaE8eyPRKGAymXD27FmLUPnOgCkuLg5xcXGIiYnhkFUiGikYJhHR8NbU1ISDBw9i165dSE9PR0lJCcaMGYPFixdj9uzZiIuLg6enp9RlElm9lpYWMVzau3cvvvrqK9jZ2eHRRx9FYmIiEhISEBAQIHWZQ+rmzZs4fPiwGCDl5+fD1tYWU6dORWxsrNj7kcEREXXWOWA6ceIEsrKycOXKFdjZ2WHatGmYNWsW4uLiMGPGDAb2RGStGCYR0fDT3t6Offv24cMPP8SePXvQ1NSEqKgoJCYmQqPR4KGHHpK6RKIRr6KiAunp6UhPT8eXX36JxsZGPPzww/je976H1atXw8PDQ+oSB1xraysOHz6MtLQ07Nu3D4WFhVAoFOIcU3FxcZg5cyZcXV2lLpWIrMyNGzfEYflZWVm4dOkS5HI5oqKikJCQgKSkJEyaNEnqMomIeothEhENHwUFBfj73/+Of/zjHzAYDIiLi8NTTz2FhIQE+Pn5SV0e0ahlMplw6NAhbNu2DTqdDi0tLUhMTMSzzz6Lxx57DLa2tlKX2G+1tbXYt28fdu7cib1796K6uhpTpkxBQkIC4uPjMX36dDg7O0tdJhGNMCUlJcjKysLBgweh1+tRWlqK4OBgJCUlISkpCTNnzrTqtpWIRjyGSUQkvd27d+Ptt99GVlYW/P398fTTT+OZZ57hRMBEw1B9fT10Oh0++OADHD16FAEBAXjhhRfwwx/+EO7u7lKX1yuNjY3Yvn07UlNTcejQIXR0dCA2NhZJSUlITEzkGe6IaEh1dHTgxIkTSEtLQ1paGvLy8vDAAw8gMTERTz/9NGJjYzmRNxENN9kc4E9Ektm7dy+++93vQqPRwNXVFbt378bVq1fxu9/9jkFSDz7//HM89NBDcHR0hEwmg0wmw4ULF3r12D/+8Y/iY0bb3Dc0cFxcXPD9738fR44cwcWLF7Fq1Sr86U9/wpgxY/DKK6+gsrJS6hJ7dO7cObzwwgvw9fXFs88+Czs7O/ztb39DWVkZDh06hPXr1zNI6iW2RdZroLb/Z599Jq7HwcFhACscfWxsbBATE4P//M//RG5uLi5duoSf/exnOHv2LGbNmoXQ0FC8+eabuHXrltSlEhGJGCYR0ZA7fPgwYmJisHjxYnh7e+Obb77Brl27sHDhQnbpvotjx47hySefxLx581BRUYGCgoI+7Qi88sorEAQBU6ZM6XJbfX09QkNDkZCQMJAlUy9Z6/Z/8MEH8dZbb+HatWt444038PHHHyMkJAS///3v0draKnV5ov3792Pu3LmYMmUKjh07hjfeeAPFxcVIS0vDmjVrrKZH1XDBtsi6DdT2f+KJJyAIAubMmTMYZfarppEiNDQUGzZswMmTJ3Hu3DkkJibinXfeQVBQEF544QUUFhZKXSIREcMkIho6dXV1eOGFFzB79my4u7vjxIkT2LVrF6KioqQubVhwcXHBzJkze7xdp9NBEASsX78eLi4uCAkJwY0bNxAZGXnfzy0IAjo6OtDR0XHf65LavbbjUK+nN6x9+yuVSvzkJz9BQUEBXn75ZfzmN79BdHQ0Tp8+LWldX331FeLj4zF//nzI5XLs27cPFy5cwMsvvwwvLy9JaxvO2BYNjKFsQwaKVNv/bttqJH0m+mPSpEn4r//6L1y/fh3vvPMODh8+jLCwMPzgBz9AWVmZ1OUR0SjGMImIhsTly5cRExODtLQ0fPbZZ9izZw+io6OlLsuq3LhxAwAG5SxaSqUShYWF2LNnz4Cvm+5tpGx/FxcXbNq0CefOnYOHhwdmzJiBv//970NeR319PdatW4cZM2YAuN2TZt++fZg/fz7nHRkAbItGruG4/YdjTVJwdnbGD37wA+Tm5uLdd9/Fnj17EB4ejg8//FDq0oholGKYRESDLj8/H3FxcbC3t8c333yDFStWSF2SVWpvb5e6BKJeCQkJwcGDB7Fp0yY899xzeOutt4bsuYuKihATE4OPPvoI7777Lg4fPoxHHnlkyJ5/NGBbRCQduVyOtWvXIj8/H88//zyee+45PPHEE2hqapK6NCIaZRgmEdGgqqiowOzZszFhwgQcPXoUQUFBUpfUxZ2TkX7zzTeYM2cOlEolnJyc8Oijj+LYsWNdHldZWYmf/OQnCAkJgZ2dHdRqNRYuXIh//etf4n127twprlsmk+HixYtYsWIFPDw8xGUbN26ETCZDQ0MDjh07Ji6Xy+UW60hLSwMAccLbmJiYPtXSkztrNJlMfX6dfdWbdfb1fTHfv6ft2Fv3Wk9v3tNbt26hra0Nn3/+OR577DH4+PjA0dERkyZNQnJyssVwjZ62/53Lr169ipUrV8LNzQ0eHh5ISEgY1vNmyGQy/PznP8d///d/49VXX8Wnn3466M9ZWFiImJgYODg44Pz583jhhRcG/TkHEtsitkVm1dXVFttCJpPhd7/7HQCgra3NYvny5cvF5b1pc3pyr+2fn5+PJUuWQKVSwdnZGbGxsTh69Gi36+ptLX1tb/vzmbD2trQnjo6OeOutt7Bnzx58+eWX0Gg0w2quOiIaBQQiokH01FNPCWPGjBGqq6ulLuWepkyZIjg7OwvTp08Xjh8/LtTX1wvffPONMHnyZMHOzk44fPiweN+SkhJh3Lhxgre3t6DX64Wamhrh4sWLwrJlywSZTCb87W9/s1h3UlKSAECYNWuW8K9//UtoaGgQvvrqK8HW1laoqKgQBEEQnJ2dhRkzZvRYn3kdTU1NFsv7WsuUKVMEf3//Xq2/r+vujf7U29v3RRDuvR17q7fvR0/vqV6vFwAIb775plBVVSVUVFQImzdvFmxsbIRXXnmlx/Xd+f6alyclJYmvPyMjQ3B0dBSmTZt2369zKKxbt05Qq9XiZ30wmEwmISwsTJg2bZrQ0NAwaM8zFNgWsS0yW7BggWBjYyMUFBR0uW369OnCJ598Iv7e1zanL9v/8uXLgpubm+Dv7y/s379fqKurE86dOyfMmzdPGDt2rGBvb2+xjr7W0p/PXH8/+9bclvbkzJkzglKpFNatWyd1KUQ0ehxnmEREg+bGjRuCXC4XPvvsM6lL6ZUpU6YIAIQzZ85YLD937pwAQJgyZYq47JlnnhEACJ9++qnFfU0mk+Dn5yc4OjoKpaWl4nLzl9g9e/b0+Pz93YHray192YHo67p7oz/19vZ9EYShD5N6ek/1er0QHx/fZfnq1asFhUIh1NTUdLu+nsIkvV5vsXz58uUCgEENaAZKQ0OD4O7uLrz11luD9hwpKSmCo6OjcOPGjUF7jqHCtohtkdmBAwcEAMJ//Md/WCw/evSoEBQUJLS2torL+trm9GX7a7VaAYDwxRdfWNz35s2bgr29fbdhUl9q6c9nrr+ffWtuS+/mww8/FBQKhVBYWCh1KUQ0OhznMDciGjRHjhyBjY0Nli5dKnUpvebs7IyHHnrIYtmkSZPg5+eHs2fPoqSkBACwY8cOAMDixYst7mtvb485c+agqakJX375ZZf1f+c73xnwmvtbi1Tr7s86e/u+SKGn9zQhIaHb4TdTpkxBa2srcnJy+vQ806ZNs/g9MDAQAGAwGPq0Hik4OTkhMTHxvoYj3Ut6ejqWL1/ep1PUD2dsiwZ/3dbQFs2ZMwdTp07Fhx9+iMrKSnH522+/jZdfftli6NxAtzmd7du3DwAwf/58i+V+fn548MEHu9x/MGsx6+9nwprb0rtZvXo1VCoV9u7dK3UpRDRKMEwiokFTVVUFlUoFOzs7qUvpNTc3t26Xm08jXl5ejubmZtTU1MDBwQFKpbLLfb29vQEApaWlXW5zdnYewGpxX7VIse7+rrM374tUenpPa2pq8Ktf/QqTJk2CWq0W5+vYsGEDAKCxsbFPz6NSqSx+N/9dWcvpsr28vCx2hgdaaWkp/P39B239Q41t0eCu25raop/+9KdobGxESkoKAODSpUvIysrCc889Z3G/gW5zzJqbm1FXVwcHBwe4uLh0ud382oeils419fczYe1taU9sbW3h5+fXr78xIqL+YJhERINm3LhxuHXrFsrKyqQupdcqKyshCEKX5eYdBC8vL9jb20OlUsFkMqGurq7Lfc2v18fHp0/P3Z9Tlg9WLYO17v6uszfvi9lAnfr9ftej0Wjw29/+Fs8//zwuXbqEjo4OCIKAP/3pTwDQ7esZyc6fP4/g4OBBW//EiRORnZ09aOsfamyLBnfd1tQWrVy5EoGBgfjLX/6C5uZmvPPOO3j++ee7hCiD1ebY29tDqVTCZDKhvr6+y+1VVVVdlvW1lr5uq8H8vFmrW7du4dKlSwgPD5e6FCIaJRgmEdGgmT17Njw8PPDnP/9Z6lJ6zWQy4ZtvvrFYdv78eRgMBkyZMgW+vr4AIA7d2717t8V9m5ubcfDgQTg6OnYZDnAvTk5OaGlpEX+fMGECtmzZcs/HDUYtg7nu/qyzt+8L0P/teKf7WU97ezuOHTsGHx8frFu3Dp6enuLO0mg8fXNeXh7279+PFStWDNpzvPTSS8jMzIRerx+05xhKbIsGf93W0hbJ5XKsX78e5eXleOedd/DZZ59h3bp1FvcZ7DZn4cKFAP493M3s1q1buHjx4n3X0p9tNZifN2v06quvws3NDUlJSVKXQkSjhVSzNRHR6JCcnCwoFArh+PHjUpdyT1OmTBFUKpUwZ86cPp9Bqba21uIsMlu2bLFYd08T1na2YMECQaVSCdevXxeOHz8uyOVyITc3957r6Gst93MGpXutuzf6U29v35febMfe6u/7YTZ79mwBgPCHP/xBqKioEBobG4VDhw4JQUFBAgAhIyPD4v73moD7zuU///nPu50MeLhpaGgQoqOjhe985zsWkwUPhrVr1wpKpdIq2pu7YVvEtuhOtbW1gkqlEmQymbBmzZpu79PXNqcv27+goEBwd3e3OJtbTk6OMH/+fMHLy6vLBNx9raU/n7mB+uxbS1t6N2+++aZgY2MjbNu2TepSiGj04NnciGhwtbe3C4mJiYJarRZOnDghdTl3Zf5inZubK8yfP19QKpWCo6OjMGvWLOHo0aNd7n/r1i3h5ZdfFsaNGycoFApBpVIJ8+fPFw4ePCjeJzs7WwDQ5dKd/Px8ITY2VnB2dhYCAwOFv/71r4IgCMKOHTu6XUd2dnafann77be7rOO1117rdv2rVq3q07r7qi/r7Ov70tN27Kue1tPb97SiokJ48cUXhcDAQEGhUAje3t7CM888I2zcuFF8TFRUVI/bv7vnee211wRBELosX7x4cb9e42Crq6sTHnvsMcHT01O4dOnSoD9fS0uLkJiYKDg4OAgffPDBoD/fYGFbxLaoOxs2bBAACGfPnu329t62Of3d/hcvXhSWLFkiuLq6Co6OjsK0adOE9PR0Yc6cOeL9165d26da7rWtBuIzMRLa0p40NDQIa9euFWxsbIQ///nPUpdDRKPLcZkgjLJJG4hoyDU3N+Pxxx/HoUOH8N5772HNmjVSl9Sthx56CLdu3UJxcbHUpVAnfF+s0+XLl/H444+jtLQU+/fv73IGrMHS0dGBV199FW+//Tbmz5+Pv/71rxg3btyQPPdA4Wd+eOL7QsPJvn378MMf/hBGoxH/+Mc/oNFopC6JiEaXbM6ZRESDzt7eHmlpafjRj36EZ555BkuXLrX6U/ASUffa2trwzjvv4KGHHoK9vT1Onjw5ZEESANjY2OCtt95CVlYWrly5gokTJ+JHP/oR2xwiGhGys7MxZ84cLFy4EFOnTkVOTg6DJCKSBMMkIhoStra2+MMf/oDMzEzk5eUhNDQUGzduRG1trdSlEdEAOXDgAKKiovCLX/wC/+///T8cO3YMQUFBktQyY8YMnDt3Dps3b8bOnTsxbtw4PP300zhz5owk9RAR9Vd7ezu2bduG2NhYPPLII2hpaUFmZia++OILi0nfiYiGEsMkIhpSsbGxOHPmDH71q1/h/fffR3BwMN54441uTy08VP74xz9CJpPh7NmzuHnzJmQyGV5//XXJ6rFGMpnsnpdNmzb1aZ0D/b4MRo10e1jZtm3bEB0djXnz5mHChAnIzc3FW2+9BTs7O0lrUygUePHFF1FQUICUlBScOXMGDz/8ML773e/i3XffRXV1taT13Ylt0f1jW0QjyeXLl/Haa69hzJgxWLFiBdzd3XHo0CEcOXIEcXFxUpdHRKMc50wiIslUVVVh8+bN+Mtf/gKTyYTly5fj2WefRWxsrHgaYSIanm7cuIEPP/wQH374Ia5evYolS5bg1VdfRVRUlNSl3dXhw4fxwQcfYNu2bejo6MDs2bORlJSExMRE+Pj4SF0eEY1yZ8+exa5du5CWlobTp0/D398fa9aswbPPPouQkBCpyyMiMstmmEREkquvr8dHH32EDz74ACdPnsT48ePxzDPP4Omnn0ZAQIDU5RHR/zGZTEhLS8MHH3yAAwcOwMPDA6tWrcJLL72ECRMmSF1en9TW1mL79u1IS0vD/v37YTKZ8J3vfEcMlsLDw6UukYhGgba2NmRlZYkB0tWrV+Hn5weNRoNly5Zhzpw5sLW1lbpMIqI7MUwiouHl3Llz+OCDD5Camgqj0YjY2FgkJiYiMTGRR+SIJFBXV4d9+/ZBr9cjPT0dtbW1WLBgAZ599lkkJCRIPpRtIDQ1NSEjIwNpaWnQ6/WoqKhAcHAw4uPjMWvWLMyaNQtjxoyRukwiGgHa29tx9uxZZGZmIjMzE1lZWTAajYiIiEBSUhKSkpIwbdo09tAmouGOYRIRDU8tLS3Q6/XYtm0b9u3bB6PRiPDwcCQmJkKj0SAmJgY2Npz2jWgwXL9+HXq9Hrt27cLhw4fR3t6ORx55BElJSXjyySfh5+cndYmDpr29HdnZ2fjyyy+RmZmJEydOoLm5GWPGjBGDpbi4OIwfP17qUonICrS1teHUqVNicHT06FHU1NTAw8MDsbGxiI+PR0JCAg+YEZG1YZhERMOfuQu4eee2qKgInp6e4k5dfHw8IiMjeRSPqJ/KysqQlZUlHim/cOEClEol5s+fD41Gg0WLFuGBBx6QukxJNDU14euvvxa3zVdffYWmpib4+voiOjoaUVFR4oVnVSIa3To6OnDx4kWcOnVKvJw5cwb19fXw9vZGbGysGErzewsRWTmGSURkfXJycrB3715kZmbiyJEj4hG+uLg48UvapEmTOMcAUQ8MBoN4lDwzMxN5eXmwtbXF1KlTMWvWLDz22GOIj4+Hvb291KUOOy0tLThx4gSOHz8u7iwWFhYCAHx9fS3CpYcffhj+/v4SV0xEg6G9vR0XL17E6dOnuwRHdnZ2iIyMRFRUFKZNm4aZM2ciLCxM6pKJiAYSwyQism7t7e3Iz8/HsWPHcODAARw6dAiVlZVwcXHBlClTLHbswsLCODSORp2amhqcP3/e4kh5bm4ubG1t8dBDD2HGjBmYOXMm5s6dC7VaLXW5Vqm2thbnzp2z2Mb5+fno6OiAm5sbQkJCEB4ejoiICPHnuHZkmdMAACAASURBVHHj2CuByAq0tbXh+vXryMnJQW5urvgzLy8PjY2NkMvlePDBBy2+b0RFRcHR0VHq0omIBhPDJCIaWTo6OnD+/Hl8/fXXOHnyJE6ePIkLFy6gtbUVKpUKUVFRiI6OxsMPP4yIiAhMmDABCoVC6rKJBkRxcTFyc3Px7bffip//K1euAACCgoIQHR2N6OhoTJs2DTExMXBxcZG44pGruroaZ86cQV5eHi5cuID8/Hzk5OSgvLwcAODq6oqwsDBEREQgLCwMEyZMQHBwMEJCQuDg4CBx9USjT1VVFQoLC1FUVIS8vDzk5uYiNzcXly9fRktLC2xsbDBu3DiEh4eLl8jISEyaNInfI4hoNGKYREQjn8lkwtmzZ3Hy5EmcOnUKJ0+eRF5eHtra2qBQKBAaGmrRYyAiIgKhoaH8ckjD1s2bNy2OkF+4cAG5ubmoqakBAPj5+Ynz+ZgDJC8vL4mrJgCorKxETk6Oxc5qbm4uDAaDeB9/f38xWLrzp6enp4TVE1mv9vZ23LhxA0VFRWJo1PlndXU1AEAulyM4OFgMes0/J06cyN5GRET/xjCJiEan5uZm5Ofnizvi5t4DRUVFaG9vF0OmBx98ECEhIeJl/PjxCAoKglwul/ol0AhXUVGBgoICFBYWWvzMz88Xd3o8PT0RGRkpHiEPCwtDZGQkPDw8JK6e+qqhoaHbHdyioiJcu3YNLS0tAAClUong4GAEBgYiMDAQAQEBCAgIQFBQEPz9/REYGMieTTQqGY1G3Lx5E9euXcPNmzctrl+7dq3bv6PuAtugoCAeTCIiujeGSUREnZlMJuTl5SEvLw85OTkoLCwUL0ajEQCgUCgwZswYMVwyf/n09/dHUFAQfHx8ODcT3VN1dTWKi4tx/fp1FBcX48qVK2JoVFhYiNraWgCAnZ0dxo0bJwaaEydOFMOj0XqGtdHmzh4VV65cET87N2/eRHFxMUwmk3h/T09PMVgKDAyEv78//P394enpCR8fH3h7e8PLy4s7zGQVGhsbUVpaitLSUlRUVKCkpAQlJSVi22kOixobG8XHqFQqMWQNCAhAYGCgGBgFBwezpyYR0f1jmERE1FuVlZUW4VLnS2lpKTo6OgDc7iLv6+uLoKAgcUfOvFPn6+sLPz8/eHl5sbv8CNXe3o6KigqUl5eLR8c7h0bm6w0NDeJjVCqVRWDUuSdcQEAAz0xI91RWVtbls9a5Z0ZJSQmamposHvPAAw/Ay8sLXl5e8PPzg6enJ7y9veHr6wtPT094enrCw8MDHh4ecHNzk+iV0UjT1taGqqoqVFZWoqqqChUVFTAYDCgvL0d5eTlKSkpQUVGBsrIylJSUWLSVAODm5gY/Pz+L3nid/9cGBQVxPjgiosHHMImIaCC0trbCYDDgxo0buHHjhkVocPXqVVy5ckWcz8bMxcUFvr6+8PLygqenp7gz5+XlJS53d3eHWq2GWq3madolVFVVBaPRKO74lJeXo6ysTDxSXlpairKyMvG2zv9alUqlxc7OnSEjd3xoqNTX14s77eYd+M477ebrpaWlXXbgbW1t4e7uLl48PDzuet3V1RVKpRKurq5wcnKS6BXTYKqurkZdXR3q6upQW1uL0tJS1NbWim2lOSwyXzdfzL0uO/Pw8IC3t3eX/4XdhZz8X0hENCwwTCIiGgwGgwE7duzAtm3bkJWVBTs7O8ybNw9z585FdHS0GDqYd+DuPBpbWVnZZZ3Ozs5isGS+dA6b1Go1XFxc4OTkBLVaDScnJzg7O1vs0I22nbq2tjZxR6exsRGNjY0wGo3i9draWlRXV8NoNFpczOGR+XInJycnMfQz7+j4+Ph0ue7n5weVSiXBKye6Pw0NDaioqBADgM6hgPl6d4GBuYdmZ7a2tnB1dYWbmxuUSqV4MS8zB09KpVJss+RyOdRqNRQKBVxcXODo6AgHBwcolUooFAr2lOoDczvY1NQEk8mEuro6tLW1wWg0orW1FfX19eJtdwZEdXV1qK6uFq+bL3ceHDGTyWRwcnKCp6cnAgMD8cADD1gEjeawsXMA6enpCTs7uyHeKkREdJ8YJhERDZTr169jx44d0Ol0yM7OhoODA2bPng2tVoulS5dCqVT2el2tra0oLy/vMdzoaXl9fb3FvBHdMQdNTk5OcHV1BXB72IB5J8De3h5yuVys19XVFba2tnBwcLAYmmfeQeyOTCbrcWfPvNPSHZPJZDEUp729XTyKbd4Bam5uRmNjIwRBECeirq+vR2trK0wmExobG1FdXY2GhgZxstXumF+jm5tbl5Cuu6DOvMzT05M9iYh6UF1djaqqqm7Dh85BhfliNBotwouGhgbx7/lezEGTud0yt1Wd2x8bGxsx0O3cZnVu48zruZO5XezJ3dpAAOjo6OgxdDFraWnp0gsMgBhid27nOq+vc9toDouAf7eh5m3YXRjeHfM2VKvVFoGfuY3s3NOscxDYORi8desWtm/fjm3btiEvLw++vr5YtmwZHn/8ccTFxXG4LhHRyMIwiYjofly5cgW7du2CTqfD8ePH4ebmhoSEBGg0GixatAjOzs6S1GU0GtHQ0IDGxkaLnbTOQYt5p627UKbzDk51dTUEQUBjYyOam5vF57gz+Omspx0kwHIn7k537px13il0dnaGnZ2dxY6feWfP3GvBzs4Ozs7OcHNzg7OzsxiYmXs8dO61xaESRMNbdz1namtr0draipqaGrGdMQfH5raqc9Bifjxg2S6ZQ2mg+7bsbm2Y2d2CcTNzL6u76S60MgdjwO051cwndTDft6fAzNwGmttLNzc3yOVyuLq6igcEOvfu6ilIu19FRUXQ6/XQ6XQ4duwYPDw8sGjRImi1WsyfP589kYiIrB/DJCKivsrJyYFOp0N6ejpOnTrFL8m9VFJSAj8/P2RmZiIuLk7qcoiI7tupU6cQHR2Ny5cvY/z48VKXMyxdvXoVaWlpXQ66aLVazJs3j8E+EZF1YphERNQb5gDp888/R35+PgICArBo0SIkJCRg4cKF9zzyTLeHaNjb2+Ojjz7CE088IXU5RET3Ta/XIzExEfX19ZL1RLUm165dw86dO8VgSaVS4bHHHkNCQgIef/xxbkMiIuuRbSN1BUREw1FHRwdOnTqFTZs2ITQ0FJGRkfjwww8xb948HDlyBNevX8f7778PjUbDIKmXbGxs4OXlhZKSEqlLISIaECUlJVCpVAxBemnMmDFYv349jh49imvXrmHTpk0wGo1Yu3YtPD09odFosHXrVnEOKCIiGr4YJhER/Z/29nYcPXoU69evR2BgIKKjo/HRRx9h0aJFOHLkCK5cuYLk5GTMnDnzrpOyUs98fX0ZJhHRiGEwGODr6yt1GVYpMDAQ69evR0ZGBkpKSvDee+8BAJ577jl4eXmJwZJ5/isiIhpeOMyNiEa19vZ2ZGdni0PYysrKEB4eDq1WC41Gg6ioKKlLHFESExPh6uqKjz/+WOpSiIju24svvoiCggIcPHhQ6lJGjMrKSuzevRs6nQ779++HjY0N5s6dC41Gg6VLl8LT01PqEomIiHMmEdFoZDKZkJGRAZ1Oh127dqGmpkYMkJ588klMmDBB6hJHrJdeegmXL1/mjhcRjQgajQZubm746KOPpC5lRDIajeJZ4TIyMtDW1oaYmBhotVo88cQT8Pb2lrpEIqLRinMmEdHo0NjYCL1ejzVr1sDLywtLlixBUVERfvGLX6CgoAA5OTnYtGkTg6RB5uvrC4PBIHUZREQDoqSkhMPcBpFarcaaNWug1+tRVVWFHTt2IDg4GK+99hr8/f0xc+ZMJCcnc/g0EZEEGCYR0YhlNBqxdetWrFixAl5eXli6dCmKiorw29/+FsXFxTh69Ch+/vOfIyQkROpSRw2GSUQ0knDOpKHj5OQkzqNUUVEhBku//OUvERAQIAZLN2/elLpUIqJRgcPciGhEuXOuBZlMhtjYWCQkJODJJ5+El5eX1CWOaunp6dBoNKirq4OLi4vU5RAR9Vt7ezvs7e2RmpqKlStXSl3OqNV56HpaWhrq6+sxdepUJCQkYPXq1Rg/frzUJRIRjUScM4mIrF9xcTH27NkDvV6Pffv2QaFQYM6cOdBqtUhKSoJKpZK6RPo/p06dQnR0NC5fvswv+ERk1QwGA/z9/ZGVlYXY2FipyyH8O1hKT0/Hjh07UFFRIc6J+NRTT+HBBx+UukQiopGCYRIRWadr165h586d0Ol0OH78OBwdHTF79mxotVosW7aMvV6GqZKSEvj5+SEzMxNxcXFSl0NE1G8Mx4e3u52tdeXKlQgLC5O6RCIia8YwiYisR1FRkXhWl+PHj8PNzQ0JCQnQarWYN28e7O3tpS6R7oHDQohopNDr9UhMTER9fT2cnZ2lLofuonOwpNPpUFJSIgZLGo0GUVFRUpdIRGRteDY3IhrezGdZi4iIQEhICH73u98hODgYaWlpKCsrw9atW6HRaBgkWQlbW1t4e3tzEm4isnolJSVQqVQMkqyAra2tOEF3cXExjhw5grlz5+J//ud/EB0djZCQEKxfvx5Hjx4Fj7MTEfWOXOoCiIjulJOTA51Oh88++wwXL15EYGAgli5diuTkZMTHx0MuZ9NlzXx9fXkaZyKyegaDAX5+flKXQX1kY2ODmTNnYubMmfjTn/6EM2fOQK/XIzU1FZs3b8bYsWORmJgIrVaLGTNmQCaTSV0yEdGwxGFuRCS5jo4OHD9+HOnp6fjiiy9QWFjIL3MjWGJiIlxdXfHxxx9LXQoRUb+9+OKLKCgowMGDB6UuhQaI+WDWp59+ikuXLiEoKAhLliyBVqvFI488AhsbDuogIvo/2Ty8T0SS6G7+guDgYHEOpJkzZ0pdIg0SX19fFBQUSF0GEdF9Yc+kkSciIgIRERHYtGmTGCz985//xObNm+Hp6YkFCxZAq9Vi4cKF7CVNRKMeW0EiGjLNzc04cuQI9Ho9PvvsM5SXlyM8PBwvvPACVqxYgfDwcKlLpCHg6+uLrKwsqcsgIrov5kmcaWTqLlhKT09HYmIiPDw8sGjRImi1WixYsAAKhULqcomIhhzDJCIaVE1NTThw4AB0Oh127dqFmpoahIeH4wc/+AGeeuopPPjgg1KXSEPMz8+PcyYRkdUzGAzw9fWVugwaAp2DpStXrmDXrl3Q6XRISkqCWq3G4sWLodVqMX/+fNjZ2UldLhHRkOCcSUQ04BobG3Hw4EHodDrs2LEDjY2NmD59OrRaLZYvXw5/f3+pSyQJpaenQ6PRoK6uDi4uLlKXQ0TUZ+3t7bC3t0dqaipWrlwpdTkkkWvXrmHnzp3Q6XQ4fvw4VCoVNBoNNBoNFi1axDP9EdFIls0wiYgGRFVVFdLT06HT6ZCRkYG2tjbExMRAq9Vi5cqV8PHxkbpEGiZOnTqF6OhoXL58GePHj5e6HCKiPjMYDPD390dWVhZiY2OlLoeGgevXr2PHjh3Q6XTIzs6Gg4MDZs+eDa1Wi2XLlvHgCRGNNAyTiKj/bt26hT179kCn0+HLL7+Era0t5s6dC41GgyVLlsDLy0vqEmkYKikpgZ+fHzIzMxEXFyd1OUREfcZQnO6moqICe/fuhU6nw759+6BQKDBnzhxotVosXboUSqVS6hKJiO4XwyQi6psbN25g+/btSE9Px+HDhy2+IC1ZsgSurq5Sl0jDHIeHEJG10+v1SExMRH19PYcy0V1VVlZi9+7dXQ68abVaJCUlQaVSSV0iEVF/ZNtIXQERDX9Xr15FcnIyZs6ciTFjxmDTpk1Qq9X43//9X5SXl0Ov12PNmjUMkqhXbG1t4e3tDYPBIHUpRET9YjAYoFKpGCTRPXl4eGDNmjXQ6/UoLS3F+++/DwB4/vnn4e3tjcceewzJyckoLy+XuFIior5hmERE3SoqKhIDpHHjxuE3v/kNgoODkZaWhrKyMvzzn//EmjVrOAcA9Yuvry/P6EZEVss8XJeoL9zd3cVgqaysDFu2bIFarcZrr70GPz8/zJw5E8nJySgtLZW6VCKie+IwNyIS5eTkQKfT4Z///Cfy8vLwwAMPYOHChdBqtViwYAEUCoXUJdIIkZiYCFdXV3z88cdSl0JE1GcvvvgiCgsLceDAAalLoRHgzrPgNjU1iScx0Wq1DC6JaDjinElEo505QPr0009x6dIlBAUFYcmSJdBoNHj00Udha2srdYk0Ar344osoKCjAwYMHpS6FiKjPNBoN3Nzc8NFHH0ldCo0wTU1NOHDgAHQ6HXbu3ImGhgZMnz4dWq0Wjz/+OAICAqQukYgI4JxJRKNPR0cHjh49ivXr1yMgIACRkZHYunUrFixYgCNHjojzI82dO5dBEg0aX19fzplERFbLYDCwtwgNCkdHR2g0GmzduhXl5eXYuXMngoOD8etf/xqBgYGIiIjApk2bcPnyZalLJaJRTi51AUQ0+Nrb25GdnS0OYSstLUV4eDhWr16NhIQEzJw5U+oSaZTx8/PjnElEZLVKSkrg6+srdRk0wjk4OECj0UCj0aC5uRlHjhyBXq/Hu+++izfeeAPh4eHQarV48sknMWHCBKnLJaJRhsPciEYok8mEjIwMpKenY8eOHaioqBC/dDzxxBOYOHGi1CXSKJaeng6NRoO6ujpO4k5EVqW9vR329vZITU3FypUrpS6HRqGeDhJqtVqsWLEC4eHhUpdIRCMf50wiGkk6j7NPS0tDfX09pk6dioSEBKxatQqhoaFSl0gEADh16hSio6Nx+fJljB8/XupyiIh6zWAwwN/fH1lZWYiNjZW6HBrlOgdLX3zxBQwGA4KDg5GQkACtVsve50Q0WBgmEVm76upqZGRkQK/X8wwgZDXMp9XOzMxEXFyc1OUQEfXayZMnMW3aNBQUFCAkJETqcohEHR0dOH78ONLT0/HFF1+gsLAQ48aNg0ajgVarxYwZMyCTyaQuk4hGBoZJRNaoqqoK6enp0Ol02L9/P9rb28UAaeXKlfDx8ZG6RKK74jARIrJWer0eiYmJqK+vh7Ozs9TlEPXIfMbeTz75BJcvX8aYMWOQlJTEYImIBkI2J+AmshK3bt3Cnj17oNPp8OWXX8LW1hZz587F3/72NyQlJUGlUkldIlGv2drawtvbWzyjW1tbG8rLy8UzJLFHHRENB2VlZbh27Rr8/f3h7e0NuVwOg8EAlUrFIImGvYiICPHsb+Zg6bPPPsPmzZsRGBiIpUuXQqPRID4+HnI5dwuJqG/YM4loGLt+/Tp27NgBnU6H7OxsODg4YPbs2dBqtVi6dCmUSqXUJRL1ysWLF3Hp0iUYDAaUlJTAYDBg586dkMvlaGlpQVVVFcz/jo4cOcI5HohoWPj2228xdepUAIBMJoNarYa9vT2am5uxdOlS+Pv7w8fHB/7+/hg/fjwnPiarYA6WdDodcnNz8cADD2DhwoXQarVYsGABFAqF1CUS0fDHYW5Ew82VK1ewa9cu6HQ6HD9+HG5ubkhISIBGo8GiRYt4JJSsUkpKCn74wx9CLpfD1tYW7e3taGtr63I/Ozs71NbWwt7eXoIqiYgsdXR0QKVSob6+vsttd7Znv//97/Gzn/1MgiqJ+q+oqAh6vR46nQ7Hjh2Dh4cHFi1aBK1Wi/nz58POzk7qEoloeGKYRDQc5OTkID09HXq9nv/IaURqamqCv78/jEbjXe83Y8YMHD16dIiqIiK6t0WLFuHLL79ER0dHj/dxdnaGwWCAq6vrEFZGNLB6OqCp1Woxb948Hughos6ybaSugGi0ysnJwaZNmxAWFobIyEi88847CA4Oxq5du1BaWoqtW7dCo9EwSKIRwdHRET/96U/vOieDnZ0d5syZM4RVERHd26xZs2Bra9vj7QqFAuvWrWOQRFZv3LhxWL9+PY4ePYorV67g17/+NYqKipCUlAQfHx+sWLECW7duRUNDg9SlEtEwwJ5JREOko6MDZ86cgV6vR2pqKgoKCnhWDRpVampq4O/vf9cvoRkZGZg7d+4QVkVEdHfZ2dl45JFHerxdoVDg2rVr8PX1HcKqiIbOjRs3sH37dqSnp+Pw4cOws7PjHJ5ExGFuRIOpvb0d2dnZ0Ol0+OKLL2AwGBAcHCx2GWaARKPNK6+8gs2bN6O1tbXLbba2tqiuroaLi4sElRERda+1tRWurq4wmUxdbrOzs8P3v/99vPfeexJURjT07jy7sFwux5w5c6DVarFkyRL20CMaPRgmEQ20zgHS559/jrKyMoSHh0Or1UKj0SAqKkrqEokkc/PmTYwdO7bbybenTp2K06dPS1AVEdHdzZo1C0eOHMGdX5ttbGyQn5+P0NBQiSojkk5lZSV2794NnU6H/fv3w8bGBnPnzoVGo8HSpUvh6enZr/UajUao1eoBrpaIBhjnTCIaCCaTCXq9HmvWrIGHhwdiY2Nx4MABvPTSS8jPzxfnR2KQRKOdv78/vve973U57bCdnR2HtxHRsPXoo492abcUCgWWLVvGIIlGLQ8PD6xZswZ6vR6lpaV4//33AQDr1q2Dr68vZs6cieTkZJSVlfVpvT/+8Y+xZs0aNDY2DkbZRDRA2DOJRr1Tp07hzTffxLZt2/r0uMbGRhw8eBA6nQ47d+5EQ0MDpk+fDo1Gg8cffxzjx48fpIqJrNvFixcRFhZmcYRfJpMhLS0NGo1GwsqIiLp36NChbk8QcPLkSR4oIrpDdXU1MjIyoNfrsX37dphMJsTExECr1WLFihV3nV+stbUVHh4eqKurw8SJE7Fz505MmDBhCKsnol7iMDca3f7yl7/gxz/+Mdra2lBYWIjg4OC73t9oNEKv1yM9PR179uyx+Oeo1Wrh5+c3RJUTWbfExETs27dPnDtJJpPh/7N35mFRXFn//zbQ7HSzySI7oiCgSBAQdzAuiRoTjCRPxixjXGKiGSeJSd5ksk1mJjOTbSbR7NubvJNFX9GMiZm44caiCIIiu7I3O/QGDTTN/f3hr+rthkYWabppzud56oGuqq57Cm6d+t5z7z23paUFrq6uRraMIAhiICqVCiKRiJ+ia2VlhUWLFuHkyZNGtowgTBuVSoXjx48P6HzdsGED7r33Xvj4+Oic/5///Ad33HEHgBvPmVAoxJdffon77rvPGOYTBDE4FEwiJicKhQKbNm3CgQMHwBiDUCjEn//8Z+zevXvAuf3ngwsEAixatAhr1qzB/fffD09PTyPcAUFMbC5cuID4+Hj+88yZM1FYWGhEiwiCIG5OXFwcsrOz+c/Hjx/XO1qJIAj9aAeWfvzxRyiVSkRHR2PNmjXYuHEjQkJCsHnzZnz99dcDFurYsmUL9uzZA2trayNZTxBEPyiYREw+ioqKsG7dOlRWVuqMioiOjkZOTg4AoLa2FkeOHMHhw4fxn//8B0KhkF+pYt26dRCLxca8BYIwCxYuXIjz58/DwsICW7duxfvvv29skwiCIAbl+eefx7vvvove3l7MmjULeXl5xjaJICYsXV1d+PXXX3HgwAEcPnwYMpkMsbGxKCkpgUwmG3C+lZUVIiIicPDgQQQFBRnBYoIg+kEJuInJxddff43o6GhUVFTo9HgwxnDp0iW8+OKLSEhIgL+/P3bv3g2RSIQffvgBLS0tfIJtCiQRxNjw4osvore3F2q1GosWLTK2OQRBEDdl8eLF6OnpAWMML774orHNIYgJja2tLdatW4evv/4ajY2N+OmnnzBlyhS9gSQA6O3tRWFhIaKjo/HLL7+Ms7UEQejDytgGEEMjl8uh0WigVCqhVquhUqnQ1dUFAOjp6UFHR4fe72mf1x8LC4tBgyJCoRCOjo4DznN2doZAIICTkxOsrCZW1enq6sLOnTvx2WefQSAQDFjaFwAsLS3xxRdf4I477sAf/vAH3H777bCxsTGCtQRhmmg0GsjlcgC6vqe/r7mZX9I+R6lUwtfXF7W1tZBKpdi/f/+A8+zt7Yd8DvufY2NjA3t7+wHHJqLvIgji1ujq6oJKpYJarYZSqdTxY8CNXIj66H8ecGPhDYFAAHd3dzg6OuL48eN6v8vpJQAQiUSwtLSEg4MDrK2tYWdnB1tb2zG6O4IwD6ytrXHnnXfip59+grW1NXp6evSep1aroVAosHr1ajz77LP485//DEtLy3G2dmRwPggAOjo6+Hvj2ncc2scGYzjnALo+aDBcXFx0PnO+SvuYpaUlRCLRkOURkxea5mYApFIpWlpa0NraCplMxm9KpRIKhQJKpRJSqRQKhYL/rFAo0N7ejr6+Pj4iP5jAMRU4YWRraws7Ozs4ODjA0dERTk5OEIvFEIlEcHJy4vc5Ozvzn52dneHm5gZXV1e4ubkNWG53LCktLcXdd9+NsrIyPnGmPgQCAebNm4eMjAyD2UIQhqCzsxNyuZzfpFIpLzikUikfuOns7ER3d/eQ+wBdkWPqvmg0cEJLO2Du6OgIoVAIFxcXWFtb8z5tOPs4nycSiSAWi/lgFkEQI6OrqwttbW1obW1Fa2srpFIpr5PkcjlkMpmOdpLJZJDL5VAoFOju7uY73jjfZqpwQW8rKys4OTnBxsYGjo6OEIvFEIvFvHbiNJNIJNLRWG5ubvxGwSnCHOjr64OnpydaWlqGdb6lpSUSEhKwf/9+eHl5jbg8bf8hl8uhVCohl8vR09MDuVzOd5Tp2yeTyaBWq3X2abfhuOC1OcHpHQB8UJzTUFxb0MnJCdbW1kPuE4lE/E+RSAQXFxedYBYxYaCcScOhubkZjY2NkEgkaGhoQGNjI5qbm3mh03/TjjJzcMKA21xcXHSEAtcAsbCw4KPB3EPFNVy4HnbtXneBQABnZ2e9dnMCRR/d3d3o7OzUe0x7lEFvby8UCgUYY5BKpQBuBMsYY1AoFOjt7eUbrZy445yxtuDTDqDpC+iIRCK4u7vD3d1dRyC5urrCw8MDU6dOhaenJ3x8fODh4THs5HsHDx7EQw89hO7u7gGJ/PQhEAhQV1d30yVLCWKs6e7u5v2HB4MHfgAAIABJREFUdiOqra0NUqlUJ1CkHTDijt0sSOri4sKPNuR8iLOzM4RCIZycnHhBIBaLIRQK+R4ozu8A4H2Ttr/R9i/aPkm73KFwcXGBRqPBm2++ieeff17vOcMJZPU/R7sRqe1zON81mOBTKBTo6emBTCbjfaRSqdQJynV0dPA+72a2WVlZQSQSwdnZWSfQpB1wcnZ2hrOzs47f4wLs1DgkzIWuri40NDRAIpGgsbERdXV1fIcbt7W0tPD79I1q1Bdo0dZTnJays7Pj/RzXaOH8H9fD3l83afu6/nC+T5s33ngDu3btGnTkN6ebOAbTTJzW4vxKV1cX38moHUBTKpV8g1epVOot18HBgfchnJbifIm7uzumTp0KLy8vTJ06Fd7e3uRfCJPk7NmzWLx48Yi+IxAI4OLigpdffhleXl46Hfna+kk7aMQdG6wJzOkbTh+JRCJYW1tDJBLpBEOEQiHEYrGOBtLXUaU940N7ZGJ/36N93mAM55zhBLL0jSAfSiNptw+5oD03glNf4I0bkaVPWw0G1ybW3rhAE6eltIPpnJ/jfifGnckdTFKr1aipqUFlZSWqqqpQU1ODhoYG1NXVoampCbW1tWhqatIZTmhrawsPDw94eHjoBD36b1OmTIGbmxsvfIj/o6urC1KpdEAQjhOT2o3p1tZWNDY2Dmi0cf8DHx8feHl5wdvbG97e3ggKCkJgYCC8vLzw2muvYe/evYNOa9OHpaUl9u7di23bthni1olJgkKh4P1IfX09GhoadAJE/RtS+hpPzs7OcHV15XuktYMQ2sGIwY7drIFkavT29k7Y6Wec0NIWqtpbe3v7TY9xW38cHBx0RFL/QLunpyemTp3KB9tpGDphDNrb21FZWcnrKK7TTSKR8L6vra1N5zseHh4D6rO+ziRu44LfpoKx/ZVarYZMJtPbmakdlNPe19jYqHMNZ2dnnQCTp6cnfH194e/vj8DAQAQGBlLDjBh3tm3bhk8++WTU3xcIBLzP0NZI/Tt0xGIxH6DQ3riAdf8AMjH2KBQKqFQqXh+1t7fr6CNt3aR9jAsUtra2DgisW1hYDBiQoP27t7c3PDw84O3tDS8vL3h4eExY7WlCmHcwiTGGmpoalJWVoaqqihc83CaRSPhRRHZ2dggICICHhwd8fX11AhXcC9fb23tYve3E2KPds6kv4FdbW4v6+no0NzcPeg1uZAXXY6BvLnFPTw+SkpIGzYNATG6amppQU1PD97BLJBI0NTXxnxsaGlBfX8/PjQduBCj7B59dXV35gHP/lx33Ow31nTz09fXpNP76B9S5BqF2MLKpqUlnFKydnR3/nuLeX9qiydvbG35+fvD09DTinRITDZVKhdLSUly/fh1VVVWoqKjQCR5pJ8rlOnW0gxT9gxUjGVlMjB1qtVpnhL2+oF9dXR0aGhr4zjcnJyc+sBQUFISAgAAEBgYiODgYM2bMoKm8xLBgjKGhoQHV1dW8RuJmeXAaitP02tNSLS0tdQI+7u7ufJDI09OT72zj3nkuLi7w8vLip2ER5k9HR4eOLtI3IEH7eENDg07nrUAg4AcncO+p/jrKx8cHfn5+lEN3cMwjmNTd3Y3y8nIUFhbi+vXruHr1KgoLC1FaWsoPNbaxsYGPjw+Cg4P5jRM9wcHBCAwMpEi0GdDd3Y0TJ06goKAA9fX1qK6uRktLC9rb29HQ0ICWlhYdoeTp6cn3RLi4uMDW1haurq547733qDE/yeju7kZdXR0vrq9fv47r16/zn7X9CXBjlKKLiws/baD/T+6Yv78/9XwQBqG9vR0SiQTt7e2or6/n66r2T873cX7P2toavr6+Ou8/7d9DQkJoNO0kpL29nddO2jqqqqqKD1q6uLgMqqFCQ0OHnHpBmD49PT2ora3Vefdx70IuoKhdH8LDwxEREYHg4GD+d9LTk4uuri5IJBK9dUYikaCqqkqnAW9raztAJ+nTUJ6enqTDiTGHy8mnTytp76upqdFJj8K9/wbTTgEBAZO1vk6sYJJGo0FJSQny8/ORn5+PvLw8FBQUoK6uDsANkRwcHIywsDDMmDEDoaGhCA0NxYwZMzBlyhQjW0+YAiqVCmVlZSgtLUVpaSlKSkpQXFyM0tJSPieUk5MTwsLCMGfOHMyZMwdRUVGYPXv2oPmniIlDQ0MDysvLB2yVlZVobW3lz3NwcEBAQAD8/Pz4Tfuzj48P9coSEwaVSoW6ujrU1NSgpqaGn9ZdU1OD6upqVFdX6+RXcHV1RWBgIEJCQvht2rRpmD59OuWTm+DI5XIdDZWXl4fi4mK+sefq6orQ0FBeR82YMQNhYWEIDg6mPDsEuru7UVFRgeLiYpSUlKC0tJT/nXuH2tvb8xoqKiqK3wbL70mYPnV1dXq1U1VVlc40bZFIBD8/PwQGBsLX1xd+fn7w9/eHv78//Pz8MHXqVPIjxISgr6+Pn41QW1uL6upqXjvV1taiqqpKp6POxsYGfn5+mDZtGq+bpk+fjpCQEAQFBZnziFzTDSZ1d3cjNzcXubm5OoEjlUoFoVCI8PBwREVFYdasWZg5cyZCQ0MRGBhIIwCIUdPU1MQHlgoKCnjB3d7eDoFAgODgYF4cRUdHIz4+noKUJgjXw15SUjJA+HANZltbW52GclBQEC94fH19KVcEMemQSqU6gaaKigqdZ4ebuung4KDz7ISEhGDGjBmIjIyk58bEaGpqwvnz5/mgUV5eHioqKsAYg6urK99hEh4ejrCwMISGhsLd3d3YZhMTlNbWVr6DrrCwkK9zXJApKCgIUVFRfL2Lj48f1QpchGFoa2vDlStXUFpaOkA7cQmT+/v/wMBAnc42GtVKTCa4kZxccKmqqgrXrl1DeXk5ysrK+Fx1lpaW8Pf313l2pk+fjvDwcAQFBU30kZymE0yqr6/HxYsXkZOTg/T0dKSnp0OlUkEsFiMyMhIREREIDw9HTEwMYmJiYGdnZ2yTiUmCRCJBTk4OCgsLcfXqVeTk5KC4uBh9fX3w9vbGwoULsWDBAsTExCAuLs6co88mBTe9Vft/U1hYyDeWtKe2ag/Fp2mtBDFy2tvb+akL2tOhysrKIJfLAehOe+F+RkVFUdB9HNBoNCguLuY11Llz51BUVATGGLy9vXntxP1vwsPD9eYNJIixRiKR6Ogn0lDGRS6Xo6ysjPfjg2mn/rqJtBNBjAwufYa2ZuK2yspK9PX1wdraGiEhITpxjoiICAQFBU2Ud7TxgkkVFRU4duwYTp48iYyMDNTU1MDS0hKRkZGYP38+5s2bh4SEBEyfPt0Y5hHETZFKpcjMzERWVhYyMzNx/vx5yOVyODo6Ii4uDosWLcKKFSsQFxdHo+XGgLq6OmRnZyM7Oxv5+fm4evUqqqqqwBiDvb09Zs6cyQedIyMjER4ejoCAAGObTRCTgpqaGhQWFuLKlSsoLCxEQUEBCgsL+alTAQEB/Gji2NhYxMbGws/Pz8hWT2w0Gg0uXLiAo0eP4syZM7hw4QKUSiVEIhHi4+ORkJCAhIQEzJs3j6YXESaHXC7n9ROnpWQyGRwcHBAbG4vFixdjxYoViI+PJw11C9TW1vLaKS8vj8+DBtwYZRQeHs5rplmzZiE8PJx8M0GMAwqFYoBu4vL9AoBYLObbNHPnzkVcXBwiIiJM0R+OXzBJoVAgLS0NR48exdGjR1FWVgYHBwcsXrwY8+fPx/z58xEbG0t5aYgJiUajQWFhITIyMpCZmYm0tDRUV1dDLBZj2bJlWL58OVasWIHg4GBjm2rytLe38+KH2yQSCSwsLBAaGoo5c+bwoicyMtIchogShNnBGENFRQWuXr2Kq1evoqCgAJcuXeJHJHh5efGBJW5zc3MzttkmTWVlJa+hTpw4AalUCj8/PyQmJvI6Kjw8fLImASUmMH19fSgsLERmZiYyMjKQlpaGqqoqiMViJCUlYcWKFaShhqCtrW2Adqqvr4eFhQXCwsIQHR3Nd7pNsJEPBDFpaGtr4zvkrly5gitXriA3NxcdHR2wt7dHdHS0jm4KCQkx9nNs2GBSXV0dDhw4gNTUVGRkZECj0SA6OppvWM+fP5+W2iPMluLiYhw7dgxHjx7FqVOnoFQqERISgrvuugsbNmxAfHy8sR2ASVBVVYW0tDSkpaUhIyMD5eXlAG6MZtB2mDExMRCJREa2liCIW0GhUCA3N1enwVNRUQEACA4Oxvz585GYmIilS5dSwxFAdnY29u3bh3//+98oLS2Fg4MDli5dyuuomTNnGttEgjAIpaWlfPA0LS1NR0OlpKQgLi5uUmuowbRTYGDgAO1EHfUEMXHhBixo66bLly9DrVbDxcUF8fHxWLJkCRITExETEzPeo5fGPpgkkUhw4MAB7Nu3DxkZGXB0dMRdd92F1atXY9myZZQ7gZiUqNVqZGRk4Ndff0VqaipKSkrg7++PDRs2YMOGDZNKFEkkEpw8eRJpaWk4deoUrl+/Djs7OyQkJGDRokW8APLw8DC2qQRBjAMtLS28QDp79iwyMjLQ2dmJgIAAJCYm8ttkmX6Rk5ODffv2Yf/+/aioqMC0adNw7733YuXKlViwYAHllCEmHdoa6sCBAygtLUVAQAA2bNiAlJQUxMbGGttEgyORSPjgUVpamo52Wrx4Ma+dqJ1FEOZPd3c38vLykJ2dzc+Iqa+vh0gkwuLFi3ndFBUVZejZG2MTTFKr1Th48CA+/PBDnDlzBo6Ojli7di1SUlKwYsUKWgaSIPqRn5/PNxbKysoQEBCATZs2YevWrWa3uklfXx8yMzORmpqKn376CaWlpbC2tkZ8fDySkpKwdOlSzJs3j/wEQRAAbqyQcv78eT7onJWVhe7uboSEhGD16tVITk7GwoULzWp6a0tLCz777DN89tlnuHbtGoKCgpCSkoKUlBTcdtttxjaPIEwKTkPt27cP5eXlCAoKwqOPPootW7aYTUdUX18fzp8/z2un4uJiWFtbIy4uDklJSUhMTCTtRBAET1FRER9sPnXqFFpaWuDq6orbb78dycnJuPPOOw0xSvHWgkmNjY345JNP8NFHH6GxsRFr167Fww8/jFWrVpFzI4hhcunSJXz33Xf48ssvIZfLce+992Lnzp2YN2+esU0bNb29vTh9+jQOHDiAQ4cOob6+HqGhobj77ruxbNkyLFiwAPb29sY2kyCICYBKpUJGRgZOnjyJQ4cOobCwEJ6enrj77ruRnJyMxMRECIVCY5s5Ki5duoT3338f3333HWxtbfHII4/ggQcemBQjLQhiLMjNzcW3336LL7/8Eh0dHUhJScHOnTsn5DOk0Whw5swZpKam4uDBg6irq8P06dNxzz338NrJwcHB2GYSBGHiMMZw5coVpKWl4aeffsKpU6dgZWWFFStWIDk5GWvXroWrq+tYFDW6YFJlZSVeeeUVfP/993BycsLmzZuxfft2Wj2JIG6Brq4ufPfdd9izZw9yc3MRExODV155BWvXrjW2acMmMzMTX3zxBQ4ePIjW1lbMmTMHycnJSE5ORkREhLHNIwjCDCguLkZqaipSU1ORk5MDFxcXrFu3Do8++igWLlxobPOGxcmTJ/HKK6/g3LlziIyMxI4dO7Bx40ZqKBLEKFGpVPjXv/6FPXv2ID8/H/Hx8XjttdewcuVKY5s2JBcuXMAXX3yB1NRUNDc3Y9asWVi/fj2Sk5Mxa9YsY5tHEMQEp7W1Ff/+97+RmpqKY8eOoa+vD4mJiXj44YeRnJx8K4OAMsFGQHt7O3v22WeZra0tmz59Ovv8889ZZ2fnSC4xLhw8eJAB4DeVSmVskwhiRGRkZLDk5GQmEAhYUlISy8nJMbZJg6JUKtn777/PIiIiGAAWFRXF/v73v7Nr164Z2zSz5M033+R9m4+Pj7HNIQijUlFRwd555x0WExPDALCwsDD2j3/8gykUCmObppfCwkK2Zs0aBoDdcccd7OTJk8Y2SS+ko4jRYCrvpzNnzrC77rqLAWArV65kly9fNpotg9HZ2ck+/PBDNnv2bAaARUREsL/+9a+stLTU2KaZJaZSN4nJgSnXN5lMxr799lt29913M6FQyFxdXdmuXbvY9evXR3O5jGEFk/r6+tjevXuZu7s7c3d3Z++99x7r6ekZTYHjyrp160gEjSMKhYKFhISw1atXG9sUsyE9PZ0lJCQwCwsL9tBDD7GmpiZjm8TT3t7OXnrpJebm5sbs7e3Z1q1bWXZ2trHNmjRERUUZ9AVFzzMx0cjNzWXbt29njo6OzMXFhb3wwgustbXV2GYxxhiTSqVs+/btzMrKikVFRbFjx44Z26RhQTpqfDEXv2vo99NwOXXqFJs7dy6ztLRkmzdvZm1tbcY2iSkUCvb6668zDw8PZmtryzZt2sQyMzONbdakgbQTMZ6Yii8cjPr6evbGG2+wgIAAZmVlxe677z5WUFAwkktkDJm9srGxEXfccQd27dqFTZs2oaysDDt37pyw+QmIW8PR0XHQaQSMMfT19aGvr8/otpgL8+fPR3p6Or777jucPn0aUVFROH78uFFt6u3txT/+8Q+EhITggw8+wM6dO1FVVYWPP/4Yc+fONaptxMgwpefZmJiTLzGnexkp0dHR+OCDD1BVVYWnn34an376KUJCQvDmm29CrVYbza7MzEzMmTMHqamp+OSTT5Cbm4vbb7/daPYQxoX87vixZMkSnD9/Hl999RWOHDmCqKgonD171ii29PX14cMPP0RISAjefvttbNmyBZWVlfj8888ndI7MyQg9wzeYzHrDXPDy8sLzzz+P8vJy/Pd//zeKi4sRFRWFzZs3o6GhYVjXuGkwqaSkBAkJCSgvL8e5c+fwt7/9Dc7OzmNiPGF+ODk54dq1azhy5IixTTErBAIBUlJSkJ+fj6VLl2LVqlX4+OOPjWJLYWEh5s+fjxdeeAFbtmxBeXk5XnnlFbi7uxvFHsJw0PNMTFRcXV3x4osvory8HE888QReffVVxMXF4fLly+Nuy//+7/8iMTER4eHhuHz5Mn7729+a1Sp0xNhCfnfssbCwwMaNG3H58mXExMTg9ttvx7/+9a9xtaG8vByLFy/Grl278MADD6C8vBx/+tOf4OnpOa52EIaHnmFiImJlZYUHHngAubm5+Oqrr3Ds2DFERETgu+++G/K7gyqayspKLF26FJ6ensjKykJcXNyYGk0QxMgQi8X49ttv8corr2D79u345JNPxrX8X375BfPmzYOFhQVyc3PxxhtvUHCZIAiTRSQS4fXXX0dBQQGcnZ0RFxeHb7/9dtzKP3ToEO6//35s3boVhw8fNpslywliIuLm5obU1FT87ne/w4MPPojvv/9+XMo9ceIE5s6dC5lMhqysLLzzzjtwc3Mbl7IJgiBGAhd8Ly4uxpYtW7Bx40Zs27YNvb29g39J3+S3np4eNmvWLBYdHc3kcvmtT8gbQ7q6uthLL73EQkNDmZ2dHXNxcWFr1qxhP/74I+vt7dU5l5vrX1FRwVJSUphYLGaurq5s9erVrLy8XOdctVrNvv/+e3b77bczT09PZmtryyIjI9k//vEPptFo+PP6J6UsLi5mGzZsYK6urvy+5557Tifp1oULF1hSUhJzdHRkdnZ2bOnSpezcuXMD7q2pqYnt3LmTBQQEMKFQyNzd3dk999zDLl26NOK/03DsbG5uHvZ9aycS094sLS31ltc/v0JLSwv7/e9/z4KDg5lQKGTOzs5s1apVo0o+OlJb9N37p59+qnPOcOqIKfHaa68xKysrlpGRMS7l7d+/n1lYWLBt27YxtVo9LmWOJdr1z9ramvn4+LBly5axL7/8kl9E4PXXX+frw4IFC/jv/vLLL/x+Nzc3fn//elZZWclSUlKYo6Mjc3V1ZRs3bmRtbW2soqKCrVmzhjk6OjIvLy+2efNmHb860nI59M3DNuTz3N7ePuD8119/nS9Xe//69ev5sozh14Zb7lB/h1utE+Ppe8gv3pze3l72u9/9jgkEAvavf/3L4OWVlJQwe3t79thjjxm8rJFCOmp4mKuOGo0vH+49cph6npCnnnqK2djYGDwx96+//sqEQiH7zW9+w7q6ugxaliEg7UTayZy1E/nCodm3bx+ztbVljzzyyGCn6E/A/dZbbzF7e/vRZvU2KJs3b2ZisZgdPXqUdXZ2soaGBvbMM88wACwtLU3nXE4ErVu3jmVkZDClUslOnDjBRCIRi42N1Tn38OHDDAD7y1/+wtra2lhzczN77733mIWFBXvmmWcG2MFde8mSJSwtLY11dHSwrKwsZmlpyT+QUVFRzMHBgSUkJPDlZ2dns9mzZzNra2t26tQp/noSiYQFBAQwT09P9vPPPzOFQsEKCgrYkiVLmK2t7aiDBkPZOdL7dnBw0HEMg5WnLYLq6+tZUFAQ8/T0ZIcPH2YymYyVlJTwq5V9+umno7q34dpys/+Rvjpy7NgxZmdnN6COmBorV65ks2fPZn19fQYtp7S0lDk4OLAdO3YYtBxDwdU/Ly8vdvjwYSaXy1lDQwP/snv33Xd1zh+sXsXExOgVJlwdSk5OZhcvXmRKpZJ9/fXXDLixWtO6devYpUuXmEKhYB999BEDwH7/+98PuM5Iy9X3ghqP53nVqlXMwsJC70s7ISGBffvtt/xnY/m1kZY71N9htHXCGL5nsvvFodi9ezeztbUdaYLJEbNq1SoWHR1tksF30lEjw1x11Eh8+Ujv0dQbUBqNhs2bN48tXrzYYGXU1dUxFxcX9uCDDxpcpxkC0k6knSaLdprMvnA4/PLLL8zS0pJ9+OGH+g4PDCb19fWxkJAQvQ+sKRAUFMTmz58/YP+MGTMGFUGHDx/W2f/AAw/oRGEZu1E5li5dOuC6GzduZEKhkMlkMr3XPnLkyKC2RkVFMQADosiXL19mwI0l1DkefvhhBmBAj2l9fT2zsbFhMTExg5ZzM4ayc6T3PRoH+sgjjzAA7LvvvtM5t6uri02dOpXZ2dmxhoaGkdzWiGy52f9osDpy7733DqgjpkZeXh4DwM6ePWvQch5++GEWHh5uko2i4cDVvx9++GHAsVWrVo2ZIPr555919kdERDAA7PTp0zr7g4KCWGho6IDrjJUgMvTzfPz4cQaAPf744zrnnjt3jvn7++vUE2P5tZGWayhBZAzfM9n94lBoNBoWExPDNmzYYLAyrl27xgQCwQCfYCqQjhoZ5qqjRuLLR3qPE6EBlZaWxgAYLLC8a9cu5u/vP2FXQiTtRNppqHLNRTtNdl84HJ555hnm7e2tz58NXM2tqakJ5eXluOuuu/ofMglWrVqFjIwMbN26FVlZWdBoNABuJAtfunSp3u/ExsbqfPbx8QEASCQSft+aNWuQlpY24LtRUVFQq9W4evWq3msPlUvKwcEBc+bM0dk3a9YsTJ06Ffn5+aivrwdwI7eChYUF1qxZo3Oul5cXIiIikJOTg9ra2puWdTMGs3O09z0SDh48CABYvXq1zn4bGxssW7YMKpUKv/766y2XMxjDyffVv474+fkB0K0jpkZUVBQCAgKQnp5u0HKOHDmCbdu2wcrKyqDlGAqu/t1xxx0Djv3yyy/YtWvXmJTTfyW7qVOn6t3v4+NjsHo1Hs/zsmXLEB0dja+++gqtra38/jfffBO7du3SqSfG8muGLvdW7dPGWL7HlG0zJBYWFnjsscfwyy+/gDFmkDIyMzNhbW2NFStWGOT6twrpqNFhbjpqJL58PO5xvFmyZAnEYrHBNNSRI0ewadMm2NraGuT6hoa0E2mnsS73Vu3TZiz1yWT3hcPhiSeeQH19PS5dujTg2IBgUnt7OwCYbHK4vXv34uuvv8b169exbNkyiEQirFq1ind6+hCLxTqfuZVUtJdtlMlkePnllzFr1iy4uLhAIBBAIBBg9+7dAIDOzk6913ZwcLipvYMlKOYScTY1NaG7uxsymQx9fX0Qi8V82dyWm5sLACgrK7tpWTdjMDtHe9/Dhbs3W1tbODk5DTjOrWQx3OUHR8NQ/yNgYB2xtrYGAJNf2tPd3R1tbW0Gu35vby/a2tr4l/tEY6j6N5aIRCKdzxYWFrC0tIS9vb3OfktLS4PVK0M/zxxPP/00Ojs78cEHHwAASktLcebMGWzevJk/x1h+bTzKvRX7+mMs32PKthkaHx8fKJVKKJVKg1y/vb0dzs7OJhuAJx01OsxRRw3HlwPj924ZTwQCAdzc3AymoRobG0k7DQPSTqSdhmNff8Zan0xmXzgcpk6dCoFAoPc9MyCY5OvrCwsLC5SUlIyLcSNFIBDgwQcfxPHjxyGVSnHo0CEwxpCcnIx33nln1Nddu3YtXn/9dWzZsgWlpaXo6+sDYwzvvvsuAIy6B7O1tVXvd5uamgDcEEM2Nja88FSr1WCM6d0SExNHfX+DMdL7FggEI7q+jY0NxGIxurq6oFAoBhxvbGwEcCPqPVJGaou5oVarce3aNQQGBhqsDCsrK0ybNg0XLlwwWBmGZKj6pw8LCwv09PQM2C+VSsfavDEv19DPM8d9990HPz8/7NmzB93d3Xj77bexZcsWHdFpLL82mnKH+jsYq06MhsnuF4fD+fPn4ePjY7BGkr+/P5qbmw0a6L8VSEeNLRNZRw3HlwOG+98aE6VSidraWoNpqLCwMNJOIO2kDWmnG5iidprMvnA4XLhwAYwxzJw5c8CxAcEkR0dHJCUl4YsvvhgX40aKs7MziouLAQBCoRDLly/HoUOHIBAI8PPPP4/qmhqNBunp6fDy8sKTTz6JKVOm8A+ISqW6JXu7urqQnZ2ts+/KlSuQSCSIioqCt7c3ACA5ORm9vb16h9v+7W9/g7+//82X5RsFo7lve3t7HccQGho65BL199xzDwAM+P90d3fjxIkTsLOzw8qVK0ds/2hsMScOHDgAuVw+YDjqWLN582Z8/PHHqKqqMmg5hoKrf0eOHBlwLDo6Gr///e919nl7e6Ourk5nX0NDA6qrqw1n5BjyWIFoAAAgAElEQVSUO17PM3AjyPi73/0OTU1NePvtt/H999/jySefHHCeMfzaaMod6u9grDoxGia7XxwKiUSCPXv2YMuWLQYrIykpCfb29vjqq68MVsatQDpq7JjoOmo4vtyQ/1tj8j//8z+wsLAY1d9tODz66KP45ptvUFRUZJDrGxrSTqSdhirXnLTTZPaFQ6HRaPDSSy9h4cKFCAsLG3iCviRLJ06cYAKBgO3fv3+4eZnGDbFYzJYsWcLy8/NZV1cXa2xsZK+++ioDwP70pz/pnKsvARpjjF9yVjuhY1JSEgPA/v73v7Pm5mbW2dnJTp48yfz9/RkAduzYsWFdW5uoqCgmFovZsmXLhlyFpLGxkU2bNo0FBwezI0eOMKlUylpbW9lHH33E7O3t9SbAGw5D2TnS+161ahUTi8WsurqaZWRkMCsrK1ZYWHjT8vqvQiKXy3VWIfnkk09GdW+jsWW4fx99dcSUaGlpYb6+vjdbqnHM6OjoYHPmzGGzZ8+ekIl3ufrn7e3NfvrpJyaXy1lNTQ3bvn078/T0ZFVVVTrn79ixgwFg77//PlMoFKy8vJylpKQwHx+fmyYM7F+HVq5cyS+Tqs2SJUuYg4PDgP0jLVdfUr/xeJ455HI5E4vFTCAQsIceemjAccaM59dGWu5Qf4exqhPDOedWfc9k9otD0dbWxubOncvCw8N1lpg2BC+88AITi8WssrLSoOWMBtJRI8OcdRRjw/PlI71HU086W1dXx9zc3Ay62FBPTw9bsGABmz59OqutrTVYOYaCtBNpp8mknRibnL5wKDQaDXv88ceZvb09y8nJ0XfKwNXcOLZv384cHBxYZmam4SwcBXl5eWzbtm1s5syZzN7enrm6urJ58+axTz/9lF96MzMzkwHQ2V588UXGGBuwf/Xq1Ywxxpqbm9m2bduYn58fEwqFzNPTkz3yyCPs+eef58+NiYnRe+1BYnJ8BSosLGQrV65kTk5OzM7Oji1ZsoSdO3duwPmtra3sqaeeYsHBwUwoFLIpU6awFStWDKiYw2G4dg73vjmKi4vZokWLmIODA/Pz82N79+5ljDF28ODBAWX95je/4b/X0tLCdu3axYKCgphQKGRisZitXLmSnThxYsT3NpQtw7n30dQRU0GpVLKFCxeywMBA1tLSMi5lVlZWsuDgYBYSEsKuXLkyLmWOJf3rn7e3N7v//vtZaWnpgHOlUinbvHkz8/b2ZnZ2dmzhwoUsOzubxcTE8HXiueeeG7QOZWdnD9j/xhtvsLNnzw7Y/8orr4y43DfffHPQujtezzPH7t27GQCWn58/6N/eGH5tpOUO9nfguJU6Md6+Z7L6xaEoLi5mYWFhzN/fX+/yv2NNZ2cni4qKYhEREePmp4cL6ajhMRl0FMdQvny493iz95Op0N7ezqKjo9nMmTOZQqEwaFkNDQ0sPDyc+fn5sYsXLxq0LENA2om002TRThyTyRcOhVwuZxs2bGA2NjYsNTV1sNMyBIzpn9zX29uL9evX48SJE/j+++8NPpXGHJkzZw5aWlrGJfM9MTloaGjAXXfdhcrKSpw+fVrv3FVD0dTUhPXr1yM7OxuvvvoqnnrqKT7hHUEQhCnS29uLf/7zn3jppZcwa9YsHDp0iJ8WZWhqa2uxaNEi2Nra4siRIwgKChqXcs0J0lHEWFJdXY3Vq1ejvb0dZ8+eHZdnUiqVIiUlBadOncILL7yA559/fsKu8EYQxOTg6NGj2Lp1Kzo7O7F//34sWbJksFMzB+RM4rCyssKBAwdw//3346677sLu3bvR3d1tGIsJghiSn3/+GVFRUZBKpcjIyBjXQBJwI8npqVOn8Mc//hGvvfYaIiIi8MMPP0z4lZ0IgjA/GGNITU1FZGQkXnzxRbzwwgtIT08ft0AScGNBk4yMDNjZ2eG2227D999/P25lEwShS2pqKqKjowEAmZmZ4xbcdXZ2xq+//oq3334bb731FsLCwvDNN9+QdiIIwuS4fPky7rzzTqxcuRKxsbEoKCi4WSAJgJ4E3NpYWVnhs88+ww8//IDPPvsMM2bMwNdff222mcoJwhQpKytDSkoK1qxZgyVLluDChQsICQkxii2WlpZ49tlnUVJSgoSEBDzwwAOIiIjAZ599RsFmgiCMTk9PD7766ivMmjUL9957L2677TYUFRXhD3/4A6ysrMbdHm9vb2RkZOChhx7CAw88gNtvvx15eXnjbgdBTFZKSkqQkpKC9evXY/Xq1cjKyoKfn9+42iAQCLBz506UlpZi+fLl+O1vf4vQ0FB8+OGHZp24lyCIicHp06exdu1azJkzB01NTThx4gT2798PDw+Pob883HlztbW1bOvWrczS0pLFxcWxs2fP3vpkPDPFkPMk+19X36Y9l3giYc73NhpaW1vZc889x2xsbFhYWBjbt2+fsU0awNWrV9mmTZuYtbU1c3d3Z0899RQrKioytlnEBIOe/cGhv83wKC0tZc8++yzz8PBg1tbW7KGHHmKXL182tlk6ZGVlsfnz5zMLCwv24IMPMolEYmyTTBbSUaPDnO9tpLS0tLAnn3ySWVlZsfDwcHbkyBFjm8RTWlrKtm7dymxtbZmLiwt78sknJ2Q+SsK40PM+OPS3GZr29nb2/vvvs9mzZzMAbOHChezHH3/kcycOk8FzJg1GTk4Onn76aZw5cwbLly/Hjh07sHr1alhY3HSQE0EQw6S0tBR79+7FV199BTs7O/zxj3/Eo48+CktLS2ObNij19fX4/PPP8fnnn6OyshIxMTFYv3497rnnHv3LSBIEQdwi5eXlSE1NRWpqKi5cuAA/Pz9s2rQJmzdvho+Pj7HN0wtjDN9++y1eeOEFtLa2YuPGjdixYwciIyONbRpBmAVFRUXYu3cvvv76a4hEIvzpT3/CQw89ZJLtlKamJnzxxRf4/PPPUV5ejujoaCQnJyM5ORnh4eHGNo8gCDOjvb0dhw8fRmpqKo4ePQoLCwvcd9992LZtG+Li4kZzycwRB5M4jhw5gn/+8584duwYgoKCsH37dmzatAmurq6juRxBTGr6+vrw888/Y8+ePTh27BgCAwOxfft2PPbYY3BycjK2ecOmr68PJ0+exP79+3Ho0CE0NTUhPDycF0dcvgKCIIjRkJ+fj4MHDyI1NRVXrlyBu7s71q1bh3vvvRcrVqwwyQajPlQqFT7//HPs2bMHJSUlWLp0KXbs2IF169YZZToeQUxkNBoNDh8+jL179+LEiROYNm0aHn/8cWzduhUODg7GNm9IGGM4deoU9u3bh0OHDqGhoQFhYWG8doqJiTG2iQRBTFAaGxtx6NAhpKamIi0tDRYWFli2bBnWr1+Pe++9FyKR6FYuP/pgEkdJSQk++OADfPXVV1Cr1Vi7di1SUlJw5513ws7O7lYuTRBmz8WLF7F//3788MMPqK6uNqvRfhqNBunp6UhNTcXBgwdRXV2NgIAALFu2DEuXLkVSUpLJjh4gCMI0qK+vR1paGtLS0nDixAlUVFTA19cXd999N5KTk7F48WKTHrU5FIwxHDt2DHv27MHPP/8Mb29vpKSkICUlBfHx8RAIBMY2kSBMluzsbOzbtw8//PAD6urqsHLlSuzYsQOrVq2asBqqr68PGRkZvHaqrKyEv78/kpKS+I20E0EQg9HZ2Yn09HScPHkSaWlpyM7Ohq2tLe644w4kJydj9erVEIvFY1XcrQeTOBQKBb777jt8//33OHPmDOzs7LB27Vps2LABd9xxBy2DSRD/n0uXLmHfvn3Yt28frl+/juDgYKSkpOC3v/0tZsyYYWzzDAJjDBcvXsTPP/+MkydP4vz58+jp6cGMGTOQmJiIxMRELF26FJ6ensY2lSAII9Lc3IzTp0/zAaSioiIIhULEx8cjMTERq1evRlxcnFkGWa5fv44vv/wS+/btQ2lpKQICArBhwwakpKQgNjbW2OYRhEnAaagffvgBFRUVmDZtGq+hpk+fbmzzxpycnBz89NNPvHbq7u7W0U6JiYnDS5JLEIRZ0t3djaysLKSlpem0sUJDQ5GYmIgVK1Zg1apVhhrkM3bBJG0aGxtx4MAB7Nu3D2fPnoWDgwOSkpKwfPlyrFixwiydPUEMhkwmw8mTJ3H06FEcPXoU169fR2BgIFJSUrBhwwbMnTvX2CaOO52dncjIyOAbjNnZ2dBoNAgNDUVsbCzmzp2L2NhYzJkzh0Y4EoSZ0t3djby8PGRnZ+PixYvIzs5GUVERLC0tERMTg6VLlyIxMRELFy6cEFNVxpK8vDy+0+HatWsIDAzEihUrsGLFCiQlJcHFxcXYJhLEuMBpqGPHjuHXX3/F9evXERQUxAdaJ9MUMJVKhfT09EG1E7fNmTOHOvEJwgxhjKG8vBzZ2dn8lpubC5VKhaCgID7AnJSUhKlTp46HSYYJJmlTX1+PQ4cO4ejRozh58iTkcjkvipYvX46kpCTKs0SYFb29vTh//jyOHTuGo0ePIjs7G4wxxMTEYMWKFVi7du1ok5yZLQqFAmfPnkVmZibvHNva2mBlZYXIyEgdkRQREQGhUGhskwmCGAG9vb0oLCzUEUBXrlyBWq2Gs7Mz/3wnJCRg8eLFtzqH36zIycnBjz/+iKNHj+LixYsAgNjYWD64FB8fT3mWCLOht7cX2dnZfAfchQsX0NfXh7lz52L58uVYt24djdT7/wymnYRCISIjIxEXF8d30EVERJCfIIgJRm1tLd/Zxm1SqRRCoRCzZ89GbGws4uPjsXTpUgQGBhrDRMMHk7TRaDTIy8vD8ePHcfz4cZw+fRpqtRrBwcFYsGABYmJisHDhQkRHR0/Yuc7E5EMul+PChQs4d+4ccnJycO7cOUilUnh5eWHRokVYs2YN1qxZQ0HTESKRSJCTk8Nv6enpaG9vh5WVFfz9/REeHo6YmBhEREQgPDwcYWFhEzp3CkGYCxKJBIWFhbh69SpycnJQWFiIwsJCqFQqXgBx7/yYmBjMnDmT3vnDRKlUIisrC4cPH8a///1vVFZWwt7eHtHR0byGWrp0KaZMmWJsUwliWCgUCpw/f36AhvL09MTixYtx++23Y+3atfD29ja2qRMCbe2Unp6OzMxMdHR0QCgUws/Pb4B2Iv9LEMZHKpXi2rVrOrrpypUraGxsBAB4e3tj4cKFOtrJRGZujG8wqT/t7e04c+YMMjIykJmZiYsXL0KlUsHV1RUJCQmYN28e4uLiEBUVRblUCJNApVLxD3pWVhYyMzNRUlICgUCA0NBQJCQkYP78+Vi0aBFCQ0ONba5ZodFoUFhYiMuXL6OgoAAFBQW4evUqKisrwRiDnZ0dwsPDERERgYiICMycORPTp09HUFAQbGxsjG0+QZgVPT09qKioQHl5OYqKinD16lUUFBSgqKgIHR0dAIDAwED+eYyMjERUVBTCw8Opd3wMKS0t5XVUVlYWiouLwRjj30cJCQm47bbbEBkZSdNeCKPT3d2Nq1ev4tKlS7z2166z8+bN4zXUzJkzjW2uWcCNCs3Pz+f9NKedAMDBwQEzZ87ErFmz+OBSSEgIgoKCYG1tbVzjCcLMkEgkKC8vR1lZGf88FhQUoL6+HgDg7Oyso5tmzZqF2267zZRHaxs3mNQftVqNS5cu8Y30jIwMVFdXAwC8vLwQFRWFOXPmICoqClFRUQgNDaWRCITBaGhoQH5+PvLy8nDy5EmUl5ejuroavb29cHR0RFxcHObPn4958+YhISGBRh4ZCaVSicLCQl4gcT/r6uoAABYWFvDz80NISAi/TZs2jf/dRCL7BGFydHV14dq1aygvLx+w1dTUQKPRALjRY8YJn4iICL5R4uTkZOQ7mHy0tbUhMzMTWVlZSE9PR3Z2NpRKJaysrBAaGsrrp+joaERFRVHiXsJgNDc38xoqPz8f+fn5KC4uhlqthoODA+bOnYv58+fzQU93d3djmzypUCgU/OgH7UZtQ0MDAMDS0hL+/v462klbQ1EnHUEMhDGG2tpaHb2kraO4zjZ7e3uEh4cP0E1+fn5GvoMRY1rBJH20tLQMeBkVFRVBrVbzIxFCQ0MRFhaG0NBQzJgxAzNmzIC9vb2xTScmAH19faiqqkJJSYnOVlBQgKamJgCAn58fVCoVWlpaYGNjg8jISCxevBhxcXGIi4tDcHCwke+C0IdSqRzUmdfV1YFzfb6+vggMDERAQAD8/Pzg5+cHf39/+Pv7w8/PjxLdEmaLVCpFTU0NqqqqUFNTw29VVVWorKxEbW0t/5z4+PgMCMRyn024x2zS09fXh/LycuTl5enoKC7YzgUCOR01Y8YMhIaGwt/f3yxXzCPGFsYYampqUFpaipKSEhQXF6OkpARXr16FRCIBcKOOcR3B3M/p06dTZ7CJIpfL9WqnsrIyfvSEhYWFjnbi9JKfnx+vpei9QJgjPT09qKur47VSdXU1amtrUVNTg8rKSly7dg1dXV0AACcnpwGaidNNvr6+Rr6TMcP0g0n66OnpwdWrV5Gfn4+CggI+AFBRUYHe3l4IBAL4+/vzgaXQ0FAEBgbyTo8c3ORCrVbzD31VVRXKysp44VNaWoru7m4AgIeHBx+UnDlzJi98XF1dodFoUFxcrJPD5+LFi+ju7oZYLEZkZCSfr2Lx4sU0LdPE6erq0hFLXN3gGtOtra38uY6OjjrBJV9fX/j5+cHDwwPe3t7w8vKCh4cHTd0hTAaNRoOmpiY0NDSgvr4eTU1NvNipqalBdXU1qquroVAo+O+4urrqBFIDAgJ0xA+N4DMvWlpa+OBSUVERHwhoaWkBANjZ2el00E2fPp3XUD4+PuTvJhEajQZ1dXV8kLm8vJzXT6WlpXxPu5ubGx+UDAsL4wNHNPrNfOjo6NAJMHGNaU4/SaVS/lyxWAwvLy84OjrC3d0dixcvho+PDzw8PPifHh4elK+JMBkUCgXq6urQ1NSE+vp6NDQ0oLq6Wkc7NTQ0oK+vDwBgY2PDtwk43RQcHIzp06cjJCRksrQFJ2YwaTB6enpw7do1PrhUWlqK4uJilJWVobm5mT/P1dUVAQEB/BYUFMRH0r29veHp6Uk9JhMIqVQKiUTCix1O8FRWVqKqqgoSiYSfjmFnZ4eQkBA+yKi9OTs7j6hctVqN0tJSpKen84kji4uL0dfXB29vbz5BGhdkohEuE4fOzk6d4JK2WKqpqUFdXR06Ozv58wUCAS+Mpk6dCk9PT3h6emLq1KmYMmUKfHx84Obmxm80PJwYKT09PWhtbeW3/oKnqamJ39fU1ATtV7u9vT2mTp3K9xwHBgbygVFOADk4OBjx7ghToa2tTWeECaejKioq+N5WKysr+Pr66mgoLtDk7e0NX19fODo6GvlOiOHS0dGB2tpa1NfX6+gnTkPV1tZCrVYDuNF4CgwM1JkNwP1O09QmN3K5HGfOnMHx48dx4cIFFBUVQSqVQiAQwM3NDSKRCBKJhPcjwI2pdB4eHrxe0tZQXl5e8Pb21tFOFMQmRopMJkNzczNaW1sHdLJxmonbp1Kp+O9ZWFjAw8OD103ao+644JGXlxeN4DW3YNLN6OzsHPCC5F6aVVVV/Bxh4EYF4hyZj48PvLy8MHXqVP6zh4cH3N3d4e7uPuIABDE8VCoV32hqbGxEQ0MD6urq0NDQAIlEgvr6en7TfvgdHR11AoQBAQG8yA0ICDB4lFgul+Py5cv86KVz586hoqICAHRWLYyJicHcuXMpIeoERqlUQiKRDPlyam5u5oU4h6OjIy+O3N3ddcRS/00sFkMkEkEkEtHoEDNApVJBLpdDLpdDJpOhra1NJ0ikvbW0tKClpQWtra1QKpU617GysoKHhwcvuDkR3n+fj48PNeyJMaG+vp7XTPp+ar+LHRwc4OPjA09PT15HaespDw8PuLq6UnDdQGgHn1taWlBbW4vGxkbU1dWhsbGR/1xbW8uPLAIAW1tbXjNpaydudL+3tzc1ngj09vaipKSEXzHu3Llzg3amLliwQCenqEwmG1Qv9e8U4UaAcIhEIkyZMuWmmmnKlCkQi8VwcXHhtRMlEp/4tLe362gnfVpJn57q7e3VuY5IJOLfQdzsAk9PTx3NxHUO08CSYTF5gklD0dXVhZqaGj5YoS9oUV9fj7a2Np3vWVpa6jgxThxpfxaLxXB0dISTkxMcHR3h7OwMJycnODk5mW0woa+vDzKZDDKZDEqlEkqlEgqFAlKpFAqFAnK5fIAj0P6sLUqBGwLH29ubD+ppB/c4sert7W2SPWP9l7jPzMxEa2srhEIhpk+fzo9cWrBgAS3RaqY0NTXp1G/uhacdLOh/rH8ACgCEQiFEIhHEYjGcnZ15oaS9OTs7QywWw9bWFg4ODnBwcIC1tTWcnZ1hbW0NR0dH2Nvbw8bGBs7OztQwGIL29nb09PSgo6MDHR0d6OnpQXt7O9RqNZRKJTo6OtDV1QWZTAapVMqLHe1NKpVCJpNBLpfr/b9aWVkNEMSurq58p4W+Yx4eHvS/I0yKxsZG1NfX8wEL7cAFN9WysbERPT09Ot/TDq5PmTJFR0fZ2dnBy8sLTk5OvO/rr6fMFZlMBoVCwWsozr8olcpBA9Hc+0R7Citw493RP7Cn/ZnTVN7e3ka6W8KUkUgkOqPwc3NzoVKp4OTkhNmzZ/OBo0WLFiEoKGhMytRoNPyIEu1N3z7tZ6F/AAq40YbgNNJQ+snOzg62trYQi8W85tK3jxicrq4uqFQqKBQK9PT0QCaTobu7G52dnTr7Ojs7B9VK/Td9cO+OwbRS/05bDw8P6pQdeyiYNFK6urrQ1NQ0oBHY/6Xe1taGlpYWtLe3QyaT6XVuwI1GhJOTEx9gEgqFfOOPc17W1tZwcHDgzxUIBDoCytLSclDH5uTkpHdY6GA2cQ6AQ6VSoauri3cCvb29UCgUfLAIuNHYAm5MN+OCRtpTgPTZJBKJdIJvgzWYuIff3KaI9X8x5+TkoKura8CLeeHChZTge5LCBVz7v1i5oOxgL1yu96arq2vAaBZ9cH6FCzCJxWJYWFjw+4EbUxu4RQ248wBd/6IvMCUSiW7as8P5tsHo7Ozkc5rpQ6PR6BUZnE/SPs4FhID/82vAjRFmarUajDFIpVL+PIVCMaBHSx+Ojo78322oAJ++Y9zoM4KYLDQ3Nw8IouvrWLp27RoaGhogFApv6gdEIpFOgInzXRYWFvyzxWkIzic5OjpCKBTqXEOfr9L2fdpo+xBt+vukm2kmuVwOjUbD+yDtjrfBGk/Ajen6nO/or5e4URv9OzYnSe4OYgyor6/HxYsXeW2alZWFlpYWWFlZYcaMGSbfAcrpJu2RLNrbUB0//dtBg8G10biRT1w7jNsPQMfPcNpKuw2nrbM4tP3WYPT3X/2RSqW4WfNen//S1kja2ktbC3HX1fZn+gJHQ8Hdo729/bC1kvZIM7FYDFdXVxrVahpQMGm84KKx2r1L3GftETuc8Ojt7eV7wbmHnnvQuXM4bub4ONHSH+0GoTb9A1OckBIKhXB0dLypOBOJRPyIK67HsL/IM7eg0FihPWSYGzZ86dIlvUOGaQldYiRwooALlHCjabgRNvpG3QDgA8ja1wCGFhYcgwV6tOEaUYOhT2j1R18jcCjRNlhwTHv0VlZWFr755htMmzYNzz77LKKiovhAv4uLy5CBMIIgRkdZWRm2bduGs2fP4vHHH8ef//xn2NnZ8Q1BhULB6yduBDT3uaOj46adX5zP4gI5APT6L47BfBSnifTB+R8AejUTd5xrEHI+yN7efoB+4j5znY5DBegJYiQolUrk5eXpjJ4vLCwEcGMVPi5oNBlTM8jlcvT09EAul/PtMJlMhp6eHr7TnNNWarWab5dxWoq7Budn9HVyaessjuEEswZr23EM1sbj0DcIYaQdiJw/47SQo6MjPwpe259ZW1vzo+W5QDj5MLOCgkkEYaqM5CUfExNDQzcJYowpKyvDY489hjNnzvCNWso/RBCGQa1W45133sErr7yC8PBwfPLJJ5g7d66xzSIIs2AknZbz58+Hm5ubsU0mCML0oWASQUwkGhoakJ2dzYuB8+fPo7m5WWf4MTcEec6cORT9J4hbhDGGb775Bk899RREIhE++OADrFq1ythmEYRZcfbsWWzbtg1VVVV4+eWX8cwzz9D7iyBuAS5fJ5dSYbA8RzExMYiIiDC2uQRBTEwomEQQE53+guHSpUvo7OyEo6MjoqKidARDeHg4Je0liFHQ2NiI3bt345tvvsGaNWvw0UcfwcfHx9hmEcSEpr29Hc8//zw+/fRTrF69Gnv37oW/v7+xzSKICYVUKsXFixf5PJz68hxxHY3R0dEml+eIIIgJCwWTCMLc6D+UOScnB9nZ2ejp6YGzszPmzp3LT4+Lj4+Hh4eHsU0miAnDkSNH8MQTT0AqleLVV1/Fzp07SZgTxCjYv38/duzYAUtLS/z1r3/FQw89ZGyTCMLkoRQIBEGYEBRMIojJQEdHBy5duqQjPoqKisAY05krv3DhQiQkJFBiYYK4CZ2dnfjjH/+It99+G/PmzcPHH3+M8PBwY5tFEBOC69ev4/HHH8fRo0exZcsWvPnmm7TUNkHoQV/n4IULF6BWq2lxFoIgTAEKJhHEZEUmk+HKlSv89Ljs7Gw0NjbC0tISoaGhOiIlNjaWluAkiH7k5+dj69atuHTpEp566im89tpr9JwQxCD09vZi7969+MMf/oCgoCB8/PHHSEhIMLZZBGEyjCRtAeU5IgjCBKBgEkEQ/wcnZLRX+2hvb4dQKMTs2bN1hk5T/iWCuLGs+GeffYZnnnkGnp6e+Oijj7Bs2TJjm0UQJkVubi62bt2KwsJCPPvss3jhhRdgbW1tbLMIwmjIZDJkZ2fzeY5utqAK5TkiCMJEoWASQRCDo9FoUFxcrBNgysnJQVdXF0QiEWbNmsWLnUWLFsHLy8vYJhOEUairq8OTTz6JgwcPYuPGjXj33XdpaWVi0tPR0YHXX66ovysAACAASURBVH8db731FhYuXIiPPvoIYWFhxjaLIMaV4aQa0M51RHmOCIKYIFAwiSCIkaFWq1FaWsoPw87JyUFxcTH6+voGzOFfsGABXF1djW0yQYwbhw8fxuOPPw61Wo2///3vlFSYmLQcPnwYO3bsgEKhwF//+lds2bKFRrMSZo++TrjBFkGZN28epkyZYmyTCYIgRgsFkwiCuHUUCgXy8/N1psddv34dABAcHKwzPW7u3LmwtbU1ssUEYThkMhlefvll7NmzBytXrsQHH3yAwMBAY5tFEONCfX09nnvuOXzzzTfYsGED9u7dSw1mwmzRTg+Qnp6OjIyMQfMcUXoAgiDMDAomEQRhGPrnX8rMzERra6tOPgBuWPfMmTMpHwBhdqSnp2Pbtm24fv06nn32Wbz44osQCoXGNosgDAJjDJ9++il2796NKVOm4MMPP8Ty5cuNbRZBjBn9Fy65cOECmpqaBuQ5iomJQXx8PPl7giDMHQomEQQxfkgkEp3pcbm5uVCpVHBycsLs2bNppRLC7FCr1XjnnXfw6quvIjQ0FJ988gni4uKMbRZBjClXrlzB1q1bcfHiRTz++OP4y1/+AgcHB2ObRRCjRq1W4/Lly7xeuVmeo9tuuw329vbGNpkgCGK8oWASQRDGo7e3FyUlJTpDxPPy8qDRaAbkX0pISIC7u7uxTSaIUXHt2jU89thjOHnyJDZv3oy33noLTk5OxjaLIG4JlUqFv/3tb3jjjTcwd+5cfPzxx4iMjDS2WQQxIm6W50gsFiM2NpbyHBEEQQyEgkkEQZgWSqUSeXl5w1r1hHoDiYkEYwzffPMNnn76aVhbW+O9997D+vXrjW0WQYyK06dPY9u2bWhoaMBrr72GHTt2wNLS0thmEcSQ9J+Gf+7cOUilUjg4OGDOnDmU54ggCGJ4UDCJIAjTRyqV4uLFi/xw85vlKYiLi4O1tbWxTSaIQWlra8N//dd/4dNPP8Xq1avx4YcfwtfX19hmEcSw6F9/P/jgA/j5+RnbLILQS/88R9nZ2WhsbISlpSVCQ0NJPxAEQYweCiYRBDExGWwFFepZJCYKp06dwmOPPcaP7Ni5cycloidMmv379+OJJ/5fe3ceFdWZpw/8qQ2BoigEWUoiKCgGEdCwiiAaknaJSUYd7ZkzJh3T7ZpoG0/UGBO1090J6Xi0c9yA9GSSNj2dnvRoptGQ7si4AbIqYCRAXBAj+w7FUlXU/f2RX9VYbIIKl+X5nFPHrlv31v3eC2moh/f9vq9AoVBwZB0NO/3pc2Qa3RwREcGRzURED4dhEhGNDj31PMjOzkZHRwfUajVmzpxpnh4XGhoKV1dXsUsm6tZzJiEhgc3nadi5ceMGNm7ciOTkZPb8omFhID/zw8LC4OLiInbJRESjDcMkIhq9+vtXStNfKsePHy92yTRG5efnY/369cjJycG2bduwb98+WFtbi10WjXH3rkbo4+ODhIQEhIWFiV0WjUFd+xylpqaivr4eCoUCAQEB5gbZHI1MRDRkGCYR0djS1NSE/Px88y+jFy9eREVFRY/9E0JCQjBu3DixS6Yxwmg04g9/+AO2b98OZ2dnHDt2DE8//bTYZdEYlZaWhnXr1uHmzZvYsWMH3nzzTfaToSHR9ef0hQsX2OeIiGj4YZhERNT1L55paWmoq6uDQqHAtGnTzEPlg4KC4Ovry742NKjKy8uxZcsW/PWvf8XKlStx5MgRLkVNQ6axsRF79uzB4cOHER0djbi4OPj4+IhdFo1Ser0excXF5gbZfY0gjoqKgoODg9glExHRjxgmERH15ObNmxbT43JyctDe3g57e3v4+/tb/HI7ZcoUsculUSgxMRGvvPIKtFot3nvvPaxdu5ZTN2hQJSYmYtOmTdDr9fjd736HF198UeySaJTp+rPV1OfI9LOVvQ2JiEYMhklERP1hMBhQVFRkHnafkpKCwsJCGI3Gbn89jYiIgJOTk9gl0yig1Wrx61//Gvv370dkZCTi4+Mxffp0scuiUaasrAxbtmzBiRMnsHr1ahw4cAATJkwQuywa4foa9cs+R0REIx7DJCKiB9Xc3Iy8vDyLX5YLCgoAABqNxmJ6XFBQEGxsbESumEaqy5cvY926dSgoKGD/GnpkTH26Xn/9dbi6uiIuLg4xMTFil0UjEPsREhGNOQyTiIgepfLycmRnZ5vDpfT0dNTU1EAul8PHx8di9bjZs2ez/xL1m8FgwJEjR7B79254eXkhISEB4eHhYpdFI1ReXh7WrVuHK1eucAVBGpCe+hz1NlKXK6USEY1aDJOIiAabaai/6RfvK1euoLW1FXZ2dggMDLT4xdvPz0/scmmYu3nzJjZu3IhvvvkGa9euxQcffAB7e3uxy6IRoq2tDe+//z7effddhIaGIiEhATNmzBC7LBrG+tNDMDIyElFRUXBzcxO7XCIiGhoMk4iIhtq9/ZdMj6ysLOh0Ojg4OCA4ONg8PS48PJwreVGPvvjiC7zyyiuQy+WIjY1ls2S6r6SkJGzatAkNDQ3Yt28fNm/ezNGRZIGrmxIRUT8xTCIiGg60Wi2uXLli8Ut8T8sjR0ZGIiIiAra2tmKXTMNAfX093njjDXz00Ud45plncOTIEXh4eIhdFg0zlZWV2L59O44fP46lS5ciLi4O7u7uYpdFIuva9y8lJQW3bt0CAHh5eVn0/GOfIyIi6oJhEhHRcNXY2IirV6+ap8dlZmaiqqqqx4amoaGhbMg8hl24cAHr16/HnTt38Pbbb+P111+HTCYTuywSmSAIOH78OLZt2wZra2scOnQIy5YtE7ssEsFAViSdO3cuHB0dxS6ZiIiGN4ZJREQjSdcpCKmpqaivr+dSy4T29nbExsYiNjYWM2bMQEJCAoKDg8Uui0Ry/fp1bNiwAefPn8emTZvw29/+FnZ2dmKXRUOkrKzMokG2qc+RSqVCQECA+efEvHnzMHnyZLHLJSKikYdhEhHRSNbZ2YnCwkKLgCk7OxsdHR1Qq9WYOXOmeXrcvHnz4OrqKnbJNMiKi4uxYcMGXLx4kSHCGKTX63HgwAHs3bsXvr6+SEhIQEhIiNhl0SDquoropUuXUFtbyz5HREQ0mBgmERGNNgNZtpnTGUYn0/Sm1157DWq1GseOHcPChQvFLosGWUpKCtavX4+SkhLs2bOH0x1Hoa59jnJyclBQUACge5+j4OBgWFtbi1wxERGNUgyTiIjGgqamJuTn5/er0So/gIweFRUV2LFjB44fP46VK1fi8OHDcHFxEbssesQaGhqwd+9eHD58GIsXL8aRI0fg6ekpdln0kNjniIiIhjGGSUREY1XX/ktdp0aYpsfNnTuXUyNGuNOnT+OVV15BY2Mj3n//faxdu5b9tEaJxMREbNy4EZ2dnXj//ffx4osvil0SPaCufY4uX76Mtra2bn2OoqKiMGXKFLHLJSKisY1hEhER/Z/+fpgJCgqCn5+f2OXSALS2tuKdd97B/v37ERERgfj4ePj6+opdFj2gW7duYdOmTfj73/+O1atX4+DBg3BychK7LOqnrn2O0tPTUVNTA7lcDh8fH4b5REQ03DFMIiKi3t07zcI01eLKlSs9TrOYM2cOJkyYIHbJdB+5ublYt24dcnNzsW3bNvzqV7/CuHHjxC6L+slgMODIkSN46623oNFoEB8fjwULFohdFvWhpaUFubm5PfY50mg0Fg2yOc2YiIhGCIZJREQ0MPf7YHTvX9SDgoJgY2MjcsXUVddAIi4uDk8++WSfx+j1eigUiiGqcOwRBOG+Uw8ZBA5/AwngIyIiOJqMiIhGKoZJRET08BoaGpCdnW2eHpeRkYHq6mqLKRumR1hYGEOJYaKkpASbNm3C119/fd+pUps3b8asWbPw85//fIirHP0OHz4MpVKJNWvW9Pg6pygOX6bec6bpwaapwXZ2dggMDOTUYCIiGq0YJhER0eC4t8F3amoq0tLS0Nra2uOHrBkzZrAhtIju18Q5MzMT4eHhkMvlSEtLQ3BwsEiVjj4pKSmYP38+7OzsUFxc3G21PVPz9KamJsTGxrJ5uoj6G5pHRkZi9uzZ7HNERESjGcMkIiIaGp2dnSgsLLSYHpeVlQWdTge1Wo2ZM2eap8eFhYVxCfshdu/y8osWLcLRo0fh6ekJg8GAwMBAFBcXQxAEODs7Iy8vj1+fR6CsrAyBgYGor6+HVCrFihUr8Oc//xkAUFFRgR07duD48eNYuXIlDh8+zHs+hHqazvvdd99BEIRufY44nZeIiMYghklERCQevV6P/Px881/6u35gu/cv/XPmzIFSqRS75FEvJSUF69evR0lJCfbs2QOj0Yi33noLRqMRAKBQKPDEE0/g4sWLnK74EPR6PebNm4ecnBzo9Xrz9q+//hqVlZV47bXX4ODggKNHj2LhwoUiVjr6de1zlJOTg8zMTOj1ei40QERE1DOGSURENLw0Njbi6tWr5h4kWVlZqKyshEwmw/Tp0y0+2IWEhLAB8SDo6OjAe++9h/feew+CIFiEHQAgk8mwefNmHDx4UKQKR761a9fik08+gcFgMG+TSqUYP348mpqasG3bNuzZswe2trYiVjk6de1zdOXKlV6n4LLPERERUY8YJhER0fB3b/8l04fA+vp6KBQKBAQEWEw3Yf+lRyc6OhqXLl3qFiaZ/Md//AdeeumloS1qFPjjH/+In/3sZz2+JpfL8fLLLyM+Pn6IqxqdGhsbkZWVxT5HREREjxbDJCIiGnl66r+Uk5OD9vZ22Nvbw9/f3/wBMSoqCm5ubmKXPOL86U9/wgsvvIC+fk1QKBS4dOkSgoKChrCykS0jIwNRUVG9BnTAjyOUsrOzMXv27CGsbOTTarW4cuVKr32OTP+fYAqf2eeIiIjogTFMIiKi0UGv16O4uNg8dSUnJweFhYUwGo3d+p7MnTsXjo6OYpc8bNXV1WHq1KloaGjoM0ySy+VwcXFBXl4e+8j0Q2VlJQIDA1FTU4POzs5e95PL5Zg5cyays7Mhk8mGsMKRo6+G/g4ODggODjaHRuHh4XB2dha7ZCIiotGEYRIREY1ezc3NyMvLs5ged/PmTQCAl5eXxfS44OBgWFtbD0odHR0dI6q3089//nN8/PHH/dpXoVAgKioK//jHPxh89EGv12P+/PnIysrqc1TSvQ4dOoRXX311kCt7NDo7O9Hc3AwHB4dBef97p7qmpqYiLS0Nra2tUCqVmDVrlkVYzKmuREREg45hEhERjS1d+y+lp6ejpqbGooeKaSqMr6/vI+mhcvToUZw6dQqHDh2Ct7f3I7iKwWMwGPDhhx/iwoULSElJQV1dHWQyGaRSaa8hiFQqxfbt2xEbGzvE1Y4cmzdvxrFjx3odkSSRSCCXy6HX680r5j377LPYvXv3EFc6cOnp6diwYQNefvllbNmy5aHfr2sT/szMTFRVVXXrcxQUFITQ0FBYWVk9gqsgIiKiAWCYREREVFZWZjE97vLly2hra4NKpUJAQMBDr+60Zs0afPLJJ1AoFHjzzTfxxhtvDNooqEetuLgYaWlpSE1Nxblz53Djxg0IggBra2u0t7eb95NIJPjLX/6ClStXPvC5DAYDmpubAQD19fUAfhxdZlrxrL29HW1tbT0eq9fr0dLS0ut7K5XKXkMHGxsb89dDLpdDpVIBAMaPHw8AUKlUkMvlD3BFP/rss8/wwgsvWGyTy+UwGo0wGo1wcHDAnDlzEBoaisjISERGRo6I74/a2lrs3LnTPIrtX//1X/GnP/1pQO+h1+uRn59v/m+vpz5HpoA3IiKCq9sRERENDwyTiIiIujIYDCgqKrKYVpObm4vOzs5u/Zf6049l6tSpuHHjBoAfQwSNRoNjx47hmWeeGYrLeaTq6uqQlpaGtLQ0JCcnIzc3FzqdDgBgZWWF3bt3Q61WQ6vVoqmpCY2NjWhpaYFWq0VzczMaGhqg1WrR0dGBlpYW6PX6PkOi4cQUOikUCtjZ2cHKygp2dnZwcHCAnZ0d7OzsoFQq4eDgAJVKBTs7O9TW1uK9994zB2IA4OnpiaefftockEybNk3Eqxo4QRBw/PhxbN261fw1BH68rpKSkl6P66vPkVqtRkhICPscERERjQwMk4iIiPqjpaUFubm5/Vop6oknnjCPoGhuboZarbZoZC2VSmE0GrFo0SIcPXoUU6ZMEeuyzFpbW1FeXo6KigpUVlairKwMtbW1qKurM/9repie90Qmk8HZ2RkqlQr29vawt7c3hyz3Pre2tu4WzkilUqjVagCAWq2GVCq1GFEkk8lgb2/f43klEkmf/Xr6aibe1NRknn6m0+mg1WphNBrR2NgI4MdpV0ajEVqtFjqdDh0dHWhtbUV7ezu0Wi0aGxvR3NxsDs1Mz5uamlBVVQWj0djjecePHw8nJyc4Ojqa/zU9JkyYAI1GA1dXV7i6umLixIlQKpW9Xt9Qyc3Nxbp165CTkwNBECzuqUQiQXV1NZycnAB0n1KakpKChoYG9jkiIiIa+RgmERERPajKykpkZWUhKysLmZmZyMrKQm1tLeRyOfz9/REaGgqVSoX9+/f3eLxCoYBEIsGuXbuwa9euQWnSrdPp8MMPP6C0tNT8qKqqMgdHVVVVKCsr6zZFzMXFBU5OThYhx73/e8KECRbb1Gq1OejR6XTsY4Mfp+rZ2dlBoVCgubkZjY2NFsFcTU1Nt7Du3gCvqqrKIqxRKpWYOHGiOWDSaDRwcXGBh4eH+TFp0qRBufcNDQ3Yu3cvDh8+DJlM1mv/rBdeeAF1dXXIzMxEdXW1eWW60NBQhIaGIiQkBH5+fmzWTkRENLIxTCIiInqUuq46deHCBQiC0OcKXjKZDO7u7oiLi8PixYsHdD6dToebN2/i+vXrFoFRaWkpSkpKUF5ebh4ZY21tjcceewxubm7m0S7Ozs5wd3eHi4sL3NzczAGFQqF4qPtAD89gMKCqqgoVFRUoLy9HVVUV7t69axEGVlZW4s6dO+b+VRKJBBqNBpMnT7YImTw9PeHl5QVvb+8BhZamKW3btm1DY2OjxXS9rkwjzBYuXGgOju4dpUdERESjBsMkIiKiwbRs2TIkJib2uoqXiUwmQ2dnJ5YsWYKjR4/C09PT4vWysjIUFBTg5s2b5se1a9dQVFRkfm9ra2tMnDgRXl5e5odGozFvmzx58iNZnY6Gn/r6ety8eRNlZWUoLy83f4+Ynt+6dcs8ykmj0cDPz8/i+2TGjBmYPn26RaPxoqIibNiwAefPnweAXqcJmkilUixatAinT58evAslIiKi4YBhEhER0WCaOHEiysvL+72/RCKBQqHAggULoFKpUFBQgOvXr5ubXDs7O2PatGnw8fHBtGnTzI+pU6fCzs5usC6DRjitVovr16/j+++/t3gUFxejqqoKwI8ji7y9veHr64vKykqkp6d364t0P46OjqitrR2syyAiIqLhgWESERHRYKmsrISbm1uf+0ilUkgkkm4jl6ysrODp6YmVK1fCz8/PHBr11WSa6EE0Njaaw6Vr167hxIkTKCkp6bbCnkQigUwmg9Fo7LWpOACUlJR0G1lHREREowrDJCIiosFy6tQpPPvss1AoFDAajebAyLRqlSAIUCgUcHZ2hre3N4KCghAREYEnn3zSvCIWkVh0Oh2KiorwzTffIDU1FYWFhbh9+za0Wi0kEgmkUqlFCCqXy2EwGPDFF1/gn//5n0WsnIiIiAYZwyQiIqJHrbOzE9nZ2di/fz/S0tJQX1+PtrY2yOVy+Pn5ITIyEuHh4QgLC8O0adPELpdoQG7cuIGMjAxkZmbi0qVLyM3NhU6ng62tLVxcXBAeHo4tW7YgJCTEogcTERERjRoMk4iIiB6FgoICJCcnIzk5GefPn0dDQwM0Gg3mz5+PsLAwhIWFYfbs2QNaSYtoJNDpdLhy5QoyMzORkZGBc+fO4e7du7C3t0d0dDRiYmIQExODmTNnil0qERERPRoMk4iIiB5ER0cHzpw5gxMnTiApKQnl5eVQq9WYP3+++cPzjBkzxC6TSBRFRUU4c+YMkpOTce7cOdTX18PNzQ2LFi3CsmXL8JOf/ATW1tZil0lEREQPhmESERFRf2m1WiQlJeHEiRM4ffo0mpubERoaiueeew4xMTEIDg6GTCYTu0yiYaWzsxNXrlzBmTNnkJiYiPT0dNja2mLJkiVYsWIFlixZwpUIiYiIRhaGSURERH0RBAFnz55FfHw8EhMTodPpEBkZieXLl2PZsmWYNGmS2CUSjShlZWU4efIkTpw4gfPnz0OhUOCZZ57BunXr8NRTT0EqlYpdIhEREfWNYRIREVFP6urq8OmnnyI+Ph5FRUWIiIjASy+9hOeffx4uLi5il0c0KtTU1OB//ud/8Omnn+LixYuYOnUq1q1bhzVr1mDChAlil0dEREQ9Y5hERER0r++//x6xsbH485//DLlcjtWrV2PDhg0ICAgQuzSiUe3atWuIi4vD8ePH0d7ejp/+9KfYs2cPvL29xS6NiIiILF3iOGIiIiIApaWlePHFF+Hr64vU1FQcPHgQd+/exdGjR0ULkrKzs/HSSy9h8uTJsLa2hoODA0JCQvDOO++goaFBlJpGgqysLLz00kuYMmUKbGxs4OjoiJkzZ2LFihU4duwYbty48UDvu3//fkgkEkgkEjz22GP33U4D4+fnh0OHDuHu3bs4fPgwMjIy4Ovri1dffRWVlZVil0dERET3YJhERERjmk6nwzvvvANfX1+kp6fj008/xbVr17B+/XqoVCrR6tq1axfCw8Mxfvx4nDp1Cg0NDbh16xb27t2LkydPwsfHB6mpqaLVNxwZjUZs374dERERcHFxQVJSEhoaGvDdd9/h4MGDaGpqwqZNmzB16lQYDIYBv//rr78OQRAQGBjYr+30YJRKJX7xi1/g22+/xdGjR/Hll19i6tSp2LdvH9rb28Uuj4iIiABwmhsREY1Z165dw+rVq3H9+nXs2bMHv/zlL2FlZSV2WfjNb36Dt99+G3FxcVi/fn2311tbWzFv3jwUFxcjMzMTjz/++EOdz87ODrNmzUJKSspDvY/Y59+9ezfeffddJCQkYO3atd1e7+zsxLPPPoukpCTo9XrI5fIHOs+sWbNQU1ODH374oV/bB4vYX7eh0tbWhkOHDuG3v/0tPDw88NlnnzG4IyIiEhenuRER0diUlJSEOXPmwNbWFrm5udi+ffuwCJKuX7+OX/3qV3jiiSd6DJIAwNbWFgcPHkRzczO2bNkyxBUOT4WFhYiNjUVQUFCPQRIAyGQyvP3220NcGT0sGxsb7NixA3l5eXBycsLcuXPx5Zdfil0WERHRmMYwiYiIxpxTp07hueeew4oVK3D27Nlh1eA3Li4OBoMBK1eu7HO/qKgoTJw4Ed988w1u3rw5RNUNXwkJCTAajfe9b3PmzIEgCA88KonEM3nyZCQnJ2PNmjVYsWIF/uu//kvskoiIiMYshklERDSmfPfdd1i1ahXWrFmDjz/+eFiMRrrX+fPnAaBf03hM+1y8eBHAj9PjTI2gIyMjzft9/fXX5u33Lrduahyt1WqRmppq3scUtHRtLJ2VlYWYmBioVCrY2tpiwYIFFn2bHvX5B+LChQsA8MDN0mtra7Ft2zZ4e3vDysoK48ePx+LFi3H27NkHer97VVdXY8uWLZg8eTKsrKzg7OyM5cuXIzc3t886xo0bh8ceewxPPfUUPvnkE7S1tQHo/33rzzV9+eWX5uMlEgmKioqwatUqODk5mbfV1NQ89D14VGQyGQ4dOoRXX30VL774IvLy8sQuiYiIaGwSiIiIxpDo6GghNDRUMBgMYpfSI41GIwAQMjIy7rvv6tWrBQDCu+++a7FdqVQKc+fO7bZ/UFCQ4OTk1G17b/ubBAYGCkqlUpgzZ46QlpYmtLS0CFlZWUJAQIBgZWUlnDt3blDP3x8DuW9dlZeXC1OmTBFcXV2FxMREobGxUSgqKhKWL18uSCQS4aOPPrLYPzAwUHB3d+/2Pj1tLysrEzw9PQVXV1fh9OnTQnNzs/Dtt98K0dHRgrW1tZCWltatDjc3NyExMVFoamoSKioqhF//+tcCAOHgwYMW793XfRvoNT3//PMCACE6Olo4e/asoNVqhfT0dEEmkwnV1dUDup9DobOzU4iKihJCQ0PFLoWIiGgsSuPIJCIiGjPy8/Nx/vx5fPDBB5DJZGKX0yeJRDIo+z4orVaLo0ePYs6cOVAqlQgODsZnn30GnU6HX/7yl4N+/v56kHuxa9cu3Lp1C7///e+xdOlS2Nvbw8fHB//5n/8JjUaDLVu2PPDS9Lt27cLt27dx4MABLFmyBHZ2dvDz88Pnn38OQRCwefPmbnV8+OGHWLp0KVQqFVxdXfHWW29h0aJFQ3JNO3fuxPz582Fra4uwsDAYDAaL0WTDhVQqxYEDB5CZmYn09HSxyyEiIhpzGCYREdGYcfHiRUyYMAFRUVFil9KriRMnAvhxitL9mPYxHTOYlEolZs2aZbHN398fEydORF5eHsrLywe9hr6Y7sGDTMk6efIkAOCZZ56x2D5u3DjExMSgra0Nf//73x+ori+//BJSqRRLly612O7m5gY/Pz/k5OSYV38z1bF48eJu75OUlIStW7f2+7wPek2hoaH9PofYgoOD4eHhYZ7mSUREREOHYRIREY0Z9fX15l4ww1V0dDQA9NhPpytTv5j58+cPZkkAAAcHhx63u7i4AACqqqoGvYa+mO5bfn7+gI7r6OhAY2MjrK2toVKpur3u6uoKAKioqBhwTab3NhqNUKvVFr2JJBIJLl++DAD4/vvv71vHUF2TUql8qHMPtQkTJvQreCUiIqJHi2ESERGNGZ6enigtLYVWqxW7lF6tX78ecrkcX3zxRZ/7paSkoKysDM8++yw8PDwsXpNKpdDpdN2OaWho6PG9+hOu1dbWQhCEbttNIZIpVBqs89+P6b799a9/7XO/QaEhYgAAC45JREFUHTt2QCqVorCwEMCPI3XUajXa29vR3NzcbX/TVDA3N7cB1zRu3Dg4ODhALpdDr9dDEIQeHwsWLLhvHT3p7b4N5jUNJx0dHbhx4wamTJkidilERERjDsMkIiIaM5YsWQKj0Yg//vGPYpfSKx8fH+zduxeXL19GfHx8j/u0trZi69atcHJywu9///tur2s0Gty9e9diW0VFBUpLS3t8P1tbW4vwZ/r06UhISLDYp729HVlZWRbbrl69irKyMgQGBkKj0Qzq+e/HdN+ys7Px8ccf97hPUVER4uPjsWrVKjz++OPm7cuWLQMAnD592mL/jo4OJCcnw8bGBgsXLhxQPSbLly+HwWCwWPXO5P3334eHhwcMBoNFHV999VW3fWfPno3XXnvNYltf920wr2m4+Pzzz6HVavHcc8+JXQoREdHYI17zbyIioqG3bds2Yfz48UJJSYnYpfRp165dgkwmE1577TXh22+/Fdrb24X6+nohMTFRmD17tuDu7i5kZ2f3eOyrr74qABAOHTokNDc3C9evXxdWrVoluLu797ia2qJFiwS1Wi2UlpYKaWlpglwuFwoKCsyvBwYGCmq1WoiJienXam6P+vwD8cYbbwgKhULYuXOnUFRUJHR0dAg//PCD8Ic//EHQaDRCZGSk0NLSYnFM15XPmpqaLFY+S0hIsNh/IKu5VVZWCt7e3oKXl5fw1VdfCQ0NDUJtba0QFxcn2NraCn/5y1+61aHRaIRTp04JTU1Nwp07d4SNGzcKrq6uwu3bt/t93wZ6TabV3Nra2gZ+00Vw9+5dwdnZWdi4caPYpRAREY1FaQyTiIhoTGlpaRECAgKE6dOnC+Xl5WKX06esrCzhZz/7meDp6SlYWVkJKpVKCA4OFn7zm98IDQ0NvR7X0NAg/OIXvxA0Go1gY2MjREZGCllZWUJQUJAAQAAg7Ny507x/YWGhEBUVJSiVSmHSpEnCkSNHLN7PFJIUFBQICxcuFFQqlWBjYyNER0cLKSkpg37+gcrMzBReeOEFYdKkSYJCoRBUKpUQHh4ufPjhh0JHR0ePx9TU1Ahbt24VpkyZIigUCkGtVgsLFy4UkpOTzft88MEH5vpNj927d/e63aS2tlbYtm2b4OXlJSgUCsHZ2Vn4yU9+InzzzTf3rUOj0Qj/8i//IhQXF3fb9373rT/XdOnSpW61D/e/NVZXVwv+/v6Cr6+v0NjYKHY5REREY1GaRBB6aIBAREQ0ipWXlyM6Oho6nQ5/+9vfEBAQIHZJw9qsWbNQU1NjXnWMSCwFBQV47rnn0NnZiQsXLmDSpElil0RERDQWXWLPJCIiGnM0Gg0uXboET09PhIWF4cCBAzAajWKXRUS9MBqNOHLkCEJCQuDq6oqMjAwGSURERCJimERERGOSk5MTkpOTsW/fPuzatQvBwcG4ePGi2GURURdnzpxBSEgItm7dis2bN+Ps2bMWqwcSERHR0GOYREREY5ZcLsfOnTuRn58PjUaDefPm4emnn0ZmZqbYpQ0L+/fvh0QiQV5eHu7evQuJRIK33npryM4vkUju+9i3b9+Q1UNDKzs7G0899RSefvppODo6Ijs7G7GxsbCyshK7NCIiojGPPZOIiIj+v6SkJOzbtw+ZmZlYsGAB1q9fj2XLlvHDK9EQ0ev1+Nvf/ob4+HicOXMGERERiI2NRWRkpNilERER0f9hzyQiIiKTxYsXIyMjA19//TVUKhX+7d/+DR4eHnjzzTdx69YtscsjGrVKS0vx9ttvw9PTE6tWrYJCocCpU6eQkpLCIImIiGgY4sgkIiKiXty5cwcfffQR/v3f/x0VFRWIjo7GihUr8E//9E9wd3cXuzyiEa2iogInT57EiRMncPbsWTg7O+Pll1/G2rVrMXnyZLHLIyIiot5dYphERER0HwaDAadOncLnn3+Or776ClqtFmFhYVixYgWWL1+OKVOmiF0i0Yhw+/ZtnDx5Ev/93/+NtLQ02NjYYPHixfjpT3+K559/HgqFQuwSiYiI6P4YJhEREQ1Ee3s7/vGPf+DEiRNITExEXV0d/P39ERMTg5iYGERHR0OlUoldJtGw0NLSggsXLuB///d/kZycjLy8PKjVaixduhQrVqzAwoULYWNjI3aZRERENDAMk4iIiB6UXq/HuXPnkJSUhOTkZFy9ehUymQyhoaHmcCk8PBzjxo0Tu1SiIaHT6ZCRkYHk5GQkJycjIyMDBoMBfn5+iImJwaJFi/Dkk0+yqT0REdHIxjCJiIjoUamursa5c+dw5swZpKSkoKCgAHK5HD4+PoiMjMTcuXMRFBSEGTNmQCKRiF0u0UMrKytDTk4OcnJykJqaitTUVLS1tUGj0SAyMhJPPfUUlixZgscee0zsUomIiOjRYZhEREQ0WG7duoWUlBRkZGQgIyMDeXl50Ov1cHFxQWhoKMLCwhAcHAx/f3829KZhr7y8HFevXkV2drb5e7qyshJyuRwBAQEICwtDWFgYIiMj4e3tLXa5RERENHgYJhEREQ2VtrY2XL58GZmZmcjIyEB6ejpu374NAHB0dERgYCD8/f3h7++PgIAA+Pn5QalUilw1jTWtra24du0a8vPzcfXqVVy9ehX5+fmoqakBAEyaNAlhYWEIDw9HWFgYnnjiCdja2opcNREREQ0hhklERERiqq+v7/ah/dtvv0VLSwukUim8vLzw+OOPw8fHB9OmTTM/Jk2axKly9MAEQcAPP/yA77//3vwoLi5GYWEhbty4AaPRCKVSCT8/PwQEBFiEnE5OTmKXT0REROJimERERDTcCIKAmzdvIj8/H9euXUNhYaH5A399fT0AwMbGxiJc8vb2hoeHBzw8PODp6ckVsgjt7e24ffs2SktLUVpaihs3bliER62trQAABwcH8/fR9OnTMXPmTAQEBMDLywtSqVTkqyAiIqJhiGESERHRSFJdXW0eRVJcXGwOBm7cuIGWlhbzfi4uLpg0aZI5YJo8eTI8PDzg7u4Od3d3uLi4cEWtEUyn06GqqgplZWW4e/cuSktLUVJSYg6O7ty5g8rKSvP+SqUS3t7e5tDIx8fHPNrNxcVFxCshIiKiEYhhEhER0WhRV1eHO3fudAsWSktLcfv2bVRUVODeH/sTJkyAq6sr3NzcoNFo4OrqiokTJ8LFxQUTJ06Es7MzHB0d4ejoyJFOQ6C9vR11dXWora1FbW0t7t69aw6MKisrUV5ejoqKClRWVqK6utriWI1GYw4OuwaIkyZN4tQ0IiIiepQYJhEREY0VHR0dKCsrQ3l5OaqqqrqFFRUVFebXdDqdxbE2NjZwdHSEk5OTOWAyPXdycoJarYZarYadnR2USiVUKhUcHBygVCphZ2cHOzs7ka566LS0tECr1aKlpQUNDQ1oaWkxb2toaEBjY6M5LLr3X9PDNO3MRKFQwMXFBRqNBm5ubhZhn2l0mUajgbu7O8aNGyfSVRMREdEYxDCJiIiIuquuru419Lj3YRpF09jYiMbGRhiNxl7f08HBwRw22dnZQSaTwd7e3vyaRCKBSqWCXC6HjY0NrK2toVAoLIIouVwOlUrV4/ubjumqo6OjW1Bj0tzcDIPBYH7e0tICvV6P9vZ2tLW1wWAwoLm5GQDM/apMx5iCI61Wa36tJxKJBA4ODlCr1b0Gcvc+N23j9DMiIiIaphgmERER0aPT2toKrVaL5ubmbqNz6uvrzc9bW1uh0+mg1WphNBrR2NgIAOZASqvVQqfTdQuC2tra0N7e3uO5m5qa0NnZ2W27VCqFWq3u8Rhra2uLKXy2trYYN24crKysoFQqLY5Vq9WQSqVQKpWwsrKCra2txSgs0wgspVKJ8ePHm5/b2to+8P0kIiIiGoYYJhERERERERERUb9d4nqvRERERERERETUbwyTiIiIiIiIiIio3xgmERERERERERFRv8kBfCF2EURERERERERENCIU/z8Y4RXEx4PfIAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%reset -s -f\n", - "import sys\n", - "import os\n", - "sys.path.append('..')\n", - "import gquant\n", - "from gquant.dataframe_flow import TaskGraph\n", - "import ipywidgets as widgets\n", - "import warnings\n", - "warnings.simplefilter(\"ignore\")\n", - "\n", - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/xgboost_trade.gq.yaml')\n", - "task_graph.draw(show='ipynb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The features used for XGBoost algorithm are prepared in the `xgboost` Task node, where `cuIndicator` module is used to compute the technical indicators in the GPU for all the stock symbols. `xgboost` is the Task node that is used to compute the trading signals from the stock technical indicators. Each of the gQuant Task node is implemented by overwriting `meta_setup`, `process`, `ports_setup`, `conf_chema` methods of the Node base class. Please refer to [customize nodes notebook](https://github.com/rapidsai/gQuant/blob/master/notebooks/05_customize_nodes.ipynb) for details. Following is the source code for \"XGBoostStrategyNode\":" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# define the function to format the plots\n", - "def plot_figures(o):\n", - " # format the figures\n", - " figure_width = '1200px'\n", - " figure_height = '400px'\n", - " sharpe_number = o['sharpe_ratio_trn.sharpe_out']\n", - " cum_return_train = o['cumulative_return_trn.cum_return']\n", - " cum_return_train.layout.height = figure_height\n", - " cum_return_train.layout.width = figure_width\n", - " cum_return_train.title = 'Training P & L %.3f' % (sharpe_number)\n", - " sharpe_number = o['sharpe_ratio_val.sharpe_out']\n", - " cum_return_test = o['cumulative_return_val.cum_return']\n", - " cum_return_test.layout.height = figure_height\n", - " cum_return_test.layout.width = figure_width\n", - " cum_return_test.title = 'Testing P & L %.3f' % (sharpe_number)\n", - " return widgets.VBox([cum_return_train, cum_return_test])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, we are going to add 5 fractional differencing signals from the closing prices " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "indicator_conf = {\n", - " \"indicators\": [\n", - " {\"function\": \"port_fractional_diff\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [0.5]\n", - " },\n", - " {\"function\": \"port_fractional_diff\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [0.3]\n", - " },\n", - " {\"function\": \"port_fractional_diff\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [0.1]\n", - " },\n", - " {\"function\": \"port_fractional_diff\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [0.7]\n", - " },\n", - " {\"function\": \"port_fractional_diff\",\n", - " \"columns\": [\"close\"],\n", - " \"args\": [0.9]\n", - " },\n", - " {\"function\": \"port_shift\",\n", - " \"columns\": [\"returns\"],\n", - " \"args\": [-1]\n", - " } \n", - " ],\n", - " \"remove_na\": True\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the backtest" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id:stock_data process time:4.121s\n", - "id:preprocess process time:1.224s\n", - "id:sort_after process time:0.049s\n", - "id:technical_indicator process time:0.906s\n", - "id:xgboost process time:2.382s\n", - "id:backtest process time:0.002s\n", - "id:train_df process time:0.152s\n", - "id:portfolio_opt_train process time:0.024s\n", - "id:sharpe_ratio_trn process time:0.001s\n", - "id:cumulative_return_trn process time:0.023s\n", - "id:validation_df process time:0.005s\n", - "id:portfolio_opt_validation process time:0.017s\n", - "id:sharpe_ratio_val process time:0.001s\n", - "id:cumulative_return_val process time:0.021s\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "f8d5c36efa0d416d813680cd601e0eaf", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(Figure(axes=[Axis(label='Cumulative return', orientation='vertical', scale=LinearScale()), Axis…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "replace_spec = {}\n", - "replace_spec['technical_indicator'] = {\"conf\": indicator_conf}\n", - "\n", - "o_gpu = task_graph.run(replace=replace_spec, profile=True)\n", - "\n", - "plot_figures(o_gpu)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We get Sharpe Ratio of `1.01` just from the fractional differencing signals of the closing prices\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To visualize the computed fractional differencing signals, we can make a TaskGraph to visualize it. We put the XGboost trade TaskGraph into a composite node. We select the asset with id `22123` and plot 4 fractional differencing signals with different `d` values. Check the updated graph below. Note, there are 2 layers of composite nodes in the following graph. As you can see, composite node is a powerful way of organizing the TaskGraphs. " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_graph = TaskGraph.load_taskgraph('../taskgraphs/visualize_frac_diff.gq.yaml')\n", - "task_graph.draw(show='ipynb')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "62f1268c0a7d40b9b486ee91867c3372", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "GQuantWidget(sub=HBox(), value=[OrderedDict([('id', 'stock_data'), ('type', 'CsvStockLoader'), ('conf', {'file…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7c637075d90e4b4ba525d75bede99d83", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Tab(children=(Output(), Output(layout=Layout(border='1px solid black'), outputs=({'output_type': 'stream', 'na…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "task_graph.run(formated=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can run the sub-graph just for plotting the signals." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note, smaller `d` value signal has more memory information but not as stationary as the high `d` value signals. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Conclusions\n", - "In this notebook, we demoed how to use Numba to implemement fractional differencing calculation in GPU. It achieves 100x speed up compared with the method done by Ensemble Capital. We also showed it is easy to use gQuant to compute fractional difference and run backtests" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'status': 'ok', 'restart': True}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import IPython\n", - "app = IPython.Application.instance()\n", - "app.kernel.do_shutdown(True)\n" - ] - }, - { - "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.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/task_example/cpu_port_trade.yaml b/task_example/cpu_port_trade.yaml deleted file mode 100644 index 4e81a3d2..00000000 --- a/task_example/cpu_port_trade.yaml +++ /dev/null @@ -1,143 +0,0 @@ -- id: node_cpu_csvdata - type: PandasCsvStockLoader - conf: - path: ./data/stock_price_hist.csv.gz - inputs: [] -- id: node_sort - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - node_cpu_csvdata -- id: node_addReturn - type: CpuReturnFeatureNode - conf: {} - inputs: - - node_sort -- id: node_addIndicator - type: CpuAssetIndicatorNode - conf: {} - inputs: - - node_addReturn -- id: node_volumeMean - type: AverageNode - conf: - column: volume - inputs: - - node_addIndicator -- id: node_renameMeanVolume - type: RenameNode - conf: - old: volume - new: volume_mean - inputs: - - node_volumeMean -- id: node_leftMergeMeanVolume - type: LeftMergeNode - conf: - column: asset - inputs: - - node_addIndicator - - node_renameMeanVolume -- id: node_maxReturns - type: MaxNode - conf: - column: returns - inputs: - - node_addIndicator -- id: node_renameMaxReturn - type: RenameNode - conf: - old: returns - new: returns_max - inputs: - - node_maxReturns -- id: node_leftMergeMaxReturn - type: LeftMergeNode - conf: - column: asset - inputs: - - node_leftMergeMeanVolume - - node_renameMaxReturn -- id: node_minReturns - type: MinNode - conf: - column: returns - inputs: - - node_addIndicator -- id: node_renameMinReturn - type: RenameNode - conf: - old: returns - new: returns_min - inputs: - - node_minReturns -- id: node_leftMergeMinReturn - type: LeftMergeNode - conf: - column: asset - inputs: - - node_leftMergeMaxReturn - - node_renameMinReturn -- id: node_filterValue - type: ValueFilterNode - conf: - - column: volume_mean - min: 10.0 - - column: returns_max - max: 10.0 - - column: returns_min - min: -10.0 - inputs: - - node_leftMergeMinReturn -- id: node_dropColumns - type: DropNode - conf: - columns: - - volume_mean - - returns_min - - returns_max - - open - - high - - low - - volume - inputs: - - node_filterValue -- id: node_sort2 - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - node_dropColumns -- id: node_exp_strategy - type: CpuPortExpMovingAverageStrategyNode - conf: - fast: 5 - slow: 20 - inputs: - - node_sort2 -- id: node_backtest - type: SimpleBackTestNode - conf: {} - inputs: - - node_exp_strategy -- id: node_portfolioOpt - type: SimpleAveragePortOpt - conf: {} - inputs: - - node_backtest -- id: node_sharpeRatio - type: SharpeRatioNode - conf: {} - inputs: - - node_portfolioOpt -- id: node_cumlativeReturn - type: CumReturnNode - conf: {'points': 300} - inputs: - - node_portfolioOpt - diff --git a/task_example/dask_port_trade.yaml b/task_example/dask_port_trade.yaml deleted file mode 100644 index b424efd0..00000000 --- a/task_example/dask_port_trade.yaml +++ /dev/null @@ -1,143 +0,0 @@ -- id: node_dask_csvdata - type: DaskCsvStockLoader - conf: - path: many-small - inputs: [] -- id: node_sort - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - node_dask_csvdata -- id: node_addReturn - type: ReturnFeatureNode - conf: {} - inputs: - - node_sort -- id: node_addIndicator - type: AssetIndicatorNode - conf: {} - inputs: - - node_addReturn -- id: node_volumeMean - type: AverageNode - conf: - column: volume - inputs: - - node_addIndicator -- id: node_renameMeanVolume - type: RenameNode - conf: - old: volume - new: volume_mean - inputs: - - node_volumeMean -- id: node_leftMergeMeanVolume - type: LeftMergeNode - conf: - column: asset - inputs: - - node_addIndicator - - node_renameMeanVolume -- id: node_maxReturns - type: MaxNode - conf: - column: returns - inputs: - - node_addIndicator -- id: node_renameMaxReturn - type: RenameNode - conf: - old: returns - new: returns_max - inputs: - - node_maxReturns -- id: node_leftMergeMaxReturn - type: LeftMergeNode - conf: - column: asset - inputs: - - node_leftMergeMeanVolume - - node_renameMaxReturn -- id: node_minReturns - type: MinNode - conf: - column: returns - inputs: - - node_addIndicator -- id: node_renameMinReturn - type: RenameNode - conf: - old: returns - new: returns_min - inputs: - - node_minReturns -- id: node_leftMergeMinReturn - type: LeftMergeNode - conf: - column: asset - inputs: - - node_leftMergeMaxReturn - - node_renameMinReturn -- id: node_filterValue - type: ValueFilterNode - conf: - - column: volume_mean - min: 200.0 - - column: returns_max - max: 10.0 - - column: returns_min - min: -10.0 - inputs: - - node_leftMergeMinReturn -- id: node_dropColumns - type: DropNode - conf: - columns: - - volume_mean - - returns_min - - returns_max - - open - - high - - low - - volume - inputs: - - node_filterValue -- id: node_sort2 - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - node_dropColumns -- id: node_exp_strategy - type: PortExpMovingAverageStrategyNode - conf: - fast: 5 - slow: 20 - inputs: - - node_sort2 -- id: node_backtest - type: SimpleBackTestNode - conf: {} - inputs: - - node_exp_strategy -- id: node_portfolioOpt - type: SimpleAveragePortOpt - conf: {} - inputs: - - node_backtest -- id: node_sharpeRatio - type: SharpeRatioNode - conf: {} - inputs: - - node_portfolioOpt -- id: node_cumlativeReturn - type: CumReturnNode - conf: {'points': 300} - inputs: - - node_portfolioOpt - diff --git a/task_example/dask_task.yaml b/task_example/dask_task.yaml deleted file mode 100644 index 7a2494a1..00000000 --- a/task_example/dask_task.yaml +++ /dev/null @@ -1,31 +0,0 @@ -- id: node_csvdata_dask - type: DaskCsvStockLoader - conf: - path: many-small - inputs: [] -- id: node_minVolume - type: VolumeFilterNode - conf: - min: 50.0 - inputs: - - node_csvdata_dask -- id: node_sort - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - node_minVolume -- id: node_volumeMean - type: AverageNode - conf: - column: volume - inputs: - - node_sort -- id: node_outputCsv - type: OutCsvNode - conf: - path: symbol_volume.csv - inputs: - - node_volumeMean diff --git a/task_example/port_trade.yaml b/task_example/port_trade.yaml deleted file mode 100644 index b27a81e5..00000000 --- a/task_example/port_trade.yaml +++ /dev/null @@ -1,142 +0,0 @@ -- id: load_csv_data - type: CsvStockLoader - conf: - path: ./data/stock_price_hist.csv.gz - inputs: [] -- id: sort - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - load_csv_data -- id: add_return - type: ReturnFeatureNode - conf: {} - inputs: - - sort -- id: add_indicator - type: AssetIndicatorNode - conf: {} - inputs: - - add_return -- id: volume_mean - type: AverageNode - conf: - column: volume - inputs: - - add_indicator -- id: rename_mean_volume - type: RenameNode - conf: - old: volume - new: volume_mean - inputs: - - volume_mean -- id: left_merge_mean_volume - type: LeftMergeNode - conf: - column: asset - inputs: - - add_indicator - - rename_mean_volume -- id: max_returns - type: MaxNode - conf: - column: returns - inputs: - - add_indicator -- id: rename_max_return - type: RenameNode - conf: - old: returns - new: returns_max - inputs: - - max_returns -- id: left_merge_max_return - type: LeftMergeNode - conf: - column: asset - inputs: - - left_merge_mean_volume - - rename_max_return -- id: min_returns - type: MinNode - conf: - column: returns - inputs: - - add_indicator -- id: rename_min_return - type: RenameNode - conf: - old: returns - new: returns_min - inputs: - - min_returns -- id: left_merge_min_return - type: LeftMergeNode - conf: - column: asset - inputs: - - left_merge_max_return - - rename_min_return -- id: filter_value - type: ValueFilterNode - conf: - - column: volume_mean - min: 10.0 - - column: returns_max - max: 10.0 - - column: returns_min - min: -10.0 - inputs: - - left_merge_min_return -- id: drop_columns - type: DropNode - conf: - columns: - - volume_mean - - returns_min - - returns_max - - open - - high - - low - - volume - inputs: - - filter_value -- id: sort_2 - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - drop_columns -- id: exp_strategy - type: PortExpMovingAverageStrategyNode - conf: - fast: 5 - slow: 20 - inputs: - - sort_2 -- id: backtest - type: SimpleBackTestNode - conf: {} - inputs: - - exp_strategy -- id: portfolio_opt - type: SimpleAveragePortOpt - conf: {} - inputs: - - backtest -- id: sharpe_ratio - type: SharpeRatioNode - conf: {} - inputs: - - portfolio_opt -- id: cumlative_return - type: CumReturnNode - conf: {'points': 300} - inputs: - - portfolio_opt \ No newline at end of file diff --git a/task_example/simple_task.yaml b/task_example/simple_task.yaml deleted file mode 100644 index 6e5f7ae3..00000000 --- a/task_example/simple_task.yaml +++ /dev/null @@ -1,67 +0,0 @@ -- id: node_csvdata - type: CsvStockLoader - conf: - path: ./data/stock_price_hist.csv.gz - inputs: [] -- id: node_minVolume - type: VolumeFilterNode - conf: - min: 50.0 - inputs: - - node_csvdata -- id: node_sort - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - node_minVolume -- id: node_addReturn - type: ReturnFeatureNode - conf: {} - inputs: - - node_sort -- id: node_stockSymbol - type: StockNameLoader - conf: - path: ./data/security_master.csv.gz - inputs: [] -- id: node_volumeMean - type: AverageNode - conf: - column: volume - inputs: - - node_addReturn -- id: node_leftMerge1 - type: LeftMergeNode - conf: - column: asset - inputs: - - node_volumeMean - - node_stockSymbol -- id: node_returnMean - type: AverageNode - conf: - column: returns - inputs: - - node_addReturn -- id: node_leftMerge2 - type: LeftMergeNode - conf: - column: asset - inputs: - - node_returnMean - - node_stockSymbol -- id: node_outputCsv1 - type: OutCsvNode - conf: - path: symbol_volume.csv - inputs: - - node_leftMerge1 -- id: node_outputCsv2 - type: OutCsvNode - conf: - path: symbol_returns.csv - inputs: - - node_leftMerge2 diff --git a/task_example/simple_trade.yaml b/task_example/simple_trade.yaml deleted file mode 100644 index 32e63581..00000000 --- a/task_example/simple_trade.yaml +++ /dev/null @@ -1,65 +0,0 @@ -- id: load_csv_data - type: CsvStockLoader - conf: - path: ./data/stock_price_hist.csv.gz - inputs: [] -- id: node_assetFilter - type: AssetFilterNode - conf: - asset: 22123 - inputs: - - load_csv_data -- id: node_sort - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - node_assetFilter -- id: node_addReturn - type: ReturnFeatureNode - conf: {} - inputs: - - node_sort -- id: node_ma_strategy - type: MovingAverageStrategyNode - conf: - fast: 5 - slow: 10 - inputs: - - node_addReturn -- id: node_backtest - type: SimpleBackTestNode - conf: {} - inputs: - - node_ma_strategy -- id: node_sharpeRatio - type: SharpeRatioNode - conf: {} - inputs: - - node_backtest -- id: node_cumlativeReturn - type: CumReturnNode - conf: {'points': 300} - inputs: - - node_backtest -- id: node_barplot - type: BarPlotNode - conf: {'points': 300} - inputs: - - node_backtest -- id: node_lineplot - type: LinePlotNode - conf: - points: 300 - lines: - - column: ma_slow - label: Slow - color: blue - - column: ma_fast - label: Fast - color: green - title: Signals - inputs: - - node_backtest diff --git a/task_example/xgboost_trade.yaml b/task_example/xgboost_trade.yaml deleted file mode 100644 index 1f1212e5..00000000 --- a/task_example/xgboost_trade.yaml +++ /dev/null @@ -1,206 +0,0 @@ -- id: node_csvdata - type: CsvStockLoader - conf: - path: ./data/stock_price_hist.csv.gz - inputs: [] -- id: node_sort - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - node_csvdata -- id: node_addReturn - type: ReturnFeatureNode - conf: {} - inputs: - - node_sort -- id: node_addIndicator - type: AssetIndicatorNode - conf: {} - inputs: - - node_addReturn -- id: node_volumeMean - type: AverageNode - conf: - column: volume - inputs: - - node_addIndicator -- id: node_renameMeanVolume - type: RenameNode - conf: - old: volume - new: volume_mean - inputs: - - node_volumeMean -- id: node_leftMergeMeanVolume - type: LeftMergeNode - conf: - column: asset - inputs: - - node_addIndicator - - node_renameMeanVolume -- id: node_maxReturns - type: MaxNode - conf: - column: returns - inputs: - - node_addIndicator -- id: node_renameMaxReturn - type: RenameNode - conf: - old: returns - new: returns_max - inputs: - - node_maxReturns -- id: node_leftMergeMaxReturn - type: LeftMergeNode - conf: - column: asset - inputs: - - node_leftMergeMeanVolume - - node_renameMaxReturn -- id: node_minReturns - type: MinNode - conf: - column: returns - inputs: - - node_addIndicator -- id: node_renameMinReturn - type: RenameNode - conf: - old: returns - new: returns_min - inputs: - - node_minReturns -- id: node_leftMergeMinReturn - type: LeftMergeNode - conf: - column: asset - inputs: - - node_leftMergeMaxReturn - - node_renameMinReturn -- id: node_filterValue - type: ValueFilterNode - conf: - - column: volume_mean - min: 10.0 - - column: returns_max - max: 10.0 - - column: returns_min - min: -10.0 - inputs: - - node_leftMergeMinReturn -- id: node_dropColumns - type: DropNode - conf: - columns: - - volume_mean - - returns_min - - returns_max - inputs: - - node_filterValue -- id: node_sort2 - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - - node_dropColumns -- id: node_technical_indicator - type: IndicatorNode - conf: - indicators: - - function: port_chaikin_oscillator - columns: - - high - - low - - close - - volume - args: - - 10 - - 20 - - function: port_bollinger_bands - columns: - - close - args: - - 10 - outputs: - - b1 - - b2 - - function: port_shift - columns: - - returns - args: - - -1 - remove_na: true - inputs: - - node_sort2 -- id: node_xgboost_strategy - type: XGBoostStrategyNode - conf: - train_date: 2010-1-1 - target: SHIFT_-1 - no_feature: - asset: int64 - datetime: date - volume: float64 - close: float64 - open: float64 - high: float64 - low: float64 - returns: float64 - indicator: int32 - inputs: - - node_technical_indicator -- id: node_backtest - type: SimpleBackTestNode - conf: {} - inputs: - - node_xgboost_strategy -- id: node_training_df - type: DatetimeFilterNode - conf: - beg: 1900-1-1 - end: 2010-1-1 - inputs: - - node_backtest -- id: node_portOpt2 - type: SimpleAveragePortOpt - conf: {} - inputs: - - node_training_df -- id: node_sharpe_training - type: SharpeRatioNode - conf: {} - inputs: - - node_portOpt2 -- id: node_testing_df - type: DatetimeFilterNode - conf: - beg: 2010-1-1 - end: 2020-1-1 - inputs: - - node_backtest -- id: node_portOpt1 - type: SimpleAveragePortOpt - conf: {} - inputs: - - node_testing_df -- id: node_sharpe_testing - type: SharpeRatioNode - conf: {} - inputs: - - node_portOpt1 -- id: node_cumlativeReturn_testing - type: CumReturnNode - conf: {'points': 300} - inputs: - - node_portOpt1 -- id: node_cumlativeReturn_training - type: CumReturnNode - conf: {'points': 300} - inputs: - - node_portOpt2 diff --git a/taskgraphs/dask_tutorial.gq.yaml b/taskgraphs/dask_tutorial.gq.yaml deleted file mode 100644 index 30648726..00000000 --- a/taskgraphs/dask_tutorial.gq.yaml +++ /dev/null @@ -1,35 +0,0 @@ -- id: stock_data - type: CsvStockLoader - conf: - file: /home/quant/gQuant/notebooks/data/stock_price_hist.csv.gz - path: /home/quant/gQuant/notebooks/many-small - inputs: {} - module: rapids_modules -- id: sort_node - type: SortNode - conf: - keys: - - asset - - datetime - inputs: - in: stock_data.dask_cudf_out - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} - inputs: - in1: output_csv.df_out -- id: average_volume - type: AverageNode - conf: - column: volume - inputs: - stock_in: sort_node.out - module: rapids_modules -- id: output_csv - type: OutCsvNode - conf: - path: /home/quant/gQuant/notebooks/dask_average_volume.csv - inputs: - df_in: average_volume.stock_out - module: rapids_modules diff --git a/taskgraphs/visualize_frac_diff.gq.yaml b/taskgraphs/visualize_frac_diff.gq.yaml deleted file mode 100644 index ac58e2df..00000000 --- a/taskgraphs/visualize_frac_diff.gq.yaml +++ /dev/null @@ -1,113 +0,0 @@ -- id: stock_data - type: CsvStockLoader - conf: - file: notebooks/data/stock_price_hist.csv.gz - path: notebooks/many-small - inputs: {} - module: rapids_modules -- id: asset_filter - type: AssetFilterNode - conf: - asset: 22123 - inputs: - stock_in: xgboost_graph.technical_indicator@stock_out - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} - inputs: - in1: lineplot.lineplot -- id: lineplot - type: LinePlotNode - conf: - lines: - - column: FR_DI_0.1 - label: d 0.1 - color: blue - - column: FR_DI_0.3 - label: d 0.3 - color: orange - - column: FR_DI_0.5 - label: d 0.5 - color: green - - column: FR_DI_0.7 - label: d 0.7 - color: black - points: 300 - title: signals - inputs: - in: asset_filter.stock_out - module: rapids_modules -- id: xgboost_graph - type: CompositeNode - conf: - input: - - preprocess.sort_node@in - output: - - technical_indicator.stock_out - subnode_ids: - - preprocess - - technical_indicator - subnodes_conf: - preprocess: - conf: - input: - - sort_node.in - output: - - drop_columns.out - subnode_ids: - - value_filter - - drop_columns - subnodes_conf: - value_filter: - conf: - - column: average_volume - min: 400 - - column: min_return - min: -10 - - column: max_return - max: 10 - drop_columns: - conf: - columns: - - average_volume - - min_return - - max_return - taskgraph: taskgraphs/preprocess.gq.yaml - technical_indicator: - conf: - indicators: - - function: port_fractional_diff - args: - - 0.9 - columns: - - close - - function: port_fractional_diff - args: - - 0.7 - columns: - - close - - function: port_fractional_diff - args: - - 0.5 - columns: - - close - - function: port_fractional_diff - args: - - 0.3 - columns: - - close - - function: port_fractional_diff - args: - - 0.1 - columns: - - close - - function: port_shift - args: - - -1 - columns: - - returns - remove_na: true - taskgraph: taskgraphs/xgboost_trade.gq.yaml - inputs: - preprocess@sort_node@in: stock_data.cudf_out diff --git a/taskgraphs/xgboost_example/stock_data.gq.yaml b/taskgraphs/xgboost_example/stock_data.gq.yaml deleted file mode 100644 index 521361b2..00000000 --- a/taskgraphs/xgboost_example/stock_data.gq.yaml +++ /dev/null @@ -1,229 +0,0 @@ -- id: stock_data - type: CsvStockLoader - conf: - file: notebooks/data/stock_price_hist.csv.gz - path: notebooks/many-small - inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} - inputs: - in1: drop_col.out -- id: stock_feature - type: CompositeNode - conf: - input: - - preprocess.sort_node@in - output: - - technical_indicator.stock_out - subnode_ids: - - technical_indicator - subnodes_conf: - technical_indicator: - conf: - indicators: - - function: port_bollinger_bands - args: - - 10 - columns: - - close - - function: port_chaikin_oscillator - args: - - 2 - - 3 - columns: - - high - - low - - close - - volume - - function: port_macd - args: - - 2 - - 3 - columns: - - close - - function: port_relative_strength_index - args: - - 2 - columns: - - high - - low - - function: port_average_true_range - args: - - 2 - columns: - - high - - low - - close - - function: port_stochastic_oscillator_k - args: - - 2 - columns: - - high - - low - - close - - function: port_stochastic_oscillator_d - args: - - 2 - columns: - - high - - low - - close - - function: port_money_flow_index - args: - - 2 - columns: - - high - - low - - close - - volume - - function: port_force_index - args: - - 2 - columns: - - close - - volume - - function: port_ultimate_oscillator - args: - - 2 - columns: - - high - - low - - close - - function: port_accumulation_distribution - args: - - 2 - columns: - - high - - low - - close - - volume - - function: port_commodity_channel_index - args: - - 2 - columns: - - high - - low - - close - - function: port_on_balance_volume - args: - - 2 - columns: - - close - - volume - - function: port_vortex_indicator - args: - - 2 - columns: - - high - - low - - close - - function: port_kst_oscillator - args: - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - - 9 - - 10 - columns: - - close - - function: port_mass_index - args: - - 2 - - 3 - columns: - - high - - low - - function: port_true_strength_index - args: - - 2 - - 3 - columns: - - close - - function: port_ease_of_movement - args: - - 2 - columns: - - high - - low - - volume - - function: port_coppock_curve - args: - - 2 - columns: - - close - - function: port_keltner_channel - args: - - 2 - columns: - - high - - low - - close - - function: port_ppsr - args: - - 2 - columns: - - high - - low - - close - - function: port_fractional_diff - args: - - 0.9 - columns: - - close - - function: port_fractional_diff - args: - - 0.7 - columns: - - close - - function: port_fractional_diff - args: - - 0.5 - columns: - - close - - function: port_fractional_diff - args: - - 0.3 - columns: - - close - - function: port_fractional_diff - args: - - 0.1 - columns: - - close - - function: port_shift - args: - - -1 - columns: - - returns - remove_na: true - taskgraph: taskgraphs/xgboost_trade.gq.yaml - inputs: - preprocess@sort_node@in: stock_data.cudf_out -- id: pos_neg_return - type: AddSignIndicatorNode - conf: - sign: sign - column: SHIFT_-1 - inputs: - in: stock_feature.technical_indicator@stock_out - module: rapids_modules -- id: drop_col - type: DropNode - conf: - columns: - - indicator - - datetime - - asset - - SHIFT_-1 - - open - - high - - low - - close - inputs: - in: pos_neg_return.out - module: rapids_modules diff --git a/taskgraphs/xgboost_example/xgboost_stock.gq.yaml b/taskgraphs/xgboost_example/xgboost_stock.gq.yaml deleted file mode 100644 index 788ff956..00000000 --- a/taskgraphs/xgboost_example/xgboost_stock.gq.yaml +++ /dev/null @@ -1,300 +0,0 @@ -- id: stock_data - type: CsvStockLoader - conf: - file: notebooks/data/stock_price_hist.csv.gz - path: notebooks/many-small - inputs: {} - module: rapids_modules -- id: "" - type: Output_Collector - conf: {} - inputs: - in1: test_roc.roc_curve - in2: train_roc.roc_curve - in3: feature_importance.importance_curve - in4: xgboost_model.train_xgboost@model_out -- id: stock_feature - type: CompositeNode - conf: - input: - - preprocess.sort_node@in - output: - - technical_indicator.stock_out - subnode_ids: - - technical_indicator - subnodes_conf: - technical_indicator: - conf: - indicators: - - function: port_bollinger_bands - args: - - 10 - columns: - - close - - function: port_chaikin_oscillator - args: - - 2 - - 3 - columns: - - high - - low - - close - - volume - - function: port_macd - args: - - 2 - - 3 - columns: - - close - - function: port_relative_strength_index - args: - - 2 - columns: - - high - - low - - function: port_average_true_range - args: - - 2 - columns: - - high - - low - - close - - function: port_stochastic_oscillator_k - args: - - 2 - columns: - - high - - low - - close - - function: port_stochastic_oscillator_d - args: - - 2 - columns: - - high - - low - - close - - function: port_money_flow_index - args: - - 2 - columns: - - high - - low - - close - - volume - - function: port_force_index - args: - - 2 - columns: - - close - - volume - - function: port_ultimate_oscillator - args: - - 2 - columns: - - high - - low - - close - - function: port_accumulation_distribution - args: - - 2 - columns: - - high - - low - - close - - volume - - function: port_commodity_channel_index - args: - - 2 - columns: - - high - - low - - close - - function: port_on_balance_volume - args: - - 2 - columns: - - close - - volume - - function: port_vortex_indicator - args: - - 2 - columns: - - high - - low - - close - - function: port_kst_oscillator - args: - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - - 9 - - 10 - columns: - - close - - function: port_mass_index - args: - - 2 - - 3 - columns: - - high - - low - - function: port_true_strength_index - args: - - 2 - - 3 - columns: - - close - - function: port_ease_of_movement - args: - - 2 - columns: - - high - - low - - volume - - function: port_coppock_curve - args: - - 2 - columns: - - close - - function: port_keltner_channel - args: - - 2 - columns: - - high - - low - - close - - function: port_ppsr - args: - - 2 - columns: - - high - - low - - close - - function: port_fractional_diff - args: - - 0.9 - columns: - - close - - function: port_fractional_diff - args: - - 0.7 - columns: - - close - - function: port_fractional_diff - args: - - 0.5 - columns: - - close - - function: port_fractional_diff - args: - - 0.3 - columns: - - close - - function: port_fractional_diff - args: - - 0.1 - columns: - - close - - function: port_shift - args: - - -1 - columns: - - returns - remove_na: true - taskgraph: taskgraphs/xgboost_trade.gq.yaml - inputs: - preprocess@sort_node@in: stock_data.dask_cudf_out -- id: pos_neg_return - type: AddSignIndicatorNode - conf: - sign: sign - column: SHIFT_-1 - inputs: - in: stock_feature.technical_indicator@stock_out - module: rapids_modules -- id: drop_col - type: DropNode - conf: - columns: - - indicator - - datetime - - asset - - SHIFT_-1 - - open - - high - - low - - close - inputs: - in: pos_neg_return.out - module: rapids_modules -- id: split_data - type: DataSplittingNode - conf: - train_size: 0.8 - target: sign - inputs: - in: drop_col.out - module: rapids_modules -- id: xgboost_model - type: CustXGBoostNode - conf: - train_norm: - conf: - columns: - - sign - include: false - train_xgboost: - conf: - num_of_rounds: 100 - columns: - - sign - include: false - xgboost_parameters: - eta: 0.3 - min_child_weight: 1 - subsample: 1 - sampling_method: uniform - colsample_bytree: 1 - colsample_bylevel: 1 - colsample_bynode: 1 - max_depth: 8 - max_leaves: 256 - grow_policy: depthwise - gamma: 0 - lambda: 1 - alpha: 0 - tree_method: gpu_hist - single_precision_histogram: false - deterministic_histogram: false - objective: binary:logistic - target: sign - inputs: - test_norm@df_in: split_data.test - train_norm@df_in: split_data.train - module: my_node -- id: train_roc - type: RocCurveNode - conf: - label: sign - prediction: predict - inputs: - in: xgboost_model.train_infer@out - module: rapids_modules -- id: test_roc - type: RocCurveNode - conf: - label: sign - prediction: predict - inputs: - in: xgboost_model.test_infer@out - module: rapids_modules -- id: feature_importance - type: ImportanceCurveNode - conf: - type: gain - inputs: - in: xgboost_model.train_xgboost@model_out - module: rapids_modules diff --git a/taskgraphs/xgboost_example/xgboost_stock_hpo.gq.yaml b/taskgraphs/xgboost_example/xgboost_stock_hpo.gq.yaml deleted file mode 100644 index 2712ec61..00000000 --- a/taskgraphs/xgboost_example/xgboost_stock_hpo.gq.yaml +++ /dev/null @@ -1,382 +0,0 @@ -- id: "" - type: Output_Collector - conf: {} - inputs: - in1: xgboost_model.train_roc@roc_curve - in2: xgboost_model.test_roc@roc_curve - in3: hpo.conf_out - in4: hpo.train_roc@roc_curve - in5: hpo.test_roc@roc_curve -- id: xgboost_model - type: ContextCompositeNode - conf: - input: - - train_norm.df_in - - test_norm.df_in - output: - - train_infer.out - - test_infer.out - - train_roc.roc_curve - - test_roc.roc_curve - context: - target: - type: string - value: sign - map: - - node_id: train_xgboost - xpath: train_xgboost.conf.target - - node_id: train_roc - xpath: train_roc.conf.label - - node_id: test_roc - xpath: test_roc.conf.label - features: - type: array_string - value: - - sign - map: - - node_id: train_norm - xpath: train_norm.conf.columns - - node_id: train_xgboost - xpath: train_xgboost.conf.columns - inclusive: - type: boolean - map: - - node_id: train_norm - xpath: train_norm.conf.include - - node_id: train_xgboost - xpath: train_xgboost.conf.include - value: false - depth: - type: number - value: 1 - map: - - node_id: train_xgboost - xpath: train_xgboost.conf.xgboost_parameters.max_depth - eta: - type: number - value: 0.1 - map: - - node_id: train_xgboost - xpath: train_xgboost.conf.xgboost_parameters.eta - subnodes_conf: {} - taskgraph: taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml - inputs: - train_norm@df_in: split_data.train - test_norm@df_in: split_data.test -- id: hpo - type: GridRandomSearchNode - conf: - parameters: - - search: - function: grid_search - args: - - 1 - - 3 - - 5 - name: depth - - search: - function: uniform - args: - - 0.1 - - 0.8 - name: eta - metrics: - - train_roc.value - - test_roc.value - best: - mode: max - metric: test_roc.value - tune: - local_dir: ./ray - name: stock - num_samples: 1 - resources_per_trial: - cpu: 1 - gpu: 1 - input: - - train_norm.df_in - - test_norm.df_in - output: - - train_infer.out - - test_infer.out - - train_roc.roc_curve - - test_roc.roc_curve - context: - target: - type: string - value: sign - map: - - node_id: train_xgboost - xpath: train_xgboost.conf.target - - node_id: train_roc - xpath: train_roc.conf.label - - node_id: test_roc - xpath: test_roc.conf.label - features: - type: array_string - value: - - sign - map: - - node_id: train_norm - xpath: train_norm.conf.columns - - node_id: train_xgboost - xpath: train_xgboost.conf.columns - inclusive: - type: boolean - map: - - node_id: train_norm - xpath: train_norm.conf.include - - node_id: train_xgboost - xpath: train_xgboost.conf.include - value: false - depth: - type: number - value: 1 - map: - - node_id: train_xgboost - xpath: train_xgboost.conf.xgboost_parameters.max_depth - eta: - type: number - value: 0.1 - map: - - node_id: train_xgboost - xpath: train_xgboost.conf.xgboost_parameters.eta - subnodes_conf: {} - taskgraph: taskgraphs/xgboost_example/xgboost_model_with_metrics.gq.yaml - inputs: - conf_in: xgboost_model.conf_out - train_norm@df_in: split_data.train - test_norm@df_in: split_data.test - module: rapids_modules -- id: stock_data - type: CsvStockLoader - conf: - file: notebooks/data/stock_price_hist.csv.gz - path: notebooks/many-small - inputs: {} - module: rapids_modules -- id: stock_feature - type: CompositeNode - conf: - input: - - preprocess.sort_node@in - output: - - technical_indicator.stock_out - subnode_ids: - - technical_indicator - subnodes_conf: - technical_indicator: - conf: - indicators: - - function: port_bollinger_bands - args: - - 10 - columns: - - close - - function: port_chaikin_oscillator - args: - - 2 - - 3 - columns: - - high - - low - - close - - volume - - function: port_macd - args: - - 2 - - 3 - columns: - - close - - function: port_relative_strength_index - args: - - 2 - columns: - - high - - low - - function: port_average_true_range - args: - - 2 - columns: - - high - - low - - close - - function: port_stochastic_oscillator_k - args: - - 2 - columns: - - high - - low - - close - - function: port_stochastic_oscillator_d - args: - - 2 - columns: - - high - - low - - close - - function: port_money_flow_index - args: - - 2 - columns: - - high - - low - - close - - volume - - function: port_force_index - args: - - 2 - columns: - - close - - volume - - function: port_ultimate_oscillator - args: - - 2 - columns: - - high - - low - - close - - function: port_accumulation_distribution - args: - - 2 - columns: - - high - - low - - close - - volume - - function: port_commodity_channel_index - args: - - 2 - columns: - - high - - low - - close - - function: port_on_balance_volume - args: - - 2 - columns: - - close - - volume - - function: port_vortex_indicator - args: - - 2 - columns: - - high - - low - - close - - function: port_kst_oscillator - args: - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - - 9 - - 10 - columns: - - close - - function: port_mass_index - args: - - 2 - - 3 - columns: - - high - - low - - function: port_true_strength_index - args: - - 2 - - 3 - columns: - - close - - function: port_ease_of_movement - args: - - 2 - columns: - - high - - low - - volume - - function: port_coppock_curve - args: - - 2 - columns: - - close - - function: port_keltner_channel - args: - - 2 - columns: - - high - - low - - close - - function: port_ppsr - args: - - 2 - columns: - - high - - low - - close - - function: port_fractional_diff - args: - - 0.9 - columns: - - close - - function: port_fractional_diff - args: - - 0.7 - columns: - - close - - function: port_fractional_diff - args: - - 0.5 - columns: - - close - - function: port_fractional_diff - args: - - 0.3 - columns: - - close - - function: port_fractional_diff - args: - - 0.1 - columns: - - close - - function: port_shift - args: - - -1 - columns: - - returns - remove_na: true - taskgraph: taskgraphs/xgboost_trade.gq.yaml - inputs: - preprocess@sort_node@in: stock_data.cudf_out -- id: pos_neg_return - type: AddSignIndicatorNode - conf: - sign: sign - column: SHIFT_-1 - inputs: - in: stock_feature.technical_indicator@stock_out - module: rapids_modules -- id: drop_col - type: DropNode - conf: - columns: - - indicator - - datetime - - asset - - SHIFT_-1 - - open - - high - - low - - close - inputs: - in: pos_neg_return.out - module: rapids_modules -- id: split_data - type: DataSplittingNode - conf: - train_size: 0.8 - target: sign - inputs: - in: drop_col.out - module: rapids_modules diff --git a/tests/unit/custom_port_nodes.py b/tests/unit/custom_port_nodes.py deleted file mode 100644 index d62e7395..00000000 --- a/tests/unit/custom_port_nodes.py +++ /dev/null @@ -1,491 +0,0 @@ -import math -import numpy as np -from numba import cuda -import cupy -import cudf -import dask_cudf -import dask -import rmm -from gquant.dataframe_flow import Node, MetaData -from gquant.dataframe_flow import NodePorts, PortsSpecSchema -from gquant.dataframe_flow import ConfSchema -import copy -import os -from gquant.dataframe_flow.task import load_modules -load_modules(os.getenv('MODULEPATH')+'/rapids_modules/') -from rapids_modules._port_type_node import _PortTypesMixin -import rapids_modules.cuindicator as gi - - -class PointNode(_PortTypesMixin, Node): - - def ports_setup(self): - input_ports = {} - output_ports = { - 'points_df_out': { - PortsSpecSchema.port_type: cudf.DataFrame - }, - 'points_ddf_out': { - PortsSpecSchema.port_type: dask_cudf.DataFrame - }, - } - return NodePorts(inports=input_ports, outports=output_ports) - - def conf_schema(self): - json = { - "title": "PointNode configure", - "type": "object", - "properties": { - "npts": { - "type": "number", - "description": "number of data points", - "minimum": 10 - }, - "npartitions": { - "type": "number", - "description": "num of partitions in the Dask dataframe", - "minimum": 1 - } - - }, - "required": ["npts", "npartitions"], - } - - ui = { - "npts": {"ui:widget": "updown"}, - "npartitions": {"ui:widget": "updown"} - } - return ConfSchema(json=json, ui=ui) - - def init(self): - pass - - def meta_setup(self): - columns_out = { - 'points_df_out': { - 'x': 'float64', - 'y': 'float64' - }, - 'points_ddf_out': { - 'x': 'float64', - 'y': 'float64' - } - } - return MetaData(inports={}, outports=columns_out) - - def process(self, inputs): - npts = self.conf['npts'] - seed = self.conf.get('nseed') - if seed is not None: - np.random.seed(seed) - df = cudf.DataFrame() - df['x'] = np.random.rand(npts) - df['y'] = np.random.rand(npts) - output = {} - if self.outport_connected('points_df_out'): - output.update({'points_df_out': df}) - if self.outport_connected('points_ddf_out'): - npartitions = self.conf['npartitions'] - ddf = dask_cudf.from_cudf(df, npartitions=npartitions) - output.update({'points_ddf_out': ddf}) - return output - - -class DistanceNode(_PortTypesMixin, Node): - - def ports_setup(self): - port_type = PortsSpecSchema.port_type - input_ports = { - 'points_df_in': { - port_type: [cudf.DataFrame, dask_cudf.DataFrame] - } - } - - output_ports = { - 'distance_df': { - port_type: [cudf.DataFrame, dask_cudf.DataFrame] - }, - 'distance_abs_df': { - PortsSpecSchema.port_type: [cudf.DataFrame, dask_cudf.DataFrame] - } - } - input_connections = self.get_connected_inports() - if 'points_df_in' in input_connections: - types = input_connections['points_df_in'] - # connected, use the types passed in from parent - return NodePorts(inports={'points_df_in': {port_type: types}}, - outports={'distance_df': {port_type: types}, - 'distance_abs_df': {port_type: types}, - }) - else: - return NodePorts(inports=input_ports, outports=output_ports) - - def conf_schema(self): - return ConfSchema() - - def init(self): - self.delayed_process = True - - def meta_setup(self): - req_cols = { - 'x': 'float64', - 'y': 'float64' - } - required = { - 'points_df_in': req_cols, - } - input_meta = self.get_input_meta() - output_cols = ({ - 'distance_df': { - 'distance_cudf': 'float64', - 'x': 'float64', - 'y': 'float64' - }, - 'distance_abs_df': { - 'distance_abs_cudf': 'float64', - 'x': 'float64', - 'y': 'float64' - } - }) - if 'points_df_in' in input_meta: - col_from_inport = input_meta['points_df_in'] - # additional ports - output_cols['distance_df'].update(col_from_inport) - output_cols['distance_abs_df'].update(col_from_inport) - return MetaData(inports=required, outports=output_cols) - - def process(self, inputs): - df = inputs['points_df_in'] - output = {} - if self.outport_connected('distance_df'): - copy_df = df.copy() - copy_df['distance_cudf'] = (df['x'] ** 2 + df['y'] ** 2).sqrt() - output.update({'distance_df': copy_df}) - if self.outport_connected('distance_abs_df'): - copy_df = df.copy() - copy_df['distance_abs_cudf'] = df['x'].abs() + df['y'].abs() - output.update({'distance_abs_df': copy_df}) - return output - - -@cuda.jit -def distance_kernel(x, y, distance, array_len): - # ii - overall thread index - ii = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x - if ii < array_len: - distance[ii] = math.sqrt(x[ii] ** 2 + y[ii] ** 2) - - -class NumbaDistanceNode(_PortTypesMixin, Node): - - def ports_setup(self): - port_type = PortsSpecSchema.port_type - input_ports = { - 'points_df_in': { - port_type: [cudf.DataFrame, - dask_cudf.DataFrame] - } - } - - output_ports = { - 'distance_df': { - port_type: [cudf.DataFrame, - dask_cudf.DataFrame] - } - } - - input_connections = self.get_connected_inports() - if 'points_df_in' in input_connections: - types = input_connections['points_df_in'] - # connected - return NodePorts(inports={'points_df_in': {port_type: types}}, - outports={'distance_df': {port_type: types}}) - else: - return NodePorts(inports=input_ports, outports=output_ports) - - def init(self): - self.delayed_process = True - - def meta_setup(self,): - required_cols = {'x': 'float64', 'y': 'float64'} - required = { - 'points_df_in': required_cols, - 'distance_df': required_cols - } - input_meta = self.get_input_meta() - output_cols = ({ - 'distance_df': { - 'distance_numba': 'float64', - 'x': 'float64', - 'y': 'float64' - } - }) - if 'points_df_in' in input_meta: - col_from_inport = input_meta['points_df_in'] - # additional ports - output_cols['distance_df'].update(col_from_inport) - return MetaData(inports=required, outports=output_cols) - - def conf_schema(self): - return ConfSchema() - - def process(self, inputs): - df = inputs['points_df_in'] - - # DEBUGGING - # try: - # from dask.distributed import get_worker - # worker = get_worker() - # print('worker{} process NODE "{}" worker: {}'.format( - # worker.name, self.uid, worker)) - # except (ValueError, ImportError): - # pass - - number_of_threads = 16 - number_of_blocks = ((len(df) - 1) // number_of_threads) + 1 - # Inits device array by setting 0 for each index. - # df['distance_numba'] = 0.0 - darr = rmm.device_array(len(df)) - distance_kernel[(number_of_blocks,), (number_of_threads,)]( - df['x'], - df['y'], - darr, - len(df)) - df['distance_numba'] = darr - return {'distance_df': df} - - -kernel_string = r''' - extern "C" __global__ - void compute_distance(const double* x, const double* y, - double* distance, int arr_len) { - int tid = blockDim.x * blockIdx.x + threadIdx.x; - if (tid < arr_len){ - distance[tid] = sqrt(x[tid]*x[tid] + y[tid]*y[tid]); - } - } -''' - - -class CupyDistanceNode(_PortTypesMixin, Node): - - def ports_setup(self): - port_type = PortsSpecSchema.port_type - input_ports = { - 'points_df_in': { - port_type: [cudf.DataFrame, - dask_cudf.DataFrame] - } - } - - output_ports = { - 'distance_df': { - port_type: [cudf.DataFrame, - dask_cudf.DataFrame] - } - } - - input_connections = self.get_connected_inports() - if 'points_df_in' in input_connections: - types = input_connections['points_df_in'] - # connected - return NodePorts(inports={'points_df_in': {port_type: types}}, - outports={'distance_df': {port_type: types}}) - else: - return NodePorts(inports=input_ports, outports=output_ports) - - def init(self): - self.delayed_process = True - - def meta_setup(self,): - cols_required = {'x': 'float64', - 'y': 'float64'} - required = { - 'points_df_in': cols_required, - 'distance_df': cols_required - } - input_meta = self.get_input_meta() - output_cols = ({ - 'distance_df': { - 'distance_cupy': 'float64', - 'x': 'float64', - 'y': 'float64' - } - }) - if 'points_df_in' in input_meta: - col_from_inport = input_meta['points_df_in'] - # additional ports - output_cols['distance_df'].update(col_from_inport) - return MetaData(inports=required, outports=output_cols) - - def conf_schema(self): - return ConfSchema() - - def get_kernel(self): - raw_kernel = cupy.RawKernel(kernel_string, 'compute_distance') - return raw_kernel - - def process(self, inputs): - df = inputs['points_df_in'] - cupy_x = cupy.asarray(df['x']) - cupy_y = cupy.asarray(df['y']) - number_of_threads = 16 - number_of_blocks = (len(df) - 1) // number_of_threads + 1 - dis = cupy.ndarray(len(df), dtype=cupy.float64) - self.get_kernel()((number_of_blocks,), (number_of_threads,), - (cupy_x, cupy_y, dis, len(df))) - df['distance_cupy'] = dis - - return {'distance_df': df} - - -class DistributedNode(_PortTypesMixin, Node): - - def ports_setup(self): - input_ports = { - 'points_df_in': { - PortsSpecSchema.port_type: cudf.DataFrame - } - } - - output_ports = { - 'points_ddf_out': { - PortsSpecSchema.port_type: dask_cudf.DataFrame - } - } - - return NodePorts(inports=input_ports, outports=output_ports) - - def init(self): - pass - - def meta_setup(self,): - cols_required = { - 'x': 'float64', - 'y': 'float64' - } - required = { - 'points_df_in': cols_required, - 'points_ddf_out': cols_required - } - input_meta = self.get_input_meta() - output_cols = ({ - 'points_ddf_out': { - 'x': 'float64', - 'y': 'float64' - } - }) - if 'points_df_in' in input_meta: - col_from_inport = input_meta['points_df_in'] - # additional ports - output_cols['points_ddf_out'].update(col_from_inport) - return MetaData(inports=required, outports=output_cols) - - def conf_schema(self): - json = { - "title": "DistributedNode configure", - "type": "object", - "properties": { - "npartitions": { - "type": "number", - "description": "num of partitions in the Dask dataframe", - "minimum": 1 - } - }, - "required": ["npartitions"], - } - - ui = { - "npartitions": {"ui:widget": "updown"} - } - return ConfSchema(json=json, ui=ui) - - def process(self, inputs): - npartitions = self.conf['npartitions'] - df = inputs['points_df_in'] - ddf = dask_cudf.from_cudf(df, npartitions=npartitions) - return {'points_ddf_out': ddf} - - -class VerifyNode(_PortTypesMixin, Node): - - def ports_setup(self): - input_ports = { - 'df1': { - PortsSpecSchema.port_type: [cudf.DataFrame, - dask_cudf.DataFrame] - }, - 'df2': { - PortsSpecSchema.port_type: [cudf.DataFrame, - dask_cudf.DataFrame] - } - } - output_ports = { - 'max_diff': { - PortsSpecSchema.port_type: float - } - } - - connections = self.get_connected_inports() - for key in input_ports: - if key in connections: - # connected - types = connections[key] - input_ports[key].update({PortsSpecSchema.port_type: types}) - return NodePorts(inports=input_ports, outports=output_ports) - - def meta_setup(self): - required ={ - "df1": {}, - "df2": {} - } - return MetaData(inports=required, outports={'max_diff': {}}) - - def conf_schema(self): - json = { - "title": "VerifyNode configure", - "type": "object", - "properties": { - "df1_col": { - "type": "string", - "description": "dataframe1 column name" - }, - "df2_col": { - "type": "string", - "description": "dataframe2 column name" - } - }, - "required": ["df1_col", "df2_col"], - } - - ui = { - "df1_col": {"ui:widget": "text"}, - "df2_col": {"ui:widget": "text"} - } - return ConfSchema(json=json, ui=ui) - - def process(self, inputs): - df1 = inputs['df1'] - df2 = inputs['df2'] - col_df1 = self.conf['df1_col'] - col_df2 = self.conf['df2_col'] - - df1_col = df1[col_df1] - if isinstance(df1, dask_cudf.DataFrame): - # df1_col = df1_col.compute() - pass - - df2_col = df2[col_df2] - if isinstance(df2, dask_cudf.DataFrame): - # df2_col = df2_col.compute() - pass - - max_difference = (df1_col - df2_col).abs().max() - - if isinstance(max_difference, dask.dataframe.core.Scalar): - max_difference = float(max_difference.compute()) - max_difference = float(max_difference) - # print('Max Difference: {}'.format(max_difference)) - # assert(max_difference < 1e-8) - - return {'max_diff': max_difference}